diff options
334 files changed, 7669 insertions, 2947 deletions
diff --git a/api/current.txt b/api/current.txt index cb077aff6255..a888b08bc8e7 100644 --- a/api/current.txt +++ b/api/current.txt @@ -287,6 +287,7 @@ package android { field public static final int alertDialogTheme = 16843529; // 0x1010309 field public static final int alignmentMode = 16843642; // 0x101037a field public static final int allContactsName = 16843468; // 0x10102cc + field public static final int allowAudioPlaybackCapture = 16844199; // 0x10105a7 field public static final int allowBackup = 16843392; // 0x1010280 field public static final int allowClearUserData = 16842757; // 0x1010005 field public static final int allowEmbedded = 16843765; // 0x10103f5 @@ -4250,10 +4251,9 @@ package android.app { public class AppComponentFactory { ctor public AppComponentFactory(); - method public android.content.pm.ApplicationInfo getApplicationInfo(); method @NonNull public android.app.Activity instantiateActivity(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException; method @NonNull public android.app.Application instantiateApplication(@NonNull ClassLoader, @NonNull String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException; - method @NonNull public ClassLoader instantiateClassLoader(@NonNull ClassLoader); + method @NonNull public ClassLoader instantiateClassLoader(@NonNull ClassLoader, @NonNull android.content.pm.ApplicationInfo); method @NonNull public android.content.ContentProvider instantiateProvider(@NonNull ClassLoader, @NonNull String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException; method @NonNull public android.content.BroadcastReceiver instantiateReceiver(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException; method @NonNull public android.app.Service instantiateService(@NonNull ClassLoader, @NonNull String, @Nullable android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException; @@ -5499,74 +5499,74 @@ package android.app { ctor public Notification.Builder(android.content.Context, String); ctor @Deprecated public Notification.Builder(android.content.Context); method @Deprecated public android.app.Notification.Builder addAction(int, CharSequence, android.app.PendingIntent); - method public android.app.Notification.Builder addAction(android.app.Notification.Action); - method public android.app.Notification.Builder addExtras(android.os.Bundle); + method @NonNull public android.app.Notification.Builder addAction(android.app.Notification.Action); + method @NonNull public android.app.Notification.Builder addExtras(android.os.Bundle); method @Deprecated public android.app.Notification.Builder addPerson(String); - method public android.app.Notification.Builder addPerson(android.app.Person); - method public android.app.Notification build(); + method @NonNull public android.app.Notification.Builder addPerson(android.app.Person); + method @NonNull public android.app.Notification build(); method public android.widget.RemoteViews createBigContentView(); method public android.widget.RemoteViews createContentView(); method public android.widget.RemoteViews createHeadsUpContentView(); - method public android.app.Notification.Builder extend(android.app.Notification.Extender); + method @NonNull public android.app.Notification.Builder extend(android.app.Notification.Extender); method public android.os.Bundle getExtras(); method @Deprecated public android.app.Notification getNotification(); method public android.app.Notification.Style getStyle(); - method public static android.app.Notification.Builder recoverBuilder(android.content.Context, android.app.Notification); - method public android.app.Notification.Builder setActions(android.app.Notification.Action...); - method public android.app.Notification.Builder setAllowSystemGeneratedContextualActions(boolean); - method public android.app.Notification.Builder setAutoCancel(boolean); - method public android.app.Notification.Builder setBadgeIconType(int); - method public android.app.Notification.Builder setBubbleMetadata(android.app.Notification.BubbleMetadata); - method public android.app.Notification.Builder setCategory(String); - method public android.app.Notification.Builder setChannelId(String); - method public android.app.Notification.Builder setChronometerCountDown(boolean); - method public android.app.Notification.Builder setColor(@ColorInt int); - method public android.app.Notification.Builder setColorized(boolean); + method @NonNull public static android.app.Notification.Builder recoverBuilder(android.content.Context, android.app.Notification); + method @NonNull public android.app.Notification.Builder setActions(android.app.Notification.Action...); + method @NonNull public android.app.Notification.Builder setAllowSystemGeneratedContextualActions(boolean); + method @NonNull public android.app.Notification.Builder setAutoCancel(boolean); + method @NonNull public android.app.Notification.Builder setBadgeIconType(int); + method @NonNull public android.app.Notification.Builder setBubbleMetadata(android.app.Notification.BubbleMetadata); + method @NonNull public android.app.Notification.Builder setCategory(String); + method @NonNull public android.app.Notification.Builder setChannelId(String); + method @NonNull public android.app.Notification.Builder setChronometerCountDown(boolean); + method @NonNull public android.app.Notification.Builder setColor(@ColorInt int); + method @NonNull public android.app.Notification.Builder setColorized(boolean); method @Deprecated public android.app.Notification.Builder setContent(android.widget.RemoteViews); method @Deprecated public android.app.Notification.Builder setContentInfo(CharSequence); - method public android.app.Notification.Builder setContentIntent(android.app.PendingIntent); - method public android.app.Notification.Builder setContentText(CharSequence); - method public android.app.Notification.Builder setContentTitle(CharSequence); - method public android.app.Notification.Builder setCustomBigContentView(android.widget.RemoteViews); - method public android.app.Notification.Builder setCustomContentView(android.widget.RemoteViews); - method public android.app.Notification.Builder setCustomHeadsUpContentView(android.widget.RemoteViews); + method @NonNull public android.app.Notification.Builder setContentIntent(android.app.PendingIntent); + method @NonNull public android.app.Notification.Builder setContentText(CharSequence); + method @NonNull public android.app.Notification.Builder setContentTitle(CharSequence); + method @NonNull public android.app.Notification.Builder setCustomBigContentView(android.widget.RemoteViews); + method @NonNull public android.app.Notification.Builder setCustomContentView(android.widget.RemoteViews); + method @NonNull public android.app.Notification.Builder setCustomHeadsUpContentView(android.widget.RemoteViews); method @Deprecated public android.app.Notification.Builder setDefaults(int); - method public android.app.Notification.Builder setDeleteIntent(android.app.PendingIntent); - method public android.app.Notification.Builder setExtras(android.os.Bundle); - method public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean); - method public android.app.Notification.Builder setGroup(String); - method public android.app.Notification.Builder setGroupAlertBehavior(int); - method public android.app.Notification.Builder setGroupSummary(boolean); - method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap); - method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon); + method @NonNull public android.app.Notification.Builder setDeleteIntent(android.app.PendingIntent); + method @NonNull public android.app.Notification.Builder setExtras(android.os.Bundle); + method @NonNull public android.app.Notification.Builder setFullScreenIntent(android.app.PendingIntent, boolean); + method @NonNull public android.app.Notification.Builder setGroup(String); + method @NonNull public android.app.Notification.Builder setGroupAlertBehavior(int); + method @NonNull public android.app.Notification.Builder setGroupSummary(boolean); + method @NonNull public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap); + method @NonNull public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon); method @Deprecated public android.app.Notification.Builder setLights(@ColorInt int, int, int); - method public android.app.Notification.Builder setLocalOnly(boolean); - method public android.app.Notification.Builder setNumber(int); - method public android.app.Notification.Builder setOngoing(boolean); - method public android.app.Notification.Builder setOnlyAlertOnce(boolean); + method @NonNull public android.app.Notification.Builder setLocalOnly(boolean); + method @NonNull public android.app.Notification.Builder setNumber(int); + method @NonNull public android.app.Notification.Builder setOngoing(boolean); + method @NonNull public android.app.Notification.Builder setOnlyAlertOnce(boolean); method @Deprecated public android.app.Notification.Builder setPriority(int); - method public android.app.Notification.Builder setProgress(int, int, boolean); - method public android.app.Notification.Builder setPublicVersion(android.app.Notification); - method public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]); - method public android.app.Notification.Builder setSettingsText(CharSequence); - method public android.app.Notification.Builder setShortcutId(String); - method public android.app.Notification.Builder setShowWhen(boolean); - method public android.app.Notification.Builder setSmallIcon(@DrawableRes int); - method public android.app.Notification.Builder setSmallIcon(@DrawableRes int, int); - method public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon); - method public android.app.Notification.Builder setSortKey(String); + method @NonNull public android.app.Notification.Builder setProgress(int, int, boolean); + method @NonNull public android.app.Notification.Builder setPublicVersion(android.app.Notification); + method @NonNull public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]); + method @NonNull public android.app.Notification.Builder setSettingsText(CharSequence); + method @NonNull public android.app.Notification.Builder setShortcutId(String); + method @NonNull public android.app.Notification.Builder setShowWhen(boolean); + method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int); + method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int, int); + method @NonNull public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon); + method @NonNull public android.app.Notification.Builder setSortKey(String); method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri); method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri, int); method @Deprecated public android.app.Notification.Builder setSound(android.net.Uri, android.media.AudioAttributes); - method public android.app.Notification.Builder setStyle(android.app.Notification.Style); - method public android.app.Notification.Builder setSubText(CharSequence); - method public android.app.Notification.Builder setTicker(CharSequence); + method @NonNull public android.app.Notification.Builder setStyle(android.app.Notification.Style); + method @NonNull public android.app.Notification.Builder setSubText(CharSequence); + method @NonNull public android.app.Notification.Builder setTicker(CharSequence); method @Deprecated public android.app.Notification.Builder setTicker(CharSequence, android.widget.RemoteViews); - method public android.app.Notification.Builder setTimeoutAfter(long); - method public android.app.Notification.Builder setUsesChronometer(boolean); + method @NonNull public android.app.Notification.Builder setTimeoutAfter(long); + method @NonNull public android.app.Notification.Builder setUsesChronometer(boolean); method @Deprecated public android.app.Notification.Builder setVibrate(long[]); - method public android.app.Notification.Builder setVisibility(int); - method public android.app.Notification.Builder setWhen(long); + method @NonNull public android.app.Notification.Builder setVisibility(int); + method @NonNull public android.app.Notification.Builder setWhen(long); } public static final class Notification.CarExtender implements android.app.Notification.Extender { @@ -6171,6 +6171,7 @@ package android.app { ctor public Service(); method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]); method public final android.app.Application getApplication(); + method public final int getForegroundServiceType(); method @Nullable public abstract android.os.IBinder onBind(android.content.Intent); method public void onConfigurationChanged(android.content.res.Configuration); method public void onCreate(); @@ -12512,7 +12513,7 @@ package android.database { method public int getInt(int); method public long getLong(int); method public android.net.Uri getNotificationUri(); - method public default java.util.List<android.net.Uri> getNotificationUris(); + method @Nullable public default java.util.List<android.net.Uri> getNotificationUris(); method public int getPosition(); method public short getShort(int); method public String getString(int); @@ -13553,7 +13554,7 @@ package android.graphics { method @CheckResult public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]); method public int getAllocationByteCount(); method public int getByteCount(); - method public android.graphics.Color getColor(int, int); + method @NonNull public android.graphics.Color getColor(int, int); method @Nullable public android.graphics.ColorSpace getColorSpace(); method public android.graphics.Bitmap.Config getConfig(); method public int getDensity(); @@ -16557,13 +16558,13 @@ package android.hardware.biometrics { public static class BiometricPrompt.Builder { ctor public BiometricPrompt.Builder(android.content.Context); - method public android.hardware.biometrics.BiometricPrompt build(); - method public android.hardware.biometrics.BiometricPrompt.Builder setAllowDeviceCredential(boolean); - method public android.hardware.biometrics.BiometricPrompt.Builder setDescription(@NonNull CharSequence); - method public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(@NonNull CharSequence, @NonNull java.util.concurrent.Executor, @NonNull android.content.DialogInterface.OnClickListener); - method public android.hardware.biometrics.BiometricPrompt.Builder setRequireConfirmation(boolean); - method public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(@NonNull CharSequence); - method public android.hardware.biometrics.BiometricPrompt.Builder setTitle(@NonNull CharSequence); + method @NonNull public android.hardware.biometrics.BiometricPrompt build(); + method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setAllowDeviceCredential(boolean); + method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setDescription(@NonNull CharSequence); + method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(@NonNull CharSequence, @NonNull java.util.concurrent.Executor, @NonNull android.content.DialogInterface.OnClickListener); + method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setRequireConfirmation(boolean); + method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(@NonNull CharSequence); + method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setTitle(@NonNull CharSequence); } public static final class BiometricPrompt.CryptoObject { @@ -16645,93 +16646,93 @@ package android.hardware.camera2 { method public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission(); method @NonNull public java.util.Set<java.lang.String> getPhysicalCameraIds(); method @Nullable public android.hardware.camera2.params.RecommendedStreamConfigurationMap getRecommendedStreamConfigurationMap(int); - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_COMPENSATION_RANGE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AE_LOCK_AVAILABLE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AWB_AVAILABLE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AWB_LOCK_AVAILABLE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> DEPTH_DEPTH_IS_EXCLUSIVE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> INFO_SUPPORTED_HARDWARE_LEVEL; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.String> INFO_VERSION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_DISTORTION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_FACING; - field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_APERTURES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_HYPERFOCAL_DISTANCE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INTRINSIC_CALIBRATION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_POSE_REFERENCE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_ROTATION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_TRANSLATION; - field @Deprecated public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REPROCESS_MAX_CAPTURE_STALL; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> REQUEST_AVAILABLE_CAPABILITIES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_INPUT_STREAMS; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC_STALLING; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_RAW; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_PARTIAL_RESULT_COUNT; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> REQUEST_PIPELINE_MAX_DEPTH; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SCALER_CROPPING_TYPE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.MandatoryStreamCombination[]> SCALER_MANDATORY_STREAM_COMBINATIONS; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.StreamConfigurationMap> SCALER_STREAM_CONFIGURATION_MAP; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SENSOR_AVAILABLE_TEST_PATTERN_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.BlackLevelPattern> SENSOR_BLACK_LEVEL_PATTERN; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM1; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM2; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM1; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM2; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX1; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX2; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> SENSOR_INFO_LENS_SHADING_APPLIED; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Long> SENSOR_INFO_MAX_FRAME_DURATION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> SENSOR_INFO_SENSITIVITY_RANGE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_TIMESTAMP_SOURCE; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_WHITE_LEVEL; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_MAX_ANALOG_SENSITIVITY; - field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect[]> SENSOR_OPTICAL_BLACK_REGIONS; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_ORIENTATION; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_REFERENCE_ILLUMINANT1; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> SENSOR_REFERENCE_ILLUMINANT2; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SHADING_AVAILABLE_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> STATISTICS_INFO_MAX_FACE_COUNT; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SYNC_MAX_LATENCY; - field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES; - field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_COMPENSATION_RANGE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AE_LOCK_AVAILABLE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AWB_AVAILABLE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AWB_LOCK_AVAILABLE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> DEPTH_DEPTH_IS_EXCLUSIVE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> INFO_SUPPORTED_HARDWARE_LEVEL; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.String> INFO_VERSION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_DISTORTION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_FACING; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_APERTURES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_HYPERFOCAL_DISTANCE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INTRINSIC_CALIBRATION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_POSE_REFERENCE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_ROTATION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_POSE_TRANSLATION; + field @Deprecated @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_RADIAL_DISTORTION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REPROCESS_MAX_CAPTURE_STALL; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> REQUEST_AVAILABLE_CAPABILITIES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_INPUT_STREAMS; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC_STALLING; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_RAW; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_PARTIAL_RESULT_COUNT; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> REQUEST_PIPELINE_MAX_DEPTH; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SCALER_CROPPING_TYPE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.MandatoryStreamCombination[]> SCALER_MANDATORY_STREAM_COMBINATIONS; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.StreamConfigurationMap> SCALER_STREAM_CONFIGURATION_MAP; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SENSOR_AVAILABLE_TEST_PATTERN_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.BlackLevelPattern> SENSOR_BLACK_LEVEL_PATTERN; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM1; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM2; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM1; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM2; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX1; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX2; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> SENSOR_INFO_LENS_SHADING_APPLIED; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Long> SENSOR_INFO_MAX_FRAME_DURATION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> SENSOR_INFO_SENSITIVITY_RANGE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_TIMESTAMP_SOURCE; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_WHITE_LEVEL; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_MAX_ANALOG_SENSITIVITY; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect[]> SENSOR_OPTICAL_BLACK_REGIONS; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_ORIENTATION; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_REFERENCE_ILLUMINANT1; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> SENSOR_REFERENCE_ILLUMINANT2; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SHADING_AVAILABLE_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> STATISTICS_INFO_MAX_FACE_COUNT; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SYNC_MAX_LATENCY; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES; + field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS; } public static final class CameraCharacteristics.Key<T> { @@ -17037,63 +17038,63 @@ package android.hardware.camera2 { method @Nullable public Object getTag(); method public boolean isReprocess(); method public void writeToParcel(android.os.Parcel, int); - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> BLACK_LEVEL_LOCK; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AE_LOCK; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER; - field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS; - field public static final android.hardware.camera2.CaptureRequest.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_TRIGGER; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AWB_LOCK; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AWB_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_EFFECT_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_SCENE_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> BLACK_LEVEL_LOCK; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AE_LOCK; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_TRIGGER; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AWB_LOCK; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AWB_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_EFFECT_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_SCENE_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE; field public static final android.os.Parcelable.Creator<android.hardware.camera2.CaptureRequest> CREATOR; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> EDGE_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> FLASH_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> HOT_PIXEL_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<android.location.Location> JPEG_GPS_LOCATION; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> JPEG_ORIENTATION; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_QUALITY; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY; - field public static final android.hardware.camera2.CaptureRequest.Key<android.util.Size> JPEG_THUMBNAIL_SIZE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_APERTURE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FILTER_DENSITY; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCAL_LENGTH; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCUS_DISTANCE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> NOISE_REDUCTION_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR; - field public static final android.hardware.camera2.CaptureRequest.Key<android.graphics.Rect> SCALER_CROP_REGION; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_EXPOSURE_TIME; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_FRAME_DURATION; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_SENSITIVITY; - field public static final android.hardware.camera2.CaptureRequest.Key<int[]> SENSOR_TEST_PATTERN_DATA; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SHADING_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> TONEMAP_GAMMA; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_MODE; - field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_PRESET_CURVE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> EDGE_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> FLASH_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> HOT_PIXEL_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.location.Location> JPEG_GPS_LOCATION; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> JPEG_ORIENTATION; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_QUALITY; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.util.Size> JPEG_THUMBNAIL_SIZE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_APERTURE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FILTER_DENSITY; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCAL_LENGTH; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCUS_DISTANCE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> NOISE_REDUCTION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.graphics.Rect> SCALER_CROP_REGION; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_EXPOSURE_TIME; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_FRAME_DURATION; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_SENSITIVITY; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<int[]> SENSOR_TEST_PATTERN_DATA; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SHADING_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> TONEMAP_GAMMA; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_MODE; + field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_PRESET_CURVE; } public static final class CaptureRequest.Builder { @@ -17118,88 +17119,88 @@ package android.hardware.camera2 { method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys(); method @NonNull public android.hardware.camera2.CaptureRequest getRequest(); method public int getSequenceId(); - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AE_LOCK; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_STATE; - field public static final android.hardware.camera2.CaptureResult.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_SCENE_CHANGE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_STATE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_TRIGGER; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AWB_LOCK; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_STATE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_EFFECT_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_SCENE_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> EDGE_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_STATE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> HOT_PIXEL_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.location.Location> JPEG_GPS_LOCATION; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> JPEG_ORIENTATION; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_QUALITY; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY; - field public static final android.hardware.camera2.CaptureResult.Key<android.util.Size> JPEG_THUMBNAIL_SIZE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_APERTURE; - field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_DISTORTION; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FILTER_DENSITY; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCAL_LENGTH; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCUS_DISTANCE; - field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Float,java.lang.Float>> LENS_FOCUS_RANGE; - field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_INTRINSIC_CALIBRATION; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_ROTATION; - field public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_TRANSLATION; - field @Deprecated public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.String> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> REQUEST_PIPELINE_DEPTH; - field public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Rect> SCALER_CROP_REGION; - field public static final android.hardware.camera2.CaptureResult.Key<float[]> SENSOR_DYNAMIC_BLACK_LEVEL; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_DYNAMIC_WHITE_LEVEL; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_EXPOSURE_TIME; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_FRAME_DURATION; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> SENSOR_GREEN_SPLIT; - field public static final android.hardware.camera2.CaptureResult.Key<android.util.Rational[]> SENSOR_NEUTRAL_COLOR_POINT; - field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Double,java.lang.Double>[]> SENSOR_NOISE_PROFILE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_ROLLING_SHUTTER_SKEW; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_SENSITIVITY; - field public static final android.hardware.camera2.CaptureResult.Key<int[]> SENSOR_TEST_PATTERN_DATA; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_TIMESTAMP; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SHADING_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.Face[]> STATISTICS_FACES; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER; - field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AE_LOCK; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_STATE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_SCENE_CHANGE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_STATE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_TRIGGER; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AWB_LOCK; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_STATE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_EFFECT_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_SCENE_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> DISTORTION_CORRECTION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> EDGE_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_STATE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> HOT_PIXEL_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.location.Location> JPEG_GPS_LOCATION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> JPEG_ORIENTATION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_QUALITY; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Size> JPEG_THUMBNAIL_SIZE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_APERTURE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_DISTORTION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FILTER_DENSITY; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCAL_LENGTH; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCUS_DISTANCE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Float,java.lang.Float>> LENS_FOCUS_RANGE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_INTRINSIC_CALIBRATION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_ROTATION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_POSE_TRANSLATION; + field @Deprecated @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.String> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> REQUEST_PIPELINE_DEPTH; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Rect> SCALER_CROP_REGION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> SENSOR_DYNAMIC_BLACK_LEVEL; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_DYNAMIC_WHITE_LEVEL; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_EXPOSURE_TIME; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_FRAME_DURATION; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> SENSOR_GREEN_SPLIT; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Rational[]> SENSOR_NEUTRAL_COLOR_POINT; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Double,java.lang.Double>[]> SENSOR_NOISE_PROFILE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_ROLLING_SHUTTER_SKEW; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_SENSITIVITY; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<int[]> SENSOR_TEST_PATTERN_DATA; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_TIMESTAMP; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SHADING_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.Face[]> STATISTICS_FACES; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_MODE; + field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE; } public static final class CaptureResult.Key<T> { @@ -23417,14 +23418,14 @@ package android.media { field public static final int MASTERING_NOT_INDICATED = 0; // 0x0 } - public static class AudioPresentation.Builder { + public static final class AudioPresentation.Builder { ctor public AudioPresentation.Builder(int); method @NonNull public android.media.AudioPresentation build(); method @NonNull public android.media.AudioPresentation.Builder setHasAudioDescription(boolean); method @NonNull public android.media.AudioPresentation.Builder setHasDialogueEnhancement(boolean); method @NonNull public android.media.AudioPresentation.Builder setHasSpokenSubtitles(boolean); - method @NonNull public android.media.AudioPresentation.Builder setLabels(@NonNull java.util.Map<android.icu.util.ULocale,java.lang.String>); - method @NonNull public android.media.AudioPresentation.Builder setLocale(android.icu.util.ULocale); + method @NonNull public android.media.AudioPresentation.Builder setLabels(@NonNull java.util.Map<android.icu.util.ULocale,java.lang.CharSequence>); + method @NonNull public android.media.AudioPresentation.Builder setLocale(@NonNull android.icu.util.ULocale); method @NonNull public android.media.AudioPresentation.Builder setMasteringIndication(int); method @NonNull public android.media.AudioPresentation.Builder setProgramId(int); } @@ -35516,7 +35517,7 @@ package android.os { public abstract class VibrationEffect implements android.os.Parcelable { method public static android.os.VibrationEffect createOneShot(long, int); - method public static android.os.VibrationEffect createPrebaked(int); + method public static android.os.VibrationEffect createPredefined(int); method public static android.os.VibrationEffect createWaveform(long[], int); method public static android.os.VibrationEffect createWaveform(long[], int[], int); method public int describeContents(); @@ -38406,14 +38407,12 @@ package android.provider { public final class MediaStore { ctor public MediaStore(); - method @NonNull public static android.net.Uri createPending(@NonNull android.content.Context, @NonNull android.provider.MediaStore.PendingParams); method @NonNull public static java.util.Set<java.lang.String> getAllVolumeNames(android.content.Context); method public static android.net.Uri getDocumentUri(android.content.Context, android.net.Uri); method public static android.net.Uri getMediaScannerUri(); method public static android.net.Uri getMediaUri(android.content.Context, android.net.Uri); method public static String getVersion(android.content.Context); method @NonNull public static String getVolumeName(@NonNull android.net.Uri); - method @NonNull public static android.provider.MediaStore.PendingSession openPending(@NonNull android.content.Context, @NonNull android.net.Uri); method @NonNull public static android.net.Uri setIncludePending(@NonNull android.net.Uri); method @NonNull public static android.net.Uri setRequireOriginal(@NonNull android.net.Uri); field public static final String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE"; @@ -38602,10 +38601,10 @@ package android.provider { } public static final class MediaStore.Downloads implements android.provider.MediaStore.DownloadColumns { - method public static android.net.Uri getContentUri(String); + method @NonNull public static android.net.Uri getContentUri(@NonNull String); field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/download"; - field public static final android.net.Uri EXTERNAL_CONTENT_URI; - field public static final android.net.Uri INTERNAL_CONTENT_URI; + field @NonNull public static final android.net.Uri EXTERNAL_CONTENT_URI; + field @NonNull public static final android.net.Uri INTERNAL_CONTENT_URI; } public static final class MediaStore.Files { @@ -38686,6 +38685,7 @@ package android.provider { public static interface MediaStore.MediaColumns extends android.provider.BaseColumns { field @Deprecated public static final String DATA = "_data"; field public static final String DATE_ADDED = "date_added"; + field public static final String DATE_EXPIRES = "date_expires"; field public static final String DATE_MODIFIED = "date_modified"; field public static final String DISPLAY_NAME = "_display_name"; field public static final String DOCUMENT_ID = "document_id"; @@ -38702,23 +38702,6 @@ package android.provider { field public static final String WIDTH = "width"; } - public static class MediaStore.PendingParams { - ctor public MediaStore.PendingParams(@NonNull android.net.Uri, @NonNull String, @NonNull String); - method public void setDownloadUri(@Nullable android.net.Uri); - method public void setPrimaryDirectory(@Nullable String); - method public void setRefererUri(@Nullable android.net.Uri); - method public void setSecondaryDirectory(@Nullable String); - } - - public static class MediaStore.PendingSession implements java.lang.AutoCloseable { - method public void abandon(); - method public void close(); - method public void notifyProgress(@IntRange(from=0, to=100) int); - method @NonNull public android.os.ParcelFileDescriptor open() throws java.io.FileNotFoundException; - method @NonNull public java.io.OutputStream openOutputStream() throws java.io.FileNotFoundException; - method @NonNull public android.net.Uri publish(); - } - public static final class MediaStore.Video { ctor public MediaStore.Video(); method @Deprecated public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]); @@ -39257,7 +39240,7 @@ package android.provider { } public static final class Telephony.CarrierId implements android.provider.BaseColumns { - method public static android.net.Uri getPreciseCarrierIdUriForSubscriptionId(int); + method @NonNull public static android.net.Uri getPreciseCarrierIdUriForSubscriptionId(int); method public static android.net.Uri getUriForSubscriptionId(int); field public static final String CARRIER_ID = "carrier_id"; field public static final String CARRIER_NAME = "carrier_name"; @@ -41192,8 +41175,9 @@ package android.service.autofill { public final class FillContext implements android.os.Parcelable { method public int describeContents(); + method @NonNull public android.view.autofill.AutofillId getFocusedId(); method public int getRequestId(); - method public android.app.assist.AssistStructure getStructure(); + method @NonNull public android.app.assist.AssistStructure getStructure(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.service.autofill.FillContext> CREATOR; } @@ -41385,10 +41369,10 @@ package android.service.autofill { field public static final android.os.Parcelable.Creator<android.service.autofill.VisibilitySetterAction> CREATOR; } - public static class VisibilitySetterAction.Builder { + public static final class VisibilitySetterAction.Builder { ctor public VisibilitySetterAction.Builder(@IdRes int, int); - method public android.service.autofill.VisibilitySetterAction build(); - method public android.service.autofill.VisibilitySetterAction.Builder setVisibility(@IdRes int, int); + method @NonNull public android.service.autofill.VisibilitySetterAction build(); + method @NonNull public android.service.autofill.VisibilitySetterAction.Builder setVisibility(@IdRes int, int); } } @@ -41414,7 +41398,7 @@ package android.service.carrier { public class CarrierMessagingClientService extends android.app.Service { ctor public CarrierMessagingClientService(); - method public final android.os.IBinder onBind(android.content.Intent); + method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent); } public abstract class CarrierMessagingService extends android.app.Service { @@ -42518,6 +42502,7 @@ package android.system { method public static void chown(String, int, int) throws android.system.ErrnoException; method public static void close(java.io.FileDescriptor) throws android.system.ErrnoException; method public static void connect(java.io.FileDescriptor, java.net.InetAddress, int) throws android.system.ErrnoException, java.net.SocketException; + method public static void connect(java.io.FileDescriptor, java.net.SocketAddress) throws android.system.ErrnoException, java.net.SocketException; method public static java.io.FileDescriptor dup(java.io.FileDescriptor) throws android.system.ErrnoException; method public static java.io.FileDescriptor dup2(java.io.FileDescriptor, int) throws android.system.ErrnoException; method public static String[] environ(); @@ -44486,6 +44471,7 @@ package android.telephony { field public static final int CONNECTION_UNKNOWN = 2147483647; // 0x7fffffff field public static final android.os.Parcelable.Creator<android.telephony.CellInfo> CREATOR; field public static final int UNAVAILABLE = 2147483647; // 0x7fffffff + field public static final long UNAVAILABLE_LONG = 9223372036854775807L; // 0x7fffffffffffffffL } public final class CellInfoCdma extends android.telephony.CellInfo implements android.os.Parcelable { @@ -45064,7 +45050,7 @@ package android.telephony { method public boolean isNetworkRoaming(int); method public static boolean isUsableSubscriptionId(int); method public static boolean isValidSubscriptionId(int); - method public void removeOnOpportunisticSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener); + method public void removeOnOpportunisticSubscriptionsChangedListener(@NonNull android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener); method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean removeSubscriptionsFromGroup(@NonNull int[]); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setMetered(boolean, int); @@ -45073,7 +45059,7 @@ package android.telephony { method public void setSubscriptionOverrideCongested(int, boolean, long); method public void setSubscriptionOverrideUnmetered(int, boolean, long); method public void setSubscriptionPlans(int, @NonNull java.util.List<android.telephony.SubscriptionPlan>); - method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, android.app.PendingIntent); + method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, @NonNull android.app.PendingIntent); field public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED"; field public static final String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED"; field public static final String ACTION_MANAGE_SUBSCRIPTION_PLANS = "android.telephony.action.MANAGE_SUBSCRIPTION_PLANS"; @@ -45182,7 +45168,7 @@ package android.telephony { method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getSubscriberId(); method public String getTypeAllocationCode(); method public String getTypeAllocationCode(int); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public java.util.List<android.telephony.UiccCardInfo> getUiccCardsInfo(); + method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @NonNull public java.util.List<android.telephony.UiccCardInfo> getUiccCardsInfo(); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVisualVoicemailPackageName(); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailAlphaTag(); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber(); @@ -45355,8 +45341,8 @@ package android.telephony { public final class UiccCardInfo implements android.os.Parcelable { method public int describeContents(); method public int getCardId(); - method public String getEid(); - method public String getIccId(); + method @Nullable public String getEid(); + method @Nullable public String getIccId(); method public int getSlotIndex(); method public boolean isEuicc(); method public boolean isRemovable(); @@ -50518,6 +50504,7 @@ package android.view { method public android.animation.StateListAnimator getStateListAnimator(); method protected int getSuggestedMinimumHeight(); method protected int getSuggestedMinimumWidth(); + method @NonNull public java.util.List<android.graphics.Rect> getSystemGestureExclusionRects(); method public int getSystemUiVisibility(); method @android.view.ViewDebug.ExportedProperty public Object getTag(); method public Object getTag(int); @@ -50856,6 +50843,7 @@ package android.view { method public void setSelected(boolean); method public void setSoundEffectsEnabled(boolean); method public void setStateListAnimator(android.animation.StateListAnimator); + method public void setSystemGestureExclusionRects(@NonNull java.util.List<android.graphics.Rect>); method public void setSystemUiVisibility(int); method public void setTag(Object); method public void setTag(int, Object); @@ -51684,6 +51672,7 @@ package android.view { method public void addOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener); method public void addOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener); method public void addOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener); + method public void addOnSystemGestureExclusionRectsChangedListener(java.util.function.Consumer<java.util.List<android.graphics.Rect>>); method public void addOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener); method public void addOnWindowAttachListener(android.view.ViewTreeObserver.OnWindowAttachListener); method public void addOnWindowFocusChangeListener(android.view.ViewTreeObserver.OnWindowFocusChangeListener); @@ -51698,6 +51687,7 @@ package android.view { method public void removeOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener); method public void removeOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener); method public void removeOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener); + method public void removeOnSystemGestureExclusionRectsChangedListener(java.util.function.Consumer<java.util.List<android.graphics.Rect>>); method public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener); method public void removeOnWindowAttachListener(android.view.ViewTreeObserver.OnWindowAttachListener); method public void removeOnWindowFocusChangeListener(android.view.ViewTreeObserver.OnWindowFocusChangeListener); @@ -53039,7 +53029,7 @@ package android.view.contentcapture { public final class ContentCaptureContext implements android.os.Parcelable { method public int describeContents(); - method public static android.view.contentcapture.ContentCaptureContext forLocusId(@NonNull android.net.Uri); + method @NonNull public static android.view.contentcapture.ContentCaptureContext forLocusId(@NonNull android.net.Uri); method @Nullable public android.os.Bundle getExtras(); method @NonNull public android.content.LocusId getLocusId(); method public void writeToParcel(android.os.Parcel, int); @@ -53048,7 +53038,7 @@ package android.view.contentcapture { public static final class ContentCaptureContext.Builder { ctor public ContentCaptureContext.Builder(@NonNull android.content.LocusId); - method public android.view.contentcapture.ContentCaptureContext build(); + method @NonNull public android.view.contentcapture.ContentCaptureContext build(); method @NonNull public android.view.contentcapture.ContentCaptureContext.Builder setExtras(@NonNull android.os.Bundle); } @@ -53064,7 +53054,7 @@ package android.view.contentcapture { method @NonNull public final android.view.contentcapture.ContentCaptureSession createContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext); method public final void destroy(); method @Nullable public final android.view.contentcapture.ContentCaptureContext getContentCaptureContext(); - method public final android.view.contentcapture.ContentCaptureSessionId getContentCaptureSessionId(); + method @NonNull public final android.view.contentcapture.ContentCaptureSessionId getContentCaptureSessionId(); method @NonNull public android.view.autofill.AutofillId newAutofillId(@NonNull android.view.autofill.AutofillId, long); method @NonNull public final android.view.ViewStructure newVirtualViewStructure(@NonNull android.view.autofill.AutofillId, long); method public final void notifyViewAppeared(@NonNull android.view.ViewStructure); @@ -53091,7 +53081,7 @@ package android.view.contentcapture { public static final class UserDataRemovalRequest.Builder { ctor public UserDataRemovalRequest.Builder(); - method public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, boolean); + method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, boolean); method @NonNull public android.view.contentcapture.UserDataRemovalRequest build(); method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything(); } @@ -57776,16 +57766,16 @@ package android.widget { method @Deprecated public void onZoom(boolean); } - public class ZoomControls extends android.widget.LinearLayout { - ctor public ZoomControls(android.content.Context); - ctor public ZoomControls(android.content.Context, android.util.AttributeSet); - method public void hide(); - method public void setIsZoomInEnabled(boolean); - method public void setIsZoomOutEnabled(boolean); - method public void setOnZoomInClickListener(android.view.View.OnClickListener); - method public void setOnZoomOutClickListener(android.view.View.OnClickListener); - method public void setZoomSpeed(long); - method public void show(); + @Deprecated public class ZoomControls extends android.widget.LinearLayout { + ctor @Deprecated public ZoomControls(android.content.Context); + ctor @Deprecated public ZoomControls(android.content.Context, android.util.AttributeSet); + method @Deprecated public void hide(); + method @Deprecated public void setIsZoomInEnabled(boolean); + method @Deprecated public void setIsZoomOutEnabled(boolean); + method @Deprecated public void setOnZoomInClickListener(android.view.View.OnClickListener); + method @Deprecated public void setOnZoomOutClickListener(android.view.View.OnClickListener); + method @Deprecated public void setZoomSpeed(long); + method @Deprecated public void show(); } } diff --git a/api/removed.txt b/api/removed.txt index c4ed871d0661..40b1316a2a5d 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -508,6 +508,8 @@ package android.provider { } public final class MediaStore { + method @Deprecated @NonNull public static android.net.Uri createPending(@NonNull android.content.Context, @NonNull android.provider.MediaStore.PendingParams); + method @Deprecated @NonNull public static android.provider.MediaStore.PendingSession openPending(@NonNull android.content.Context, @NonNull android.net.Uri); method @Deprecated @NonNull public static android.net.Uri setIncludeTrashed(@NonNull android.net.Uri); method @Deprecated public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri); method @Deprecated public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri, long); @@ -515,11 +517,27 @@ package android.provider { } public static interface MediaStore.MediaColumns extends android.provider.BaseColumns { - field @Deprecated public static final String DATE_EXPIRES = "date_expires"; field @Deprecated public static final String HASH = "_hash"; field @Deprecated public static final String IS_TRASHED = "is_trashed"; } + @Deprecated public static class MediaStore.PendingParams { + ctor public MediaStore.PendingParams(@NonNull android.net.Uri, @NonNull String, @NonNull String); + method public void setDownloadUri(@Nullable android.net.Uri); + method public void setPrimaryDirectory(@Nullable String); + method public void setRefererUri(@Nullable android.net.Uri); + method public void setSecondaryDirectory(@Nullable String); + } + + @Deprecated public static class MediaStore.PendingSession implements java.lang.AutoCloseable { + method public void abandon(); + method public void close(); + method public void notifyProgress(@IntRange(from=0, to=100) int); + method @NonNull public android.os.ParcelFileDescriptor open() throws java.io.FileNotFoundException; + method @NonNull public java.io.OutputStream openOutputStream() throws java.io.FileNotFoundException; + method @NonNull public android.net.Uri publish(); + } + public static final class Settings.Global extends android.provider.Settings.NameValueTable { field @Deprecated public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync"; } diff --git a/api/system-current.txt b/api/system-current.txt index dc418989d3eb..8325cbca4032 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -565,12 +565,12 @@ package android.app { } public class StatusBarManager { - method public android.app.StatusBarManager.DisableInfo getDisableInfo(); - method public void setDisabledForSetup(boolean); + method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo(); + method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean); } public static final class StatusBarManager.DisableInfo { - method public boolean areNoComponentsDisabled(); + method public boolean areAllComponentsEnabled(); method public boolean isNavigateToHomeDisabled(); method public boolean isNotificationPeekingDisabled(); method public boolean isRecentsDisabled(); @@ -1906,12 +1906,12 @@ package android.hardware.display { public static class BrightnessConfiguration.Builder { ctor public BrightnessConfiguration.Builder(float[], float[]); - method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection); - method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection); - method public android.hardware.display.BrightnessConfiguration build(); + method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection); + method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection); + method @NonNull public android.hardware.display.BrightnessConfiguration build(); method public int getMaxCorrectionsByCategory(); method public int getMaxCorrectionsByPackageName(); - method public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String); + method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String); } public final class BrightnessCorrection implements android.os.Parcelable { @@ -3456,15 +3456,22 @@ package android.media { method public void clearAudioServerStateCallback(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioProductStrategies getAudioProductStrategies(); + method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioVolumeGroups getAudioVolumeGroups(); + method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); + method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); + method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); method public boolean isAudioServerRunning(); method public boolean isHdmiSystemAudioSupported(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy); + method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException; method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException; method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull android.media.AudioFocusRequest, @Nullable android.media.audiopolicy.AudioPolicy); method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); + method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull android.media.AudioAttributes, int, int); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy); + method public void unregisterVolumeGroupCallback(@NonNull android.media.AudioManager.VolumeGroupCallback); field public static final int AUDIOFOCUS_FLAG_DELAY_OK = 1; // 0x1 field public static final int AUDIOFOCUS_FLAG_LOCK = 4; // 0x4 field public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 2; // 0x2 @@ -3478,6 +3485,11 @@ package android.media { method public void onAudioServerUp(); } + public abstract static class AudioManager.VolumeGroupCallback { + ctor public AudioManager.VolumeGroupCallback(); + method public void onAudioVolumeGroupChanged(int, int); + } + public final class AudioPlaybackConfiguration implements android.os.Parcelable { method public int getClientPid(); method public int getClientUid(); @@ -3649,6 +3661,8 @@ package android.media.audiopolicy { method @Nullable public android.media.audiopolicy.AudioProductStrategy getById(int); method public int getLegacyStreamTypeForAudioAttributes(@NonNull android.media.AudioAttributes); method @Nullable public android.media.audiopolicy.AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull android.media.AudioAttributes); + method public int getVolumeGroupIdForAttributes(@NonNull android.media.AudioAttributes); + method public int getVolumeGroupIdForLegacyStreamType(int); method public java.util.Iterator<android.media.audiopolicy.AudioProductStrategy> iterator(); method public int size(); method public void writeToParcel(@NonNull android.os.Parcel, int); @@ -3664,6 +3678,27 @@ package android.media.audiopolicy { field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioProductStrategy> CREATOR; } + public final class AudioVolumeGroup implements android.os.Parcelable { + method public int describeContents(); + method public java.util.List<android.media.AudioAttributes> getAudioAttributes(); + method public int getId(); + method @NonNull public int[] getLegacyStreamTypes(); + method @NonNull public String name(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroup> CREATOR; + } + + public final class AudioVolumeGroups implements java.lang.Iterable<android.media.audiopolicy.AudioVolumeGroup> android.os.Parcelable { + ctor public AudioVolumeGroups(); + method public int describeContents(); + method @Nullable public android.media.audiopolicy.AudioVolumeGroup getById(int); + method public java.util.Iterator<android.media.audiopolicy.AudioVolumeGroup> iterator(); + method public int size(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroups> CREATOR; + field public static final int DEFAULT_VOLUME_GROUP = -1; // 0xffffffff + } + } package android.media.session { @@ -5791,10 +5826,16 @@ package android.provider { public final class DeviceConfig { method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener); + method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static boolean getBoolean(String, String, boolean); + method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(String, String, float); + method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static int getInt(String, String, int); + method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static long getLong(String, String, long); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getProperty(String, String); + method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static String getString(String, String, String); method public static void removeOnPropertyChangedListener(android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String); method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(String, String, String, boolean); + field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager"; field public static final String NAMESPACE_AUTOFILL = "autofill"; field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture"; field public static final String NAMESPACE_GAME_DRIVER = "game_driver"; @@ -5803,19 +5844,6 @@ package android.provider { field public static final String NAMESPACE_SYSTEMUI = "systemui"; } - public static interface DeviceConfig.ActivityManager { - field public static final String KEY_COMPACT_ACTION_1 = "compact_action_1"; - field public static final String KEY_COMPACT_ACTION_2 = "compact_action_2"; - field public static final String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate"; - field public static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1"; - field public static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2"; - field public static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3"; - field public static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4"; - field public static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes"; - field public static final String KEY_USE_COMPACTION = "use_compaction"; - field public static final String NAMESPACE = "activity_manager"; - } - public static interface DeviceConfig.ActivityManagerNativeBoot { field public static final String NAMESPACE = "activity_manager_native_boot"; field public static final String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled"; @@ -6365,9 +6393,8 @@ package android.service.autofill.augmented { public static final class FillResponse.Builder { ctor public FillResponse.Builder(); - method public android.service.autofill.augmented.FillResponse build(); - method public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow); - method public android.service.autofill.augmented.FillResponse.Builder setIgnoredIds(@NonNull java.util.List<android.view.autofill.AutofillId>); + method @NonNull public android.service.autofill.augmented.FillResponse build(); + method @NonNull public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow); } public final class FillWindow implements java.lang.AutoCloseable { @@ -6415,9 +6442,9 @@ package android.service.contentcapture { public final class SnapshotData implements android.os.Parcelable { method public int describeContents(); - method public android.app.assist.AssistContent getAssistContent(); - method public android.os.Bundle getAssistData(); - method public android.app.assist.AssistStructure getAssistStructure(); + method @Nullable public android.app.assist.AssistContent getAssistContent(); + method @NonNull public android.os.Bundle getAssistData(); + method @NonNull public android.app.assist.AssistStructure getAssistStructure(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR; } @@ -7661,7 +7688,7 @@ package android.telephony { method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onCallDisconnectCauseChanged(int, int); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onImsCallDisconnectCauseChanged(@NonNull android.telephony.ims.ImsReasonInfo); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseCallStateChanged(@NonNull android.telephony.PreciseCallState); - method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseDataConnectionStateChanged(android.telephony.PreciseDataConnectionState); + method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onPreciseDataConnectionStateChanged(@NonNull android.telephony.PreciseDataConnectionState); method public void onRadioPowerStateChanged(int); method public void onSrvccStateChanged(int); method public void onVoiceActivationStateChanged(int); @@ -7696,7 +7723,7 @@ package android.telephony { public final class PreciseDataConnectionState implements android.os.Parcelable { method public int describeContents(); - method public String getDataConnectionApn(); + method @Nullable public String getDataConnectionApn(); method public int getDataConnectionApnTypeBitMask(); method public int getDataConnectionFailCause(); method public int getDataConnectionState(); @@ -7851,17 +7878,17 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @NonNull java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSubscriptionEnabled(int, boolean); - field public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI; + field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI; field public static final int PROFILE_CLASS_DEFAULT = -1; // 0xffffffff field public static final int PROFILE_CLASS_OPERATIONAL = 2; // 0x2 field public static final int PROFILE_CLASS_PROVISIONING = 1; // 0x1 field public static final int PROFILE_CLASS_TESTING = 0; // 0x0 field public static final int PROFILE_CLASS_UNSET = -1; // 0xffffffff - field public static final android.net.Uri VT_ENABLED_CONTENT_URI; - field public static final android.net.Uri WFC_ENABLED_CONTENT_URI; - field public static final android.net.Uri WFC_MODE_CONTENT_URI; - field public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI; - field public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI; + field @NonNull public static final android.net.Uri VT_ENABLED_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_ENABLED_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_MODE_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI; } public static class SubscriptionPlan.Builder { @@ -8493,14 +8520,14 @@ package android.telephony.ims { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVtSettingEnabled(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerMmTelCapabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSetting(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean, int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSetting(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSetting(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSetting(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterMmTelCapabilityCallback(@NonNull android.telephony.ims.ImsMmTelManager.CapabilityCallback); field public static final int WIFI_MODE_CELLULAR_PREFERRED = 1; // 0x1 @@ -8515,10 +8542,10 @@ package android.telephony.ims { public static class ImsMmTelManager.RegistrationCallback { ctor public ImsMmTelManager.RegistrationCallback(); - method public void onDeregistered(android.telephony.ims.ImsReasonInfo); method public void onRegistered(int); method public void onRegistering(int); method public void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo); + method public void onUnregistered(android.telephony.ims.ImsReasonInfo); } public final class ImsReasonInfo implements android.os.Parcelable { @@ -9808,7 +9835,7 @@ package android.webkit { method public default void onMovedToDisplay(int, android.content.res.Configuration); method public void onOverScrolled(int, int, boolean, boolean); method public default void onProvideAutofillVirtualStructure(android.view.ViewStructure, int); - method public default void onProvideContentCaptureStructure(android.view.ViewStructure, int); + method public default void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int); method public void onProvideVirtualStructure(android.view.ViewStructure); method public void onScrollChanged(int, int, int, int); method public void onSizeChanged(int, int, int, int); diff --git a/api/test-current.txt b/api/test-current.txt index 1089761a3ab1..c5e535e65f9e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -271,6 +271,10 @@ package android.app { method public void onOpActiveChanged(int, int, String, boolean); } + public class DownloadManager { + field public static final String COLUMN_MEDIASTORE_URI = "mediastore_uri"; + } + public final class NotificationChannel implements android.os.Parcelable { method public boolean isImportanceLockedByOEM(); method public void setImportanceLockedByOEM(boolean); @@ -778,12 +782,12 @@ package android.hardware.display { public static class BrightnessConfiguration.Builder { ctor public BrightnessConfiguration.Builder(float[], float[]); - method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection); - method public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection); - method public android.hardware.display.BrightnessConfiguration build(); + method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection); + method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection); + method @NonNull public android.hardware.display.BrightnessConfiguration build(); method public int getMaxCorrectionsByCategory(); method public int getMaxCorrectionsByPackageName(); - method public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String); + method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String); } public final class BrightnessCorrection implements android.os.Parcelable { @@ -1921,7 +1925,12 @@ package android.provider { public final class DeviceConfig { method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener); + method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static boolean getBoolean(String, String, boolean); + method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static float getFloat(String, String, float); + method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static int getInt(String, String, int); + method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static long getLong(String, String, long); method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getProperty(String, String); + method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getString(String, String, String); method public static void removeOnPropertyChangedListener(android.provider.DeviceConfig.OnPropertyChangedListener); method @RequiresPermission("android.permission.WRITE_DEVICE_CONFIG") public static void resetToDefaults(int, @Nullable String); method @RequiresPermission("android.permission.WRITE_DEVICE_CONFIG") public static boolean setProperty(String, String, String, boolean); @@ -2203,9 +2212,8 @@ package android.service.autofill.augmented { public static final class FillResponse.Builder { ctor public FillResponse.Builder(); - method public android.service.autofill.augmented.FillResponse build(); - method public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow); - method public android.service.autofill.augmented.FillResponse.Builder setIgnoredIds(@NonNull java.util.List<android.view.autofill.AutofillId>); + method @NonNull public android.service.autofill.augmented.FillResponse build(); + method @NonNull public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow); } public final class FillWindow implements java.lang.AutoCloseable { @@ -2243,9 +2251,9 @@ package android.service.contentcapture { public final class SnapshotData implements android.os.Parcelable { method public int describeContents(); - method public android.app.assist.AssistContent getAssistContent(); - method public android.os.Bundle getAssistData(); - method public android.app.assist.AssistStructure getAssistStructure(); + method @Nullable public android.app.assist.AssistContent getAssistContent(); + method @NonNull public android.os.Bundle getAssistData(); + method @NonNull public android.app.assist.AssistStructure getAssistStructure(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR; } diff --git a/cmds/idmap2/idmap2/Create.cpp b/cmds/idmap2/idmap2/Create.cpp index 6703909d887e..c416fa123b73 100644 --- a/cmds/idmap2/idmap2/Create.cpp +++ b/cmds/idmap2/idmap2/Create.cpp @@ -28,7 +28,6 @@ #include "idmap2/FileUtils.h" #include "idmap2/Idmap.h" #include "idmap2/Policies.h" -#include "idmap2/Result.h" #include "idmap2/SysTrace.h" using android::ApkAssets; @@ -38,7 +37,6 @@ using android::idmap2::Idmap; using android::idmap2::PoliciesToBitmask; using android::idmap2::PolicyBitmask; using android::idmap2::PolicyFlags; -using android::idmap2::Result; using android::idmap2::utils::kIdmapFilePermissionMask; using android::idmap2::utils::UidHasWriteAccessToPath; @@ -77,9 +75,11 @@ bool Create(const std::vector<std::string>& args, std::ostream& out_error) { } PolicyBitmask fulfilled_policies = 0; - if (auto result = PoliciesToBitmask(policies, out_error)) { - fulfilled_policies |= *result; + auto conv_result = PoliciesToBitmask(policies); + if (conv_result) { + fulfilled_policies |= *conv_result; } else { + out_error << "error: " << conv_result.GetErrorMessage() << std::endl; return false; } diff --git a/cmds/idmap2/idmap2/Lookup.cpp b/cmds/idmap2/idmap2/Lookup.cpp index 553d8cac99e4..83a40efee3f3 100644 --- a/cmds/idmap2/idmap2/Lookup.cpp +++ b/cmds/idmap2/idmap2/Lookup.cpp @@ -53,6 +53,7 @@ using android::ResTable_config; using android::StringPiece16; using android::base::StringPrintf; using android::idmap2::CommandLineOptions; +using android::idmap2::Error; using android::idmap2::IdmapHeader; using android::idmap2::ResourceId; using android::idmap2::Result; @@ -71,17 +72,17 @@ Result<ResourceId> WARN_UNUSED ParseResReference(const AssetManager2& am, const ResourceId resid; resid = strtol(res.c_str(), &endptr, kBaseHex); if (*endptr == '\0') { - return {resid}; + return resid; } // next, try to parse as a package:type/name string resid = am.GetResourceId(res, "", fallback_package); if (is_valid_resid(resid)) { - return {resid}; + return resid; } // end of the road: res could not be parsed - return {}; + return Error("failed to obtain resource id for %s", res.c_str()); } Result<std::string> WARN_UNUSED GetValue(const AssetManager2& am, ResourceId resid) { @@ -90,7 +91,7 @@ Result<std::string> WARN_UNUSED GetValue(const AssetManager2& am, ResourceId res uint32_t flags; ApkAssetsCookie cookie = am.GetResource(resid, false, 0, &value, &config, &flags); if (cookie == kInvalidCookie) { - return {}; + return Error("no resource 0x%08x in asset manager", resid); } std::string out; @@ -128,31 +129,31 @@ Result<std::string> WARN_UNUSED GetValue(const AssetManager2& am, ResourceId res out.append(StringPrintf("dataType=0x%02x data=0x%08x", value.dataType, value.data)); break; } - return {out}; + return out; } Result<std::string> GetTargetPackageNameFromManifest(const std::string& apk_path) { const auto zip = ZipFile::Open(apk_path); if (!zip) { - return {}; + return Error("failed to open %s as zip", apk_path.c_str()); } const auto entry = zip->Uncompress("AndroidManifest.xml"); if (!entry) { - return {}; + return Error("failed to uncompress AndroidManifest.xml in %s", apk_path.c_str()); } const auto xml = Xml::Create(entry->buf, entry->size); if (!xml) { - return {}; + return Error("failed to create XML buffer"); } const auto tag = xml->FindTag("overlay"); if (!tag) { - return {}; + return Error("failed to find <overlay> tag"); } const auto iter = tag->find("targetPackage"); if (iter == tag->end()) { - return {}; + return Error("failed to find targetPackage attribute"); } - return {iter->second}; + return iter->second; } } // namespace diff --git a/cmds/idmap2/idmap2/Scan.cpp b/cmds/idmap2/idmap2/Scan.cpp index 873779f386f5..e5f6223ef2b4 100644 --- a/cmds/idmap2/idmap2/Scan.cpp +++ b/cmds/idmap2/idmap2/Scan.cpp @@ -142,9 +142,9 @@ bool Scan(const std::vector<std::string>& args, std::ostream& out_error) { std::vector<InputOverlay> interesting_apks; for (const std::string& path : *apk_paths) { Result<OverlayManifestInfo> overlay_info = - ExtractOverlayManifestInfo(path, out_error, - /* assert_overlay */ false); + ExtractOverlayManifestInfo(path, /* assert_overlay */ false); if (!overlay_info) { + out_error << "error: " << overlay_info.GetErrorMessage() << std::endl; return false; } @@ -163,9 +163,11 @@ bool Scan(const std::vector<std::string>& args, std::ostream& out_error) { PolicyBitmask fulfilled_policies; if (!override_policies.empty()) { - if (Result<PolicyBitmask> result = PoliciesToBitmask(override_policies, out_error)) { - fulfilled_policies = *result; + auto conv_result = PoliciesToBitmask(override_policies); + if (conv_result) { + fulfilled_policies = *conv_result; } else { + out_error << "error: " << conv_result.GetErrorMessage() << std::endl; return false; } } else { diff --git a/cmds/idmap2/idmap2d/Idmap2Service.cpp b/cmds/idmap2/idmap2d/Idmap2Service.cpp index 0e4bd89e355c..fa944143e408 100644 --- a/cmds/idmap2/idmap2d/Idmap2Service.cpp +++ b/cmds/idmap2/idmap2d/Idmap2Service.cpp @@ -34,7 +34,6 @@ #include "idmap2/FileUtils.h" #include "idmap2/Idmap.h" #include "idmap2/Policies.h" -#include "idmap2/Result.h" #include "idmap2/SysTrace.h" #include "idmap2d/Idmap2Service.h" @@ -45,7 +44,6 @@ using android::idmap2::BinaryStreamVisitor; using android::idmap2::Idmap; using android::idmap2::IdmapHeader; using android::idmap2::PolicyBitmask; -using android::idmap2::Result; using android::idmap2::utils::kIdmapCacheDir; using android::idmap2::utils::kIdmapFilePermissionMask; using android::idmap2::utils::UidHasWriteAccessToPath; diff --git a/cmds/idmap2/include/idmap2/Policies.h b/cmds/idmap2/include/idmap2/Policies.h index eecee25445e2..911d3f2cd109 100644 --- a/cmds/idmap2/include/idmap2/Policies.h +++ b/cmds/idmap2/include/idmap2/Policies.h @@ -14,7 +14,6 @@ * limitations under the License. */ -#include <ostream> #include <string> #include <vector> @@ -33,8 +32,7 @@ using PolicyBitmask = uint32_t; // Parses a the string representation of a set of policies into a bitmask. The format of the string // is the same as for the <policy> element. -Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies, - std::ostream& err); +Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies); } // namespace android::idmap2 diff --git a/cmds/idmap2/include/idmap2/ResourceUtils.h b/cmds/idmap2/include/idmap2/ResourceUtils.h index 22827ac45f9b..1d81c486d504 100644 --- a/cmds/idmap2/include/idmap2/ResourceUtils.h +++ b/cmds/idmap2/include/idmap2/ResourceUtils.h @@ -18,10 +18,8 @@ #define IDMAP2_INCLUDE_IDMAP2_RESOURCEUTILS_H_ #include <optional> -#include <ostream> #include <string> -#include "android-base/macros.h" #include "androidfw/AssetManager2.h" #include "idmap2/Idmap.h" @@ -38,10 +36,9 @@ struct OverlayManifestInfo { }; Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path, - std::ostream& out_error, bool assert_overlay = true); -Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, ResourceId resid); +Result<std::string> ResToTypeEntryName(const AssetManager2& am, ResourceId resid); } // namespace android::idmap2::utils diff --git a/cmds/idmap2/include/idmap2/Result.h b/cmds/idmap2/include/idmap2/Result.h index d88dd5179610..41b15ebf4afc 100644 --- a/cmds/idmap2/include/idmap2/Result.h +++ b/cmds/idmap2/include/idmap2/Result.h @@ -17,7 +17,6 @@ #ifndef IDMAP2_INCLUDE_IDMAP2_RESULT_H_ #define IDMAP2_INCLUDE_IDMAP2_RESULT_H_ -#include <optional> #include <string> #include <utility> #include <variant> @@ -26,13 +25,6 @@ namespace android::idmap2 { -template <typename T> -using Result = std::optional<T>; - -static constexpr std::nullopt_t kResultError = std::nullopt; - -namespace v2 { - using Unit = std::monostate; class Error { @@ -148,8 +140,6 @@ inline bool Result<T>::is_ok() const { return std::holds_alternative<T>(data_); } -} // namespace v2 - } // namespace android::idmap2 #endif // IDMAP2_INCLUDE_IDMAP2_RESULT_H_ diff --git a/cmds/idmap2/libidmap2/Idmap.cpp b/cmds/idmap2/libidmap2/Idmap.cpp index ec498ffb393c..a1341fb001f6 100644 --- a/cmds/idmap2/libidmap2/Idmap.cpp +++ b/cmds/idmap2/libidmap2/Idmap.cpp @@ -121,7 +121,9 @@ const LoadedPackage* GetPackageAtIndex0(const LoadedArsc& loaded_arsc) { Result<uint32_t> GetCrc(const ZipFile& zip) { const Result<uint32_t> a = zip.Crc("resources.arsc"); const Result<uint32_t> b = zip.Crc("AndroidManifest.xml"); - return a && b ? Result<uint32_t>(*a ^ *b) : kResultError; + return a && b + ? Result<uint32_t>(*a ^ *b) + : Error("Couldn't get CRC for \"%s\"", a ? "AndroidManifest.xml" : "resources.arsc"); } } // namespace @@ -355,9 +357,9 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets( return nullptr; } - Result<utils::OverlayManifestInfo> overlay_info = - utils::ExtractOverlayManifestInfo(overlay_apk_path, out_error); + auto overlay_info = utils::ExtractOverlayManifestInfo(overlay_apk_path); if (!overlay_info) { + out_error << "error: " << overlay_info.GetErrorMessage() << std::endl; return nullptr; } diff --git a/cmds/idmap2/libidmap2/Policies.cpp b/cmds/idmap2/libidmap2/Policies.cpp index 6649288dfa41..c6ba87dfc2fb 100644 --- a/cmds/idmap2/libidmap2/Policies.cpp +++ b/cmds/idmap2/libidmap2/Policies.cpp @@ -16,7 +16,6 @@ #include <iterator> #include <map> -#include <sstream> #include <string> #include <vector> @@ -39,16 +38,14 @@ const std::map<android::StringPiece, PolicyFlags> kStringToFlag = { }; } // namespace -Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies, - std::ostream& err) { +Result<PolicyBitmask> PoliciesToBitmask(const std::vector<std::string>& policies) { PolicyBitmask bitmask = 0; for (const std::string& policy : policies) { const auto iter = kStringToFlag.find(policy); if (iter != kStringToFlag.end()) { bitmask |= iter->second; } else { - err << "error: unknown policy \"" << policy << "\""; - return kResultError; + return Error("unknown policy \"%s\"", policy.c_str()); } } diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp index b78e942d4049..1149c905a178 100644 --- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp @@ -75,7 +75,7 @@ void RawPrintVisitor::visit(const IdmapData::TypeEntry& type_entry) { type_entry.GetEntryOffset() + i); const ResourceId overlay_resid = RESID(last_seen_package_id_, type_entry.GetOverlayTypeId(), entry); - Result<std::string> name; + Result<std::string> name(Error("")); if (target_package_loaded) { name = utils::ResToTypeEntryName(target_am_, target_resid); } diff --git a/cmds/idmap2/libidmap2/ResourceUtils.cpp b/cmds/idmap2/libidmap2/ResourceUtils.cpp index 7a984f3f98ad..a24836da7f3a 100644 --- a/cmds/idmap2/libidmap2/ResourceUtils.cpp +++ b/cmds/idmap2/libidmap2/ResourceUtils.cpp @@ -33,10 +33,10 @@ using android::util::Utf16ToUtf8; namespace android::idmap2::utils { -Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, ResourceId resid) { +Result<std::string> ResToTypeEntryName(const AssetManager2& am, ResourceId resid) { AssetManager2::ResourceName name; if (!am.GetResourceName(resid, &name)) { - return {}; + return Error("no resource 0x%08x in asset manager", resid); } std::string out; if (name.type != nullptr) { @@ -50,36 +50,31 @@ Result<std::string> WARN_UNUSED ResToTypeEntryName(const AssetManager2& am, Reso } else { out += Utf16ToUtf8(StringPiece16(name.entry16, name.entry_len)); } - return {out}; + return out; } Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path, - std::ostream& out_error, bool assert_overlay) { std::unique_ptr<const ZipFile> zip = ZipFile::Open(path); if (!zip) { - out_error << "error: failed to open " << path << " as a zip file" << std::endl; - return kResultError; + return Error("failed to open %s as a zip file", path.c_str()); } std::unique_ptr<const MemoryChunk> entry = zip->Uncompress("AndroidManifest.xml"); if (!entry) { - out_error << "error: failed to uncompress AndroidManifest.xml from " << path << std::endl; - return kResultError; + return Error("failed to uncompress AndroidManifest.xml from %s", path.c_str()); } std::unique_ptr<const Xml> xml = Xml::Create(entry->buf, entry->size); if (!xml) { - out_error << "error: failed to parse AndroidManifest.xml from " << path << std::endl; - return kResultError; + return Error("failed to parse AndroidManifest.xml from %s", path.c_str()); } OverlayManifestInfo info{}; const auto tag = xml->FindTag("overlay"); if (!tag) { if (assert_overlay) { - out_error << "error: <overlay> missing from AndroidManifest.xml of " << path << std::endl; - return kResultError; + return Error("<overlay> missing from AndroidManifest.xml of %s", path.c_str()); } return info; } @@ -87,8 +82,7 @@ Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path, auto iter = tag->find("targetPackage"); if (iter == tag->end()) { if (assert_overlay) { - out_error << "error: android:targetPackage missing from <overlay> of " << path << std::endl; - return kResultError; + return Error("android:targetPackage missing from <overlay> of %s", path.c_str()); } } else { info.target_package = iter->second; diff --git a/cmds/idmap2/libidmap2/Result.cpp b/cmds/idmap2/libidmap2/Result.cpp index bd4fabd3bdac..471dab2e0411 100644 --- a/cmds/idmap2/libidmap2/Result.cpp +++ b/cmds/idmap2/libidmap2/Result.cpp @@ -23,7 +23,7 @@ namespace android::idmap2 { // NOLINTNEXTLINE(cert-dcl50-cpp) -v2::Error::Error(const char* fmt, ...) { +Error::Error(const char* fmt, ...) { va_list ap; va_start(ap, fmt); base::StringAppendV(&msg_, fmt, ap); @@ -31,7 +31,7 @@ v2::Error::Error(const char* fmt, ...) { } // NOLINTNEXTLINE(cert-dcl50-cpp) -v2::Error::Error(const Error& parent, const char* fmt, ...) : msg_(parent.msg_) { +Error::Error(const Error& parent, const char* fmt, ...) : msg_(parent.msg_) { msg_.append(" -> "); va_list ap; diff --git a/cmds/idmap2/libidmap2/ZipFile.cpp b/cmds/idmap2/libidmap2/ZipFile.cpp index 15ec3f9d3afe..0f0732466256 100644 --- a/cmds/idmap2/libidmap2/ZipFile.cpp +++ b/cmds/idmap2/libidmap2/ZipFile.cpp @@ -59,7 +59,10 @@ std::unique_ptr<const MemoryChunk> ZipFile::Uncompress(const std::string& entryP Result<uint32_t> ZipFile::Crc(const std::string& entryPath) const { ::ZipEntry entry; int32_t status = ::FindEntry(handle_, ::ZipString(entryPath.c_str()), &entry); - return status == 0 ? Result<uint32_t>(entry.crc32) : kResultError; + if (status != 0) { + return Error("failed to find zip entry %s", entryPath.c_str()); + } + return entry.crc32; } } // namespace android::idmap2 diff --git a/cmds/idmap2/tests/FileUtilsTests.cpp b/cmds/idmap2/tests/FileUtilsTests.cpp index 2e85eb6215d1..34a0097b0316 100644 --- a/cmds/idmap2/tests/FileUtilsTests.cpp +++ b/cmds/idmap2/tests/FileUtilsTests.cpp @@ -58,21 +58,15 @@ TEST(FileUtilsTests, FindFilesFindApkFilesRecursive) { }); ASSERT_THAT(v, NotNull()); ASSERT_EQ(v->size(), 10U); - ASSERT_EQ( - std::set<std::string>(v->begin(), v->end()), - std::set<std::string>( - { - root + "/target/target.apk", - root + "/target/target-no-overlayable.apk", - root + "/overlay/overlay.apk", - root + "/overlay/overlay-no-name.apk", - root + "/overlay/overlay-no-name-static.apk", - root + "/overlay/overlay-static-1.apk", - root + "/overlay/overlay-static-2.apk", - root + "/signature-overlay/signature-overlay.apk", - root + "/system-overlay/system-overlay.apk", - root + "/system-overlay-invalid/system-overlay-invalid.apk" - })); + ASSERT_EQ(std::set<std::string>(v->begin(), v->end()), + std::set<std::string>( + {root + "/target/target.apk", root + "/target/target-no-overlayable.apk", + root + "/overlay/overlay.apk", root + "/overlay/overlay-no-name.apk", + root + "/overlay/overlay-no-name-static.apk", + root + "/overlay/overlay-static-1.apk", root + "/overlay/overlay-static-2.apk", + root + "/signature-overlay/signature-overlay.apk", + root + "/system-overlay/system-overlay.apk", + root + "/system-overlay-invalid/system-overlay-invalid.apk"})); } TEST(FileUtilsTests, ReadFile) { diff --git a/cmds/idmap2/tests/IdmapTests.cpp b/cmds/idmap2/tests/IdmapTests.cpp index 53ec03ba3d5e..bbfbad9aa8ca 100644 --- a/cmds/idmap2/tests/IdmapTests.cpp +++ b/cmds/idmap2/tests/IdmapTests.cpp @@ -256,10 +256,10 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublic) { ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); ASSERT_EQ(types[0]->GetEntryCount(), 4U); ASSERT_EQ(types[0]->GetEntryOffset(), 6U); - ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_public - ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature - ASSERT_EQ(types[0]->GetEntry(2), 0x0001U); // string/policy_system - ASSERT_EQ(types[0]->GetEntry(3), 0x0002U); // string/policy_system_vendor + ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_public + ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature + ASSERT_EQ(types[0]->GetEntry(2), 0x0001U); // string/policy_system + ASSERT_EQ(types[0]->GetEntry(3), 0x0002U); // string/policy_system_vendor } TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) { @@ -267,7 +267,8 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) { std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path); ASSERT_THAT(target_apk, NotNull()); - const std::string overlay_apk_path(GetTestDataPath() + "/signature-overlay/signature-overlay.apk"); + const std::string overlay_apk_path(GetTestDataPath() + + "/signature-overlay/signature-overlay.apk"); std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); @@ -294,7 +295,7 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignature) { ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); ASSERT_EQ(types[0]->GetEntryCount(), 1U); ASSERT_EQ(types[0]->GetEntryOffset(), 7U); - ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_signature + ASSERT_EQ(types[0]->GetEntry(0), 0x0000U); // string/policy_signature } TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignatureNotFulfilled) { @@ -302,7 +303,8 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignatureNotFulfilled) std::unique_ptr<const ApkAssets> target_apk = ApkAssets::Load(target_apk_path); ASSERT_THAT(target_apk, NotNull()); - const std::string overlay_apk_path(GetTestDataPath() + "/signature-overlay/signature-overlay.apk"); + const std::string overlay_apk_path(GetTestDataPath() + + "/signature-overlay/signature-overlay.apk"); std::unique_ptr<const ApkAssets> overlay_apk = ApkAssets::Load(overlay_apk_path); ASSERT_THAT(overlay_apk, NotNull()); @@ -323,7 +325,7 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySignatureNotFulfilled) ASSERT_EQ(data->GetHeader()->GetTypeCount(), 0U); const std::vector<std::unique_ptr<const IdmapData::TypeEntry>>& types = data->GetTypeEntries(); - ASSERT_EQ(types.size(), 0U); // can't overlay, so contains nothing + ASSERT_EQ(types.size(), 0U); // can't overlay, so contains nothing } // Overlays should abide by all overlayable restrictions if enforcement of overlayable is enabled. @@ -359,10 +361,10 @@ TEST(IdmapOverlayableTests, CreateIdmapFromApkAssetsPolicySystemPublicInvalid) { ASSERT_EQ(types[0]->GetOverlayTypeId(), 0x01U); ASSERT_EQ(types[0]->GetEntryCount(), 4U); ASSERT_EQ(types[0]->GetEntryOffset(), 6U); - ASSERT_EQ(types[0]->GetEntry(0), 0x0003U); // string/policy_public - ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature - ASSERT_EQ(types[0]->GetEntry(2), 0x0005U); // string/policy_system - ASSERT_EQ(types[0]->GetEntry(3), 0x0006U); // string/policy_system_vendor + ASSERT_EQ(types[0]->GetEntry(0), 0x0003U); // string/policy_public + ASSERT_EQ(types[0]->GetEntry(1), kNoEntry); // string/policy_signature + ASSERT_EQ(types[0]->GetEntry(2), 0x0005U); // string/policy_system + ASSERT_EQ(types[0]->GetEntry(3), 0x0006U); // string/policy_system_vendor } // Overlays should ignore all overlayable restrictions if enforcement of overlayable is disabled. diff --git a/cmds/idmap2/tests/PoliciesTests.cpp b/cmds/idmap2/tests/PoliciesTests.cpp index ab567adc6f19..a76da533cdcb 100644 --- a/cmds/idmap2/tests/PoliciesTests.cpp +++ b/cmds/idmap2/tests/PoliciesTests.cpp @@ -27,44 +27,42 @@ using android::idmap2::PolicyFlags; namespace android::idmap2 { TEST(PoliciesTests, PoliciesToBitmasks) { - const Result<PolicyBitmask> bitmask1 = PoliciesToBitmask({"system"}, std::cerr); - ASSERT_NE(bitmask1, kResultError); - ASSERT_EQ(bitmask1, PolicyFlags::POLICY_SYSTEM_PARTITION); + const auto bitmask1 = PoliciesToBitmask({"system"}); + ASSERT_TRUE(bitmask1); + ASSERT_EQ(*bitmask1, PolicyFlags::POLICY_SYSTEM_PARTITION); - const Result<PolicyBitmask> bitmask2 = PoliciesToBitmask({"system", "vendor"}, std::cerr); - ASSERT_NE(bitmask2, kResultError); - ASSERT_EQ(bitmask2, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION); + const auto bitmask2 = PoliciesToBitmask({"system", "vendor"}); + ASSERT_TRUE(bitmask2); + ASSERT_EQ(*bitmask2, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION); - const Result<PolicyBitmask> bitmask3 = PoliciesToBitmask({"vendor", "system"}, std::cerr); - ASSERT_NE(bitmask3, kResultError); - ASSERT_EQ(bitmask3, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION); + const auto bitmask3 = PoliciesToBitmask({"vendor", "system"}); + ASSERT_TRUE(bitmask3); + ASSERT_EQ(*bitmask3, PolicyFlags::POLICY_SYSTEM_PARTITION | PolicyFlags::POLICY_VENDOR_PARTITION); - const Result<PolicyBitmask> bitmask4 = - PoliciesToBitmask({"public", "product", "system", "vendor"}, std::cerr); - ASSERT_NE(bitmask4, kResultError); - ASSERT_EQ(bitmask4, PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION | - PolicyFlags::POLICY_SYSTEM_PARTITION | - PolicyFlags::POLICY_VENDOR_PARTITION); + const auto bitmask4 = PoliciesToBitmask({"public", "product", "system", "vendor"}); + ASSERT_TRUE(bitmask4); + ASSERT_EQ(*bitmask4, PolicyFlags::POLICY_PUBLIC | PolicyFlags::POLICY_PRODUCT_PARTITION | + PolicyFlags::POLICY_SYSTEM_PARTITION | + PolicyFlags::POLICY_VENDOR_PARTITION); - const Result<PolicyBitmask> bitmask5 = - PoliciesToBitmask({"system", "system", "system"}, std::cerr); - ASSERT_NE(bitmask5, kResultError); - ASSERT_EQ(bitmask5, PolicyFlags::POLICY_SYSTEM_PARTITION); + const auto bitmask5 = PoliciesToBitmask({"system", "system", "system"}); + ASSERT_TRUE(bitmask5); + ASSERT_EQ(*bitmask5, PolicyFlags::POLICY_SYSTEM_PARTITION); - const Result<PolicyBitmask> bitmask6 = PoliciesToBitmask({""}, std::cerr); - ASSERT_EQ(bitmask6, kResultError); + const auto bitmask6 = PoliciesToBitmask({""}); + ASSERT_FALSE(bitmask6); - const Result<PolicyBitmask> bitmask7 = PoliciesToBitmask({"foo"}, std::cerr); - ASSERT_EQ(bitmask7, kResultError); + const auto bitmask7 = PoliciesToBitmask({"foo"}); + ASSERT_FALSE(bitmask7); - const Result<PolicyBitmask> bitmask8 = PoliciesToBitmask({"system", "foo"}, std::cerr); - ASSERT_EQ(bitmask8, kResultError); + const auto bitmask8 = PoliciesToBitmask({"system", "foo"}); + ASSERT_FALSE(bitmask8); - const Result<PolicyBitmask> bitmask9 = PoliciesToBitmask({"system", ""}, std::cerr); - ASSERT_EQ(bitmask9, kResultError); + const auto bitmask9 = PoliciesToBitmask({"system", ""}); + ASSERT_FALSE(bitmask9); - const Result<PolicyBitmask> bitmask10 = PoliciesToBitmask({"system "}, std::cerr); - ASSERT_EQ(bitmask10, kResultError); + const auto bitmask10 = PoliciesToBitmask({"system "}); + ASSERT_FALSE(bitmask10); } } // namespace android::idmap2 diff --git a/cmds/idmap2/tests/ResultTests.cpp b/cmds/idmap2/tests/ResultTests.cpp index d82f0c475ea9..5f4daed521c0 100644 --- a/cmds/idmap2/tests/ResultTests.cpp +++ b/cmds/idmap2/tests/ResultTests.cpp @@ -32,28 +32,28 @@ struct Container { // Tests: Error TEST(ResultTests, ErrorTraits) { - ASSERT_TRUE(std::is_move_constructible<v2::Error>::value); - ASSERT_TRUE(std::is_move_assignable<v2::Error>::value); - ASSERT_TRUE(std::is_copy_constructible<v2::Error>::value); - ASSERT_TRUE(std::is_copy_assignable<v2::Error>::value); + ASSERT_TRUE(std::is_move_constructible<Error>::value); + ASSERT_TRUE(std::is_move_assignable<Error>::value); + ASSERT_TRUE(std::is_copy_constructible<Error>::value); + ASSERT_TRUE(std::is_copy_assignable<Error>::value); } TEST(ResultTests, ErrorCtorFormat) { - v2::Error e("%s=0x%08x", "resid", 0x7f010002); + Error e("%s=0x%08x", "resid", 0x7f010002); ASSERT_EQ(e.GetMessage(), "resid=0x7f010002"); } TEST(ResultTests, ErrorPropagateParent) { - v2::Error e1("foo"); + Error e1("foo"); ASSERT_EQ(e1.GetMessage(), "foo"); - v2::Error e2(e1, "bar"); + Error e2(e1, "bar"); ASSERT_EQ(e2.GetMessage(), "foo -> bar"); - v2::Error e3(e2); // NOLINT(performance-unnecessary-copy-initialization) + Error e3(e2); // NOLINT(performance-unnecessary-copy-initialization) ASSERT_EQ(e3.GetMessage(), "foo -> bar"); - v2::Error e4(e3, "%02d", 1); + Error e4(e3, "%02d", 1); ASSERT_EQ(e4.GetMessage(), "foo -> bar -> 01"); } @@ -61,13 +61,13 @@ TEST(ResultTests, ErrorPropagateParent) { // Result(const Result&) TEST(ResultTests, CopyConstructor) { - v2::Result<uint32_t> r1(42U); + Result<uint32_t> r1(42U); - v2::Result<uint32_t> r2(r1); + Result<uint32_t> r2(r1); ASSERT_TRUE(r2); ASSERT_EQ(*r2, 42U); - v2::Result<uint32_t> r3 = r2; + Result<uint32_t> r3 = r2; ASSERT_TRUE(r3); ASSERT_EQ(*r3, 42U); } @@ -75,23 +75,23 @@ TEST(ResultTests, CopyConstructor) { // Result(const T&) TEST(ResultTests, Constructor) { uint32_t v = 42U; - v2::Result<uint32_t> r1(v); + Result<uint32_t> r1(v); ASSERT_TRUE(r1); ASSERT_EQ(*r1, 42U); - v2::Error e("foo"); - v2::Result<uint32_t> r2(e); + Error e("foo"); + Result<uint32_t> r2(e); ASSERT_FALSE(r2); ASSERT_EQ(r2.GetErrorMessage(), "foo"); } // Result(const T&&) TEST(ResultTests, MoveConstructor) { - v2::Result<uint32_t> r1(42U); + Result<uint32_t> r1(42U); ASSERT_TRUE(r1); ASSERT_EQ(*r1, 42U); - v2::Result<uint32_t> r2(v2::Error("foo")); + Result<uint32_t> r2(Error("foo")); ASSERT_FALSE(r2); ASSERT_EQ(r2.GetErrorMessage(), "foo"); } @@ -99,52 +99,52 @@ TEST(ResultTests, MoveConstructor) { // operator= TEST(ResultTests, CopyAssignmentOperator) { // note: 'Result<...> r2 = r1;' calls the copy ctor - v2::Result<uint32_t> r1(42U); - v2::Result<uint32_t> r2(0U); + Result<uint32_t> r1(42U); + Result<uint32_t> r2(0U); r2 = r1; ASSERT_TRUE(r2); ASSERT_EQ(*r2, 42U); - v2::Result<uint32_t> r3(v2::Error("foo")); + Result<uint32_t> r3(Error("foo")); r2 = r3; ASSERT_FALSE(r2); ASSERT_EQ(r2.GetErrorMessage(), "foo"); } TEST(ResultTests, MoveAssignmentOperator) { - v2::Result<uint32_t> r(0U); - r = v2::Result<uint32_t>(42U); + Result<uint32_t> r(0U); + r = Result<uint32_t>(42U); ASSERT_TRUE(r); ASSERT_EQ(*r, 42U); - r = v2::Result<uint32_t>(v2::Error("foo")); + r = Result<uint32_t>(Error("foo")); ASSERT_FALSE(r); ASSERT_EQ(r.GetErrorMessage(), "foo"); } // operator bool() TEST(ResultTests, BoolOperator) { - v2::Result<uint32_t> r1(42U); + Result<uint32_t> r1(42U); ASSERT_TRUE(r1); ASSERT_EQ(*r1, 42U); - v2::Result<uint32_t> r2(v2::Error("foo")); + Result<uint32_t> r2(Error("foo")); ASSERT_FALSE(r2); ASSERT_EQ(r2.GetErrorMessage(), "foo"); } // operator* TEST(ResultTests, IndirectionOperator) { - const v2::Result<uint32_t> r1(42U); + const Result<uint32_t> r1(42U); ASSERT_TRUE(r1); ASSERT_EQ(*r1, 42U); - const v2::Result<Container> r2(Container{42U}); + const Result<Container> r2(Container{42U}); ASSERT_TRUE(r2); const Container& c = *r2; ASSERT_EQ(c.value, 42U); - v2::Result<Container> r3(Container{42U}); + Result<Container> r3(Container{42U}); ASSERT_TRUE(r3); ASSERT_EQ((*r3).value, 42U); (*r3).value = 0U; @@ -153,11 +153,11 @@ TEST(ResultTests, IndirectionOperator) { // operator-> TEST(ResultTests, DereferenceOperator) { - const v2::Result<Container> r1(Container{42U}); + const Result<Container> r1(Container{42U}); ASSERT_TRUE(r1); ASSERT_EQ(r1->value, 42U); - v2::Result<Container> r2(Container{42U}); + Result<Container> r2(Container{42U}); ASSERT_TRUE(r2); ASSERT_EQ(r2->value, 42U); r2->value = 0U; @@ -167,14 +167,14 @@ TEST(ResultTests, DereferenceOperator) { // Tests: intended use of Result<T> TEST(ResultTests, ResultTraits) { - ASSERT_TRUE(std::is_move_constructible<v2::Result<uint32_t>>::value); - ASSERT_TRUE(std::is_move_assignable<v2::Result<uint32_t>>::value); - ASSERT_TRUE(std::is_copy_constructible<v2::Result<uint32_t>>::value); - ASSERT_TRUE(std::is_copy_assignable<v2::Result<uint32_t>>::value); + ASSERT_TRUE(std::is_move_constructible<Result<uint32_t>>::value); + ASSERT_TRUE(std::is_move_assignable<Result<uint32_t>>::value); + ASSERT_TRUE(std::is_copy_constructible<Result<uint32_t>>::value); + ASSERT_TRUE(std::is_copy_assignable<Result<uint32_t>>::value); } TEST(ResultTests, UnitTypeResult) { - v2::Result<v2::Unit> r(v2::Unit{}); + Result<Unit> r(Unit{}); ASSERT_TRUE(r); } @@ -220,16 +220,16 @@ TEST(ResultTests, ReferenceCount) { ASSERT_FALSE(std::is_copy_assignable<RefCountContainer>::value); RefCountData rc{0, 0, 0, 0}; - { v2::Result<RefCountContainer> r(RefCountContainer{rc}); } + { Result<RefCountContainer> r(RefCountContainer{rc}); } ASSERT_EQ(rc.ctor, 1); ASSERT_EQ(rc.copy_ctor, 1); ASSERT_EQ(rc.move, 0); ASSERT_EQ(rc.dtor, 2); } -v2::Result<Container> CreateContainer(bool succeed) { +Result<Container> CreateContainer(bool succeed) { if (!succeed) { - return v2::Error("foo"); + return Error("foo"); } return Container{42U}; } @@ -245,10 +245,10 @@ TEST(ResultTests, FunctionReturn) { ASSERT_EQ(r2.GetError().GetMessage(), "foo"); } -v2::Result<Container> FailToCreateContainer() { +Result<Container> FailToCreateContainer() { auto container = CreateContainer(false); if (!container) { - return v2::Error(container.GetError(), "bar"); + return Error(container.GetError(), "bar"); } return container; } @@ -264,9 +264,9 @@ struct NoCopyContainer { DISALLOW_COPY_AND_ASSIGN(NoCopyContainer); }; -v2::Result<std::unique_ptr<NoCopyContainer>> CreateNoCopyContainer(bool succeed) { +Result<std::unique_ptr<NoCopyContainer>> CreateNoCopyContainer(bool succeed) { if (!succeed) { - return v2::Error("foo"); + return Error("foo"); } std::unique_ptr<NoCopyContainer> p(new NoCopyContainer{0U}); p->value = 42U; diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index be5a5bf6c35a..4a6f87f09d29 100644 --- a/cmds/sm/src/com/android/commands/sm/Sm.java +++ b/cmds/sm/src/com/android/commands/sm/Sm.java @@ -103,6 +103,8 @@ public final class Sm { runSetVirtualDisk(); } else if ("set-isolated-storage".equals(op)) { runIsolatedStorage(); + } else if ("set-legacy-greylist".equals(op)) { + runLegacyGreylist(); } else { throw new IllegalArgumentException(); } @@ -282,7 +284,7 @@ public final class Sm { StorageManager.DEBUG_VIRTUAL_DISK); } - public void runIsolatedStorage() { + public void runIsolatedStorage() throws RemoteException { final int value; final int mask = StorageManager.DEBUG_ISOLATED_STORAGE_FORCE_ON | StorageManager.DEBUG_ISOLATED_STORAGE_FORCE_OFF; @@ -301,16 +303,13 @@ public final class Sm { default: return; } + mSm.setDebugFlags(value, mask); + } - // Toggling isolated-storage state will result in a device reboot. So to avoid this command - // from erroring out (DeadSystemException), call setDebugFlags() in a separate thread. - new Thread(() -> { - try { - mSm.setDebugFlags(value, mask); - } catch (RemoteException e) { - Log.e(TAG, "Encountered an error!", e); - } - }).start(); + public void runLegacyGreylist() throws RemoteException { + final boolean legacyGreylist = Boolean.parseBoolean(nextArg()); + mSm.setDebugFlags(legacyGreylist ? StorageManager.DEBUG_LEGACY_GREYLIST : 0, + StorageManager.DEBUG_LEGACY_GREYLIST); } public void runIdleMaint() throws RemoteException { diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 1dd68df36ba8..b6474001deba 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -5528,8 +5528,9 @@ message ScheduledJobConstraintChanged { optional com.android.server.job.ConstraintEnum constraint = 3; enum State { - UNSATISFIED = 0; - SATISFIED = 1; + UNKNOWN = 0; + UNSATISFIED = 1; + SATISFIED = 2; } optional State state = 4; } diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h index 99cb5d4389c7..046f9963b351 100644 --- a/cmds/statsd/src/metrics/MetricProducer.h +++ b/cmds/statsd/src/metrics/MetricProducer.h @@ -69,7 +69,7 @@ public: mTimeBaseNs(timeBaseNs), mCurrentBucketStartTimeNs(timeBaseNs), mCurrentBucketNum(0), - mCondition(conditionIndex >= 0 ? ConditionState::kUnknown : ConditionState::kTrue), + mCondition(initialCondition(conditionIndex)), mConditionSliced(false), mWizard(wizard), mConditionTrackerIndex(conditionIndex), @@ -82,6 +82,10 @@ public: virtual ~MetricProducer(){}; + ConditionState initialCondition(const int conditionIndex) const { + return conditionIndex >= 0 ? ConditionState::kUnknown : ConditionState::kTrue; + } + /** * Forces this metric to split into a partial bucket right now. If we're past a full bucket, we * first call the standard flushing code to flush up to the latest full bucket. Then we call diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index 9de62a2cce03..27ee57013fda 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -394,7 +394,7 @@ void ValueMetricProducer::onConditionChangedLocked(const bool condition, invalidateCurrentBucket(); // Something weird happened. If we received another event if the future, the condition might // be wrong. - mCondition = ConditionState::kUnknown; + mCondition = initialCondition(mConditionTrackerIndex); } // This part should alway be called. diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index e25f463a9442..07fba3ba9ce4 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -437,7 +437,6 @@ Landroid/content/pm/IShortcutService$Stub;->asInterface(Landroid/os/IBinder;)Lan Landroid/content/res/ConfigurationBoundResourceCache;-><init>()V Landroid/content/res/DrawableCache;-><init>()V Landroid/content/UndoManager;-><init>()V -Landroid/database/BulkCursorProxy;->mRemote:Landroid/os/IBinder; Landroid/database/IContentObserver$Stub;-><init>()V Landroid/database/IContentObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/database/IContentObserver; Landroid/database/IContentObserver;->onChange(ZLandroid/net/Uri;I)V @@ -446,16 +445,13 @@ Landroid/database/sqlite/SQLiteDatabase;->$assertionsDisabled:Z Landroid/filterfw/GraphEnvironment;->addReferences([Ljava/lang/Object;)V Landroid/hardware/camera2/utils/HashCodeHelpers;->hashCode([I)I Landroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager; -Landroid/hardware/display/IDisplayManager;->getDisplayInfo(I)Landroid/view/DisplayInfo; Landroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/hardware/fingerprint/IFingerprintService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/fingerprint/IFingerprintService; Landroid/hardware/ICameraService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ICameraService; Landroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager; Landroid/hardware/input/IInputManager$Stub;->TRANSACTION_injectInputEvent:I -Landroid/hardware/input/IInputManager;->injectInputEvent(Landroid/view/InputEvent;I)Z Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V -Landroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V Landroid/hardware/location/IContextHubService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubService; Landroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/hardware/usb/IUsbManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/usb/IUsbManager; @@ -465,60 +461,33 @@ Landroid/location/ICountryDetector$Stub;->asInterface(Landroid/os/IBinder;)Landr Landroid/location/ICountryListener$Stub;-><init>()V Landroid/location/IGeocodeProvider$Stub;-><init>()V Landroid/location/IGeocodeProvider$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/IGeocodeProvider; -Landroid/location/IGeocodeProvider;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String; -Landroid/location/IGeocodeProvider;->getFromLocationName(Ljava/lang/String;DDDDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String; Landroid/location/IGeofenceProvider$Stub;-><init>()V -Landroid/location/IGeofenceProvider;->setGeofenceHardware(Landroid/hardware/location/IGeofenceHardware;)V Landroid/location/ILocationListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/location/ILocationListener$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/location/ILocationListener$Stub;-><init>()V Landroid/location/ILocationListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationListener; -Landroid/location/ILocationListener;->onLocationChanged(Landroid/location/Location;)V -Landroid/location/ILocationListener;->onProviderDisabled(Ljava/lang/String;)V -Landroid/location/ILocationListener;->onProviderEnabled(Ljava/lang/String;)V -Landroid/location/ILocationListener;->onStatusChanged(Ljava/lang/String;ILandroid/os/Bundle;)V Landroid/location/ILocationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager; Landroid/location/ILocationManager$Stub;->TRANSACTION_getAllProviders:I -Landroid/location/ILocationManager;->getAllProviders()Ljava/util/List; Landroid/location/INetInitiatedListener$Stub;-><init>()V -Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z Landroid/location/LocationManager$ListenerTransport;-><init>(Landroid/location/LocationManager;Landroid/location/LocationListener;Landroid/os/Looper;)V Landroid/Manifest$permission;->CAPTURE_SECURE_VIDEO_OUTPUT:Ljava/lang/String; Landroid/Manifest$permission;->CAPTURE_VIDEO_OUTPUT:Ljava/lang/String; Landroid/Manifest$permission;->READ_FRAME_BUFFER:Ljava/lang/String; Landroid/media/effect/SingleFilterEffect;-><init>(Landroid/media/effect/EffectContext;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V -Landroid/media/IAudioFocusDispatcher;->dispatchAudioFocusChange(ILjava/lang/String;)V Landroid/media/IAudioRoutesObserver$Stub;-><init>()V Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/media/IAudioService$Stub;-><init>()V Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService; -Landroid/media/IAudioService;->getStreamMaxVolume(I)I -Landroid/media/IAudioService;->getStreamVolume(I)I -Landroid/media/IAudioService;->setStreamVolume(IIILjava/lang/String;)V -Landroid/media/IAudioService;->startWatchingRoutes(Landroid/media/IAudioRoutesObserver;)Landroid/media/AudioRoutesInfo; Landroid/media/IMediaRouterService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaRouterService; Landroid/media/IMediaScannerListener$Stub;-><init>()V Landroid/media/IMediaScannerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaScannerService; -Landroid/media/IMediaScannerService;->requestScanFile(Ljava/lang/String;Ljava/lang/String;Landroid/media/IMediaScannerListener;)V -Landroid/media/IMediaScannerService;->scanFile(Ljava/lang/String;Ljava/lang/String;)V -Landroid/media/IRemoteDisplayCallback;->onStateChanged(Landroid/media/RemoteDisplayState;)V Landroid/media/IRingtonePlayer;->play(Landroid/os/IBinder;Landroid/net/Uri;Landroid/media/AudioAttributes;FZ)V Landroid/media/IVolumeController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IVolumeController; Landroid/media/MediaFile;-><init>()V Landroid/media/MediaScanner$MyMediaScannerClient;-><init>(Landroid/media/MediaScanner;)V -Landroid/media/projection/IMediaProjectionManager;->hasProjectionPermission(ILjava/lang/String;)Z Landroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager; Landroid/media/tv/ITvRemoteProvider$Stub;-><init>()V -Landroid/media/tv/ITvRemoteServiceInput;->clearInputBridge(Landroid/os/IBinder;)V -Landroid/media/tv/ITvRemoteServiceInput;->closeInputBridge(Landroid/os/IBinder;)V -Landroid/media/tv/ITvRemoteServiceInput;->openInputBridge(Landroid/os/IBinder;Ljava/lang/String;III)V -Landroid/media/tv/ITvRemoteServiceInput;->sendKeyDown(Landroid/os/IBinder;I)V -Landroid/media/tv/ITvRemoteServiceInput;->sendKeyUp(Landroid/os/IBinder;I)V -Landroid/media/tv/ITvRemoteServiceInput;->sendPointerDown(Landroid/os/IBinder;III)V -Landroid/media/tv/ITvRemoteServiceInput;->sendPointerSync(Landroid/os/IBinder;)V -Landroid/media/tv/ITvRemoteServiceInput;->sendPointerUp(Landroid/os/IBinder;I)V -Landroid/media/tv/ITvRemoteServiceInput;->sendTimestamp(Landroid/os/IBinder;J)V Landroid/net/ConnectivityManager$PacketKeepaliveCallback;-><init>()V Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveLinkProperties()Landroid/net/LinkProperties; @@ -530,41 +499,13 @@ Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/la Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredIfaces()[Ljava/lang/String; Landroid/net/IConnectivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager; -Landroid/net/IConnectivityManager;->getActiveLinkProperties()Landroid/net/LinkProperties; -Landroid/net/IConnectivityManager;->getActiveNetworkInfo()Landroid/net/NetworkInfo; -Landroid/net/IConnectivityManager;->getAllNetworkInfo()[Landroid/net/NetworkInfo; -Landroid/net/IConnectivityManager;->getAllNetworkState()[Landroid/net/NetworkState; -Landroid/net/IConnectivityManager;->getLastTetherError(Ljava/lang/String;)I -Landroid/net/IConnectivityManager;->getTetherableIfaces()[Ljava/lang/String; -Landroid/net/IConnectivityManager;->getTetherableUsbRegexs()[Ljava/lang/String; -Landroid/net/IConnectivityManager;->getTetherableWifiRegexs()[Ljava/lang/String; -Landroid/net/IConnectivityManager;->getTetheredIfaces()[Ljava/lang/String; -Landroid/net/IConnectivityManager;->getTetheringErroredIfaces()[Ljava/lang/String; -Landroid/net/IConnectivityManager;->startLegacyVpn(Lcom/android/internal/net/VpnProfile;)V Landroid/net/INetworkManagementEventObserver$Stub;-><init>()V Landroid/net/INetworkPolicyListener$Stub;-><init>()V Landroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager; -Landroid/net/INetworkPolicyManager;->getNetworkQuotaInfo(Landroid/net/NetworkState;)Landroid/net/NetworkQuotaInfo; -Landroid/net/INetworkPolicyManager;->getRestrictBackground()Z -Landroid/net/INetworkPolicyManager;->getUidPolicy(I)I -Landroid/net/INetworkPolicyManager;->setNetworkPolicies([Landroid/net/NetworkPolicy;)V -Landroid/net/INetworkPolicyManager;->setRestrictBackground(Z)V -Landroid/net/INetworkPolicyManager;->setUidPolicy(II)V -Landroid/net/INetworkPolicyManager;->snoozeLimit(Landroid/net/NetworkTemplate;)V Landroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService; Landroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String; Landroid/net/INetworkStatsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsService; -Landroid/net/INetworkStatsService;->forceUpdate()V -Landroid/net/INetworkStatsService;->getDataLayerSnapshotForUid(I)Landroid/net/NetworkStats; -Landroid/net/INetworkStatsService;->getMobileIfaces()[Ljava/lang/String; -Landroid/net/INetworkStatsService;->openSession()Landroid/net/INetworkStatsSession; -Landroid/net/INetworkStatsService;->openSessionForUsageStats(ILjava/lang/String;)Landroid/net/INetworkStatsSession; -Landroid/net/INetworkStatsSession;->close()V -Landroid/net/INetworkStatsSession;->getHistoryForNetwork(Landroid/net/NetworkTemplate;I)Landroid/net/NetworkStatsHistory; -Landroid/net/INetworkStatsSession;->getHistoryForUid(Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory; -Landroid/net/INetworkStatsSession;->getSummaryForAllUid(Landroid/net/NetworkTemplate;JJZ)Landroid/net/NetworkStats; -Landroid/net/INetworkStatsSession;->getSummaryForNetwork(Landroid/net/NetworkTemplate;JJ)Landroid/net/NetworkStats; Landroid/net/InterfaceConfiguration;-><init>()V Landroid/net/LinkProperties$ProvisioningChange;->values()[Landroid/net/LinkProperties$ProvisioningChange; Landroid/net/MobileLinkQualityInfo;-><init>()V @@ -575,22 +516,12 @@ Landroid/net/SntpClient;-><init>()V Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/net/wifi/IWifiManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiManager; Landroid/net/wifi/IWifiManager$Stub;->TRANSACTION_getScanResults:I -Landroid/net/wifi/IWifiManager;->getCurrentNetwork()Landroid/net/Network; -Landroid/net/wifi/IWifiManager;->getWifiApConfiguration()Landroid/net/wifi/WifiConfiguration; -Landroid/net/wifi/IWifiManager;->getWifiApEnabledState()I Landroid/net/wifi/IWifiScanner$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/net/wifi/IWifiScanner$Stub$Proxy;->mRemote:Landroid/os/IBinder; Landroid/net/wifi/IWifiScanner$Stub;-><init>()V Landroid/net/wifi/IWifiScanner$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiScanner; Landroid/net/wifi/p2p/IWifiP2pManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/p2p/IWifiP2pManager; Landroid/nfc/INfcAdapter$Stub;->TRANSACTION_enable:I -Landroid/nfc/INfcAdapterExtras;->authenticate(Ljava/lang/String;[B)V -Landroid/nfc/INfcAdapterExtras;->close(Ljava/lang/String;Landroid/os/IBinder;)Landroid/os/Bundle; -Landroid/nfc/INfcAdapterExtras;->getCardEmulationRoute(Ljava/lang/String;)I -Landroid/nfc/INfcAdapterExtras;->getDriverName(Ljava/lang/String;)Ljava/lang/String; -Landroid/nfc/INfcAdapterExtras;->open(Ljava/lang/String;Landroid/os/IBinder;)Landroid/os/Bundle; -Landroid/nfc/INfcAdapterExtras;->setCardEmulationRoute(Ljava/lang/String;I)V -Landroid/nfc/INfcAdapterExtras;->transceive(Ljava/lang/String;[B)Landroid/os/Bundle; Landroid/os/AsyncResult;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V Landroid/os/AsyncResult;->exception:Ljava/lang/Throwable; Landroid/os/AsyncResult;->forMessage(Landroid/os/Message;)Landroid/os/AsyncResult; @@ -1360,9 +1291,7 @@ Landroid/R$styleable;->View_visibility:I Landroid/R$styleable;->Window:[I Landroid/R$styleable;->Window_windowBackground:I Landroid/R$styleable;->Window_windowFrame:I -Landroid/security/Credentials;->convertToPem([Ljava/security/cert/Certificate;)[B Landroid/security/IKeyChainService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/security/IKeyChainService; -Landroid/security/IKeyChainService;->requestPrivateKey(Ljava/lang/String;)Ljava/lang/String; Landroid/security/keymaster/KeymasterBlobArgument;-><init>(ILandroid/os/Parcel;)V Landroid/security/keymaster/KeymasterBlobArgument;-><init>(I[B)V Landroid/security/keymaster/KeymasterBlobArgument;->blob:[B @@ -1391,29 +1320,12 @@ Landroid/service/dreams/IDreamManager;->dream()V Landroid/service/dreams/IDreamManager;->getDreamComponents()[Landroid/content/ComponentName; Landroid/service/dreams/IDreamManager;->isDreaming()Z Landroid/service/dreams/IDreamManager;->setDreamComponents([Landroid/content/ComponentName;)V -Landroid/service/euicc/IDeleteSubscriptionCallback;->onComplete(I)V -Landroid/service/euicc/IEraseSubscriptionsCallback;->onComplete(I)V Landroid/service/euicc/IEuiccService$Stub;-><init>()V -Landroid/service/euicc/IGetDefaultDownloadableSubscriptionListCallback;->onComplete(Landroid/service/euicc/GetDefaultDownloadableSubscriptionListResult;)V -Landroid/service/euicc/IGetDownloadableSubscriptionMetadataCallback;->onComplete(Landroid/service/euicc/GetDownloadableSubscriptionMetadataResult;)V -Landroid/service/euicc/IGetEidCallback;->onSuccess(Ljava/lang/String;)V -Landroid/service/euicc/IGetEuiccInfoCallback;->onSuccess(Landroid/telephony/euicc/EuiccInfo;)V -Landroid/service/euicc/IGetEuiccProfileInfoListCallback;->onComplete(Landroid/service/euicc/GetEuiccProfileInfoListResult;)V -Landroid/service/euicc/IRetainSubscriptionsForFactoryResetCallback;->onComplete(I)V -Landroid/service/euicc/ISwitchToSubscriptionCallback;->onComplete(I)V -Landroid/service/euicc/IUpdateSubscriptionNicknameCallback;->onComplete(I)V Landroid/service/notification/INotificationListener$Stub;-><init>()V Landroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService; Landroid/service/vr/IVrManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/vr/IVrManager; -Landroid/service/vr/IVrManager;->getVr2dDisplayId()I -Landroid/service/vr/IVrManager;->getVrModeState()Z Landroid/service/wallpaper/IWallpaperConnection$Stub;-><init>()V -Landroid/service/wallpaper/IWallpaperEngine;->destroy()V -Landroid/service/wallpaper/IWallpaperEngine;->dispatchPointer(Landroid/view/MotionEvent;)V -Landroid/service/wallpaper/IWallpaperEngine;->dispatchWallpaperCommand(Ljava/lang/String;IIILandroid/os/Bundle;)V -Landroid/service/wallpaper/IWallpaperEngine;->setVisibility(Z)V Landroid/service/wallpaper/IWallpaperService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/wallpaper/IWallpaperService; -Landroid/speech/IRecognitionListener;->onEvent(ILandroid/os/Bundle;)V Landroid/telecom/Log;->i(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V Landroid/telecom/Log;->w(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V Landroid/telephony/ims/compat/feature/MMTelFeature;-><init>()V @@ -1424,10 +1336,6 @@ Landroid/telephony/JapanesePhoneNumberFormatter;->format(Landroid/text/Editable; Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService; -Landroid/telephony/mbms/vendor/IMbmsStreamingService;->getPlaybackUri(ILjava/lang/String;)Landroid/net/Uri; -Landroid/telephony/mbms/vendor/IMbmsStreamingService;->initialize(Landroid/telephony/mbms/IMbmsStreamingSessionCallback;I)I -Landroid/telephony/mbms/vendor/IMbmsStreamingService;->requestUpdateStreamingServices(ILjava/util/List;)I -Landroid/telephony/mbms/vendor/IMbmsStreamingService;->startStreaming(ILjava/lang/String;Landroid/telephony/mbms/IStreamingServiceCallback;)I Landroid/telephony/SmsCbCmasInfo;->getCategory()I Landroid/telephony/SmsCbCmasInfo;->getCertainty()I Landroid/telephony/SmsCbCmasInfo;->getMessageClass()I @@ -1470,17 +1378,8 @@ Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder; Landroid/view/autofill/IAutoFillManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/autofill/IAutoFillManager; Landroid/view/IAppTransitionAnimationSpecsFuture$Stub;-><init>()V Landroid/view/IDockedStackListener$Stub;-><init>()V -Landroid/view/IRecentsAnimationController;->finish(Z)V -Landroid/view/IRecentsAnimationController;->screenshotTask(I)Landroid/app/ActivityManager$TaskSnapshot; -Landroid/view/IRecentsAnimationController;->setAnimationTargetsBehindSystemBars(Z)V -Landroid/view/IRecentsAnimationController;->setInputConsumerEnabled(Z)V Landroid/view/IRecentsAnimationRunner$Stub;-><init>()V -Landroid/view/IRecentsAnimationRunner;->onAnimationCanceled()V -Landroid/view/IRecentsAnimationRunner;->onAnimationStart(Landroid/view/IRecentsAnimationController;[Landroid/view/RemoteAnimationTarget;Landroid/graphics/Rect;Landroid/graphics/Rect;)V -Landroid/view/IRemoteAnimationFinishedCallback;->onAnimationFinished()V Landroid/view/IRemoteAnimationRunner$Stub;-><init>()V -Landroid/view/IRemoteAnimationRunner;->onAnimationCancelled()V -Landroid/view/IRemoteAnimationRunner;->onAnimationStart([Landroid/view/RemoteAnimationTarget;Landroid/view/IRemoteAnimationFinishedCallback;)V Landroid/view/IRotationWatcher$Stub;-><init>()V Landroid/view/IWindow$Stub;-><init>()V Landroid/view/IWindow$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindow; @@ -1492,44 +1391,7 @@ Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar(I)Z Landroid/view/IWindowManager$Stub$Proxy;->watchRotation(Landroid/view/IRotationWatcher;I)I Landroid/view/IWindowManager$Stub;-><init>()V Landroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager; -Landroid/view/IWindowManager;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;ILandroid/view/InputChannel;)V -Landroid/view/IWindowManager;->destroyInputConsumer(Ljava/lang/String;I)Z -Landroid/view/IWindowManager;->endProlongedAnimations()V -Landroid/view/IWindowManager;->executeAppTransition()V -Landroid/view/IWindowManager;->freezeRotation(I)V -Landroid/view/IWindowManager;->getAnimationScale(I)F -Landroid/view/IWindowManager;->getAnimationScales()[F -Landroid/view/IWindowManager;->getBaseDisplaySize(ILandroid/graphics/Point;)V -Landroid/view/IWindowManager;->getDockedStackSide()I -Landroid/view/IWindowManager;->getInitialDisplayDensity(I)I -Landroid/view/IWindowManager;->getInitialDisplaySize(ILandroid/graphics/Point;)V -Landroid/view/IWindowManager;->getStableInsets(ILandroid/graphics/Rect;)V -Landroid/view/IWindowManager;->hasNavigationBar(I)Z -Landroid/view/IWindowManager;->isKeyguardLocked()Z -Landroid/view/IWindowManager;->isKeyguardSecure()Z -Landroid/view/IWindowManager;->isSafeModeEnabled()Z -Landroid/view/IWindowManager;->lockNow(Landroid/os/Bundle;)V -Landroid/view/IWindowManager;->overridePendingAppTransitionMultiThumbFuture(Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/os/IRemoteCallback;ZI)V -Landroid/view/IWindowManager;->overridePendingAppTransitionRemote(Landroid/view/RemoteAnimationAdapter;I)V -Landroid/view/IWindowManager;->registerDockedStackListener(Landroid/view/IDockedStackListener;)V -Landroid/view/IWindowManager;->removeRotationWatcher(Landroid/view/IRotationWatcher;)V -Landroid/view/IWindowManager;->setAnimationScale(IF)V -Landroid/view/IWindowManager;->setAnimationScales([F)V -Landroid/view/IWindowManager;->setNavBarVirtualKeyHapticFeedbackEnabled(Z)V -Landroid/view/IWindowManager;->setShelfHeight(ZI)V -Landroid/view/IWindowManager;->setStrictModeVisualIndicatorPreference(Ljava/lang/String;)V -Landroid/view/IWindowManager;->thawRotation()V Landroid/view/IWindowSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowSession; -Landroid/view/IWindowSession;->finishDrawing(Landroid/view/IWindow;)V -Landroid/view/IWindowSession;->getInTouchMode()Z -Landroid/view/IWindowSession;->performDrag(Landroid/view/IWindow;ILandroid/view/SurfaceControl;IFFFFLandroid/content/ClipData;)Landroid/os/IBinder; -Landroid/view/IWindowSession;->performHapticFeedback(IZ)Z -Landroid/view/IWindowSession;->remove(Landroid/view/IWindow;)V -Landroid/view/IWindowSession;->setInTouchMode(Z)V -Landroid/view/IWindowSession;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V -Landroid/view/IWindowSession;->wallpaperCommandComplete(Landroid/os/IBinder;Landroid/os/Bundle;)V -Landroid/view/IWindowSession;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V -Landroid/view/RenderNodeAnimator;->setDuration(J)Landroid/view/RenderNodeAnimator; Landroid/view/View$AttachInfo$InvalidateInfo;-><init>()V Landroid/view/View$CheckForLongPress;-><init>(Landroid/view/View;)V Landroid/view/View$ListenerInfo;-><init>()V @@ -1538,9 +1400,6 @@ Landroid/webkit/CacheManager$CacheResult;-><init>()V Landroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/webkit/IWebViewUpdateService$Stub$Proxy;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse; Landroid/webkit/IWebViewUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/webkit/IWebViewUpdateService; -Landroid/webkit/IWebViewUpdateService;->getCurrentWebViewPackageName()Ljava/lang/String; -Landroid/webkit/IWebViewUpdateService;->getValidWebViewPackages()[Landroid/webkit/WebViewProviderInfo; -Landroid/webkit/IWebViewUpdateService;->isFallbackPackage(Ljava/lang/String;)Z Landroid/widget/DigitalClock$FormatChangeObserver;-><init>(Landroid/widget/DigitalClock;)V Landroid/widget/QuickContactBadge$QueryHandler;-><init>(Landroid/widget/QuickContactBadge;Landroid/content/ContentResolver;)V Landroid/widget/RelativeLayout$DependencyGraph$Node;-><init>()V @@ -1550,7 +1409,6 @@ Lcom/android/ims/ImsCall;->isMultiparty()Z Lcom/android/ims/ImsCall;->reject(I)V Lcom/android/ims/ImsCall;->terminate(I)V Lcom/android/ims/ImsConfigListener$Stub;-><init>()V -Lcom/android/ims/ImsConfigListener;->onSetFeatureResponse(IIII)V Lcom/android/ims/ImsEcbm;->exitEmergencyCallbackMode()V Lcom/android/ims/ImsManager;->getConfigInterface()Lcom/android/ims/ImsConfig; Lcom/android/ims/ImsManager;->getInstance(Landroid/content/Context;I)Lcom/android/ims/ImsManager; @@ -1560,104 +1418,17 @@ Lcom/android/ims/ImsManager;->isVolteEnabledByPlatform(Landroid/content/Context; Lcom/android/ims/ImsUtInterface;->queryCallForward(ILjava/lang/String;Landroid/os/Message;)V Lcom/android/ims/internal/IImsCallSession$Stub;-><init>()V Lcom/android/ims/internal/IImsCallSession$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/ims/internal/IImsCallSession; -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionConferenceStateUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsConferenceState;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandover(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandoverFailed(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHeld(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionInviteParticipantsRequestDelivered(Lcom/android/ims/internal/IImsCallSession;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionInviteParticipantsRequestFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeComplete(Lcom/android/ims/internal/IImsCallSession;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeStarted(Lcom/android/ims/internal/IImsCallSession;Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMultipartyStateChanged(Lcom/android/ims/internal/IImsCallSession;Z)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionProgressing(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsStreamMediaProfile;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumeFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumeReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionStarted(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionStartFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionSuppServiceReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsSuppServiceNotification;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionTerminated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionTtyModeReceived(Lcom/android/ims/internal/IImsCallSession;I)V -Lcom/android/ims/internal/IImsCallSessionListener;->callSessionUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V Lcom/android/ims/internal/IImsConfig$Stub;-><init>()V Lcom/android/ims/internal/IImsEcbm$Stub;-><init>()V -Lcom/android/ims/internal/IImsRegistrationListener;->registrationAssociatedUriChanged([Landroid/net/Uri;)V -Lcom/android/ims/internal/IImsRegistrationListener;->registrationChangeFailed(ILandroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsRegistrationListener;->registrationConnected()V -Lcom/android/ims/internal/IImsRegistrationListener;->registrationConnectedWithRadioTech(I)V -Lcom/android/ims/internal/IImsRegistrationListener;->registrationDisconnected(Landroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsRegistrationListener;->registrationFeatureCapabilityChanged(I[I[I)V -Lcom/android/ims/internal/IImsRegistrationListener;->registrationProgressingWithRadioTech(I)V -Lcom/android/ims/internal/IImsRegistrationListener;->voiceMessageCountUpdate(I)V Lcom/android/ims/internal/IImsService$Stub;-><init>()V Lcom/android/ims/internal/IImsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/ims/internal/IImsService; Lcom/android/ims/internal/IImsUt$Stub;-><init>()V -Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallBarringQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsSsInfo;)V -Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallForwardQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsCallForwardInfo;)V -Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallWaitingQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsSsInfo;)V -Lcom/android/ims/internal/IImsUtListener;->utConfigurationQueried(Lcom/android/ims/internal/IImsUt;ILandroid/os/Bundle;)V -Lcom/android/ims/internal/IImsUtListener;->utConfigurationQueryFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdated(Lcom/android/ims/internal/IImsUt;I)V -Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdateFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V -Lcom/android/ims/internal/IImsVideoCallCallback;->changeCallDataUsage(J)V -Lcom/android/ims/internal/IImsVideoCallCallback;->changeCameraCapabilities(Landroid/telecom/VideoProfile$CameraCapabilities;)V -Lcom/android/ims/internal/IImsVideoCallCallback;->changePeerDimensions(II)V -Lcom/android/ims/internal/IImsVideoCallCallback;->changeVideoQuality(I)V -Lcom/android/ims/internal/IImsVideoCallCallback;->handleCallSessionEvent(I)V -Lcom/android/ims/internal/IImsVideoCallCallback;->receiveSessionModifyRequest(Landroid/telecom/VideoProfile;)V -Lcom/android/ims/internal/IImsVideoCallCallback;->receiveSessionModifyResponse(ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V Lcom/android/ims/internal/IImsVideoCallProvider$Stub;-><init>()V -Lcom/android/ims/internal/IImsVideoCallProvider;->setCallback(Lcom/android/ims/internal/IImsVideoCallCallback;)V Lcom/android/ims/internal/ImsVideoCallProviderWrapper;-><init>(Lcom/android/ims/internal/IImsVideoCallProvider;)V -Lcom/android/ims/internal/uce/options/IOptionsListener;->cmdStatus(Lcom/android/ims/internal/uce/options/OptionsCmdStatus;)V -Lcom/android/ims/internal/uce/options/IOptionsListener;->getVersionCb(Ljava/lang/String;)V -Lcom/android/ims/internal/uce/options/IOptionsListener;->incomingOptions(Ljava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;I)V -Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V -Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceUnavailable(Lcom/android/ims/internal/uce/common/StatusCode;)V -Lcom/android/ims/internal/uce/options/IOptionsListener;->sipResponseReceived(Ljava/lang/String;Lcom/android/ims/internal/uce/options/OptionsSipResponse;Lcom/android/ims/internal/uce/options/OptionsCapInfo;)V Lcom/android/ims/internal/uce/options/IOptionsService$Stub;-><init>()V -Lcom/android/ims/internal/uce/options/IOptionsService;->addListener(ILcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService;->getMyInfo(II)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService;->getVersion(I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService;->responseIncomingOptions(IIILjava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;Z)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/options/IOptionsService;->setMyInfo(ILcom/android/ims/internal/uce/common/CapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceListener;->capInfoReceived(Ljava/lang/String;[Lcom/android/ims/internal/uce/presence/PresTupleInfo;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->cmdStatus(Lcom/android/ims/internal/uce/presence/PresCmdStatus;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->getVersionCb(Ljava/lang/String;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->listCapInfoReceived(Lcom/android/ims/internal/uce/presence/PresRlmiInfo;[Lcom/android/ims/internal/uce/presence/PresResInfo;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->publishTriggering(Lcom/android/ims/internal/uce/presence/PresPublishTriggerType;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceUnAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->sipResponseReceived(Lcom/android/ims/internal/uce/presence/PresSipResponse;)V -Lcom/android/ims/internal/uce/presence/IPresenceListener;->unpublishMessageSent()V Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;-><init>()V -Lcom/android/ims/internal/uce/presence/IPresenceService;->addListener(ILcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService;->getVersion(I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService;->publishMyCap(ILcom/android/ims/internal/uce/presence/PresCapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService;->reenableService(II)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode; -Lcom/android/ims/internal/uce/presence/IPresenceService;->setNewFeatureTag(ILjava/lang/String;Lcom/android/ims/internal/uce/presence/PresServiceInfo;I)Lcom/android/ims/internal/uce/common/StatusCode; Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub;-><init>()V -Lcom/android/ims/internal/uce/uceservice/IUceListener;->setStatus(I)V Lcom/android/ims/internal/uce/uceservice/IUceService$Stub;-><init>()V -Lcom/android/ims/internal/uce/uceservice/IUceService;->createOptionsService(Lcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)I -Lcom/android/ims/internal/uce/uceservice/IUceService;->createPresenceService(Lcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)I -Lcom/android/ims/internal/uce/uceservice/IUceService;->destroyOptionsService(I)V -Lcom/android/ims/internal/uce/uceservice/IUceService;->destroyPresenceService(I)V -Lcom/android/ims/internal/uce/uceservice/IUceService;->getOptionsService()Lcom/android/ims/internal/uce/options/IOptionsService; -Lcom/android/ims/internal/uce/uceservice/IUceService;->getPresenceService()Lcom/android/ims/internal/uce/presence/IPresenceService; -Lcom/android/ims/internal/uce/uceservice/IUceService;->getServiceStatus()Z -Lcom/android/ims/internal/uce/uceservice/IUceService;->isServiceStarted()Z -Lcom/android/ims/internal/uce/uceservice/IUceService;->startService(Lcom/android/ims/internal/uce/uceservice/IUceListener;)Z -Lcom/android/ims/internal/uce/uceservice/IUceService;->stopService()Z Lcom/android/internal/app/AlertActivity;-><init>()V Lcom/android/internal/app/AlertActivity;->mAlert:Lcom/android/internal/app/AlertController; Lcom/android/internal/app/AlertActivity;->mAlertParams:Lcom/android/internal/app/AlertController$AlertParams; @@ -1688,22 +1459,12 @@ Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_setUserRestrictions: Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_startOperation:I Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_startWatchingMode:I Lcom/android/internal/app/IAppOpsService$Stub;->TRANSACTION_stopWatchingMode:I -Lcom/android/internal/app/IAppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;)V -Lcom/android/internal/app/IAppOpsService;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List; -Lcom/android/internal/app/IAppOpsService;->getPackagesForOps([I)Ljava/util/List; -Lcom/android/internal/app/IAppOpsService;->resetAllModes(ILjava/lang/String;)V -Lcom/android/internal/app/IAppOpsService;->setMode(IILjava/lang/String;I)V Lcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Lcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats; -Lcom/android/internal/app/IBatteryStats;->computeChargeTimeRemaining()J -Lcom/android/internal/app/IBatteryStats;->getAwakeTimeBattery()J -Lcom/android/internal/app/IBatteryStats;->getStatistics()[B -Lcom/android/internal/app/IBatteryStats;->isCharging()Z Lcom/android/internal/app/IMediaContainerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IMediaContainerService; Lcom/android/internal/app/IntentForwarderActivity;->TAG:Ljava/lang/String; Lcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;->showSessionFromSession(Landroid/os/IBinder;Landroid/os/Bundle;I)Z Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService; -Lcom/android/internal/app/IVoiceInteractionManagerService;->getKeyphraseSoundModel(ILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel; Lcom/android/internal/app/LocaleHelper$LocaleInfoComparator;-><init>(Ljava/util/Locale;Z)V Lcom/android/internal/app/LocaleHelper$LocaleInfoComparator;->compare(Lcom/android/internal/app/LocaleStore$LocaleInfo;Lcom/android/internal/app/LocaleStore$LocaleInfo;)I Lcom/android/internal/app/LocaleHelper;->getDisplayCountry(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String; @@ -1731,10 +1492,6 @@ Lcom/android/internal/app/WindowDecorActionBar;->mTabScrollView:Lcom/android/int Lcom/android/internal/app/WindowDecorActionBar;->setShowHideAnimationEnabled(Z)V Lcom/android/internal/appwidget/IAppWidgetService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/appwidget/IAppWidgetService; Lcom/android/internal/appwidget/IAppWidgetService$Stub;->TRANSACTION_bindAppWidgetId:I -Lcom/android/internal/appwidget/IAppWidgetService;->bindAppWidgetId(Ljava/lang/String;IILandroid/content/ComponentName;Landroid/os/Bundle;)Z -Lcom/android/internal/appwidget/IAppWidgetService;->bindRemoteViewsService(Ljava/lang/String;ILandroid/content/Intent;Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/app/IServiceConnection;I)Z -Lcom/android/internal/appwidget/IAppWidgetService;->getAppWidgetIds(Landroid/content/ComponentName;)[I -Lcom/android/internal/appwidget/IAppWidgetService;->getAppWidgetViews(Ljava/lang/String;I)Landroid/widget/RemoteViews; Lcom/android/internal/backup/IBackupTransport$Stub;-><init>()V Lcom/android/internal/content/PackageMonitor;-><init>()V Lcom/android/internal/database/SortCursor;-><init>([Landroid/database/Cursor;Ljava/lang/String;)V @@ -1751,16 +1508,11 @@ Lcom/android/internal/location/GpsNetInitiatedHandler;->handleNiNotification(Lco Lcom/android/internal/location/GpsNetInitiatedHandler;->mIsHexInput:Z Lcom/android/internal/location/ILocationProvider$Stub;-><init>()V Lcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider; -Lcom/android/internal/location/ILocationProvider;->getStatus(Landroid/os/Bundle;)I -Lcom/android/internal/location/ILocationProvider;->getStatusUpdateTime()J Lcom/android/internal/location/ILocationProvider;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)V Lcom/android/internal/location/ILocationProvider;->setLocationProviderManager(Lcom/android/internal/location/ILocationProviderManager;)V Lcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V Lcom/android/internal/location/ILocationProviderManager$Stub;-><init>()V Lcom/android/internal/location/ILocationProviderManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProviderManager; -Lcom/android/internal/location/ILocationProviderManager;->onReportLocation(Landroid/location/Location;)V -Lcom/android/internal/location/ILocationProviderManager;->onSetEnabled(Z)V -Lcom/android/internal/location/ILocationProviderManager;->onSetProperties(Lcom/android/internal/location/ProviderProperties;)V Lcom/android/internal/logging/MetricsLogger;-><init>()V Lcom/android/internal/net/LegacyVpnInfo;-><init>()V Lcom/android/internal/net/VpnConfig;-><init>()V @@ -1772,7 +1524,6 @@ Lcom/android/internal/os/BinderInternal;->getContextObject()Landroid/os/IBinder; Lcom/android/internal/os/BinderInternal;->handleGc()V Lcom/android/internal/os/ClassLoaderFactory;->createClassloaderNamespace(Ljava/lang/ClassLoader;ILjava/lang/String;Ljava/lang/String;ZZ)Ljava/lang/String; Lcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService; -Lcom/android/internal/os/IDropBoxManagerService;->getNextEntry(Ljava/lang/String;JLjava/lang/String;)Landroid/os/DropBoxManager$Entry; Lcom/android/internal/os/ProcessCpuTracker$Stats;->name:Ljava/lang/String; Lcom/android/internal/os/ProcessCpuTracker$Stats;->rel_stime:I Lcom/android/internal/os/ProcessCpuTracker$Stats;->rel_uptime:J @@ -1798,8 +1549,6 @@ Lcom/android/internal/policy/DecorView;->mLastLeftInset:I Lcom/android/internal/policy/DecorView;->mLastRightInset:I Lcom/android/internal/policy/DecorView;->mWindow:Lcom/android/internal/policy/PhoneWindow; Lcom/android/internal/policy/IKeyguardService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardService; -Lcom/android/internal/policy/IKeyguardService;->doKeyguardTimeout(Landroid/os/Bundle;)V -Lcom/android/internal/policy/IKeyguardService;->setKeyguardEnabled(Z)V Lcom/android/internal/policy/IKeyguardStateCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardStateCallback; Lcom/android/internal/policy/PhoneFallbackEventHandler;-><init>(Landroid/content/Context;)V Lcom/android/internal/policy/PhoneFallbackEventHandler;->mContext:Landroid/content/Context; @@ -2253,14 +2002,7 @@ Lcom/android/internal/R$xml;->power_profile:I Lcom/android/internal/statusbar/IStatusBar$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/statusbar/IStatusBar; Lcom/android/internal/statusbar/IStatusBarService$Stub;-><init>()V Lcom/android/internal/statusbar/IStatusBarService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/statusbar/IStatusBarService; -Lcom/android/internal/statusbar/IStatusBarService;->collapsePanels()V -Lcom/android/internal/statusbar/IStatusBarService;->disable(ILandroid/os/IBinder;Ljava/lang/String;)V -Lcom/android/internal/statusbar/IStatusBarService;->expandNotificationsPanel()V -Lcom/android/internal/statusbar/IStatusBarService;->handleSystemKey(I)V -Lcom/android/internal/statusbar/IStatusBarService;->removeIcon(Ljava/lang/String;)V -Lcom/android/internal/statusbar/IStatusBarService;->setIconVisibility(Ljava/lang/String;Z)V Lcom/android/internal/telecom/ITelecomService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telecom/ITelecomService; -Lcom/android/internal/telecom/ITelecomService;->getCallState()I Lcom/android/internal/telephony/BaseCommands;->mCallStateRegistrants:Landroid/os/RegistrantList; Lcom/android/internal/telephony/BaseCommands;->mCallWaitingInfoRegistrants:Landroid/os/RegistrantList; Lcom/android/internal/telephony/BaseCommands;->mCatCallSetUpRegistrant:Landroid/os/Registrant; @@ -2887,7 +2629,6 @@ Lcom/android/internal/telephony/GsmCdmaPhone;->notifyPreciseCallStateChanged()V Lcom/android/internal/telephony/GsmCdmaPhone;->notifyServiceStateChanged(Landroid/telephony/ServiceState;)V Lcom/android/internal/telephony/GsmCdmaPhone;->setOnEcbModeExitResponse(Landroid/os/Handler;ILjava/lang/Object;)V Lcom/android/internal/telephony/GsmCdmaPhone;->syncClirSetting()V -Lcom/android/internal/telephony/ICarrierConfigLoader;->getConfigForSubId(ILjava/lang/String;)Landroid/os/PersistableBundle; Lcom/android/internal/telephony/IccCard;->getState()Lcom/android/internal/telephony/IccCardConstants$State; Lcom/android/internal/telephony/IccCard;->registerForNetworkLocked(Landroid/os/Handler;ILjava/lang/Object;)V Lcom/android/internal/telephony/IccCard;->supplyNetworkDepersonalization(Ljava/lang/String;Landroid/os/Message;)V @@ -3093,8 +2834,6 @@ Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IB Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getDeviceId(Ljava/lang/String;)Ljava/lang/String; Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo; Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->TRANSACTION_getDeviceId:I -Lcom/android/internal/telephony/IPhoneSubInfo;->getIccSerialNumber(Ljava/lang/String;)Ljava/lang/String; -Lcom/android/internal/telephony/IPhoneSubInfo;->getSubscriberId(Ljava/lang/String;)Ljava/lang/String; Lcom/android/internal/telephony/ISms$Stub;-><init>()V Lcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISms; Lcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V @@ -3108,38 +2847,9 @@ Lcom/android/internal/telephony/ITelephony$Stub;->DESCRIPTOR:Ljava/lang/String; Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_call:I Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_dial:I Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I -Lcom/android/internal/telephony/ITelephony;->call(Ljava/lang/String;Ljava/lang/String;)V -Lcom/android/internal/telephony/ITelephony;->dial(Ljava/lang/String;)V -Lcom/android/internal/telephony/ITelephony;->disableDataConnectivity()Z -Lcom/android/internal/telephony/ITelephony;->disableLocationUpdates()V -Lcom/android/internal/telephony/ITelephony;->enableDataConnectivity()Z -Lcom/android/internal/telephony/ITelephony;->enableLocationUpdates()V -Lcom/android/internal/telephony/ITelephony;->getActivePhoneType()I -Lcom/android/internal/telephony/ITelephony;->getCallState()I -Lcom/android/internal/telephony/ITelephony;->getDataActivity()I -Lcom/android/internal/telephony/ITelephony;->getDataEnabled(I)Z -Lcom/android/internal/telephony/ITelephony;->getDataState()I -Lcom/android/internal/telephony/ITelephony;->getNetworkType()I -Lcom/android/internal/telephony/ITelephony;->handlePinMmi(Ljava/lang/String;)Z -Lcom/android/internal/telephony/ITelephony;->handlePinMmiForSubscriber(ILjava/lang/String;)Z -Lcom/android/internal/telephony/ITelephony;->hasIccCard()Z -Lcom/android/internal/telephony/ITelephony;->iccCloseLogicalChannel(II)Z -Lcom/android/internal/telephony/ITelephony;->iccTransmitApduLogicalChannel(IIIIIIILjava/lang/String;)Ljava/lang/String; -Lcom/android/internal/telephony/ITelephony;->isRadioOnForSubscriber(ILjava/lang/String;)Z -Lcom/android/internal/telephony/ITelephony;->setRadio(Z)Z -Lcom/android/internal/telephony/ITelephony;->supplyPin(Ljava/lang/String;)Z -Lcom/android/internal/telephony/ITelephony;->toggleRadioOnOff()V -Lcom/android/internal/telephony/ITelephony;->updateServiceLocation()V Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Lcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry; -Lcom/android/internal/telephony/ITelephonyRegistry;->listen(Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;IZ)V -Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallState(ILjava/lang/String;)V -Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellInfo(Ljava/util/List;)V -Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataConnectionFailed(Ljava/lang/String;)V Lcom/android/internal/telephony/IWapPushManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IWapPushManager; -Lcom/android/internal/telephony/IWapPushManager;->addPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZZ)Z -Lcom/android/internal/telephony/IWapPushManager;->deletePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z -Lcom/android/internal/telephony/IWapPushManager;->updatePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZZ)Z Lcom/android/internal/telephony/MccTable$MccEntry;->mIso:Ljava/lang/String; Lcom/android/internal/telephony/MccTable;->countryCodeForMcc(I)Ljava/lang/String; Lcom/android/internal/telephony/MccTable;->defaultLanguageForMcc(I)Ljava/lang/String; @@ -3934,23 +3644,7 @@ Lcom/android/internal/widget/ActionBarOverlayLayout;-><init>(Landroid/content/Co Lcom/android/internal/widget/ActionBarOverlayLayout;->setWindowCallback(Landroid/view/Window$Callback;)V Lcom/android/internal/widget/EditableInputConnection;-><init>(Landroid/widget/TextView;)V Lcom/android/internal/widget/ILockSettings$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/widget/ILockSettings; -Lcom/android/internal/widget/ILockSettings;->getBoolean(Ljava/lang/String;ZI)Z -Lcom/android/internal/widget/ILockSettings;->getLong(Ljava/lang/String;JI)J -Lcom/android/internal/widget/ILockSettings;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String; -Lcom/android/internal/widget/ILockSettings;->havePassword(I)Z -Lcom/android/internal/widget/ILockSettings;->havePattern(I)Z -Lcom/android/internal/widget/ILockSettings;->setBoolean(Ljava/lang/String;ZI)V -Lcom/android/internal/widget/ILockSettings;->setLong(Ljava/lang/String;JI)V -Lcom/android/internal/widget/ILockSettings;->setString(Ljava/lang/String;Ljava/lang/String;I)V Lcom/android/internal/widget/IRemoteViewsFactory$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/widget/IRemoteViewsFactory; -Lcom/android/internal/widget/IRemoteViewsFactory;->getCount()I -Lcom/android/internal/widget/IRemoteViewsFactory;->getItemId(I)J -Lcom/android/internal/widget/IRemoteViewsFactory;->getLoadingView()Landroid/widget/RemoteViews; -Lcom/android/internal/widget/IRemoteViewsFactory;->getViewAt(I)Landroid/widget/RemoteViews; -Lcom/android/internal/widget/IRemoteViewsFactory;->getViewTypeCount()I -Lcom/android/internal/widget/IRemoteViewsFactory;->hasStableIds()Z -Lcom/android/internal/widget/IRemoteViewsFactory;->isCreated()Z -Lcom/android/internal/widget/IRemoteViewsFactory;->onDataSetChanged()V Lcom/android/internal/widget/LinearLayoutWithDefaultTouchRecepient;-><init>(Landroid/content/Context;)V Lcom/android/internal/widget/LinearLayoutWithDefaultTouchRecepient;->setDefaultTouchRecepient(Landroid/view/View;)V Lcom/android/internal/widget/LockPatternChecker;->checkPassword(Lcom/android/internal/widget/LockPatternUtils;Ljava/lang/String;ILcom/android/internal/widget/LockPatternChecker$OnCheckCallback;)Landroid/os/AsyncTask; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 92302c501caf..b18c4de93b40 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -6954,6 +6954,8 @@ public final class ActivityThread extends ClientTransactionHandler { fd.setInt$(cr.openFileDescriptor(uri, FileUtils.translateModePosixToString(mode)).detachFd()); return fd; + } catch (SecurityException e) { + throw new ErrnoException(e.getMessage(), OsConstants.EACCES); } catch (FileNotFoundException e) { throw new ErrnoException(e.getMessage(), OsConstants.ENOENT); } diff --git a/core/java/android/app/AppComponentFactory.java b/core/java/android/app/AppComponentFactory.java index ae632915dd2d..2cec7f0fc323 100644 --- a/core/java/android/app/AppComponentFactory.java +++ b/core/java/android/app/AppComponentFactory.java @@ -27,6 +27,7 @@ import android.content.pm.ApplicationInfo; * * @see #instantiateApplication * @see #instantiateActivity + * @see #instantiateClassLoader * @see #instantiateService * @see #instantiateReceiver * @see #instantiateProvider @@ -39,8 +40,10 @@ public class AppComponentFactory { * a custom class loader hierarchy. * * @param cl The default classloader instantiated by platform. + * @param aInfo Information about the application being loaded. */ - public @NonNull ClassLoader instantiateClassLoader(@NonNull ClassLoader cl) { + public @NonNull ClassLoader instantiateClassLoader(@NonNull ClassLoader cl, + @NonNull ApplicationInfo aInfo) { return cl; } @@ -133,19 +136,6 @@ public class AppComponentFactory { return (ContentProvider) cl.loadClass(className).newInstance(); } - private ApplicationInfo mApplicationInfo = null; - - void setApplicationInfo(ApplicationInfo info) { - mApplicationInfo = info; - } - - /** - * Returns the ApplicationInfo associated with this package. - */ - public ApplicationInfo getApplicationInfo() { - return mApplicationInfo; - } - /** * @hide */ diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index fde1d29eb709..e20c4901ea0d 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -21,6 +21,7 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; import android.annotation.SystemService; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.content.ContentResolver; import android.content.ContentUris; @@ -163,6 +164,10 @@ public class DownloadManager { */ public static final String COLUMN_MEDIAPROVIDER_URI = Downloads.Impl.COLUMN_MEDIAPROVIDER_URI; + /** @hide */ + @TestApi + public static final String COLUMN_MEDIASTORE_URI = Downloads.Impl.COLUMN_MEDIASTORE_URI; + /** * @hide */ diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 780dd630d834..5cbb59976c5a 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -204,6 +204,7 @@ interface IActivityManager { void setProcessImportant(in IBinder token, int pid, boolean isForeground, String reason); void setServiceForeground(in ComponentName className, in IBinder token, int id, in Notification notification, int flags, int foregroundServiceType); + int getForegroundServiceType(in ComponentName className, in IBinder token); boolean moveActivityTaskToBack(in IBinder token, boolean nonRoot); void getMemoryInfo(out ActivityManager.MemoryInfo outInfo); List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState(); diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index b01cd0e411c7..b16188f1a0e3 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -129,6 +129,7 @@ interface IActivityTaskManager { oneway void activityIdle(in IBinder token, in Configuration config, in boolean stopProfiling); void activityResumed(in IBinder token); + void activityTopResumedStateLost(); void activityPaused(in IBinder token); void activityStopped(in IBinder token, in Bundle state, in PersistableBundle persistentState, in CharSequence description); diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 8615f00facd9..8c85ad134e53 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -81,6 +81,16 @@ oneway interface ITaskStackListener { int requestedDisplayId); /** + * Called when an activity was requested to be launched on a secondary display but was rerouted + * to default display. + * + * @param taskInfo info about the Activity's task + * @param requestedDisplayId the id of the requested launch display + */ + void onActivityLaunchOnSecondaryDisplayRerouted(in ActivityManager.RunningTaskInfo taskInfo, + int requestedDisplayId); + + /** * Called when a task is added. * * @param taskId id of the task. diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index dda5569a26b3..4f9420946680 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -52,6 +52,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.ViewConfiguration; import android.view.Window; +import android.view.WindowManagerGlobal; import com.android.internal.content.ReferrerIntent; @@ -1102,8 +1103,11 @@ public class Instrumentation { if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) { event.setSource(InputDevice.SOURCE_TOUCHSCREEN); } - InputManager.getInstance().injectInputEvent(event, - InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); + try { + WindowManagerGlobal.getWindowManagerService().injectInputAfterTransactionsApplied(event, + InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); + } catch (RemoteException e) { + } } /** diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 5c4c0052cfbb..5d186a25596f 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -232,7 +232,8 @@ public final class LoadedApk { mResources = Resources.getSystem(); mDefaultClassLoader = ClassLoader.getSystemClassLoader(); mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader); - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } /** @@ -243,19 +244,15 @@ public final class LoadedApk { mApplicationInfo = info; mDefaultClassLoader = classLoader; mAppComponentFactory = createAppFactory(info, mDefaultClassLoader); - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } private AppComponentFactory createAppFactory(ApplicationInfo appInfo, ClassLoader cl) { if (appInfo.appComponentFactory != null && cl != null) { try { - AppComponentFactory factory = (AppComponentFactory) cl.loadClass( - appInfo.appComponentFactory).newInstance(); - // Pass a copy of ApplicationInfo to the factory. Copying protects the framework - // from apps which would override the factory and change ApplicationInfo contents. - // ApplicationInfo is used to set up the default class loader. - factory.setApplicationInfo(new ApplicationInfo(appInfo)); - return factory; + return (AppComponentFactory) + cl.loadClass(appInfo.appComponentFactory).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { Slog.e(TAG, "Unable to instantiate appComponentFactory", e); } @@ -729,8 +726,8 @@ public final class LoadedApk { mDefaultClassLoader = ClassLoader.getSystemClassLoader(); } mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader); - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); - + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); return; } @@ -821,7 +818,8 @@ public final class LoadedApk { } if (mClassLoader == null) { - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } return; @@ -935,8 +933,10 @@ public final class LoadedApk { // Call AppComponentFactory to select/create the main class loader of this app. // Since this may call code in the app, mDefaultClassLoader must be fully set up // before invoking the factory. + // Invoke with a copy of ApplicationInfo to protect against the app changing it. if (mClassLoader == null) { - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 2e7093db92f0..dd7b629905f4 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3471,6 +3471,7 @@ public class Notification implements Parcelable * @param shortcutId the {@link ShortcutInfo#getId() id} of the shortcut this notification * supersedes */ + @NonNull public Builder setShortcutId(String shortcutId) { mN.mShortcutId = shortcutId; return this; @@ -3484,6 +3485,7 @@ public class Notification implements Parcelable * * Note: This value might be ignored, for launchers that don't support badge icons. */ + @NonNull public Builder setBadgeIconType(int icon) { mN.mBadgeIcon = icon; return this; @@ -3499,6 +3501,7 @@ public class Notification implements Parcelable * * <p> The default value is {@link #GROUP_ALERT_ALL}.</p> */ + @NonNull public Builder setGroupAlertBehavior(@GroupAlertBehavior int groupAlertBehavior) { mN.mGroupAlertBehavior = groupAlertBehavior; return this; @@ -3515,6 +3518,7 @@ public class Notification implements Parcelable * outside of the notification shade on unlocked devices. When a user interacts with the * collapsed state, the bubble intent will be invoked and displayed.</b> */ + @NonNull public Builder setBubbleMetadata(BubbleMetadata data) { mN.mBubbleMetadata = data; return this; @@ -3530,6 +3534,7 @@ public class Notification implements Parcelable /** * Specifies the channel the notification should be delivered on. */ + @NonNull public Builder setChannelId(String channelId) { mN.mChannelId = channelId; return this; @@ -3546,6 +3551,7 @@ public class Notification implements Parcelable * Specifies a duration in milliseconds after which this notification should be canceled, * if it is not already canceled. */ + @NonNull public Builder setTimeoutAfter(long durationMs) { mN.mTimeout = durationMs; return this; @@ -3560,6 +3566,7 @@ public class Notification implements Parcelable * * @see Notification#when */ + @NonNull public Builder setWhen(long when) { mN.when = when; return this; @@ -3571,6 +3578,7 @@ public class Notification implements Parcelable * For apps targeting {@link android.os.Build.VERSION_CODES#N} and above, this defaults to * {@code false}. For earlier apps, the default is {@code true}. */ + @NonNull public Builder setShowWhen(boolean show) { mN.extras.putBoolean(EXTRA_SHOW_WHEN, show); return this; @@ -3591,6 +3599,7 @@ public class Notification implements Parcelable * @see Notification#when * @see #setChronometerCountDown(boolean) */ + @NonNull public Builder setUsesChronometer(boolean b) { mN.extras.putBoolean(EXTRA_SHOW_CHRONOMETER, b); return this; @@ -3604,6 +3613,7 @@ public class Notification implements Parcelable * * @see #setUsesChronometer(boolean) */ + @NonNull public Builder setChronometerCountDown(boolean countDown) { mN.extras.putBoolean(EXTRA_CHRONOMETER_COUNT_DOWN, countDown); return this; @@ -3623,6 +3633,7 @@ public class Notification implements Parcelable * A resource ID in the application's package of the drawable to use. * @see Notification#icon */ + @NonNull public Builder setSmallIcon(@DrawableRes int icon) { return setSmallIcon(icon != 0 ? Icon.createWithResource(mContext, icon) @@ -3640,6 +3651,7 @@ public class Notification implements Parcelable * @see Notification#icon * @see Notification#iconLevel */ + @NonNull public Builder setSmallIcon(@DrawableRes int icon, int level) { mN.iconLevel = level; return setSmallIcon(icon); @@ -3653,6 +3665,7 @@ public class Notification implements Parcelable * @param icon An Icon object to use. * @see Notification#icon */ + @NonNull public Builder setSmallIcon(Icon icon) { mN.setSmallIcon(icon); if (icon != null && icon.getType() == Icon.TYPE_RESOURCE) { @@ -3664,6 +3677,7 @@ public class Notification implements Parcelable /** * Set the first line of text in the platform notification template. */ + @NonNull public Builder setContentTitle(CharSequence title) { mN.extras.putCharSequence(EXTRA_TITLE, safeCharSequence(title)); return this; @@ -3672,6 +3686,7 @@ public class Notification implements Parcelable /** * Set the second line of text in the platform notification template. */ + @NonNull public Builder setContentText(CharSequence text) { mN.extras.putCharSequence(EXTRA_TEXT, safeCharSequence(text)); return this; @@ -3695,6 +3710,7 @@ public class Notification implements Parcelable * same time on those versions; they occupy the same place. * </p> */ + @NonNull public Builder setSubText(CharSequence text) { mN.extras.putCharSequence(EXTRA_SUB_TEXT, safeCharSequence(text)); return this; @@ -3713,6 +3729,7 @@ public class Notification implements Parcelable * @param text * @return */ + @NonNull public Builder setSettingsText(CharSequence text) { mN.mSettingsText = safeCharSequence(text); return this; @@ -3732,6 +3749,7 @@ public class Notification implements Parcelable * <p>Note: The reply text will only be shown on notifications that have least one action * with a {@code RemoteInput}.</p> */ + @NonNull public Builder setRemoteInputHistory(CharSequence[] text) { if (text == null) { mN.extras.putCharSequenceArray(EXTRA_REMOTE_INPUT_HISTORY, null); @@ -3750,6 +3768,7 @@ public class Notification implements Parcelable * Sets whether remote history entries view should have a spinner. * @hide */ + @NonNull public Builder setShowRemoteInputSpinner(boolean showSpinner) { mN.extras.putBoolean(EXTRA_SHOW_REMOTE_INPUT_SPINNER, showSpinner); return this; @@ -3759,6 +3778,7 @@ public class Notification implements Parcelable * Sets whether smart reply buttons should be hidden. * @hide */ + @NonNull public Builder setHideSmartReplies(boolean hideSmartReplies) { mN.extras.putBoolean(EXTRA_HIDE_SMART_REPLIES, hideSmartReplies); return this; @@ -3768,6 +3788,7 @@ public class Notification implements Parcelable * Sets the number of items this notification represents. May be displayed as a badge count * for Launchers that support badging. */ + @NonNull public Builder setNumber(int number) { mN.number = number; return this; @@ -3794,6 +3815,7 @@ public class Notification implements Parcelable * * The platform template will represent this using a {@link ProgressBar}. */ + @NonNull public Builder setProgress(int max, int progress, boolean indeterminate) { mN.extras.putInt(EXTRA_PROGRESS, progress); mN.extras.putInt(EXTRA_PROGRESS_MAX, max); @@ -3817,6 +3839,7 @@ public class Notification implements Parcelable * This will override the layout that would otherwise be constructed by this Builder * object. */ + @NonNull public Builder setCustomContentView(RemoteViews contentView) { mN.contentView = contentView; return this; @@ -3828,6 +3851,7 @@ public class Notification implements Parcelable * This will override the expanded layout that would otherwise be constructed by this * Builder object. */ + @NonNull public Builder setCustomBigContentView(RemoteViews contentView) { mN.bigContentView = contentView; return this; @@ -3839,6 +3863,7 @@ public class Notification implements Parcelable * This will override the heads-up layout that would otherwise be constructed by this * Builder object. */ + @NonNull public Builder setCustomHeadsUpContentView(RemoteViews contentView) { mN.headsUpContentView = contentView; return this; @@ -3855,6 +3880,7 @@ public class Notification implements Parcelable * * @see Notification#contentIntent Notification.contentIntent */ + @NonNull public Builder setContentIntent(PendingIntent intent) { mN.contentIntent = intent; return this; @@ -3865,6 +3891,7 @@ public class Notification implements Parcelable * * @see Notification#deleteIntent */ + @NonNull public Builder setDeleteIntent(PendingIntent intent) { mN.deleteIntent = intent; return this; @@ -3893,6 +3920,7 @@ public class Notification implements Parcelable * * @see Notification#fullScreenIntent */ + @NonNull public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) { mN.fullScreenIntent = intent; setFlag(FLAG_HIGH_PRIORITY, highPriority); @@ -3904,6 +3932,7 @@ public class Notification implements Parcelable * * @see Notification#tickerText */ + @NonNull public Builder setTicker(CharSequence tickerText) { mN.tickerText = safeCharSequence(tickerText); return this; @@ -3927,6 +3956,7 @@ public class Notification implements Parcelable * in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small * badge atop the large icon). */ + @NonNull public Builder setLargeIcon(Bitmap b) { return setLargeIcon(b != null ? Icon.createWithBitmap(b) : null); } @@ -3938,6 +3968,7 @@ public class Notification implements Parcelable * in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small * badge atop the large icon). */ + @NonNull public Builder setLargeIcon(Icon icon) { mN.mLargeIcon = icon; mN.extras.putParcelable(EXTRA_LARGE_ICON, icon); @@ -4045,6 +4076,7 @@ public class Notification implements Parcelable * @see Notification#FLAG_ONGOING_EVENT */ + @NonNull public Builder setOngoing(boolean ongoing) { setFlag(FLAG_ONGOING_EVENT, ongoing); return this; @@ -4065,6 +4097,7 @@ public class Notification implements Parcelable * @see #setColor(int) * @see MediaStyle#setMediaSession(MediaSession.Token) */ + @NonNull public Builder setColorized(boolean colorize) { mN.extras.putBoolean(EXTRA_COLORIZED, colorize); return this; @@ -4076,6 +4109,7 @@ public class Notification implements Parcelable * * @see Notification#FLAG_ONLY_ALERT_ONCE */ + @NonNull public Builder setOnlyAlertOnce(boolean onlyAlertOnce) { setFlag(FLAG_ONLY_ALERT_ONCE, onlyAlertOnce); return this; @@ -4086,6 +4120,7 @@ public class Notification implements Parcelable * * @see Notification#FLAG_AUTO_CANCEL */ + @NonNull public Builder setAutoCancel(boolean autoCancel) { setFlag(FLAG_AUTO_CANCEL, autoCancel); return this; @@ -4097,6 +4132,7 @@ public class Notification implements Parcelable * <p>Some notifications can be bridged to other devices for remote display. * This hint can be set to recommend this notification not be bridged. */ + @NonNull public Builder setLocalOnly(boolean localOnly) { setFlag(FLAG_LOCAL_ONLY, localOnly); return this; @@ -4138,6 +4174,7 @@ public class Notification implements Parcelable * * @see Notification#category */ + @NonNull public Builder setCategory(String category) { mN.category = category; return this; @@ -4195,6 +4232,7 @@ public class Notification implements Parcelable * @param person the person to add. * @see Notification#EXTRA_PEOPLE_LIST */ + @NonNull public Builder addPerson(Person person) { mPersonList.add(person); return this; @@ -4211,6 +4249,7 @@ public class Notification implements Parcelable * @param groupKey The group key of the group. * @return this object for method chaining */ + @NonNull public Builder setGroup(String groupKey) { mN.mGroupKey = groupKey; return this; @@ -4224,6 +4263,7 @@ public class Notification implements Parcelable * @param isGroupSummary Whether this notification should be a group summary. * @return this object for method chaining */ + @NonNull public Builder setGroupSummary(boolean isGroupSummary) { setFlag(FLAG_GROUP_SUMMARY, isGroupSummary); return this; @@ -4241,6 +4281,7 @@ public class Notification implements Parcelable * * @see String#compareTo(String) */ + @NonNull public Builder setSortKey(String sortKey) { mN.mSortKey = sortKey; return this; @@ -4253,6 +4294,7 @@ public class Notification implements Parcelable * * @see Notification#extras */ + @NonNull public Builder addExtras(Bundle extras) { if (extras != null) { mUserExtras.putAll(extras); @@ -4272,6 +4314,7 @@ public class Notification implements Parcelable * * @see Notification#extras */ + @NonNull public Builder setExtras(Bundle extras) { if (extras != null) { mUserExtras = extras; @@ -4339,6 +4382,7 @@ public class Notification implements Parcelable * * @param action The action to add. */ + @NonNull public Builder addAction(Action action) { if (action != null) { mActions.add(action); @@ -4353,6 +4397,7 @@ public class Notification implements Parcelable * @param actions * @return */ + @NonNull public Builder setActions(Action... actions) { mActions.clear(); for (int i = 0; i < actions.length; i++) { @@ -4368,6 +4413,7 @@ public class Notification implements Parcelable * * @param style Object responsible for modifying the notification style. */ + @NonNull public Builder setStyle(Style style) { if (mStyle != style) { mStyle = style; @@ -4393,6 +4439,7 @@ public class Notification implements Parcelable * * @return The same Builder. */ + @NonNull public Builder setVisibility(@Visibility int visibility) { mN.visibility = visibility; return this; @@ -4404,6 +4451,7 @@ public class Notification implements Parcelable * @param n A replacement notification, presumably with some or all info redacted. * @return The same Builder. */ + @NonNull public Builder setPublicVersion(Notification n) { if (n != null) { mN.publicVersion = new Notification(); @@ -4418,6 +4466,7 @@ public class Notification implements Parcelable * Apply an extender to this notification builder. Extenders may be used to add * metadata or change options on this builder. */ + @NonNull public Builder extend(Extender extender) { extender.extend(this); return this; @@ -4426,6 +4475,7 @@ public class Notification implements Parcelable /** * @hide */ + @NonNull public Builder setFlag(int mask, boolean value) { if (value) { mN.flags |= mask; @@ -4442,6 +4492,7 @@ public class Notification implements Parcelable * * @return The same Builder. */ + @NonNull public Builder setColor(@ColorInt int argb) { mN.color = argb; sanitizeColor(); @@ -5674,6 +5725,7 @@ public class Notification implements Parcelable * Apply the unstyled operations and return a new {@link Notification} object. * @hide */ + @NonNull public Notification buildUnstyled() { if (mActions.size() > 0) { mN.actions = new Action[mActions.size()]; @@ -5694,6 +5746,7 @@ public class Notification implements Parcelable * @param context The context for your application / activity. * @param n The notification to create a Builder from. */ + @NonNull public static Notification.Builder recoverBuilder(Context context, Notification n) { // Re-create notification context so we can access app resources. ApplicationInfo applicationInfo = n.extras.getParcelable( @@ -5718,6 +5771,7 @@ public class Notification implements Parcelable * Determines whether the platform can generate contextual actions for a notification. * By default this is true. */ + @NonNull public Builder setAllowSystemGeneratedContextualActions(boolean allowed) { mN.mAllowSystemGeneratedContextualActions = allowed; return this; @@ -5735,6 +5789,7 @@ public class Notification implements Parcelable * Combine all of the options that have been set and return a new {@link Notification} * object. */ + @NonNull public Notification build() { // first, add any extras from the calling code if (mUserExtras != null) { @@ -5793,7 +5848,8 @@ public class Notification implements Parcelable * * @hide */ - public Notification buildInto(Notification n) { + @NonNull + public Notification buildInto(@NonNull Notification n) { build().cloneInto(n, true); return n; } diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index 4a451509f538..8493fb25b8a5 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -47,8 +47,10 @@ import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.AutoCompleteTextView; +import android.widget.Filterable; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ListPopupWindow; import android.widget.SearchView; import android.widget.TextView; @@ -370,7 +372,10 @@ public class SearchDialog extends Dialog { updateSearchAppIcon(); updateSearchBadge(); if (isLandscapeMode(getContext())) { - mSearchAutoComplete.ensureImeVisible(true); + mSearchAutoComplete.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NEEDED); + if (mSearchAutoComplete.isDropDownAlwaysVisible() || enoughToFilter()) { + mSearchAutoComplete.showDropDown(); + } } } } @@ -381,6 +386,15 @@ public class SearchDialog extends Dialog { == Configuration.ORIENTATION_LANDSCAPE; } + private boolean enoughToFilter() { + Filterable filterableAdapter = (Filterable) mSearchAutoComplete.getAdapter(); + if (filterableAdapter == null || filterableAdapter.getFilter() == null) { + return false; + } + + return mSearchAutoComplete.enoughToFilter(); + } + /** * Update the UI according to the info in the current value of {@link #mSearchable}. */ diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java index f116e133e338..1f91b3f431a1 100644 --- a/core/java/android/app/Service.java +++ b/core/java/android/app/Service.java @@ -27,6 +27,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; +import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo.ForegroundServiceType; import android.content.res.Configuration; import android.os.Build; @@ -733,7 +734,7 @@ public abstract class Service extends ContextWrapper implements ComponentCallbac * {@link android.R.attr#foregroundServiceType} flags. * @throws IllegalArgumentException if param foregroundServiceType is not subset of manifest * attribute {@link android.R.attr#foregroundServiceType}. - * @see {@link android.content.pm.ServiceInfo} for the set of FOREGROUND_SERVICE_TYPE flags. + * @see android.content.pm.ServiceInfo#FOREGROUND_SERVICE_TYPE_MANIFEST */ public final void startForeground(int id, @NonNull Notification notification, @ForegroundServiceType int foregroundServiceType) { @@ -775,6 +776,30 @@ public abstract class Service extends ContextWrapper implements ComponentCallbac } /** + * If the service has become a foreground service by calling + * {@link #startForeground(int, Notification)} + * or {@link #startForeground(int, Notification, int)}, {@link #getForegroundServiceType()} + * returns the current foreground service type. + * + * <p>If there is no foregroundServiceType specified + * in manifest, {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_NONE} is returned. </p> + * + * <p>If the service is not a foreground service, + * {@link ServiceInfo#FOREGROUND_SERVICE_TYPE_NONE} is returned.</p> + * + * @return current foreground service type flags. + */ + public final @ForegroundServiceType int getForegroundServiceType() { + int ret = ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE; + try { + ret = mActivityManager.getForegroundServiceType( + new ComponentName(this, mClassName), mToken); + } catch (RemoteException ex) { + } + return ret; + } + + /** * Print the Service's state into the given stream. This gets invoked if * you run "adb shell dumpsys activity service <yourservicename>" * (note that for this command to work, the service must be running, and diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 077652cacc2d..9ff363dddc3c 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -17,7 +17,9 @@ package android.app; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.UnsupportedAppUsage; @@ -364,6 +366,7 @@ public class StatusBarManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean disabled) { try { final int userId = Binder.getCallingUserHandle().getIdentifier(); @@ -387,6 +390,8 @@ public class StatusBarManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.STATUS_BAR) + @NonNull public DisableInfo getDisableInfo() { try { final int userId = Binder.getCallingUserHandle().getIdentifier(); @@ -518,7 +523,7 @@ public class StatusBarManager { * @hide */ @SystemApi - public boolean areNoComponentsDisabled() { + public boolean areAllComponentsEnabled() { return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents && !mSearch; } diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index fcc76ac8bc40..47ad6d737430 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -85,6 +85,12 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { } @Override + @UnsupportedAppUsage + public void onActivityLaunchOnSecondaryDisplayRerouted(ActivityManager.RunningTaskInfo taskInfo, + int requestedDisplayId) throws RemoteException { + } + + @Override public void onTaskCreated(int taskId, ComponentName componentName) throws RemoteException { } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index a32e01fb68e5..d593ad1fd0cd 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -59,7 +59,6 @@ import android.os.Build; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.Parcelable; -import android.os.ParcelableException; import android.os.PersistableBundle; import android.os.Process; import android.os.RemoteCallback; @@ -1453,7 +1452,7 @@ public class DevicePolicyManager { * Constant for {@link #getPasswordComplexity()}: password satisfies one of the following: * <ul> * <li>PIN with <b>no</b> repeating (4444) or ordered (1234, 4321, 2468) sequences, length at - * least 4 + * least 8 * <li>alphabetic, length at least 6 * <li>alphanumeric, length at least 6 * </ul> diff --git a/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java b/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java index 4064a02e54a8..ad2006c07f6a 100644 --- a/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java +++ b/core/java/android/app/servertransaction/TopResumedActivityChangeItem.java @@ -17,9 +17,11 @@ package android.app.servertransaction; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; +import android.app.ActivityTaskManager; import android.app.ClientTransactionHandler; import android.os.IBinder; import android.os.Parcel; +import android.os.RemoteException; import android.os.Trace; /** @@ -38,6 +40,26 @@ public class TopResumedActivityChangeItem extends ClientTransactionItem { Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } + @Override + public void postExecute(ClientTransactionHandler client, IBinder token, + PendingTransactionActions pendingActions) { + if (mOnTop) { + return; + } + + // The loss of top resumed state can always be reported immediately in postExecute + // because only three cases are possible: + // 1. Activity is in RESUMED state now and it just handled the callback in #execute(). + // 2. Activity wasn't RESUMED yet, which means that it didn't receive the top state yet. + // 3. Activity is PAUSED or in other lifecycle state after PAUSED. In this case top resumed + // state loss was already called right before pausing. + try { + ActivityTaskManager.getService().activityTopResumedStateLost(); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + // ObjectPoolItem implementation diff --git a/core/java/android/app/servertransaction/WindowVisibilityItem.java b/core/java/android/app/servertransaction/WindowVisibilityItem.java index d9956b1348b1..6bdd313d819a 100644 --- a/core/java/android/app/servertransaction/WindowVisibilityItem.java +++ b/core/java/android/app/servertransaction/WindowVisibilityItem.java @@ -34,7 +34,8 @@ public class WindowVisibilityItem extends ClientTransactionItem { @Override public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { - Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityShowWindow"); + Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, + mShowWindow ? "activityShowWindow" : "activityHideWindow"); client.handleWindowVisibility(token, mShowWindow); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index 9c6bd927dd56..d34e6d3836b8 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -195,6 +195,8 @@ public final class UsageStatsManager { /** @hide */ public static final int REASON_SUB_USAGE_EXEMPTED_SYNC_START = 0x000D; /** @hide */ + public static final int REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED = 0x000E; + /** @hide */ public static final int REASON_SUB_PREDICTED_RESTORED = 0x0001; @@ -972,6 +974,9 @@ public final class UsageStatsManager { case REASON_SUB_USAGE_EXEMPTED_SYNC_START: sb.append("-es"); break; + case REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED: + sb.append("-uss"); + break; } break; } diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java index 43ce521fa9f3..bbec6b386d60 100644 --- a/core/java/android/app/usage/UsageStatsManagerInternal.java +++ b/core/java/android/app/usage/UsageStatsManagerInternal.java @@ -257,12 +257,14 @@ public abstract class UsageStatsManagerInternal { int numDeferredJobs, long timeSinceLastJobRun); /** - * Report a sync is scheduled by a foreground app. + * Report a sync that was scheduled. * * @param packageName name of the package that owns the sync adapter. * @param userId which user the app is associated with + * @param exempted is sync app standby exempted */ - public abstract void reportExemptedSyncScheduled(String packageName, @UserIdInt int userId); + public abstract void reportSyncScheduled(String packageName, @UserIdInt int userId, + boolean exempted); /** * Report a sync that was scheduled by a foreground app is about to be executed. diff --git a/core/java/android/content/LocusId.java b/core/java/android/content/LocusId.java index 9548f9c32d90..d6697286cfa1 100644 --- a/core/java/android/content/LocusId.java +++ b/core/java/android/content/LocusId.java @@ -101,12 +101,14 @@ public final class LocusId implements Parcelable { public static final Parcelable.Creator<LocusId> CREATOR = new Parcelable.Creator<LocusId>() { + @NonNull @Override public LocusId createFromParcel(Parcel source) { final Uri uri = source.readParcelable(null); return new LocusId(uri); } + @NonNull @Override public LocusId[] newArray(int size) { return new LocusId[size]; diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 6c6fcb2ea558..dad1a1a22fb6 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -662,6 +662,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public static final int PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE = 1 << 26; + /** + * Value for {@link #privateFlags}: true if the application allows its audio playback + * to be captured by other apps. + * + * @hide + */ + public static final int PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE = 1 << 27; + /** @hide */ @IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = { PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, @@ -688,7 +696,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { PRIVATE_FLAG_VENDOR, PRIVATE_FLAG_VIRTUAL_PRELOAD, PRIVATE_FLAG_HAS_FRAGILE_USER_DATA, - PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE + PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE, + PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE }) @Retention(RetentionPolicy.SOURCE) public @interface ApplicationInfoPrivateFlags {} @@ -1342,6 +1351,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { } pw.println(prefix + "HiddenApiEnforcementPolicy=" + getHiddenApiEnforcementPolicy()); pw.println(prefix + "usesNonSdkApi=" + usesNonSdkApi()); + pw.println(prefix + "allowsPlaybackCapture=" + + (isAudioPlaybackCaptureAllowed() ? "true" : "false")); } super.dumpBack(pw, prefix); } @@ -1790,6 +1801,17 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { return (privateFlags & PRIVATE_FLAG_HAS_FRAGILE_USER_DATA) != 0; } + /** + * Whether an app allows its playback audio to be captured by other apps. + * + * @return {@code true} if the app indicates that its audio can be captured by other apps. + * + * @hide + */ + public boolean isAudioPlaybackCaptureAllowed() { + return (privateFlags & PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE) != 0; + } + private boolean isAllowedToUseHiddenApis() { if (isSignedWithPlatformKey()) { return true; diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 270e3879a71f..2c1842c70db9 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -160,6 +160,14 @@ public abstract class PackageManagerInternal { * @return whether the default browser was successfully set. */ boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId); + + /** + * Set the package name of the default browser asynchronously. + * + * @param packageName package name of the default browser, or {@code null} to remove + * @param userId the user id + */ + void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId); } /** diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 4db7d0a91c6a..f899800f4e93 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3756,6 +3756,12 @@ public class PackageParser { ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE; } + if (sa.getBoolean( + R.styleable.AndroidManifestApplication_allowAudioPlaybackCapture, + owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q)) { + ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE; + } + ai.maxAspectRatio = sa.getFloat(R.styleable.AndroidManifestApplication_maxAspectRatio, 0); ai.minAspectRatio = sa.getFloat(R.styleable.AndroidManifestApplication_minAspectRatio, 0); diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java index 0cde6ba38099..9459ad366f76 100644 --- a/core/java/android/content/rollback/RollbackInfo.java +++ b/core/java/android/content/rollback/RollbackInfo.java @@ -17,12 +17,10 @@ package android.content.rollback; import android.annotation.SystemApi; -import android.content.pm.PackageInstaller; import android.content.pm.VersionedPackage; import android.os.Parcel; import android.os.Parcelable; -import java.util.Collections; import java.util.List; /** @@ -44,13 +42,7 @@ public final class RollbackInfo implements Parcelable { private final List<VersionedPackage> mCausePackages; private final boolean mIsStaged; - private final int mCommittedSessionId; - - /** @hide */ - public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged) { - this(rollbackId, packages, isStaged, Collections.emptyList(), - PackageInstaller.SessionInfo.INVALID_ID); - } + private int mCommittedSessionId; /** @hide */ public RollbackInfo(int rollbackId, List<PackageRollbackInfo> packages, boolean isStaged, @@ -101,6 +93,14 @@ public final class RollbackInfo implements Parcelable { } /** + * Sets the session ID for the committed rollback for staged rollbacks. + * @hide + */ + public void setCommittedSessionId(int sessionId) { + mCommittedSessionId = sessionId; + } + + /** * Gets the list of package versions that motivated this rollback. * As provided to {@link #commitRollback} when the rollback was committed. * This is only applicable for rollbacks that have been committed. diff --git a/core/java/android/database/BulkCursorNative.java b/core/java/android/database/BulkCursorNative.java index d3c11e785d7f..77a13cf80073 100644 --- a/core/java/android/database/BulkCursorNative.java +++ b/core/java/android/database/BulkCursorNative.java @@ -16,6 +16,7 @@ package android.database; +import android.annotation.UnsupportedAppUsage; import android.os.Binder; import android.os.Bundle; import android.os.IBinder; @@ -138,6 +139,7 @@ public abstract class BulkCursorNative extends Binder implements IBulkCursor final class BulkCursorProxy implements IBulkCursor { + @UnsupportedAppUsage private IBinder mRemote; private Bundle mExtras; diff --git a/core/java/android/database/Cursor.java b/core/java/android/database/Cursor.java index 1379138b37c0..2afb755031b9 100644 --- a/core/java/android/database/Cursor.java +++ b/core/java/android/database/Cursor.java @@ -17,6 +17,7 @@ package android.database; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.ContentResolver; import android.net.Uri; import android.os.Bundle; @@ -473,7 +474,7 @@ public interface Cursor extends Closeable { * ContentResolver.registerContentObserver} to find out about changes to this Cursor's * data. May be null if no notification URI has been set. */ - default List<Uri> getNotificationUris() { + default @Nullable List<Uri> getNotificationUris() { final Uri notifyUri = getNotificationUri(); return notifyUri == null ? null : Arrays.asList(notifyUri); } diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java index baf972b26573..c64e48f44fd9 100644 --- a/core/java/android/hardware/biometrics/BiometricPrompt.java +++ b/core/java/android/hardware/biometrics/BiometricPrompt.java @@ -139,7 +139,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @param title * @return */ - public Builder setTitle(@NonNull CharSequence title) { + @NonNull public Builder setTitle(@NonNull CharSequence title) { mBundle.putCharSequence(KEY_TITLE, title); return this; } @@ -150,7 +150,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @hide */ @RequiresPermission(USE_BIOMETRIC_INTERNAL) - public Builder setUseDefaultTitle() { + @NonNull public Builder setUseDefaultTitle() { mBundle.putBoolean(KEY_USE_DEFAULT_TITLE, true); return this; } @@ -160,7 +160,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @param subtitle * @return */ - public Builder setSubtitle(@NonNull CharSequence subtitle) { + @NonNull public Builder setSubtitle(@NonNull CharSequence subtitle) { mBundle.putCharSequence(KEY_SUBTITLE, subtitle); return this; } @@ -170,7 +170,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @param description * @return */ - public Builder setDescription(@NonNull CharSequence description) { + @NonNull public Builder setDescription(@NonNull CharSequence description) { mBundle.putCharSequence(KEY_DESCRIPTION, description); return this; } @@ -182,7 +182,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @return * @hide */ - public Builder setPositiveButton(@NonNull CharSequence text, + @NonNull public Builder setPositiveButton(@NonNull CharSequence text, @NonNull @CallbackExecutor Executor executor, @NonNull DialogInterface.OnClickListener listener) { if (TextUtils.isEmpty(text)) { @@ -210,7 +210,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @param text * @return */ - public Builder setNegativeButton(@NonNull CharSequence text, + @NonNull public Builder setNegativeButton(@NonNull CharSequence text, @NonNull @CallbackExecutor Executor executor, @NonNull DialogInterface.OnClickListener listener) { if (TextUtils.isEmpty(text)) { @@ -245,7 +245,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * * @param requireConfirmation */ - public Builder setRequireConfirmation(boolean requireConfirmation) { + @NonNull public Builder setRequireConfirmation(boolean requireConfirmation) { mBundle.putBoolean(KEY_REQUIRE_CONFIRMATION, requireConfirmation); return this; } @@ -255,7 +255,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * option to authenticate with their device PIN, pattern, or password. Developers should * first check {@link KeyguardManager#isDeviceSecure()} before enabling this. If the device * is not secure, {@link BiometricPrompt#BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL} will be - * returned in {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}} + * returned in {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}}. + * Defaults to false. * * Note that {@link #setNegativeButton(CharSequence, Executor, * DialogInterface.OnClickListener)} should not be set if this is set to true. @@ -264,7 +265,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * credentials (PIN, pattern, or password). * @return */ - public Builder setAllowDeviceCredential(boolean enable) { + @NonNull public Builder setAllowDeviceCredential(boolean enable) { mBundle.putBoolean(KEY_ALLOW_DEVICE_CREDENTIAL, enable); return this; } @@ -274,7 +275,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @return a {@link BiometricPrompt} * @throws IllegalArgumentException if any of the required fields are not set. */ - public BiometricPrompt build() { + @NonNull public BiometricPrompt build() { final CharSequence title = mBundle.getCharSequence(KEY_TITLE); final CharSequence negative = mBundle.getCharSequence(KEY_NEGATIVE_TEXT); final boolean useDefaultTitle = mBundle.getBoolean(KEY_USE_DEFAULT_TITLE); @@ -616,8 +617,15 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan mExecutor = executor; mAuthenticationCallback = callback; final long sessionId = crypto != null ? crypto.getOpId() : 0; - mService.authenticate(mToken, sessionId, userId, mBiometricServiceReceiver, - mContext.getOpPackageName(), mBundle); + if (BiometricManager.hasBiometrics(mContext)) { + mService.authenticate(mToken, sessionId, userId, mBiometricServiceReceiver, + mContext.getOpPackageName(), mBundle); + } else { + mExecutor.execute(() -> { + callback.onAuthenticationError(BiometricPrompt.BIOMETRIC_ERROR_HW_NOT_PRESENT, + mContext.getString(R.string.biometric_error_hw_unavailable)); + }); + } } catch (RemoteException e) { Log.e(TAG, "Remote exception while authenticating", e); mExecutor.execute(() -> { diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 0e4ff78af1e0..f7b7ef2f0d58 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -682,6 +682,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#COLOR_CORRECTION_ABERRATION_MODE */ @PublicKey + @NonNull public static final Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES = new Key<int[]>("android.colorCorrection.availableAberrationModes", int[].class); @@ -700,6 +701,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AE_ANTIBANDING_MODE */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES = new Key<int[]>("android.control.aeAvailableAntibandingModes", int[].class); @@ -725,6 +727,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AE_MODE */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AE_AVAILABLE_MODES = new Key<int[]>("android.control.aeAvailableModes", int[].class); @@ -764,6 +767,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE */ @PublicKey + @NonNull public static final Key<android.util.Range<Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES = new Key<android.util.Range<Integer>[]>("android.control.aeAvailableTargetFpsRanges", new TypeReference<android.util.Range<Integer>[]>() {{ }}); @@ -784,6 +788,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION */ @PublicKey + @NonNull public static final Key<android.util.Range<Integer>> CONTROL_AE_COMPENSATION_RANGE = new Key<android.util.Range<Integer>>("android.control.aeCompensationRange", new TypeReference<android.util.Range<Integer>>() {{ }}); @@ -801,6 +806,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION */ @PublicKey + @NonNull public static final Key<Rational> CONTROL_AE_COMPENSATION_STEP = new Key<Rational>("android.control.aeCompensationStep", Rational.class); @@ -825,6 +831,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AF_AVAILABLE_MODES = new Key<int[]>("android.control.afAvailableModes", int[].class); @@ -848,6 +855,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_MODE */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AVAILABLE_EFFECTS = new Key<int[]>("android.control.availableEffects", int[].class); @@ -871,6 +879,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#STATISTICS_INFO_MAX_FACE_COUNT */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AVAILABLE_SCENE_MODES = new Key<int[]>("android.control.availableSceneModes", int[].class); @@ -885,6 +894,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_VIDEO_STABILIZATION_MODE */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES = new Key<int[]>("android.control.availableVideoStabilizationModes", int[].class); @@ -909,6 +919,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AWB_MODE */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AWB_AVAILABLE_MODES = new Key<int[]>("android.control.awbAvailableModes", int[].class); @@ -945,6 +956,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AE_REGIONS */ @PublicKey + @NonNull @SyntheticKey public static final Key<Integer> CONTROL_MAX_REGIONS_AE = new Key<Integer>("android.control.maxRegionsAe", int.class); @@ -961,6 +973,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AWB_REGIONS */ @PublicKey + @NonNull @SyntheticKey public static final Key<Integer> CONTROL_MAX_REGIONS_AWB = new Key<Integer>("android.control.maxRegionsAwb", int.class); @@ -977,6 +990,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AF_REGIONS */ @PublicKey + @NonNull @SyntheticKey public static final Key<Integer> CONTROL_MAX_REGIONS_AF = new Key<Integer>("android.control.maxRegionsAf", int.class); @@ -1025,7 +1039,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * normal capture session, or it will cause request error.</p> * <p><b>Range of valid values:</b><br></p> * <p>For each configuration, the fps_max >= 120fps.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1046,6 +1060,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AE_LOCK */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_AE_LOCK_AVAILABLE = new Key<Boolean>("android.control.aeLockAvailable", boolean.class); @@ -1058,6 +1073,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_AWB_LOCK */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_AWB_LOCK_AVAILABLE = new Key<Boolean>("android.control.awbLockAvailable", boolean.class); @@ -1074,6 +1090,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#CONTROL_MODE */ @PublicKey + @NonNull public static final Key<int[]> CONTROL_AVAILABLE_MODES = new Key<int[]>("android.control.availableModes", int[].class); @@ -1088,12 +1105,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * present, and if a device does not support post RAW sensitivity boost, it will * list <code>(100, 100)</code> in this key.</p> * <p><b>Units</b>: ISO arithmetic units, the same as {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#CONTROL_POST_RAW_SENSITIVITY_BOOST * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<android.util.Range<Integer>> CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE = new Key<android.util.Range<Integer>>("android.control.postRawSensitivityBoostRange", new TypeReference<android.util.Range<Integer>>() {{ }}); @@ -1105,7 +1123,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * list FAST.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#EDGE_MODE android.edge.mode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1114,6 +1132,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<int[]> EDGE_AVAILABLE_EDGE_MODES = new Key<int[]>("android.edge.availableEdgeModes", int[].class); @@ -1126,6 +1145,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * This key is available on all devices.</p> */ @PublicKey + @NonNull public static final Key<Boolean> FLASH_INFO_AVAILABLE = new Key<Boolean>("android.flash.info.available", boolean.class); @@ -1135,11 +1155,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>FULL mode camera devices will always support FAST.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#HOT_PIXEL_MODE android.hotPixel.mode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#HOT_PIXEL_MODE */ @PublicKey + @NonNull public static final Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES = new Key<int[]>("android.hotPixel.availableHotPixelModes", int[].class); @@ -1167,6 +1188,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#JPEG_THUMBNAIL_SIZE */ @PublicKey + @NonNull public static final Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES = new Key<android.util.Size[]>("android.jpeg.availableThumbnailSizes", android.util.Size[].class); @@ -1178,7 +1200,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>If the camera device supports a variable aperture, the aperture values * in this list will be sorted in ascending order.</p> * <p><b>Units</b>: The aperture f-number</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1187,6 +1209,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#LENS_APERTURE */ @PublicKey + @NonNull public static final Key<float[]> LENS_INFO_AVAILABLE_APERTURES = new Key<float[]>("android.lens.info.availableApertures", float[].class); @@ -1199,7 +1222,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p><b>Units</b>: Exposure value (EV)</p> * <p><b>Range of valid values:</b><br></p> * <p>Values are >= 0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1208,6 +1231,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#LENS_FILTER_DENSITY */ @PublicKey + @NonNull public static final Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES = new Key<float[]>("android.lens.info.availableFilterDensities", float[].class); @@ -1226,6 +1250,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#LENS_FOCAL_LENGTH */ @PublicKey + @NonNull public static final Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS = new Key<float[]>("android.lens.info.availableFocalLengths", float[].class); @@ -1236,7 +1261,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * contain only OFF.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#LENS_OPTICAL_STABILIZATION_MODE android.lens.opticalStabilizationMode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1245,6 +1270,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#LENS_OPTICAL_STABILIZATION_MODE */ @PublicKey + @NonNull public static final Key<int[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION = new Key<int[]>("android.lens.info.availableOpticalStabilization", int[].class); @@ -1256,7 +1282,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p><b>Range of valid values:</b><br> * If lens is fixed focus, >= 0. If lens has focuser unit, the value is * within <code>(0.0f, {@link CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE android.lens.info.minimumFocusDistance}]</code></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1267,6 +1293,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE */ @PublicKey + @NonNull public static final Key<Float> LENS_INFO_HYPERFOCAL_DISTANCE = new Key<Float>("android.lens.info.hyperfocalDistance", float.class); @@ -1278,7 +1305,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p><b>Units</b>: See {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details</p> * <p><b>Range of valid values:</b><br> * >= 0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1288,6 +1315,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION */ @PublicKey + @NonNull public static final Key<Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE = new Key<Float>("android.lens.info.minimumFocusDistance", float.class); @@ -1297,7 +1325,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * must be smaller than 64x64.</p> * <p><b>Range of valid values:</b><br> * Both values >= 1</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1329,7 +1357,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <li>{@link #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE APPROXIMATE}</li> * <li>{@link #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED CALIBRATED}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1344,6 +1372,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED */ @PublicKey + @NonNull public static final Key<Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION = new Key<Integer>("android.lens.info.focusDistanceCalibration", int.class); @@ -1362,6 +1391,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #LENS_FACING_EXTERNAL */ @PublicKey + @NonNull public static final Key<Integer> LENS_FACING = new Key<Integer>("android.lens.facing", int.class); @@ -1396,10 +1426,11 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <code>p'</code> is in the camera-oriented coordinate system.</p> * <p><b>Units</b>: * Quaternion coefficients</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> */ @PublicKey + @NonNull public static final Key<float[]> LENS_POSE_ROTATION = new Key<float[]>("android.lens.poseRotation", float[].class); @@ -1432,7 +1463,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * the center of the primary gyroscope on the device. The axis definitions are the same as * with PRIMARY_CAMERA.</p> * <p><b>Units</b>: Meters</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_DISTORTION @@ -1441,6 +1472,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#LENS_POSE_ROTATION */ @PublicKey + @NonNull public static final Key<float[]> LENS_POSE_TRANSLATION = new Key<float[]>("android.lens.poseTranslation", float[].class); @@ -1504,7 +1536,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * Pixels in the * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * coordinate system.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_DISTORTION @@ -1514,6 +1546,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<float[]> LENS_INTRINSIC_CALIBRATION = new Key<float[]>("android.lens.intrinsicCalibration", float[].class); @@ -1548,7 +1581,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>The distortion model used is the Brown-Conrady model.</p> * <p><b>Units</b>: * Unitless coefficients.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION @@ -1561,6 +1594,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri */ @Deprecated @PublicKey + @NonNull public static final Key<float[]> LENS_RADIAL_DISTORTION = new Key<float[]>("android.lens.radialDistortion", float[].class); @@ -1573,7 +1607,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <li>{@link #LENS_POSE_REFERENCE_PRIMARY_CAMERA PRIMARY_CAMERA}</li> * <li>{@link #LENS_POSE_REFERENCE_GYROSCOPE GYROSCOPE}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_POSE_TRANSLATION @@ -1581,6 +1615,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #LENS_POSE_REFERENCE_GYROSCOPE */ @PublicKey + @NonNull public static final Key<Integer> LENS_POSE_REFERENCE = new Key<Integer>("android.lens.poseReference", int.class); @@ -1615,13 +1650,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>The distortion model used is the Brown-Conrady model.</p> * <p><b>Units</b>: * Unitless coefficients.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION * @see CameraCharacteristics#LENS_RADIAL_DISTORTION */ @PublicKey + @NonNull public static final Key<float[]> LENS_DISTORTION = new Key<float[]>("android.lens.distortion", float[].class); @@ -1634,7 +1670,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>Legacy-capability camera devices will only support FAST mode.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#NOISE_REDUCTION_MODE android.noiseReduction.mode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1643,6 +1679,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#NOISE_REDUCTION_MODE */ @PublicKey + @NonNull public static final Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES = new Key<int[]>("android.noiseReduction.availableNoiseReductionModes", int[].class); @@ -1655,7 +1692,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * future versions of camera service. This quirk will stop * working at that point; DO NOT USE without careful * consideration of future support.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Not used in HALv3 or newer; replaced by better partials mechanism</p> @@ -1728,6 +1765,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP */ @PublicKey + @NonNull @SyntheticKey public static final Key<Integer> REQUEST_MAX_NUM_OUTPUT_RAW = new Key<Integer>("android.request.maxNumOutputRaw", int.class); @@ -1764,6 +1802,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP */ @PublicKey + @NonNull @SyntheticKey public static final Key<Integer> REQUEST_MAX_NUM_OUTPUT_PROC = new Key<Integer>("android.request.maxNumOutputProc", int.class); @@ -1790,6 +1829,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP */ @PublicKey + @NonNull @SyntheticKey public static final Key<Integer> REQUEST_MAX_NUM_OUTPUT_PROC_STALLING = new Key<Integer>("android.request.maxNumOutputProcStalling", int.class); @@ -1809,7 +1849,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * should be JPEG.</p> * <p><b>Range of valid values:</b><br></p> * <p>0 or 1.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1817,6 +1857,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<Integer> REQUEST_MAX_NUM_INPUT_STREAMS = new Key<Integer>("android.request.maxNumInputStreams", int.class); @@ -1841,6 +1882,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureResult#REQUEST_PIPELINE_DEPTH */ @PublicKey + @NonNull public static final Key<Byte> REQUEST_PIPELINE_MAX_DEPTH = new Key<Byte>("android.request.pipelineMaxDepth", byte.class); @@ -1861,9 +1903,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * partial results.</p> * <p><b>Range of valid values:</b><br> * >= 1</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> */ @PublicKey + @NonNull public static final Key<Integer> REQUEST_PARTIAL_RESULT_COUNT = new Key<Integer>("android.request.partialResultCount", int.class); @@ -1923,6 +1966,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA */ @PublicKey + @NonNull public static final Key<int[]> REQUEST_AVAILABLE_CAPABILITIES = new Key<int[]>("android.request.availableCapabilities", int[].class); @@ -2036,7 +2080,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * {@link CaptureRequest.Builder#getPhysicalCameraKey }. Capture requests that contain * individual physical device requests must be built via * {@link android.hardware.camera2.CameraDevice#createCaptureRequest(int, Set)}.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2067,7 +2111,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * camera device for output streams.</p> * <p>All camera devices will support JPEG and YUV_420_888 formats.</p> * <p>When set to YUV_420_888, application can access the YUV420 data directly.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Not used in HALv3 or newer</p> @@ -2089,7 +2133,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p><b>Units</b>: Nanoseconds</p> * <p><b>Range of valid values:</b><br> * TODO: Remove property.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Not used in HALv3 or newer</p> @@ -2105,7 +2149,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * sensor maximum resolution (defined by {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}).</p> * <p><b>Range of valid values:</b><br> * TODO: Remove property.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @deprecated @@ -2135,6 +2179,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#SCALER_CROP_REGION */ @PublicKey + @NonNull public static final Key<Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM = new Key<Float>("android.scaler.availableMaxDigitalZoom", float.class); @@ -2148,7 +2193,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>When multiple streams are configured, the minimum frame duration will * be >= max(individual stream min durations).</p> * <p><b>Units</b>: Nanoseconds</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Not used in HALv3 or newer</p> @@ -2172,7 +2217,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * can provide.</p> * <p>Please reference the documentation for the image data destination to * check if it limits the maximum size for image data.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Not used in HALv3 or newer</p> @@ -2257,7 +2302,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * </tr> * </tbody> * </table> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES * @see CameraCharacteristics#REQUEST_MAX_NUM_INPUT_STREAMS @@ -2551,6 +2596,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.hardware.camera2.params.StreamConfigurationMap> SCALER_STREAM_CONFIGURATION_MAP = new Key<android.hardware.camera2.params.StreamConfigurationMap>("android.scaler.streamConfigurationMap", android.hardware.camera2.params.StreamConfigurationMap.class); @@ -2579,6 +2625,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #SCALER_CROPPING_TYPE_FREEFORM */ @PublicKey + @NonNull public static final Key<Integer> SCALER_CROPPING_TYPE = new Key<Integer>("android.scaler.croppingType", int.class); @@ -2591,7 +2638,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * power and performance efficient for specific use cases. For more information about * retrieving the suggestions see * {@link android.hardware.camera2.CameraCharacteristics#getRecommendedStreamConfigurationMap }.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<android.hardware.camera2.params.RecommendedStreamConfiguration[]> SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS = @@ -2607,7 +2654,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * If set, the information will be available in the ZERO_SHUTTER_LAG recommended stream * configuration see * {@link android.hardware.camera2.CameraCharacteristics#getRecommendedStreamConfigurationMap }.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<android.hardware.camera2.params.ReprocessFormatsMap> SCALER_AVAILABLE_RECOMMENDED_INPUT_OUTPUT_FORMATS_MAP = @@ -2634,7 +2681,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * physical camera not independently exposed in * {@link android.hardware.camera2.CameraManager#getCameraIdList } or is not backward * compatible.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2642,6 +2689,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.hardware.camera2.params.MandatoryStreamCombination[]> SCALER_MANDATORY_STREAM_COMBINATIONS = new Key<android.hardware.camera2.params.MandatoryStreamCombination[]>("android.scaler.mandatoryStreamCombinations", android.hardware.camera2.params.MandatoryStreamCombination[].class); @@ -2681,6 +2729,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE = new Key<android.graphics.Rect>("android.sensor.info.activeArraySize", android.graphics.Rect.class); @@ -2691,7 +2740,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * as defined in ISO 12232:2006.</p> * <p><b>Range of valid values:</b><br> * Min <= 100, Max >= 800</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2700,6 +2749,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<android.util.Range<Integer>> SENSOR_INFO_SENSITIVITY_RANGE = new Key<android.util.Range<Integer>>("android.sensor.info.sensitivityRange", new TypeReference<android.util.Range<Integer>>() {{ }}); @@ -2718,7 +2768,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <li>{@link #SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO MONO}</li> * <li>{@link #SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR NIR}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2733,6 +2783,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT = new Key<Integer>("android.sensor.info.colorFilterArrangement", int.class); @@ -2744,7 +2795,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * The minimum exposure time will be less than 100 us. For FULL * capability devices ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} == FULL), * the maximum exposure time will be greater than 100ms.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2753,6 +2804,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#SENSOR_EXPOSURE_TIME */ @PublicKey + @NonNull public static final Key<android.util.Range<Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE = new Key<android.util.Range<Long>>("android.sensor.info.exposureTimeRange", new TypeReference<android.util.Range<Long>>() {{ }}); @@ -2768,7 +2820,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p><b>Range of valid values:</b><br> * For FULL capability devices * ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} == FULL), at least 100ms.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2777,6 +2829,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#SENSOR_FRAME_DURATION */ @PublicKey + @NonNull public static final Key<Long> SENSOR_INFO_MAX_FRAME_DURATION = new Key<Long>("android.sensor.info.maxFrameDuration", long.class); @@ -2791,6 +2844,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE = new Key<android.util.SizeF>("android.sensor.info.physicalSize", android.util.SizeF.class); @@ -2816,6 +2870,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE = new Key<android.util.Size>("android.sensor.info.pixelArraySize", android.util.Size.class); @@ -2837,13 +2892,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * by the camera device, which provides more accurate white level values.</p> * <p><b>Range of valid values:</b><br> * > 255 (8-bit output)</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN * @see CaptureResult#SENSOR_DYNAMIC_WHITE_LEVEL * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_INFO_WHITE_LEVEL = new Key<Integer>("android.sensor.info.whiteLevel", int.class); @@ -2863,6 +2919,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_INFO_TIMESTAMP_SOURCE = new Key<Integer>("android.sensor.info.timestampSource", int.class); @@ -2875,11 +2932,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * See {@link CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW android.request.maxNumOutputRaw} for a list of RAW image formats.</p> * <p>This key will be <code>null</code> for all devices do not report this information. * Devices with RAW capability will always report this information in this key.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#REQUEST_MAX_NUM_OUTPUT_RAW */ @PublicKey + @NonNull public static final Key<Boolean> SENSOR_INFO_LENS_SHADING_APPLIED = new Key<Boolean>("android.sensor.info.lensShadingApplied", boolean.class); @@ -2945,6 +3003,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.graphics.Rect> SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE = new Key<android.graphics.Rect>("android.sensor.info.preCorrectionActiveArraySize", android.graphics.Rect.class); @@ -2986,7 +3045,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <li>{@link #SENSOR_REFERENCE_ILLUMINANT1_D50 D50}</li> * <li>{@link #SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN ISO_STUDIO_TUNGSTEN}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_CALIBRATION_TRANSFORM1 @@ -3014,6 +3073,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_REFERENCE_ILLUMINANT1 = new Key<Integer>("android.sensor.referenceIlluminant1", int.class); @@ -3030,7 +3090,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * the camera device has RAW capability.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 android.sensor.referenceIlluminant1}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_CALIBRATION_TRANSFORM2 @@ -3039,6 +3099,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 */ @PublicKey + @NonNull public static final Key<Byte> SENSOR_REFERENCE_ILLUMINANT2 = new Key<Byte>("android.sensor.referenceIlluminant2", byte.class); @@ -3055,12 +3116,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * ({@link CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 android.sensor.referenceIlluminant1}).</p> * <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if * the camera device has RAW capability.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM1 = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.calibrationTransform1", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -3080,12 +3142,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * illuminant is present.</p> * <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if * the camera device has RAW capability.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT2 */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM2 = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.calibrationTransform2", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -3106,12 +3169,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * (i.e. no chromatic adaptation will be applied by this transform).</p> * <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if * the camera device has RAW capability.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM1 = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.colorTransform1", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -3134,12 +3198,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * illuminant is present.</p> * <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if * the camera device has RAW capability.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT2 */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM2 = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.colorTransform2", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -3158,12 +3223,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * CIE XYZ colorspace.</p> * <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if * the camera device has RAW capability.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT1 */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX1 = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.forwardMatrix1", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -3184,12 +3250,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * illuminant is present.</p> * <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if * the camera device has RAW capability.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT2 */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX2 = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.sensor.forwardMatrix2", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -3215,7 +3282,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>For a MONOCHROME camera device, all of the 2x2 channels must have the same values.</p> * <p><b>Range of valid values:</b><br> * >= 0 for each.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureResult#SENSOR_DYNAMIC_BLACK_LEVEL * @see CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT @@ -3224,6 +3291,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.BlackLevelPattern> SENSOR_BLACK_LEVEL_PATTERN = new Key<android.hardware.camera2.params.BlackLevelPattern>("android.sensor.blackLevelPattern", android.hardware.camera2.params.BlackLevelPattern.class); @@ -3234,7 +3302,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * equal to this, all applied gain must be analog. For * values above this, the gain applied can be a mix of analog and * digital.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3243,6 +3311,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_MAX_ANALOG_SENSITIVITY = new Key<Integer>("android.sensor.maxAnalogSensitivity", int.class); @@ -3258,6 +3327,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_ORIENTATION = new Key<Integer>("android.sensor.orientation", int.class); @@ -3267,11 +3337,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>Defaults to OFF, and always includes OFF if defined.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#SENSOR_TEST_PATTERN_MODE android.sensor.testPatternMode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#SENSOR_TEST_PATTERN_MODE */ @PublicKey + @NonNull public static final Key<int[]> SENSOR_AVAILABLE_TEST_PATTERN_MODES = new Key<int[]>("android.sensor.availableTestPatternModes", int[].class); @@ -3291,13 +3362,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * black level of each captured raw images.</p> * <p>When this key is reported, the {@link CaptureResult#SENSOR_DYNAMIC_BLACK_LEVEL android.sensor.dynamicBlackLevel} and * {@link CaptureResult#SENSOR_DYNAMIC_WHITE_LEVEL android.sensor.dynamicWhiteLevel} will also be reported.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN * @see CaptureResult#SENSOR_DYNAMIC_BLACK_LEVEL * @see CaptureResult#SENSOR_DYNAMIC_WHITE_LEVEL */ @PublicKey + @NonNull public static final Key<android.graphics.Rect[]> SENSOR_OPTICAL_BLACK_REGIONS = new Key<android.graphics.Rect[]>("android.sensor.opticalBlackRegions", android.graphics.Rect[].class); @@ -3314,6 +3386,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#SHADING_MODE */ @PublicKey + @NonNull public static final Key<int[]> SHADING_AVAILABLE_MODES = new Key<int[]>("android.shading.availableModes", int[].class); @@ -3328,6 +3401,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#STATISTICS_FACE_DETECT_MODE */ @PublicKey + @NonNull public static final Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES = new Key<int[]>("android.statistics.info.availableFaceDetectModes", int[].class); @@ -3341,6 +3415,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_INFO_MAX_FACE_COUNT = new Key<Integer>("android.statistics.info.maxFaceCount", int.class); @@ -3352,11 +3427,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>ON is always supported on devices with the RAW capability.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#STATISTICS_HOT_PIXEL_MAP_MODE android.statistics.hotPixelMapMode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#STATISTICS_HOT_PIXEL_MAP_MODE */ @PublicKey + @NonNull public static final Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES = new Key<boolean[]>("android.statistics.info.availableHotPixelMapModes", boolean[].class); @@ -3369,11 +3445,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * LEGACY mode devices will always only support OFF.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE android.statistics.lensShadingMapMode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#STATISTICS_LENS_SHADING_MAP_MODE */ @PublicKey + @NonNull public static final Key<int[]> STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES = new Key<int[]>("android.statistics.info.availableLensShadingMapModes", int[].class); @@ -3384,11 +3461,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * contain only OFF.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#STATISTICS_OIS_DATA_MODE android.statistics.oisDataMode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#STATISTICS_OIS_DATA_MODE */ @PublicKey + @NonNull public static final Key<int[]> STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES = new Key<int[]>("android.statistics.info.availableOisDataModes", int[].class); @@ -3401,7 +3479,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>The output curves in the result metadata may have a different number * of points than the input curves, and will represent the actual * hardware curves used as closely as possible when linearly interpolated.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3410,6 +3488,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#TONEMAP_CURVE */ @PublicKey + @NonNull public static final Key<Integer> TONEMAP_MAX_CURVE_POINTS = new Key<Integer>("android.tonemap.maxCurvePoints", int.class); @@ -3425,7 +3504,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>This includes all FULL level devices.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3434,6 +3513,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CaptureRequest#TONEMAP_MODE */ @PublicKey + @NonNull public static final Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES = new Key<int[]>("android.tonemap.availableToneMapModes", int[].class); @@ -3443,7 +3523,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <ul> * <li>{@link #LED_AVAILABLE_LEDS_TRANSMIT TRANSMIT}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @see #LED_AVAILABLE_LEDS_TRANSMIT * @hide */ @@ -3534,6 +3614,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL */ @PublicKey + @NonNull public static final Key<Integer> INFO_SUPPORTED_HARDWARE_LEVEL = new Key<Integer>("android.info.supportedHardwareLevel", int.class); @@ -3543,9 +3624,10 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>This can be used in {@link android.media.ExifInterface#TAG_IMAGE_DESCRIPTION TAG_IMAGE_DESCRIPTION} * in jpeg EXIF. This key may be absent if no version information is available on the * device.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> */ @PublicKey + @NonNull public static final Key<String> INFO_VERSION = new Key<String>("android.info.version", String.class); @@ -3572,6 +3654,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #SYNC_MAX_LATENCY_UNKNOWN */ @PublicKey + @NonNull public static final Key<Integer> SYNC_MAX_LATENCY = new Key<Integer>("android.sync.maxLatency", int.class); @@ -3598,7 +3681,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p><b>Units</b>: Number of frames.</p> * <p><b>Range of valid values:</b><br> * <= 4</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3607,6 +3690,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES */ @PublicKey + @NonNull public static final Key<Integer> REPROCESS_MAX_CAPTURE_STALL = new Key<Integer>("android.reprocess.maxCaptureStall", int.class); @@ -3625,7 +3709,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * the format in this list as <code>(HAL_PIXEL_FORMAT_BLOB, * android.depth.maxDepthSamples, 1, OUTPUT)</code> in addition to * the entries for HAL_PIXEL_FORMAT_Y16.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3650,7 +3734,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * android.scaler.availableStallDurations for more details about * calculating the max frame rate.</p> * <p><b>Units</b>: (format, width, height, ns) x n</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3674,7 +3758,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>All depth output stream formats may have a nonzero stall * duration.</p> * <p><b>Units</b>: (format, width, height, ns) x n</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3697,7 +3781,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * need to emit a specific pattern or wavelength of light to * measure depth values, which causes the color image to be * corrupted during depth measurement.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3705,6 +3789,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<Boolean> DEPTH_DEPTH_IS_EXCLUSIVE = new Key<Boolean>("android.depth.depthIsExclusive", boolean.class); @@ -3717,7 +3802,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * power and performance efficient for specific use cases. For more information about * retrieving the suggestions see * {@link android.hardware.camera2.CameraCharacteristics#getRecommendedStreamConfigurationMap }.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<android.hardware.camera2.params.RecommendedStreamConfiguration[]> DEPTH_AVAILABLE_RECOMMENDED_DEPTH_STREAM_CONFIGURATIONS = @@ -3736,7 +3821,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * the same aspect ratio can have dynamic depth dataspace * stream configuration. {@link CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE android.depth.depthIsExclusive} also * needs to be set to FALSE.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#DEPTH_DEPTH_IS_EXCLUSIVE * @hide @@ -3755,7 +3840,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>The minimum frame duration of a stream (of a particular format, size) * is the same regardless of whether the stream is input or output.</p> * <p><b>Units</b>: (format, width, height, ns) x n</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS = @@ -3770,7 +3855,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>All dynamic depth output streams may have a nonzero stall * duration.</p> * <p><b>Units</b>: (format, width, height, ns) x n</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<android.hardware.camera2.params.StreamConfigurationDuration[]> DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS = @@ -3785,7 +3870,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * value of this tag will be ['2', '\0', '3', '\0'].</p> * <p>The number of physical camera IDs must be no less than 2.</p> * <p><b>Units</b>: UTF-8 null-terminated string</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3811,7 +3896,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <li>{@link #LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE APPROXIMATE}</li> * <li>{@link #LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED CALIBRATED}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3821,6 +3906,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED */ @PublicKey + @NonNull public static final Key<Integer> LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE = new Key<Integer>("android.logicalMultiCamera.sensorSyncType", int.class); @@ -3831,11 +3917,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * All devices that support this API will list both FAST and HIGH_QUALITY.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#DISTORTION_CORRECTION_MODE */ @PublicKey + @NonNull public static final Key<int[]> DISTORTION_CORRECTION_AVAILABLE_MODES = new Key<int[]>("android.distortionCorrection.availableModes", int[].class); @@ -3849,7 +3936,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * image format as required by the device's hardware level and capabilities.</p> * <p>All the static, control, and dynamic metadata tags related to JPEG apply to HEIC formats. * Configuring JPEG and HEIC streams at the same time is not supported.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3872,7 +3959,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * android.scaler.availableStallDurations for more details about * calculating the max frame rate.</p> * <p><b>Units</b>: (format, width, height, ns) x n</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3896,7 +3983,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <p>All HEIC output stream formats may have a nonzero stall * duration.</p> * <p><b>Units</b>: (format, width, height, ns) x n</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3913,4 +4000,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri + + + } diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 525070103c2c..792ec256b7a3 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -978,7 +978,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <li>{@link #COLOR_CORRECTION_MODE_FAST FAST}</li> * <li>{@link #COLOR_CORRECTION_MODE_HIGH_QUALITY HIGH_QUALITY}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -992,6 +992,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #COLOR_CORRECTION_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> COLOR_CORRECTION_MODE = new Key<Integer>("android.colorCorrection.mode", int.class); @@ -1010,7 +1011,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p>The valid range of each matrix element varies on different devices, but * values within [-1.5, 3.0] are guaranteed not to be clipped.</p> * <p><b>Units</b>: Unitless scale factors</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1019,6 +1020,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.colorCorrection.transform", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -1037,7 +1039,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * device allows gains below 1.0, this is usually not recommended because * this can create color artifacts.</p> * <p><b>Units</b>: Unitless gain factors</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1046,6 +1048,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS = new Key<android.hardware.camera2.params.RggbChannelVector>("android.colorCorrection.gains", android.hardware.camera2.params.RggbChannelVector.class); @@ -1078,6 +1081,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> COLOR_CORRECTION_ABERRATION_MODE = new Key<Integer>("android.colorCorrection.aberrationMode", int.class); @@ -1134,6 +1138,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_AE_ANTIBANDING_MODE_AUTO */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_ANTIBANDING_MODE = new Key<Integer>("android.control.aeAntibandingMode", int.class); @@ -1167,6 +1172,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureResult#CONTROL_AE_STATE */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_EXPOSURE_COMPENSATION = new Key<Integer>("android.control.aeExposureCompensation", int.class); @@ -1217,6 +1223,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_AE_LOCK = new Key<Boolean>("android.control.aeLock", boolean.class); @@ -1269,6 +1276,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_AE_MODE_ON_EXTERNAL_FLASH */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_MODE = new Key<Integer>("android.control.aeMode", int.class); @@ -1320,7 +1328,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * Coordinates must be between <code>[(0,0), (width, height))</code> of * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * depending on distortion correction capability and mode</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#CONTROL_MAX_REGIONS_AE * @see CaptureRequest#DISTORTION_CORRECTION_MODE @@ -1329,6 +1337,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS = new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.aeRegions", android.hardware.camera2.params.MeteringRectangle[].class); @@ -1349,6 +1358,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureRequest#SENSOR_FRAME_DURATION */ @PublicKey + @NonNull public static final Key<android.util.Range<Integer>> CONTROL_AE_TARGET_FPS_RANGE = new Key<android.util.Range<Integer>>("android.control.aeTargetFpsRange", new TypeReference<android.util.Range<Integer>>() {{ }}); @@ -1407,7 +1417,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_START START}</li> * <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL CANCEL}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1422,6 +1432,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER = new Key<Integer>("android.control.aePrecaptureTrigger", int.class); @@ -1463,6 +1474,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_AF_MODE_EDOF */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AF_MODE = new Key<Integer>("android.control.afMode", int.class); @@ -1515,7 +1527,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * Coordinates must be between <code>[(0,0), (width, height))</code> of * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * depending on distortion correction capability and mode</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#CONTROL_MAX_REGIONS_AF * @see CaptureRequest#DISTORTION_CORRECTION_MODE @@ -1524,6 +1536,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS = new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.afRegions", android.hardware.camera2.params.MeteringRectangle[].class); @@ -1561,6 +1574,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_AF_TRIGGER_CANCEL */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AF_TRIGGER = new Key<Integer>("android.control.afTrigger", int.class); @@ -1591,6 +1605,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureRequest#CONTROL_AWB_MODE */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_AWB_LOCK = new Key<Boolean>("android.control.awbLock", boolean.class); @@ -1651,6 +1666,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_AWB_MODE_SHADE */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AWB_MODE = new Key<Integer>("android.control.awbMode", int.class); @@ -1703,7 +1719,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * Coordinates must be between <code>[(0,0), (width, height))</code> of * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * depending on distortion correction capability and mode</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#CONTROL_MAX_REGIONS_AWB * @see CaptureRequest#DISTORTION_CORRECTION_MODE @@ -1712,6 +1728,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS = new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.awbRegions", android.hardware.camera2.params.MeteringRectangle[].class); @@ -1754,6 +1771,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_CAPTURE_INTENT_MOTION_TRACKING */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_CAPTURE_INTENT = new Key<Integer>("android.control.captureIntent", int.class); @@ -1793,6 +1811,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_EFFECT_MODE_AQUA */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_EFFECT_MODE = new Key<Integer>("android.control.effectMode", int.class); @@ -1833,6 +1852,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_MODE_OFF_KEEP_STATE */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_MODE = new Key<Integer>("android.control.mode", int.class); @@ -1900,6 +1920,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_SCENE_MODE_HDR */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_SCENE_MODE = new Key<Integer>("android.control.sceneMode", int.class); @@ -1943,6 +1964,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #CONTROL_VIDEO_STABILIZATION_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_VIDEO_STABILIZATION_MODE = new Key<Integer>("android.control.videoStabilizationMode", int.class); @@ -1969,7 +1991,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: ISO arithmetic units, the same as {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE android.control.postRawSensitivityBoostRange}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#CONTROL_AE_MODE * @see CaptureRequest#CONTROL_MODE @@ -1978,6 +2000,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST = new Key<Integer>("android.control.postRawSensitivityBoost", int.class); @@ -2005,12 +2028,13 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p>For applications targeting SDK versions older than O, the value of enableZsl in all * capture templates is always <code>false</code> if present.</p> * <p>For application-operated ZSL, use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG template.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#CONTROL_CAPTURE_INTENT * @see CaptureResult#SENSOR_TIMESTAMP */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_ENABLE_ZSL = new Key<Boolean>("android.control.enableZsl", boolean.class); @@ -2045,7 +2069,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2059,6 +2083,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #EDGE_MODE_ZERO_SHUTTER_LAG */ @PublicKey + @NonNull public static final Key<Integer> EDGE_MODE = new Key<Integer>("android.edge.mode", int.class); @@ -2094,6 +2119,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #FLASH_MODE_TORCH */ @PublicKey + @NonNull public static final Key<Integer> FLASH_MODE = new Key<Integer>("android.flash.mode", int.class); @@ -2110,7 +2136,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES android.hotPixel.availableHotPixelModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES * @see #HOT_PIXEL_MODE_OFF @@ -2118,6 +2144,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #HOT_PIXEL_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> HOT_PIXEL_MODE = new Key<Integer>("android.hotPixel.mode", int.class); @@ -2130,6 +2157,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.location.Location> JPEG_GPS_LOCATION = new Key<android.location.Location>("android.jpeg.gpsLocation", android.location.Location.class); @@ -2211,6 +2239,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_ORIENTATION */ @PublicKey + @NonNull public static final Key<Integer> JPEG_ORIENTATION = new Key<Integer>("android.jpeg.orientation", int.class); @@ -2224,6 +2253,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull public static final Key<Byte> JPEG_QUALITY = new Key<Byte>("android.jpeg.quality", byte.class); @@ -2236,6 +2266,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull public static final Key<Byte> JPEG_THUMBNAIL_QUALITY = new Key<Byte>("android.jpeg.thumbnailQuality", byte.class); @@ -2275,6 +2306,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureRequest#JPEG_ORIENTATION */ @PublicKey + @NonNull public static final Key<android.util.Size> JPEG_THUMBNAIL_SIZE = new Key<android.util.Size>("android.jpeg.thumbnailSize", android.util.Size.class); @@ -2298,7 +2330,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: The f-number (f/N)</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#LENS_INFO_AVAILABLE_APERTURES android.lens.info.availableApertures}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2312,6 +2344,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Float> LENS_APERTURE = new Key<Float>("android.lens.aperture", float.class); @@ -2332,7 +2365,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: Exposure Value (EV)</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#LENS_INFO_AVAILABLE_FILTER_DENSITIES android.lens.info.availableFilterDensities}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2342,6 +2375,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureResult#LENS_STATE */ @PublicKey + @NonNull public static final Key<Float> LENS_FILTER_DENSITY = new Key<Float>("android.lens.filterDensity", float.class); @@ -2367,6 +2401,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureResult#LENS_STATE */ @PublicKey + @NonNull public static final Key<Float> LENS_FOCAL_LENGTH = new Key<Float>("android.lens.focalLength", float.class); @@ -2387,7 +2422,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: See {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details</p> * <p><b>Range of valid values:</b><br> * >= 0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2399,6 +2434,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureResult#LENS_STATE */ @PublicKey + @NonNull public static final Key<Float> LENS_FOCUS_DISTANCE = new Key<Float>("android.lens.focusDistance", float.class); @@ -2429,7 +2465,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION android.lens.info.availableOpticalStabilization}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2441,6 +2477,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #LENS_OPTICAL_STABILIZATION_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> LENS_OPTICAL_STABILIZATION_MODE = new Key<Integer>("android.lens.opticalStabilizationMode", int.class); @@ -2481,7 +2518,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2496,6 +2533,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG */ @PublicKey + @NonNull public static final Key<Integer> NOISE_REDUCTION_MODE = new Key<Integer>("android.noiseReduction.mode", int.class); @@ -2506,7 +2544,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: arbitrary integer assigned by application</p> * <p><b>Range of valid values:</b><br> * Any int</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<Integer> REQUEST_ID = @@ -2570,6 +2608,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.graphics.Rect> SCALER_CROP_REGION = new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class); @@ -2584,7 +2623,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: Nanoseconds</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE android.sensor.info.exposureTimeRange}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2595,6 +2634,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE */ @PublicKey + @NonNull public static final Key<Long> SENSOR_EXPOSURE_TIME = new Key<Long>("android.sensor.exposureTime", long.class); @@ -2665,7 +2705,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Range of valid values:</b><br> * See {@link CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION android.sensor.info.maxFrameDuration}, {@link android.hardware.camera2.params.StreamConfigurationMap }. * The duration is capped to <code>max(duration, exposureTime + overhead)</code>.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2676,6 +2716,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION */ @PublicKey + @NonNull public static final Key<Long> SENSOR_FRAME_DURATION = new Key<Long>("android.sensor.frameDuration", long.class); @@ -2696,7 +2737,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: ISO arithmetic units</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2708,6 +2749,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#SENSOR_MAX_ANALOG_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_SENSITIVITY = new Key<Integer>("android.sensor.sensitivity", int.class); @@ -2720,11 +2762,12 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * output.</p> * <p>For example, a sensor with RAW10 Bayer output would use the * 10 most significant bits from each color channel.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#SENSOR_TEST_PATTERN_MODE */ @PublicKey + @NonNull public static final Key<int[]> SENSOR_TEST_PATTERN_DATA = new Key<int[]>("android.sensor.testPatternData", int[].class); @@ -2749,7 +2792,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES android.sensor.availableTestPatternModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES * @see #SENSOR_TEST_PATTERN_MODE_OFF @@ -2760,6 +2803,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #SENSOR_TEST_PATTERN_MODE_CUSTOM1 */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_TEST_PATTERN_MODE = new Key<Integer>("android.sensor.testPatternMode", int.class); @@ -2797,7 +2841,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#SHADING_AVAILABLE_MODES android.shading.availableModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2813,6 +2857,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #SHADING_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> SHADING_MODE = new Key<Integer>("android.shading.mode", int.class); @@ -2838,6 +2883,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #STATISTICS_FACE_DETECT_MODE_FULL */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_FACE_DETECT_MODE = new Key<Integer>("android.statistics.faceDetectMode", int.class); @@ -2847,12 +2893,13 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * If set to <code>false</code>, no hot pixel map will be returned.</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES android.statistics.info.availableHotPixelMapModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureResult#STATISTICS_HOT_PIXEL_MAP * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES */ @PublicKey + @NonNull public static final Key<Boolean> STATISTICS_HOT_PIXEL_MAP_MODE = new Key<Boolean>("android.statistics.hotPixelMapMode", boolean.class); @@ -2870,7 +2917,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES android.statistics.info.availableLensShadingMapModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2881,6 +2928,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #STATISTICS_LENS_SHADING_MAP_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_LENS_SHADING_MAP_MODE = new Key<Integer>("android.statistics.lensShadingMapMode", int.class); @@ -2900,13 +2948,14 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES android.statistics.info.availableOisDataModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES * @see #STATISTICS_OIS_DATA_MODE_OFF * @see #STATISTICS_OIS_DATA_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_OIS_DATA_MODE = new Key<Integer>("android.statistics.oisDataMode", int.class); @@ -2915,7 +2964,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is * CONTRAST_CURVE.</p> * <p>See android.tonemap.curveRed for more details.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2932,7 +2981,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is * CONTRAST_CURVE.</p> * <p>See android.tonemap.curveRed for more details.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2993,7 +3042,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Range of valid values:</b><br> * 0-1 on both input and output coordinates, normalized * as a floating-point value such that 0 == black and 1 == white.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3054,7 +3103,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * (0.8000, 0.9063), (0.8667, 0.9389), (0.9333, 0.9701), (1.0000, 1.0000) ] * </code></pre> * <p><img alt="sRGB tonemapping curve" src="/reference/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png" /></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3064,6 +3113,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CaptureRequest#TONEMAP_MODE */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE = new Key<android.hardware.camera2.params.TonemapCurve>("android.tonemap.curve", android.hardware.camera2.params.TonemapCurve.class); @@ -3098,7 +3148,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#TONEMAP_AVAILABLE_TONE_MAP_MODES android.tonemap.availableToneMapModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3114,6 +3164,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #TONEMAP_MODE_PRESET_CURVE */ @PublicKey + @NonNull public static final Key<Integer> TONEMAP_MODE = new Key<Integer>("android.tonemap.mode", int.class); @@ -3130,11 +3181,12 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * value will be returned in capture result.</p> * <p>The valid range of gamma value varies on different devices, but values * within [1.0, 5.0] are guaranteed not to be clipped.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#TONEMAP_MODE */ @PublicKey + @NonNull public static final Key<Float> TONEMAP_GAMMA = new Key<Float>("android.tonemap.gamma", float.class); @@ -3153,13 +3205,14 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <li>{@link #TONEMAP_PRESET_CURVE_SRGB SRGB}</li> * <li>{@link #TONEMAP_PRESET_CURVE_REC709 REC709}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#TONEMAP_MODE * @see #TONEMAP_PRESET_CURVE_SRGB * @see #TONEMAP_PRESET_CURVE_REC709 */ @PublicKey + @NonNull public static final Key<Integer> TONEMAP_PRESET_CURVE = new Key<Integer>("android.tonemap.presetCurve", int.class); @@ -3174,7 +3227,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * data is stored locally on the device.</p> * <p>The LED <em>may</em> be off if a trusted application is using the data that * doesn't violate the above rules.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<Boolean> LED_TRANSMIT = @@ -3218,7 +3271,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * possible, only overriding the lock to OFF when changes to * other request parameters require a black level recalculation * or reset.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3226,6 +3279,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<Boolean> BLACK_LEVEL_LOCK = new Key<Boolean>("android.blackLevel.lock", boolean.class); @@ -3265,7 +3319,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Units</b>: Relative exposure time increase factor.</p> * <p><b>Range of valid values:</b><br> * >= 1.0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3276,6 +3330,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES */ @PublicKey + @NonNull public static final Key<Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR = new Key<Float>("android.reprocess.effectiveExposureFactor", float.class); @@ -3322,7 +3377,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#CONTROL_AE_REGIONS * @see CaptureRequest#CONTROL_AF_REGIONS @@ -3338,6 +3393,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> DISTORTION_CORRECTION_MODE = new Key<Integer>("android.distortionCorrection.mode", int.class); @@ -3347,4 +3403,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> + + + } diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 13ad092f6efd..0900f3b11d4c 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -437,7 +437,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #COLOR_CORRECTION_MODE_FAST FAST}</li> * <li>{@link #COLOR_CORRECTION_MODE_HIGH_QUALITY HIGH_QUALITY}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -451,6 +451,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #COLOR_CORRECTION_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> COLOR_CORRECTION_MODE = new Key<Integer>("android.colorCorrection.mode", int.class); @@ -469,7 +470,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>The valid range of each matrix element varies on different devices, but * values within [-1.5, 3.0] are guaranteed not to be clipped.</p> * <p><b>Units</b>: Unitless scale factors</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -478,6 +479,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM = new Key<android.hardware.camera2.params.ColorSpaceTransform>("android.colorCorrection.transform", android.hardware.camera2.params.ColorSpaceTransform.class); @@ -496,7 +498,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * device allows gains below 1.0, this is usually not recommended because * this can create color artifacts.</p> * <p><b>Units</b>: Unitless gain factors</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -505,6 +507,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS = new Key<android.hardware.camera2.params.RggbChannelVector>("android.colorCorrection.gains", android.hardware.camera2.params.RggbChannelVector.class); @@ -537,6 +540,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> COLOR_CORRECTION_ABERRATION_MODE = new Key<Integer>("android.colorCorrection.aberrationMode", int.class); @@ -593,6 +597,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AE_ANTIBANDING_MODE_AUTO */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_ANTIBANDING_MODE = new Key<Integer>("android.control.aeAntibandingMode", int.class); @@ -626,6 +631,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureResult#CONTROL_AE_STATE */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_EXPOSURE_COMPENSATION = new Key<Integer>("android.control.aeExposureCompensation", int.class); @@ -676,6 +682,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_AE_LOCK = new Key<Boolean>("android.control.aeLock", boolean.class); @@ -728,6 +735,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AE_MODE_ON_EXTERNAL_FLASH */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_MODE = new Key<Integer>("android.control.aeMode", int.class); @@ -779,7 +787,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * Coordinates must be between <code>[(0,0), (width, height))</code> of * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * depending on distortion correction capability and mode</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#CONTROL_MAX_REGIONS_AE * @see CaptureRequest#DISTORTION_CORRECTION_MODE @@ -788,6 +796,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS = new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.aeRegions", android.hardware.camera2.params.MeteringRectangle[].class); @@ -808,6 +817,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#SENSOR_FRAME_DURATION */ @PublicKey + @NonNull public static final Key<android.util.Range<Integer>> CONTROL_AE_TARGET_FPS_RANGE = new Key<android.util.Range<Integer>>("android.control.aeTargetFpsRange", new TypeReference<android.util.Range<Integer>>() {{ }}); @@ -866,7 +876,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_START START}</li> * <li>{@link #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL CANCEL}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -881,6 +891,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_PRECAPTURE_TRIGGER = new Key<Integer>("android.control.aePrecaptureTrigger", int.class); @@ -1108,7 +1119,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #CONTROL_AE_STATE_FLASH_REQUIRED FLASH_REQUIRED}</li> * <li>{@link #CONTROL_AE_STATE_PRECAPTURE PRECAPTURE}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -1129,6 +1140,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AE_STATE_PRECAPTURE */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AE_STATE = new Key<Integer>("android.control.aeState", int.class); @@ -1170,6 +1182,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AF_MODE_EDOF */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AF_MODE = new Key<Integer>("android.control.afMode", int.class); @@ -1222,7 +1235,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * Coordinates must be between <code>[(0,0), (width, height))</code> of * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * depending on distortion correction capability and mode</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#CONTROL_MAX_REGIONS_AF * @see CaptureRequest#DISTORTION_CORRECTION_MODE @@ -1231,6 +1244,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS = new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.afRegions", android.hardware.camera2.params.MeteringRectangle[].class); @@ -1268,6 +1282,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AF_TRIGGER_CANCEL */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AF_TRIGGER = new Key<Integer>("android.control.afTrigger", int.class); @@ -1677,6 +1692,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AF_STATE_PASSIVE_UNFOCUSED */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AF_STATE = new Key<Integer>("android.control.afState", int.class); @@ -1707,6 +1723,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#CONTROL_AWB_MODE */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_AWB_LOCK = new Key<Boolean>("android.control.awbLock", boolean.class); @@ -1767,6 +1784,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AWB_MODE_SHADE */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AWB_MODE = new Key<Integer>("android.control.awbMode", int.class); @@ -1819,7 +1837,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * Coordinates must be between <code>[(0,0), (width, height))</code> of * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * depending on distortion correction capability and mode</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#CONTROL_MAX_REGIONS_AWB * @see CaptureRequest#DISTORTION_CORRECTION_MODE @@ -1828,6 +1846,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS = new Key<android.hardware.camera2.params.MeteringRectangle[]>("android.control.awbRegions", android.hardware.camera2.params.MeteringRectangle[].class); @@ -1870,6 +1889,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_CAPTURE_INTENT_MOTION_TRACKING */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_CAPTURE_INTENT = new Key<Integer>("android.control.captureIntent", int.class); @@ -1997,7 +2017,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #CONTROL_AWB_STATE_CONVERGED CONVERGED}</li> * <li>{@link #CONTROL_AWB_STATE_LOCKED LOCKED}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2013,6 +2033,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_AWB_STATE_LOCKED */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AWB_STATE = new Key<Integer>("android.control.awbState", int.class); @@ -2052,6 +2073,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_EFFECT_MODE_AQUA */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_EFFECT_MODE = new Key<Integer>("android.control.effectMode", int.class); @@ -2092,6 +2114,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_MODE_OFF_KEEP_STATE */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_MODE = new Key<Integer>("android.control.mode", int.class); @@ -2159,6 +2182,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_SCENE_MODE_HDR */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_SCENE_MODE = new Key<Integer>("android.control.sceneMode", int.class); @@ -2202,6 +2226,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #CONTROL_VIDEO_STABILIZATION_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_VIDEO_STABILIZATION_MODE = new Key<Integer>("android.control.videoStabilizationMode", int.class); @@ -2228,7 +2253,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: ISO arithmetic units, the same as {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity}</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE android.control.postRawSensitivityBoostRange}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#CONTROL_AE_MODE * @see CaptureRequest#CONTROL_MODE @@ -2237,6 +2262,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST = new Key<Integer>("android.control.postRawSensitivityBoost", int.class); @@ -2264,12 +2290,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>For applications targeting SDK versions older than O, the value of enableZsl in all * capture templates is always <code>false</code> if present.</p> * <p>For application-operated ZSL, use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG template.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#CONTROL_CAPTURE_INTENT * @see CaptureResult#SENSOR_TIMESTAMP */ @PublicKey + @NonNull public static final Key<Boolean> CONTROL_ENABLE_ZSL = new Key<Boolean>("android.control.enableZsl", boolean.class); @@ -2287,11 +2314,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #CONTROL_AF_SCENE_CHANGE_NOT_DETECTED NOT_DETECTED}</li> * <li>{@link #CONTROL_AF_SCENE_CHANGE_DETECTED DETECTED}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @see #CONTROL_AF_SCENE_CHANGE_NOT_DETECTED * @see #CONTROL_AF_SCENE_CHANGE_DETECTED */ @PublicKey + @NonNull public static final Key<Integer> CONTROL_AF_SCENE_CHANGE = new Key<Integer>("android.control.afSceneChange", int.class); @@ -2326,7 +2354,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2340,6 +2368,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #EDGE_MODE_ZERO_SHUTTER_LAG */ @PublicKey + @NonNull public static final Key<Integer> EDGE_MODE = new Key<Integer>("android.edge.mode", int.class); @@ -2375,6 +2404,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #FLASH_MODE_TORCH */ @PublicKey + @NonNull public static final Key<Integer> FLASH_MODE = new Key<Integer>("android.flash.mode", int.class); @@ -2402,7 +2432,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #FLASH_STATE_FIRED FIRED}</li> * <li>{@link #FLASH_STATE_PARTIAL PARTIAL}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2418,6 +2448,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #FLASH_STATE_PARTIAL */ @PublicKey + @NonNull public static final Key<Integer> FLASH_STATE = new Key<Integer>("android.flash.state", int.class); @@ -2434,7 +2465,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES android.hotPixel.availableHotPixelModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES * @see #HOT_PIXEL_MODE_OFF @@ -2442,6 +2473,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #HOT_PIXEL_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> HOT_PIXEL_MODE = new Key<Integer>("android.hotPixel.mode", int.class); @@ -2454,6 +2486,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.location.Location> JPEG_GPS_LOCATION = new Key<android.location.Location>("android.jpeg.gpsLocation", android.location.Location.class); @@ -2535,6 +2568,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_ORIENTATION */ @PublicKey + @NonNull public static final Key<Integer> JPEG_ORIENTATION = new Key<Integer>("android.jpeg.orientation", int.class); @@ -2548,6 +2582,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull public static final Key<Byte> JPEG_QUALITY = new Key<Byte>("android.jpeg.quality", byte.class); @@ -2560,6 +2595,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>This key is available on all devices.</p> */ @PublicKey + @NonNull public static final Key<Byte> JPEG_THUMBNAIL_QUALITY = new Key<Byte>("android.jpeg.thumbnailQuality", byte.class); @@ -2599,6 +2635,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#JPEG_ORIENTATION */ @PublicKey + @NonNull public static final Key<android.util.Size> JPEG_THUMBNAIL_SIZE = new Key<android.util.Size>("android.jpeg.thumbnailSize", android.util.Size.class); @@ -2622,7 +2659,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: The f-number (f/N)</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#LENS_INFO_AVAILABLE_APERTURES android.lens.info.availableApertures}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2636,6 +2673,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Float> LENS_APERTURE = new Key<Float>("android.lens.aperture", float.class); @@ -2656,7 +2694,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: Exposure Value (EV)</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#LENS_INFO_AVAILABLE_FILTER_DENSITIES android.lens.info.availableFilterDensities}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2666,6 +2704,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureResult#LENS_STATE */ @PublicKey + @NonNull public static final Key<Float> LENS_FILTER_DENSITY = new Key<Float>("android.lens.filterDensity", float.class); @@ -2691,6 +2730,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureResult#LENS_STATE */ @PublicKey + @NonNull public static final Key<Float> LENS_FOCAL_LENGTH = new Key<Float>("android.lens.focalLength", float.class); @@ -2701,7 +2741,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: See {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details</p> * <p><b>Range of valid values:</b><br> * >= 0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2710,6 +2750,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION */ @PublicKey + @NonNull public static final Key<Float> LENS_FOCUS_DISTANCE = new Key<Float>("android.lens.focusDistance", float.class); @@ -2722,7 +2763,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * far); see {@link CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION android.lens.info.focusDistanceCalibration} for details.</p> * <p><b>Range of valid values:</b><br> * >=0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2731,6 +2772,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#LENS_INFO_FOCUS_DISTANCE_CALIBRATION */ @PublicKey + @NonNull public static final Key<android.util.Pair<Float,Float>> LENS_FOCUS_RANGE = new Key<android.util.Pair<Float,Float>>("android.lens.focusRange", new TypeReference<android.util.Pair<Float,Float>>() {{ }}); @@ -2761,7 +2803,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION android.lens.info.availableOpticalStabilization}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2773,6 +2815,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #LENS_OPTICAL_STABILIZATION_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> LENS_OPTICAL_STABILIZATION_MODE = new Key<Integer>("android.lens.opticalStabilizationMode", int.class); @@ -2802,7 +2845,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #LENS_STATE_STATIONARY STATIONARY}</li> * <li>{@link #LENS_STATE_MOVING MOVING}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -2820,6 +2863,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #LENS_STATE_MOVING */ @PublicKey + @NonNull public static final Key<Integer> LENS_STATE = new Key<Integer>("android.lens.state", int.class); @@ -2854,10 +2898,11 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <code>p'</code> is in the camera-oriented coordinate system.</p> * <p><b>Units</b>: * Quaternion coefficients</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> */ @PublicKey + @NonNull public static final Key<float[]> LENS_POSE_ROTATION = new Key<float[]>("android.lens.poseRotation", float[].class); @@ -2890,7 +2935,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * the center of the primary gyroscope on the device. The axis definitions are the same as * with PRIMARY_CAMERA.</p> * <p><b>Units</b>: Meters</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_DISTORTION @@ -2899,6 +2944,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#LENS_POSE_ROTATION */ @PublicKey + @NonNull public static final Key<float[]> LENS_POSE_TRANSLATION = new Key<float[]>("android.lens.poseTranslation", float[].class); @@ -2962,7 +3008,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * Pixels in the * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} * coordinate system.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_DISTORTION @@ -2972,6 +3018,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<float[]> LENS_INTRINSIC_CALIBRATION = new Key<float[]>("android.lens.intrinsicCalibration", float[].class); @@ -3006,7 +3053,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>The distortion model used is the Brown-Conrady model.</p> * <p><b>Units</b>: * Unitless coefficients.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION @@ -3019,6 +3066,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { */ @Deprecated @PublicKey + @NonNull public static final Key<float[]> LENS_RADIAL_DISTORTION = new Key<float[]>("android.lens.radialDistortion", float[].class); @@ -3053,13 +3101,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>The distortion model used is the Brown-Conrady model.</p> * <p><b>Units</b>: * Unitless coefficients.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Permission {@link android.Manifest.permission#CAMERA } is needed to access this property</b></p> * * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION * @see CameraCharacteristics#LENS_RADIAL_DISTORTION */ @PublicKey + @NonNull public static final Key<float[]> LENS_DISTORTION = new Key<float[]>("android.lens.distortion", float[].class); @@ -3100,7 +3149,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3115,6 +3164,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG */ @PublicKey + @NonNull public static final Key<Integer> NOISE_REDUCTION_MODE = new Key<Integer>("android.noiseReduction.mode", int.class); @@ -3134,7 +3184,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * only be used by the camera device if quirks.usePartialResult is set to 1.</p> * <p><b>Range of valid values:</b><br> * Optional. Default value is FINAL.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Not used in HALv3 or newer</p> @@ -3152,7 +3202,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: count of frames</p> * <p><b>Range of valid values:</b><br> * > 0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Not used in HALv3 or newer</p> @@ -3169,7 +3219,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: arbitrary integer assigned by application</p> * <p><b>Range of valid values:</b><br> * Any int</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<Integer> REQUEST_ID = @@ -3190,6 +3240,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#REQUEST_PIPELINE_MAX_DEPTH */ @PublicKey + @NonNull public static final Key<Byte> REQUEST_PIPELINE_DEPTH = new Key<Byte>("android.request.pipelineDepth", byte.class); @@ -3251,6 +3302,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.graphics.Rect> SCALER_CROP_REGION = new Key<android.graphics.Rect>("android.scaler.cropRegion", android.graphics.Rect.class); @@ -3265,7 +3317,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: Nanoseconds</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE android.sensor.info.exposureTimeRange}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3276,6 +3328,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_EXPOSURE_TIME_RANGE */ @PublicKey + @NonNull public static final Key<Long> SENSOR_EXPOSURE_TIME = new Key<Long>("android.sensor.exposureTime", long.class); @@ -3346,7 +3399,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Range of valid values:</b><br> * See {@link CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION android.sensor.info.maxFrameDuration}, {@link android.hardware.camera2.params.StreamConfigurationMap }. * The duration is capped to <code>max(duration, exposureTime + overhead)</code>.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3357,6 +3410,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_MAX_FRAME_DURATION */ @PublicKey + @NonNull public static final Key<Long> SENSOR_FRAME_DURATION = new Key<Long>("android.sensor.frameDuration", long.class); @@ -3377,7 +3431,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: ISO arithmetic units</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3389,6 +3443,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_MAX_ANALOG_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_SENSITIVITY = new Key<Integer>("android.sensor.sensitivity", int.class); @@ -3419,6 +3474,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_TIMESTAMP_SOURCE */ @PublicKey + @NonNull public static final Key<Long> SENSOR_TIMESTAMP = new Key<Long>("android.sensor.timestamp", long.class); @@ -3433,9 +3489,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>The order of the values is R, G, B; where R is in the lowest index.</p> * <p>Starting from Android Q, this key will not be present for a MONOCHROME camera, even if * the camera device has RAW capability.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> */ @PublicKey + @NonNull public static final Key<Rational[]> SENSOR_NEUTRAL_COLOR_POINT = new Key<Rational[]>("android.sensor.neutralColorPoint", Rational[].class); @@ -3460,11 +3517,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * Adobe DNG specification for the NoiseProfile tag.</p> * <p>For a MONOCHROME camera, there is only one color channel. So the noise model coefficients * will only contain one S and one O.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT */ @PublicKey + @NonNull public static final Key<android.util.Pair<Double,Double>[]> SENSOR_NOISE_PROFILE = new Key<android.util.Pair<Double,Double>[]>("android.sensor.noiseProfile", new TypeReference<android.util.Pair<Double,Double>[]>() {{ }}); @@ -3504,9 +3562,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * the camera device has RAW capability.</p> * <p><b>Range of valid values:</b><br></p> * <p>>= 0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> */ @PublicKey + @NonNull public static final Key<Float> SENSOR_GREEN_SPLIT = new Key<Float>("android.sensor.greenSplit", float.class); @@ -3519,11 +3578,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * output.</p> * <p>For example, a sensor with RAW10 Bayer output would use the * 10 most significant bits from each color channel.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#SENSOR_TEST_PATTERN_MODE */ @PublicKey + @NonNull public static final Key<int[]> SENSOR_TEST_PATTERN_DATA = new Key<int[]>("android.sensor.testPatternData", int[].class); @@ -3548,7 +3608,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES android.sensor.availableTestPatternModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_AVAILABLE_TEST_PATTERN_MODES * @see #SENSOR_TEST_PATTERN_MODE_OFF @@ -3559,6 +3619,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #SENSOR_TEST_PATTERN_MODE_CUSTOM1 */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_TEST_PATTERN_MODE = new Key<Integer>("android.sensor.testPatternMode", int.class); @@ -3575,7 +3636,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Range of valid values:</b><br> * >= 0 and < * {@link android.hardware.camera2.params.StreamConfigurationMap#getOutputMinFrameDuration }.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3584,6 +3645,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<Long> SENSOR_ROLLING_SHUTTER_SKEW = new Key<Long>("android.sensor.rollingShutterSkew", long.class); @@ -3617,7 +3679,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * camera device advertises this key via {@link android.hardware.camera2.CameraCharacteristics#getAvailableCaptureResultKeys }.</p> * <p><b>Range of valid values:</b><br> * >= 0 for each.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN * @see CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT @@ -3625,6 +3687,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<float[]> SENSOR_DYNAMIC_BLACK_LEVEL = new Key<float[]>("android.sensor.dynamicBlackLevel", float[].class); @@ -3640,7 +3703,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * {@link android.hardware.camera2.CameraCharacteristics#getAvailableCaptureRequestKeys }.</p> * <p><b>Range of valid values:</b><br> * >= 0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_BLACK_LEVEL_PATTERN * @see CameraCharacteristics#SENSOR_INFO_WHITE_LEVEL @@ -3648,6 +3711,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#SENSOR_SENSITIVITY */ @PublicKey + @NonNull public static final Key<Integer> SENSOR_DYNAMIC_WHITE_LEVEL = new Key<Integer>("android.sensor.dynamicWhiteLevel", int.class); @@ -3685,7 +3749,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#SHADING_AVAILABLE_MODES android.shading.availableModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3701,6 +3765,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #SHADING_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> SHADING_MODE = new Key<Integer>("android.shading.mode", int.class); @@ -3726,6 +3791,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #STATISTICS_FACE_DETECT_MODE_FULL */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_FACE_DETECT_MODE = new Key<Integer>("android.statistics.faceDetectMode", int.class); @@ -3818,6 +3884,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#STATISTICS_FACE_DETECT_MODE */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.hardware.camera2.params.Face[]> STATISTICS_FACES = new Key<android.hardware.camera2.params.Face[]>("android.statistics.faces", android.hardware.camera2.params.Face[].class); @@ -3886,7 +3953,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </code></pre> * <p><b>Range of valid values:</b><br> * Each gain factor is >= 1</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -3896,6 +3963,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#SENSOR_INFO_LENS_SHADING_APPLIED */ @PublicKey + @NonNull public static final Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP = new Key<android.hardware.camera2.params.LensShadingMap>("android.statistics.lensShadingCorrectionMap", android.hardware.camera2.params.LensShadingMap.class); @@ -3976,7 +4044,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * formats.</p> * <p><b>Range of valid values:</b><br> * Each gain factor is >= 1</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4001,7 +4069,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * see {@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains} for details.</p> * <p>This value should always be calculated by the auto-white balance (AWB) block, * regardless of the android.control.* current values.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#COLOR_CORRECTION_GAINS * @deprecated @@ -4029,7 +4097,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * capture settings and color transforms are set by the application.</p> * <p>This value should always be calculated by the auto-white balance (AWB) block, * regardless of the android.control.* current values.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @deprecated * <p>Never fully implemented or specified; do not use</p> @@ -4061,7 +4129,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #STATISTICS_SCENE_FLICKER_50HZ 50HZ}</li> * <li>{@link #STATISTICS_SCENE_FLICKER_60HZ 60HZ}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4075,6 +4143,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #STATISTICS_SCENE_FLICKER_60HZ */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_SCENE_FLICKER = new Key<Integer>("android.statistics.sceneFlicker", int.class); @@ -4084,12 +4153,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * If set to <code>false</code>, no hot pixel map will be returned.</p> * <p><b>Range of valid values:</b><br> * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES android.statistics.info.availableHotPixelMapModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureResult#STATISTICS_HOT_PIXEL_MAP * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES */ @PublicKey + @NonNull public static final Key<Boolean> STATISTICS_HOT_PIXEL_MAP_MODE = new Key<Boolean>("android.statistics.hotPixelMapMode", boolean.class); @@ -4105,12 +4175,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>n <= number of pixels on the sensor. * The <code>(x, y)</code> coordinates must be bounded by * {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE */ @PublicKey + @NonNull public static final Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP = new Key<android.graphics.Point[]>("android.statistics.hotPixelMap", android.graphics.Point[].class); @@ -4128,7 +4199,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES android.statistics.info.availableLensShadingMapModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4139,6 +4210,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #STATISTICS_LENS_SHADING_MAP_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_LENS_SHADING_MAP_MODE = new Key<Integer>("android.statistics.lensShadingMapMode", int.class); @@ -4158,13 +4230,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES android.statistics.info.availableOisDataModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CameraCharacteristics#STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES * @see #STATISTICS_OIS_DATA_MODE_OFF * @see #STATISTICS_OIS_DATA_MODE_ON */ @PublicKey + @NonNull public static final Key<Integer> STATISTICS_OIS_DATA_MODE = new Key<Integer>("android.statistics.oisDataMode", int.class); @@ -4173,7 +4246,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>The array contains the timestamps of OIS samples. The timestamps are in the same * timebase as and comparable to {@link CaptureResult#SENSOR_TIMESTAMP android.sensor.timestamp}.</p> * <p><b>Units</b>: nanoseconds</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureResult#SENSOR_TIMESTAMP * @hide @@ -4194,7 +4267,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * since the scaling of OIS shifts would depend on the specific spot on the sensor the shift * is needed.</p> * <p><b>Units</b>: Pixels in active array.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<float[]> STATISTICS_OIS_X_SHIFTS = @@ -4213,7 +4286,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * since the scaling of OIS shifts would depend on the specific spot on the sensor the shift * is needed.</p> * <p><b>Units</b>: Pixels in active array.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<float[]> STATISTICS_OIS_Y_SHIFTS = @@ -4235,9 +4308,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * supporting devices). They are always reported in pre-correction active array coordinates, * since the scaling of OIS shifts would depend on the specific spot on the sensor the shift * is needed.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES = new Key<android.hardware.camera2.params.OisSample[]>("android.statistics.oisSamples", android.hardware.camera2.params.OisSample[].class); @@ -4247,7 +4321,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is * CONTRAST_CURVE.</p> * <p>See android.tonemap.curveRed for more details.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4264,7 +4338,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is * CONTRAST_CURVE.</p> * <p>See android.tonemap.curveRed for more details.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4325,7 +4399,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Range of valid values:</b><br> * 0-1 on both input and output coordinates, normalized * as a floating-point value such that 0 == black and 1 == white.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4386,7 +4460,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * (0.8000, 0.9063), (0.8667, 0.9389), (0.9333, 0.9701), (1.0000, 1.0000) ] * </code></pre> * <p><img alt="sRGB tonemapping curve" src="/reference/images/camera2/metadata/android.tonemap.curveRed/srgb_tonemap.png" /></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4396,6 +4470,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CaptureRequest#TONEMAP_MODE */ @PublicKey + @NonNull @SyntheticKey public static final Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE = new Key<android.hardware.camera2.params.TonemapCurve>("android.tonemap.curve", android.hardware.camera2.params.TonemapCurve.class); @@ -4430,7 +4505,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#TONEMAP_AVAILABLE_TONE_MAP_MODES android.tonemap.availableToneMapModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4446,6 +4521,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #TONEMAP_MODE_PRESET_CURVE */ @PublicKey + @NonNull public static final Key<Integer> TONEMAP_MODE = new Key<Integer>("android.tonemap.mode", int.class); @@ -4462,11 +4538,12 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * value will be returned in capture result.</p> * <p>The valid range of gamma value varies on different devices, but values * within [1.0, 5.0] are guaranteed not to be clipped.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#TONEMAP_MODE */ @PublicKey + @NonNull public static final Key<Float> TONEMAP_GAMMA = new Key<Float>("android.tonemap.gamma", float.class); @@ -4485,13 +4562,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <li>{@link #TONEMAP_PRESET_CURVE_SRGB SRGB}</li> * <li>{@link #TONEMAP_PRESET_CURVE_REC709 REC709}</li> * </ul></p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#TONEMAP_MODE * @see #TONEMAP_PRESET_CURVE_SRGB * @see #TONEMAP_PRESET_CURVE_REC709 */ @PublicKey + @NonNull public static final Key<Integer> TONEMAP_PRESET_CURVE = new Key<Integer>("android.tonemap.presetCurve", int.class); @@ -4506,7 +4584,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * data is stored locally on the device.</p> * <p>The LED <em>may</em> be off if a trusted application is using the data that * doesn't violate the above rules.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * @hide */ public static final Key<Boolean> LED_TRANSMIT = @@ -4519,7 +4597,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * ON if {@link CaptureRequest#BLACK_LEVEL_LOCK android.blackLevel.lock} was ON in the capture request, unless * a change in other capture settings forced the camera device to * perform a black level reset.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Full capability</b> - * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4528,6 +4606,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL */ @PublicKey + @NonNull public static final Key<Boolean> BLACK_LEVEL_LOCK = new Key<Boolean>("android.blackLevel.lock", boolean.class); @@ -4637,7 +4716,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Units</b>: Relative exposure time increase factor.</p> * <p><b>Range of valid values:</b><br> * >= 1.0</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * <p><b>Limited capability</b> - * Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> @@ -4648,6 +4727,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES */ @PublicKey + @NonNull public static final Key<Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR = new Key<Float>("android.reprocess.effectiveExposureFactor", float.class); @@ -4662,9 +4742,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * cameras when application changes FOCAL_LENGTH or SCALER_CROP_REGION. * At the time of lens switch, this result metadata reflects the new active physical camera * ID.</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> */ @PublicKey + @NonNull public static final Key<String> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID = new Key<String>("android.logicalMultiCamera.activePhysicalId", String.class); @@ -4711,7 +4792,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * </ul></p> * <p><b>Available values for this device:</b><br> * {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p> - * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p> * * @see CaptureRequest#CONTROL_AE_REGIONS * @see CaptureRequest#CONTROL_AF_REGIONS @@ -4727,6 +4808,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY */ @PublicKey + @NonNull public static final Key<Integer> DISTORTION_CORRECTION_MODE = new Key<Integer>("android.distortionCorrection.mode", int.class); @@ -4736,4 +4818,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { + + + } diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java index ed8a97c7e263..316c0c61e808 100644 --- a/core/java/android/hardware/display/BrightnessConfiguration.java +++ b/core/java/android/hardware/display/BrightnessConfiguration.java @@ -444,6 +444,7 @@ public final class BrightnessConfiguration implements Parcelable { * {@link #getMaxCorrectionsByPackageName}). * */ + @NonNull public Builder addCorrectionByPackageName(@NonNull String packageName, @NonNull BrightnessCorrection correction) { Objects.requireNonNull(packageName, "packageName must not be null"); @@ -472,6 +473,7 @@ public final class BrightnessConfiguration implements Parcelable { * {@link #getMaxCorrectionsByCategory}). * */ + @NonNull public Builder addCorrectionByCategory(@ApplicationInfo.Category int category, @NonNull BrightnessCorrection correction) { Objects.requireNonNull(correction, "correction must not be null"); @@ -488,6 +490,7 @@ public final class BrightnessConfiguration implements Parcelable { * @param description brief text describing the curve pushed. It maybe truncated * and will not be displayed in the UI */ + @NonNull public Builder setDescription(@Nullable String description) { mDescription = description; return this; @@ -496,6 +499,7 @@ public final class BrightnessConfiguration implements Parcelable { /** * Builds the {@link BrightnessConfiguration}. */ + @NonNull public BrightnessConfiguration build() { if (mCurveLux == null || mCurveNits == null) { throw new IllegalStateException("A curve must be set!"); diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl index 5ea8bd67ce75..edd20519bb53 100644 --- a/core/java/android/hardware/display/IDisplayManager.aidl +++ b/core/java/android/hardware/display/IDisplayManager.aidl @@ -30,6 +30,7 @@ import android.view.Surface; /** @hide */ interface IDisplayManager { + @UnsupportedAppUsage DisplayInfo getDisplayInfo(int displayId); int[] getDisplayIds(); diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl index 64448fd98bf3..2923bbf14c30 100644 --- a/core/java/android/hardware/input/IInputManager.aidl +++ b/core/java/android/hardware/input/IInputManager.aidl @@ -45,6 +45,7 @@ interface IInputManager { // Injects an input event into the system. To inject into windows owned by other // applications, the caller must have the INJECT_EVENTS permission. + @UnsupportedAppUsage boolean injectInputEvent(in InputEvent ev, int mode); // Calibrate input device position diff --git a/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl b/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl index 3fe645c59a30..2dfaf601c6f5 100644 --- a/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl +++ b/core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl @@ -32,5 +32,6 @@ oneway interface IActivityRecognitionHardwareClient { * @param isSupported whether the platform has hardware support for the feature * @param instance the available instance to provide access to the feature */ + @UnsupportedAppUsage void onAvailabilityChanged(in boolean isSupported, in IActivityRecognitionHardware instance); } diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index c1bce5e52a8d..64ed32266217 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -3684,7 +3684,8 @@ public class ConnectivityManager { /** * Registers to receive notifications about all networks which satisfy the given * {@link NetworkRequest}. The callbacks will continue to be called until - * either the application exits or link #unregisterNetworkCallback(NetworkCallback)} is called. + * either the application exits or {@link #unregisterNetworkCallback(NetworkCallback)} is + * called. * * @param request {@link NetworkRequest} describing this request. * @param networkCallback The {@link NetworkCallback} that the system will call as suitable @@ -3700,7 +3701,8 @@ public class ConnectivityManager { /** * Registers to receive notifications about all networks which satisfy the given * {@link NetworkRequest}. The callbacks will continue to be called until - * either the application exits or link #unregisterNetworkCallback(NetworkCallback)} is called. + * either the application exits or {@link #unregisterNetworkCallback(NetworkCallback)} is + * called. * * @param request {@link NetworkRequest} describing this request. * @param networkCallback The {@link NetworkCallback} that the system will call as suitable diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 87c62d2f10a7..6728712fe686 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -47,10 +47,12 @@ interface IConnectivityManager { Network getActiveNetwork(); Network getActiveNetworkForUid(int uid, boolean ignoreBlocked); + @UnsupportedAppUsage NetworkInfo getActiveNetworkInfo(); NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked); NetworkInfo getNetworkInfo(int networkType); NetworkInfo getNetworkInfoForUid(in Network network, int uid, boolean ignoreBlocked); + @UnsupportedAppUsage NetworkInfo[] getAllNetworkInfo(); Network getNetworkForType(int networkType); Network[] getAllNetworks(); @@ -58,12 +60,14 @@ interface IConnectivityManager boolean isNetworkSupported(int networkType); + @UnsupportedAppUsage LinkProperties getActiveLinkProperties(); LinkProperties getLinkPropertiesForType(int networkType); LinkProperties getLinkProperties(in Network network); NetworkCapabilities getNetworkCapabilities(in Network network); + @UnsupportedAppUsage NetworkState[] getAllNetworkState(); NetworkQuotaInfo getActiveNetworkQuotaInfo(); @@ -75,6 +79,7 @@ interface IConnectivityManager int untether(String iface, String callerPkg); + @UnsupportedAppUsage int getLastTetherError(String iface); boolean isTetheringSupported(String callerPkg); @@ -84,16 +89,21 @@ interface IConnectivityManager void stopTethering(int type, String callerPkg); + @UnsupportedAppUsage String[] getTetherableIfaces(); + @UnsupportedAppUsage String[] getTetheredIfaces(); + @UnsupportedAppUsage String[] getTetheringErroredIfaces(); String[] getTetheredDhcpRanges(); + @UnsupportedAppUsage String[] getTetherableUsbRegexs(); + @UnsupportedAppUsage String[] getTetherableWifiRegexs(); String[] getTetherableBluetoothRegexs(); @@ -118,12 +128,11 @@ interface IConnectivityManager VpnConfig getVpnConfig(int userId); + @UnsupportedAppUsage void startLegacyVpn(in VpnProfile profile); LegacyVpnInfo getLegacyVpnInfo(int userId); - VpnInfo[] getAllVpnInfo(); - boolean updateLockdownVpn(); boolean isAlwaysOnVpnPackageSupported(int userId, String packageName); boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdown, diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl index e92302a939d8..385cb1d68b57 100644 --- a/core/java/android/net/INetworkPolicyManager.aidl +++ b/core/java/android/net/INetworkPolicyManager.aidl @@ -31,9 +31,11 @@ import android.telephony.SubscriptionPlan; interface INetworkPolicyManager { /** Control UID policies. */ + @UnsupportedAppUsage void setUidPolicy(int uid, int policy); void addUidPolicy(int uid, int policy); void removeUidPolicy(int uid, int policy); + @UnsupportedAppUsage int getUidPolicy(int uid); int[] getUidsWithPolicy(int policy); @@ -41,14 +43,18 @@ interface INetworkPolicyManager { void unregisterListener(INetworkPolicyListener listener); /** Control network policies atomically. */ + @UnsupportedAppUsage void setNetworkPolicies(in NetworkPolicy[] policies); NetworkPolicy[] getNetworkPolicies(String callingPackage); /** Snooze limit on policy matching given template. */ + @UnsupportedAppUsage void snoozeLimit(in NetworkTemplate template); /** Control if background data is restricted system-wide. */ + @UnsupportedAppUsage void setRestrictBackground(boolean restrictBackground); + @UnsupportedAppUsage boolean getRestrictBackground(); /** Callback used to change internal state on tethering */ @@ -64,6 +70,7 @@ interface INetworkPolicyManager { void setDeviceIdleMode(boolean enabled); void setWifiMeteredOverride(String networkId, int meteredOverride); + @UnsupportedAppUsage NetworkQuotaInfo getNetworkQuotaInfo(in NetworkState state); SubscriptionPlan[] getSubscriptionPlans(int subId, String callingPackage); diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl index 8e6f27238846..41efc5040885 100644 --- a/core/java/android/net/INetworkStatsService.aidl +++ b/core/java/android/net/INetworkStatsService.aidl @@ -19,16 +19,19 @@ package android.net; import android.net.DataUsageRequest; import android.net.INetworkStatsSession; import android.net.Network; +import android.net.NetworkState; import android.net.NetworkStats; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; import android.os.IBinder; import android.os.Messenger; +import com.android.internal.net.VpnInfo; /** {@hide} */ interface INetworkStatsService { /** Start a statistics query session. */ + @UnsupportedAppUsage INetworkStatsSession openSession(); /** Start a statistics query session. If calling package is profile or device owner then it is @@ -37,9 +40,11 @@ interface INetworkStatsService { * PACKAGE_USAGE_STATS permission is always checked. If PACKAGE_USAGE_STATS is not granted * READ_NETWORK_USAGE_STATS is checked for. */ + @UnsupportedAppUsage INetworkStatsSession openSessionForUsageStats(int flags, String callingPackage); /** Return data layer snapshot of UID network usage. */ + @UnsupportedAppUsage NetworkStats getDataLayerSnapshotForUid(int uid); /** Get a detailed snapshot of stats since boot for all UIDs. @@ -52,14 +57,20 @@ interface INetworkStatsService { NetworkStats getDetailedUidStats(in String[] requiredIfaces); /** Return set of any ifaces associated with mobile networks since boot. */ + @UnsupportedAppUsage String[] getMobileIfaces(); /** Increment data layer count of operations performed for UID and tag. */ void incrementOperationCount(int uid, int tag, int operationCount); /** Force update of ifaces. */ - void forceUpdateIfaces(in Network[] defaultNetworks); + void forceUpdateIfaces( + in Network[] defaultNetworks, + in VpnInfo[] vpnArray, + in NetworkState[] networkStates, + in String activeIface); /** Force update of statistics. */ + @UnsupportedAppUsage void forceUpdate(); /** Registers a callback on data usage. */ diff --git a/core/java/android/net/INetworkStatsSession.aidl b/core/java/android/net/INetworkStatsSession.aidl index 5229a3b3b9f6..f13f2cb664ba 100644 --- a/core/java/android/net/INetworkStatsSession.aidl +++ b/core/java/android/net/INetworkStatsSession.aidl @@ -27,13 +27,17 @@ interface INetworkStatsSession { NetworkStats getDeviceSummaryForNetwork(in NetworkTemplate template, long start, long end); /** Return network layer usage summary for traffic that matches template. */ + @UnsupportedAppUsage NetworkStats getSummaryForNetwork(in NetworkTemplate template, long start, long end); /** Return historical network layer stats for traffic that matches template. */ + @UnsupportedAppUsage NetworkStatsHistory getHistoryForNetwork(in NetworkTemplate template, int fields); /** Return network layer usage summary per UID for traffic that matches template. */ + @UnsupportedAppUsage NetworkStats getSummaryForAllUid(in NetworkTemplate template, long start, long end, boolean includeTags); /** Return historical network layer stats for specific UID traffic that matches template. */ + @UnsupportedAppUsage NetworkStatsHistory getHistoryForUid(in NetworkTemplate template, int uid, int set, int tag, int fields); /** Return historical network layer stats for specific UID traffic that matches template. */ NetworkStatsHistory getHistoryIntervalForUid(in NetworkTemplate template, int uid, int set, int tag, int fields, long start, long end); @@ -41,6 +45,7 @@ interface INetworkStatsSession { /** Return array of uids that have stats and are accessible to the calling user */ int[] getRelevantUids(); + @UnsupportedAppUsage void close(); } diff --git a/core/java/android/nfc/INfcAdapterExtras.aidl b/core/java/android/nfc/INfcAdapterExtras.aidl index 41ebf636c89e..dd260bc6f2f6 100644 --- a/core/java/android/nfc/INfcAdapterExtras.aidl +++ b/core/java/android/nfc/INfcAdapterExtras.aidl @@ -23,11 +23,18 @@ import android.os.Bundle; * {@hide} */ interface INfcAdapterExtras { + @UnsupportedAppUsage Bundle open(in String pkg, IBinder b); + @UnsupportedAppUsage Bundle close(in String pkg, IBinder b); + @UnsupportedAppUsage Bundle transceive(in String pkg, in byte[] data_in); + @UnsupportedAppUsage int getCardEmulationRoute(in String pkg); + @UnsupportedAppUsage void setCardEmulationRoute(in String pkg, int route); + @UnsupportedAppUsage void authenticate(in String pkg, in byte[] token); + @UnsupportedAppUsage String getDriverName(in String pkg); } diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index 99fb608b80dc..471ae30a4058 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -240,7 +240,7 @@ public abstract class VibrationEffect implements Parcelable { * * @return The desired effect. */ - public static VibrationEffect createPrebaked(@EffectType int effectId) { + public static VibrationEffect createPredefined(@EffectType int effectId) { return get(effectId, true); } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 90a5f7660e0d..27e391423d21 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -136,6 +136,8 @@ public class StorageManager { public static final String PROP_ISOLATED_STORAGE = "persist.sys.isolated_storage"; /** {@hide} */ public static final String PROP_ISOLATED_STORAGE_SNAPSHOT = "sys.isolated_storage_snapshot"; + /** {@hide} */ + public static final String PROP_LEGACY_GREYLIST = "persist.sys.legacy_greylist"; /** {@hide} */ public static final String PROP_FORCE_AUDIO = "persist.fw.force_audio"; @@ -233,6 +235,8 @@ public class StorageManager { public static final int DEBUG_ISOLATED_STORAGE_FORCE_ON = 1 << 6; /** {@hide} */ public static final int DEBUG_ISOLATED_STORAGE_FORCE_OFF = 1 << 7; + /** {@hide} */ + public static final int DEBUG_LEGACY_GREYLIST = 1 << 8; /** {@hide} */ public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE; diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index 3e5bd4b72513..5d34aa65937d 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -183,6 +183,22 @@ public final class CalendarContract { public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); /** + * The content:// style URL for the top-level cross-profile calendar uris. + * {@link android.database.ContentObserver} for this URL in the primary profile will be + * notified when there is a change in the managed profile calendar provider. + * + * @see Events#ENTERPRISE_CONTENT_URI + * @see Calendars#ENTERPRISE_CONTENT_URI + * @see Instances#ENTERPRISE_CONTENT_URI + * @see Instances#ENTERPRISE_CONTENT_BY_DAY_URI + * @see Instances#ENTERPRISE_CONTENT_SEARCH_URI + * @see Instances#ENTERPRISE_CONTENT_SEARCH_BY_DAY_URI + * @hide + */ + public static final Uri ENTERPRISE_CONTENT_URI = Uri.parse( + "content://" + AUTHORITY + "/enterprise"); + + /** * An optional insert, update or delete URI parameter that allows the caller * to specify that it is a sync adapter. The default value is false. If set * to true, the modified row is not marked as "dirty" (needs to be synced) diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index ddb8758e18f4..fc89e2ca07e3 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -55,6 +55,15 @@ public final class DeviceConfig { public static final Uri CONTENT_URI = Uri.parse("content://" + Settings.AUTHORITY + "/config"); /** + * Namespace for activity manager related features. These features will be applied + * immediately upon change. + * + * @hide + */ + @SystemApi + public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager"; + + /** * Namespace for all Game Driver features. * * @hide @@ -281,35 +290,6 @@ public final class DeviceConfig { } /** - * Namespace for activity manager related features. These features will be applied - * immediately upon change. - * - * @hide - */ - @SystemApi - public interface ActivityManager { - String NAMESPACE = "activity_manager"; - - /** - * App compaction flags. See {@link com.android.server.am.AppCompactor}. - */ - String KEY_USE_COMPACTION = "use_compaction"; - String KEY_COMPACT_ACTION_1 = "compact_action_1"; - String KEY_COMPACT_ACTION_2 = "compact_action_2"; - String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1"; - String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2"; - String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3"; - String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4"; - String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate"; - - /** - * Maximum number of cached processes. See - * {@link com.android.server.am.ActivityManagerConstants}. - */ - String KEY_MAX_CACHED_PROCESSES = "max_cached_processes"; - } - - /** * Namespace for {@link AttentionManagerService} related features. * * @hide @@ -412,6 +392,100 @@ public final class DeviceConfig { } /** + * Look up the String value of a property for a particular namespace. + * + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @return the corresponding value, or defaultValue if none exists. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(READ_DEVICE_CONFIG) + public static String getString(String namespace, String name, String defaultValue) { + String value = getProperty(namespace, name); + return value != null ? value : defaultValue; + } + + /** + * Look up the boolean value of a property for a particular namespace. + * + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @return the corresponding value, or defaultValue if none exists. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(READ_DEVICE_CONFIG) + public static boolean getBoolean(String namespace, String name, boolean defaultValue) { + String value = getProperty(namespace, name); + return value != null ? Boolean.parseBoolean(value) : defaultValue; + } + + /** + * Look up the int value of a property for a particular namespace. + * + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @return the corresponding value, or defaultValue if either none exists or it does not parse. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(READ_DEVICE_CONFIG) + public static int getInt(String namespace, String name, int defaultValue) { + String value = getProperty(namespace, name); + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + + /** + * Look up the long value of a property for a particular namespace. + * + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @return the corresponding value, or defaultValue if either none exists or it does not parse. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(READ_DEVICE_CONFIG) + public static long getLong(String namespace, String name, long defaultValue) { + String value = getProperty(namespace, name); + try { + return Long.parseLong(value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + + /** + * Look up the float value of a property for a particular namespace. + * + * @param namespace The namespace containing the property to look up. + * @param name The name of the property to look up. + * @return the corresponding value, or defaultValue if either none exists or it does not parse. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(READ_DEVICE_CONFIG) + public static float getFloat(String namespace, String name, float defaultValue) { + String value = getProperty(namespace, name); + try { + return Float.parseFloat(value); + } catch (NumberFormatException e) { + return defaultValue; + } catch (NullPointerException e) { + return defaultValue; + } + } + + /** * Create a new property with the the provided name and value in the provided namespace, or * update the value of such a property if it already exists. The same name can exist in multiple * namespaces and might have different values in any or all namespaces. diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 643307eb89ae..35c60981bc9d 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -529,7 +529,6 @@ public final class MediaStore { * * @see MediaColumns#IS_PENDING * @see MediaStore#setIncludePending(Uri) - * @see MediaStore#createPending(Context, PendingParams) */ public static @NonNull Uri setIncludePending(@NonNull Uri uri) { return setIncludePending(uri.buildUpon()).build(); @@ -586,7 +585,9 @@ public final class MediaStore { * @see MediaColumns#IS_PENDING * @see MediaStore#setIncludePending(Uri) * @see MediaStore#createPending(Context, PendingParams) + * @removed */ + @Deprecated public static @NonNull Uri createPending(@NonNull Context context, @NonNull PendingParams params) { return context.getContentResolver().insert(params.insertUri, params.insertValues); @@ -599,14 +600,19 @@ public final class MediaStore { * * @param uri token which was previously returned from * {@link #createPending(Context, PendingParams)}. + * @removed */ + @Deprecated public static @NonNull PendingSession openPending(@NonNull Context context, @NonNull Uri uri) { return new PendingSession(context, uri); } /** * Parameters that describe a pending media item. + * + * @removed */ + @Deprecated public static class PendingParams { /** {@hide} */ public final Uri insertUri; @@ -711,7 +717,10 @@ public final class MediaStore { * expected to have a short lifetime, and owners should either * {@link PendingSession#publish()} or {@link PendingSession#abandon()} a * pending item within a few hours after first creating it. + * + * @removed */ + @Deprecated public static class PendingSession implements AutoCloseable { /** {@hide} */ private final Context mContext; @@ -976,9 +985,7 @@ public final class MediaStore { * Flag indicating if a media item is pending, and still being inserted * by its owner. * - * @see MediaColumns#IS_PENDING * @see MediaStore#setIncludePending(Uri) - * @see MediaStore#createPending(Context, PendingParams) */ @Column(Cursor.FIELD_TYPE_INTEGER) public static final String IS_PENDING = "is_pending"; @@ -998,12 +1005,8 @@ public final class MediaStore { /** * The time the media item should be considered expired. Typically only - * meaningful in the context of {@link #IS_PENDING} or - * {@link #IS_TRASHED}. - * - * @removed + * meaningful in the context of {@link #IS_PENDING}. */ - @Deprecated @CurrentTimeSecondsLong @Column(Cursor.FIELD_TYPE_INTEGER) public static final String DATE_EXPIRES = "date_expires"; @@ -1030,8 +1033,6 @@ public final class MediaStore { /** * The primary directory name this media exists under. The value may be * {@code NULL} if the media doesn't have a primary directory name. - * - * @see PendingParams#setPrimaryDirectory(String) */ @Column(Cursor.FIELD_TYPE_STRING) public static final String PRIMARY_DIRECTORY = "primary_directory"; @@ -1039,8 +1040,6 @@ public final class MediaStore { /** * The secondary directory name this media exists under. The value may * be {@code NULL} if the media doesn't have a secondary directory name. - * - * @see PendingParams#setSecondaryDirectory(String) */ @Column(Cursor.FIELD_TYPE_STRING) public static final String SECONDARY_DIRECTORY = "secondary_directory"; @@ -1292,12 +1291,7 @@ public final class MediaStore { } /** - * Container for downloaded files. - * - * <p> - * Querying for downloads from this table will return files contributed via - * {@link PendingSession} and also ones which were downloaded using - * {@link android.app.DownloadManager} APIs. + * Collection of downloaded items. */ public static final class Downloads implements DownloadColumns { private Downloads() {} @@ -1305,6 +1299,7 @@ public final class MediaStore { /** * The content:// style URI for the internal storage. */ + @NonNull public static final Uri INTERNAL_CONTENT_URI = getContentUri("internal"); @@ -1312,6 +1307,7 @@ public final class MediaStore { * The content:// style URI for the "primary" external storage * volume. */ + @NonNull public static final Uri EXTERNAL_CONTENT_URI = getContentUri("external"); @@ -1336,13 +1332,13 @@ public final class MediaStore { * @param volumeName the name of the volume to get the URI for * @return the URI to the image media table on the given volume */ - public static Uri getContentUri(String volumeName) { + public static @NonNull Uri getContentUri(@NonNull String volumeName) { return AUTHORITY_URI.buildUpon().appendPath(volumeName) .appendPath("downloads").build(); } /** @hide */ - public static Uri getContentUriForPath(@NonNull String path) { + public static @NonNull Uri getContentUriForPath(@NonNull String path) { return getContentUri(getVolumeName(new File(path))); } @@ -1620,9 +1616,9 @@ public final class MediaStore { * @param name The name of the image * @param description The description of the image * @return The URL to the newly created image - * @deprecated inserting of images should be performed through - * {@link MediaStore#createPending(Context, PendingParams)}, - * which offers richer control over lifecycle. + * @deprecated inserting of images should be performed using + * {@link MediaColumns#IS_PENDING}, which offers richer + * control over lifecycle. */ @Deprecated public static final String insertImage(ContentResolver cr, String imagePath, @@ -1651,9 +1647,9 @@ public final class MediaStore { * @param description The description of the image * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored * for any reason. - * @deprecated inserting of images should be performed through - * {@link MediaStore#createPending(Context, PendingParams)}, - * which offers richer control over lifecycle. + * @deprecated inserting of images should be performed using + * {@link MediaColumns#IS_PENDING}, which offers richer + * control over lifecycle. */ @Deprecated public static final String insertImage(ContentResolver cr, Bitmap source, diff --git a/core/java/android/service/autofill/FillContext.java b/core/java/android/service/autofill/FillContext.java index 535c00bc5319..5ed978eafe11 100644 --- a/core/java/android/service/autofill/FillContext.java +++ b/core/java/android/service/autofill/FillContext.java @@ -49,6 +49,7 @@ import java.util.LinkedList; public final class FillContext implements Parcelable { private final int mRequestId; private final @NonNull AssistStructure mStructure; + private final @NonNull AutofillId mFocusedId; /** * Lookup table AutofillId->ViewNode to speed up {@link #findViewNodesByAutofillIds} @@ -58,13 +59,15 @@ public final class FillContext implements Parcelable { /** @hide */ - public FillContext(int requestId, @NonNull AssistStructure structure) { + public FillContext(int requestId, @NonNull AssistStructure structure, + @NonNull AutofillId autofillId) { mRequestId = requestId; mStructure = structure; + mFocusedId = autofillId; } private FillContext(Parcel parcel) { - this(parcel.readInt(), parcel.readParcelable(null)); + this(parcel.readInt(), parcel.readParcelable(null), parcel.readParcelable(null)); } /** @@ -82,15 +85,24 @@ public final class FillContext implements Parcelable { /** * @return The screen content. */ + @NonNull public AssistStructure getStructure() { return mStructure; } + /** + * @return the AutofillId of the view that triggered autofill. + */ + @NonNull + public AutofillId getFocusedId() { + return mFocusedId; + } + @Override public String toString() { if (!sDebug) return super.toString(); - return "FillContext [reqId=" + mRequestId + "]"; + return "FillContext [reqId=" + mRequestId + ", focusedId=" + mFocusedId + "]"; } @Override @@ -102,6 +114,7 @@ public final class FillContext implements Parcelable { public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(mRequestId); parcel.writeParcelable(mStructure, flags); + parcel.writeParcelable(mFocusedId, flags); } /** @@ -180,11 +193,13 @@ public final class FillContext implements Parcelable { public static final Parcelable.Creator<FillContext> CREATOR = new Parcelable.Creator<FillContext>() { @Override + @NonNull public FillContext createFromParcel(Parcel parcel) { return new FillContext(parcel); } @Override + @NonNull public FillContext[] newArray(int size) { return new FillContext[size]; } diff --git a/core/java/android/service/autofill/VisibilitySetterAction.java b/core/java/android/service/autofill/VisibilitySetterAction.java index 9f977d79c184..81f5d38651cd 100644 --- a/core/java/android/service/autofill/VisibilitySetterAction.java +++ b/core/java/android/service/autofill/VisibilitySetterAction.java @@ -70,7 +70,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen /** * Builder for {@link VisibilitySetterAction} objects. */ - public static class Builder { + public static final class Builder { private final SparseIntArray mVisibilities = new SparseIntArray(); private boolean mDestroyed; @@ -96,6 +96,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen * @throws IllegalArgumentException if visibility is not one of {@link View#VISIBLE}, * {@link View#INVISIBLE}, or {@link View#GONE}. */ + @NonNull public Builder setVisibility(@IdRes int id, @Visibility int visibility) { throwIfDestroyed(); switch (visibility) { @@ -111,6 +112,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen /** * Creates a new {@link VisibilitySetterAction} instance. */ + @NonNull public VisibilitySetterAction build() { throwIfDestroyed(); mDestroyed = true; @@ -147,6 +149,8 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen public static final Parcelable.Creator<VisibilitySetterAction> CREATOR = new Parcelable.Creator<VisibilitySetterAction>() { + + @NonNull @Override public VisibilitySetterAction createFromParcel(Parcel parcel) { // Always go through the builder to ensure the data ingested by @@ -165,6 +169,7 @@ public final class VisibilitySetterAction extends InternalOnClickAction implemen return builder == null ? null : builder.build(); } + @NonNull @Override public VisibilitySetterAction[] newArray(int size) { return new VisibilitySetterAction[size]; diff --git a/core/java/android/service/autofill/augmented/FillResponse.java b/core/java/android/service/autofill/augmented/FillResponse.java index 2ac406c5b08c..48a3c1b18334 100644 --- a/core/java/android/service/autofill/augmented/FillResponse.java +++ b/core/java/android/service/autofill/augmented/FillResponse.java @@ -19,9 +19,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; -import android.view.autofill.AutofillId; - -import java.util.List; /** * Response to a {@link FillRequest}. @@ -63,6 +60,7 @@ public final class FillResponse { * * @return this builder */ + @NonNull public Builder setFillWindow(@NonNull FillWindow fillWindow) { // TODO(b/123100712): check not null / unit test / throw exception if FillWindow not // updated yet @@ -71,19 +69,6 @@ public final class FillResponse { } /** - * Tells the Android System that the given {@code ids} should not trigger further - * {@link FillRequest requests} when focused. - * - * @param ids ids of the fields that should be ignored - * - * @return this builder - */ - public Builder setIgnoredIds(@NonNull List<AutofillId> ids) { - // TODO(b/123100695): implement / check not null / unit test - return this; - } - - /** * Builds a new {@link FillResponse} instance. * * @throws IllegalStateException if any of the following conditions occur: @@ -95,6 +80,7 @@ public final class FillResponse { * * @return A built response. */ + @NonNull public FillResponse build() { // TODO(b/123100712): check conditions / add unit test return new FillResponse(this); diff --git a/core/java/android/service/carrier/CarrierMessagingClientService.java b/core/java/android/service/carrier/CarrierMessagingClientService.java index 13f4fc4b0dcb..767c1d1a49c6 100644 --- a/core/java/android/service/carrier/CarrierMessagingClientService.java +++ b/core/java/android/service/carrier/CarrierMessagingClientService.java @@ -15,6 +15,8 @@ */ package android.service.carrier; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.Service; import android.content.ComponentName; import android.content.Intent; @@ -71,7 +73,8 @@ public class CarrierMessagingClientService extends Service { } @Override - public final IBinder onBind(Intent intent) { + @NonNull + public final IBinder onBind(@Nullable Intent intent) { return mImpl.asBinder(); } diff --git a/core/java/android/service/contentcapture/SnapshotData.java b/core/java/android/service/contentcapture/SnapshotData.java index c3af1f0cc608..58ec2fffb98a 100644 --- a/core/java/android/service/contentcapture/SnapshotData.java +++ b/core/java/android/service/contentcapture/SnapshotData.java @@ -60,6 +60,7 @@ public final class SnapshotData implements Parcelable { /** * Returns the assist data for this snapshot. */ + @NonNull public Bundle getAssistData() { return mAssistData; } @@ -67,6 +68,7 @@ public final class SnapshotData implements Parcelable { /** * Returns the assist structure for this snapshot. */ + @NonNull public AssistStructure getAssistStructure() { return mAssistStructure; } @@ -74,6 +76,7 @@ public final class SnapshotData implements Parcelable { /** * Returns the assist context for this snapshot. */ + @Nullable public AssistContent getAssistContent() { return mAssistContent; } @@ -94,11 +97,13 @@ public final class SnapshotData implements Parcelable { new Creator<SnapshotData>() { @Override + @NonNull public SnapshotData createFromParcel(@NonNull Parcel parcel) { return new SnapshotData(parcel); } @Override + @NonNull public SnapshotData[] newArray(int size) { return new SnapshotData[size]; } diff --git a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java index 333f4bec8f7e..40333bf7709e 100644 --- a/core/java/android/service/contentsuggestions/ContentSuggestionsService.java +++ b/core/java/android/service/contentsuggestions/ContentSuggestionsService.java @@ -60,11 +60,17 @@ public abstract class ContentSuggestionsService extends Service { @Override public void provideContextImage(int taskId, GraphicBuffer contextImage, Bundle imageContextRequestExtras) { + + Bitmap wrappedBuffer = null; + if (contextImage != null) { + wrappedBuffer = Bitmap.wrapHardwareBuffer( + HardwareBuffer.createFromGraphicBuffer(contextImage), null); + } + mHandler.sendMessage( obtainMessage(ContentSuggestionsService::processContextImage, ContentSuggestionsService.this, taskId, - Bitmap.wrapHardwareBuffer( - HardwareBuffer.createFromGraphicBuffer(contextImage), null), + wrappedBuffer, imageContextRequestExtras)); } diff --git a/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl b/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl index 4667066df866..aff8f1b7b346 100644 --- a/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl +++ b/core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl @@ -18,5 +18,6 @@ package android.service.euicc; /** @hide */ oneway interface IDeleteSubscriptionCallback { + @UnsupportedAppUsage void onComplete(int result); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl b/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl index c975f1894aa2..34b53cc71dfb 100644 --- a/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl +++ b/core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl @@ -18,5 +18,6 @@ package android.service.euicc; /** @hide */ oneway interface IEraseSubscriptionsCallback { + @UnsupportedAppUsage void onComplete(int result); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl b/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl index 0c5a0c692cb5..ad69ef132428 100644 --- a/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl +++ b/core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl @@ -20,5 +20,6 @@ import android.service.euicc.GetDefaultDownloadableSubscriptionListResult; /** @hide */ oneway interface IGetDefaultDownloadableSubscriptionListCallback { + @UnsupportedAppUsage void onComplete(in GetDefaultDownloadableSubscriptionListResult result); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl b/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl index 3353061ad93e..01f187ed11e2 100644 --- a/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl +++ b/core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl @@ -20,5 +20,6 @@ import android.service.euicc.GetDownloadableSubscriptionMetadataResult; /** @hide */ oneway interface IGetDownloadableSubscriptionMetadataCallback { + @UnsupportedAppUsage void onComplete(in GetDownloadableSubscriptionMetadataResult result); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IGetEidCallback.aidl b/core/java/android/service/euicc/IGetEidCallback.aidl index 35ee9c25a48e..e405a981c85a 100644 --- a/core/java/android/service/euicc/IGetEidCallback.aidl +++ b/core/java/android/service/euicc/IGetEidCallback.aidl @@ -18,5 +18,6 @@ package android.service.euicc; /** @hide */ oneway interface IGetEidCallback { + @UnsupportedAppUsage void onSuccess(String eid); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl b/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl index 6d281487602a..c0611825ff0f 100644 --- a/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl +++ b/core/java/android/service/euicc/IGetEuiccInfoCallback.aidl @@ -20,5 +20,6 @@ import android.telephony.euicc.EuiccInfo; /** @hide */ oneway interface IGetEuiccInfoCallback { + @UnsupportedAppUsage void onSuccess(in EuiccInfo euiccInfo); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl b/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl index 761ec1f01324..0485f7be29d3 100644 --- a/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl +++ b/core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl @@ -20,5 +20,6 @@ import android.service.euicc.GetEuiccProfileInfoListResult; /** @hide */ oneway interface IGetEuiccProfileInfoListCallback { + @UnsupportedAppUsage void onComplete(in GetEuiccProfileInfoListResult result); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl b/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl index 127683059c02..340401fe89cb 100644 --- a/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl +++ b/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl @@ -18,5 +18,6 @@ package android.service.euicc; /** @hide */ oneway interface IRetainSubscriptionsForFactoryResetCallback { + @UnsupportedAppUsage void onComplete(int result); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl b/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl index 0f91a6b29e26..b8f984d1c28b 100644 --- a/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl +++ b/core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl @@ -18,5 +18,6 @@ package android.service.euicc; /** @hide */ oneway interface ISwitchToSubscriptionCallback { + @UnsupportedAppUsage void onComplete(int result); }
\ No newline at end of file diff --git a/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl b/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl index 66669330c8c0..0aa66978bb91 100644 --- a/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl +++ b/core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl @@ -18,5 +18,6 @@ package android.service.euicc; /** @hide */ oneway interface IUpdateSubscriptionNicknameCallback { + @UnsupportedAppUsage void onComplete(int result); }
\ No newline at end of file diff --git a/core/java/android/service/vr/IVrManager.aidl b/core/java/android/service/vr/IVrManager.aidl index b0269e3325bf..a8293b47db30 100644 --- a/core/java/android/service/vr/IVrManager.aidl +++ b/core/java/android/service/vr/IVrManager.aidl @@ -57,6 +57,7 @@ interface IVrManager { * * @return {@code true} if VR mode is enabled. */ + @UnsupportedAppUsage boolean getVrModeState(); /** @@ -93,6 +94,7 @@ interface IVrManager { * @return {@link android.view.Display.INVALID_DISPLAY} if there is no virtual display * currently, else return the display id of the virtual display */ + @UnsupportedAppUsage int getVr2dDisplayId(); /** diff --git a/core/java/android/service/wallpaper/IWallpaperEngine.aidl b/core/java/android/service/wallpaper/IWallpaperEngine.aidl index ebce4846c16b..00e0b7c170be 100644 --- a/core/java/android/service/wallpaper/IWallpaperEngine.aidl +++ b/core/java/android/service/wallpaper/IWallpaperEngine.aidl @@ -26,11 +26,15 @@ import android.os.Bundle; oneway interface IWallpaperEngine { void setDesiredSize(int width, int height); void setDisplayPadding(in Rect padding); + @UnsupportedAppUsage void setVisibility(boolean visible); void setInAmbientMode(boolean inAmbientDisplay, long animationDuration); + @UnsupportedAppUsage void dispatchPointer(in MotionEvent event); + @UnsupportedAppUsage void dispatchWallpaperCommand(String action, int x, int y, int z, in Bundle extras); void requestWallpaperColors(); + @UnsupportedAppUsage void destroy(); } diff --git a/core/java/android/speech/IRecognitionListener.aidl b/core/java/android/speech/IRecognitionListener.aidl index 3d3c44bf1efe..e77851b0e405 100644 --- a/core/java/android/speech/IRecognitionListener.aidl +++ b/core/java/android/speech/IRecognitionListener.aidl @@ -83,5 +83,6 @@ oneway interface IRecognitionListener { * @param eventType the type of the occurred event * @param params a Bundle containing the passed parameters */ + @UnsupportedAppUsage void onEvent(in int eventType, in Bundle params); } diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index 2d6cbd6cbcef..fac699ece642 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -50,7 +50,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put("settings_slice_injection", "true"); DEFAULT_FLAGS.put("settings_systemui_theme", "true"); DEFAULT_FLAGS.put("settings_wifi_mac_randomization", "true"); - DEFAULT_FLAGS.put("settings_mainline_module", "true"); + DEFAULT_FLAGS.put("settings_mainline_module", "false"); DEFAULT_FLAGS.put("settings_dynamic_android", "false"); DEFAULT_FLAGS.put(SEAMLESS_TRANSFER, "false"); DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false"); diff --git a/core/java/android/view/GestureExclusionTracker.java b/core/java/android/view/GestureExclusionTracker.java new file mode 100644 index 000000000000..8eccc04fa647 --- /dev/null +++ b/core/java/android/view/GestureExclusionTracker.java @@ -0,0 +1,125 @@ +/* + * 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.view; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.graphics.Rect; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * Used by {@link ViewRootImpl} to track system gesture exclusion rects reported by views. + */ +class GestureExclusionTracker { + private boolean mGestureExclusionViewsChanged = false; + private List<GestureExclusionViewInfo> mGestureExclusionViewInfos = new ArrayList<>(); + private List<Rect> mGestureExclusionRects = Collections.emptyList(); + + public void updateRectsForView(@NonNull View view) { + boolean found = false; + final Iterator<GestureExclusionViewInfo> i = mGestureExclusionViewInfos.iterator(); + while (i.hasNext()) { + final GestureExclusionViewInfo info = i.next(); + final View v = info.getView(); + if (v == null || !v.isAttachedToWindow()) { + mGestureExclusionViewsChanged = true; + i.remove(); + continue; + } + if (v == view) { + found = true; + info.mDirty = true; + break; + } + } + if (!found && view.isAttachedToWindow()) { + mGestureExclusionViewInfos.add(new GestureExclusionViewInfo(view)); + mGestureExclusionViewsChanged = true; + } + } + + @Nullable + public List<Rect> computeChangedRects() { + boolean changed = false; + final Iterator<GestureExclusionViewInfo> i = mGestureExclusionViewInfos.iterator(); + final List<Rect> rects = new ArrayList<>(); + while (i.hasNext()) { + final GestureExclusionViewInfo info = i.next(); + switch (info.update()) { + case GestureExclusionViewInfo.CHANGED: + changed = true; + // Deliberate fall-through + case GestureExclusionViewInfo.UNCHANGED: + rects.addAll(info.mExclusionRects); + break; + case GestureExclusionViewInfo.GONE: + mGestureExclusionViewsChanged = true; + i.remove(); + break; + } + } + if (changed || mGestureExclusionViewsChanged) { + mGestureExclusionViewsChanged = false; + if (!mGestureExclusionRects.equals(rects)) { + mGestureExclusionRects = rects; + return rects; + } + } + return null; + } + + private static class GestureExclusionViewInfo { + public static final int CHANGED = 0; + public static final int UNCHANGED = 1; + public static final int GONE = 2; + + private final WeakReference<View> mView; + boolean mDirty = true; + List<Rect> mExclusionRects = Collections.emptyList(); + + GestureExclusionViewInfo(View view) { + mView = new WeakReference<>(view); + } + + public View getView() { + return mView.get(); + } + + public int update() { + final View excludedView = getView(); + if (excludedView == null || !excludedView.isAttachedToWindow()) return GONE; + final List<Rect> localRects = excludedView.getSystemGestureExclusionRects(); + final List<Rect> newRects = new ArrayList<>(localRects.size()); + for (Rect src : localRects) { + Rect mappedRect = new Rect(src); + ViewParent p = excludedView.getParent(); + if (p != null && p.getChildVisibleRect(excludedView, mappedRect, null)) { + newRects.add(mappedRect); + } + } + + if (mExclusionRects.equals(localRects)) return UNCHANGED; + mExclusionRects = newRects; + return CHANGED; + } + } +} diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl index 94b9bc099d56..b1f934a44cdb 100644 --- a/core/java/android/view/IRecentsAnimationController.aidl +++ b/core/java/android/view/IRecentsAnimationController.aidl @@ -33,6 +33,7 @@ interface IRecentsAnimationController { * Takes a screenshot of the task associated with the given {@param taskId}. Only valid for the * current set of task ids provided to the handler. */ + @UnsupportedAppUsage ActivityManager.TaskSnapshot screenshotTask(int taskId); /** @@ -41,6 +42,7 @@ interface IRecentsAnimationController { * the home activity should be moved to the top. Otherwise, the home activity is hidden and the * user is returned to the app. */ + @UnsupportedAppUsage void finish(boolean moveHomeToTop); /** @@ -50,6 +52,7 @@ interface IRecentsAnimationController { * may register the recents animation input consumer prior to starting the recents animation * and then enable it mid-animation to start receiving touch events. */ + @UnsupportedAppUsage void setInputConsumerEnabled(boolean enabled); /** @@ -58,6 +61,7 @@ interface IRecentsAnimationController { * they can control the SystemUI flags, otherwise the SystemUI flags from home activity will be * taken. */ + @UnsupportedAppUsage void setAnimationTargetsBehindSystemBars(boolean behindSystemBars); /** diff --git a/core/java/android/view/IRecentsAnimationRunner.aidl b/core/java/android/view/IRecentsAnimationRunner.aidl index 4cdf66441514..6e382f416b62 100644 --- a/core/java/android/view/IRecentsAnimationRunner.aidl +++ b/core/java/android/view/IRecentsAnimationRunner.aidl @@ -33,6 +33,7 @@ oneway interface IRecentsAnimationRunner { * wallpaper not drawing in time, or the handler not finishing the animation within a predefined * amount of time. */ + @UnsupportedAppUsage void onAnimationCanceled() = 1; /** @@ -42,6 +43,7 @@ oneway interface IRecentsAnimationRunner { * @param minimizedHomeBounds Specifies the bounds of the minimized home app, will be * {@code null} if the device is not currently in split screen */ + @UnsupportedAppUsage void onAnimationStart(in IRecentsAnimationController controller, in RemoteAnimationTarget[] apps, in Rect homeContentInsets, in Rect minimizedHomeBounds) = 2; diff --git a/core/java/android/view/IRemoteAnimationFinishedCallback.aidl b/core/java/android/view/IRemoteAnimationFinishedCallback.aidl index ae58b226ec03..a99162b6c857 100644 --- a/core/java/android/view/IRemoteAnimationFinishedCallback.aidl +++ b/core/java/android/view/IRemoteAnimationFinishedCallback.aidl @@ -23,5 +23,6 @@ package android.view; * {@hide} */ interface IRemoteAnimationFinishedCallback { + @UnsupportedAppUsage void onAnimationFinished(); } diff --git a/core/java/android/view/IRemoteAnimationRunner.aidl b/core/java/android/view/IRemoteAnimationRunner.aidl index 1350ebf10a4f..73b023c99665 100644 --- a/core/java/android/view/IRemoteAnimationRunner.aidl +++ b/core/java/android/view/IRemoteAnimationRunner.aidl @@ -33,6 +33,7 @@ oneway interface IRemoteAnimationRunner { * @param apps The list of apps to animate. * @param finishedCallback The callback to invoke when the animation is finished. */ + @UnsupportedAppUsage void onAnimationStart(in RemoteAnimationTarget[] apps, in IRemoteAnimationFinishedCallback finishedCallback); @@ -40,5 +41,6 @@ oneway interface IRemoteAnimationRunner { * Called when the animation was cancelled. From this point on, any updates onto the leashes * won't have any effect anymore. */ + @UnsupportedAppUsage void onAnimationCancelled(); } diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 5dc54a566676..e32c4e136a6e 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -74,10 +74,13 @@ interface IWindowManager IWindowSession openSession(in IWindowSessionCallback callback); + @UnsupportedAppUsage void getInitialDisplaySize(int displayId, out Point size); + @UnsupportedAppUsage void getBaseDisplaySize(int displayId, out Point size); void setForcedDisplaySize(int displayId, int width, int height); void clearForcedDisplaySize(int displayId); + @UnsupportedAppUsage int getInitialDisplayDensity(int displayId); int getBaseDisplayDensity(int displayId); void setForcedDisplayDensityForUser(int displayId, int density, int userId); @@ -97,17 +100,21 @@ interface IWindowManager * used for recents, where generating the thumbnails of the specs takes a non-trivial amount of * time, so we want to move that off the critical path for starting the new activity. */ + @UnsupportedAppUsage void overridePendingAppTransitionMultiThumbFuture( IAppTransitionAnimationSpecsFuture specsFuture, IRemoteCallback startedCallback, boolean scaleUp, int displayId); + @UnsupportedAppUsage void overridePendingAppTransitionRemote(in RemoteAnimationAdapter remoteAnimationAdapter, int displayId); + @UnsupportedAppUsage void executeAppTransition(); /** * Used by system ui to report that recents has shown itself. * @deprecated to be removed once prebuilts are updated */ + @UnsupportedAppUsage void endProlongedAnimations(); void startFreezingScreen(int exitAnim, int enterAnim); @@ -119,7 +126,9 @@ interface IWindowManager /** @deprecated use Activity.setShowWhenLocked instead. */ void reenableKeyguard(IBinder token, int userId); void exitKeyguardSecurely(IOnKeyguardExitResult callback); + @UnsupportedAppUsage boolean isKeyguardLocked(); + @UnsupportedAppUsage boolean isKeyguardSecure(); void dismissKeyguard(IKeyguardDismissCallback callback, CharSequence message); @@ -129,9 +138,13 @@ interface IWindowManager void closeSystemDialogs(String reason); // These can only be called with the SET_ANIMATON_SCALE permission. + @UnsupportedAppUsage float getAnimationScale(int which); + @UnsupportedAppUsage float[] getAnimationScales(); + @UnsupportedAppUsage void setAnimationScale(int which, float scale); + @UnsupportedAppUsage void setAnimationScales(in float[] scales); float getCurrentAnimatorScale(); @@ -150,6 +163,7 @@ interface IWindowManager // should be enabled. The 'enabled' value is null or blank for // the system default (differs per build variant) or any valid // boolean string as parsed by SystemProperties.getBoolean(). + @UnsupportedAppUsage void setStrictModeVisualIndicatorPreference(String enabled); /** @@ -188,6 +202,7 @@ interface IWindowManager * Remove a rotation watcher set using watchRotation. * @hide */ + @UnsupportedAppUsage void removeRotationWatcher(IRotationWatcher watcher); /** @@ -203,12 +218,14 @@ interface IWindowManager * Equivalent to calling {@link #freezeDisplayRotation(int, int)} with {@link * android.view.Display#DEFAULT_DISPLAY} and given rotation. */ + @UnsupportedAppUsage void freezeRotation(int rotation); /** * Equivalent to calling {@link #thawDisplayRotation(int)} with {@link * android.view.Display#DEFAULT_DISPLAY}. */ + @UnsupportedAppUsage void thawRotation(); /** @@ -286,11 +303,13 @@ interface IWindowManager /** * Called by System UI to notify of changes to the visibility and height of the shelf. */ + @UnsupportedAppUsage void setShelfHeight(boolean visible, int shelfHeight); /** * Called by System UI to enable or disable haptic feedback on the navigation bar buttons. */ + @UnsupportedAppUsage void setNavBarVirtualKeyHapticFeedbackEnabled(boolean enabled); /** @@ -298,6 +317,7 @@ interface IWindowManager * * @param displayId the id of display to check if there is a software navigation bar. */ + @UnsupportedAppUsage boolean hasNavigationBar(int displayId); /** @@ -308,11 +328,13 @@ interface IWindowManager /** * Lock the device immediately with the specified options (can be null). */ + @UnsupportedAppUsage void lockNow(in Bundle options); /** * Device is in safe mode. */ + @UnsupportedAppUsage boolean isSafeModeEnabled(); /** @@ -340,6 +362,7 @@ interface IWindowManager * @return the dock side the current docked stack is at; must be one of the * WindowManagerGlobal.DOCKED_* values */ + @UnsupportedAppUsage int getDockedStackSide(); /** @@ -352,6 +375,7 @@ interface IWindowManager * Registers a listener that will be called when the dock divider changes its visibility or when * the docked stack gets added/removed. */ + @UnsupportedAppUsage void registerDockedStackListener(IDockedStackListener listener); /** @@ -378,6 +402,7 @@ interface IWindowManager /** * Retrieves the current stable insets from the primary display. */ + @UnsupportedAppUsage void getStableInsets(int displayId, out Rect outInsets); /** @@ -400,6 +425,7 @@ interface IWindowManager /** * Create an input consumer by name and display id. */ + @UnsupportedAppUsage void createInputConsumer(IBinder token, String name, int displayId, out InputChannel inputChannel); @@ -407,6 +433,7 @@ interface IWindowManager * Destroy an input consumer by name and display id. * This method will also dispose the input channels associated with that InputConsumer. */ + @UnsupportedAppUsage boolean destroyInputConsumer(String name, int displayId); /** diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index 240aad5a0c56..1fcd4321cdde 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -46,6 +46,7 @@ interface IWindowSession { int addToDisplayWithoutInputChannel(IWindow window, int seq, in WindowManager.LayoutParams attrs, in int viewVisibility, in int layerStackId, out Rect outContentInsets, out Rect outStableInsets, out InsetsState insetsState); + @UnsupportedAppUsage void remove(IWindow window); /** @@ -122,6 +123,7 @@ interface IWindowSession { * completely transparent, allowing it to work with the surface flinger * to optimize compositing of this part of the window. */ + @UnsupportedAppUsage void setTransparentRegion(IWindow window, in Region region); /** @@ -143,11 +145,15 @@ interface IWindowSession { */ void getDisplayFrame(IWindow window, out Rect outDisplayFrame); + @UnsupportedAppUsage void finishDrawing(IWindow window); + @UnsupportedAppUsage void setInTouchMode(boolean showFocus); + @UnsupportedAppUsage boolean getInTouchMode(); + @UnsupportedAppUsage boolean performHapticFeedback(int effectId, boolean always); /** @@ -166,6 +172,7 @@ interface IWindowSession { * @param data Data transferred by drag and drop * @return Token of drag operation which will be passed to cancelDragAndDrop. */ + @UnsupportedAppUsage IBinder performDrag(IWindow window, int flags, in SurfaceControl surface, int touchSource, float touchX, float touchY, float thumbCenterX, float thumbCenterY, in ClipData data); @@ -199,6 +206,7 @@ interface IWindowSession { */ void setWallpaperPosition(IBinder windowToken, float x, float y, float xstep, float ystep); + @UnsupportedAppUsage void wallpaperOffsetsComplete(IBinder window); /** @@ -209,6 +217,7 @@ interface IWindowSession { Bundle sendWallpaperCommand(IBinder window, String action, int x, int y, int z, in Bundle extras, boolean sync); + @UnsupportedAppUsage void wallpaperCommandComplete(IBinder window, in Bundle result); /** diff --git a/core/java/android/view/RenderNodeAnimator.java b/core/java/android/view/RenderNodeAnimator.java index 23f2b8a0a3ca..7ab9534941c7 100644 --- a/core/java/android/view/RenderNodeAnimator.java +++ b/core/java/android/view/RenderNodeAnimator.java @@ -336,6 +336,7 @@ public class RenderNodeAnimator extends Animator { return mUnscaledStartDelay; } + @UnsupportedAppUsage @Override public RenderNodeAnimator setDuration(long duration) { checkMutable(); diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index ea7f31dd8507..3768acaaaad5 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -160,6 +160,7 @@ public final class SurfaceControl implements Parcelable { private static native boolean nativeSetActiveConfig(IBinder displayToken, int id); private static native boolean nativeSetAllowedDisplayConfigs(IBinder displayToken, int[] allowedConfigs); + private static native int[] nativeGetAllowedDisplayConfigs(IBinder displayToken); private static native int[] nativeGetDisplayColorModes(IBinder displayToken); private static native SurfaceControl.DisplayPrimaries nativeGetDisplayNativePrimaries( IBinder displayToken); @@ -1538,6 +1539,16 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ + public static int[] getAllowedDisplayConfigs(IBinder displayToken) { + if (displayToken == null) { + throw new IllegalArgumentException("displayToken must not be null"); + } + return nativeGetAllowedDisplayConfigs(displayToken); + } + + /** + * @hide + */ public static int[] getDisplayColorModes(IBinder displayToken) { if (displayToken == null) { throw new IllegalArgumentException("displayToken must not be null"); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index fe9aa234ba54..ee8d66313ea2 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -210,7 +210,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - mRenderNode.requestPositionUpdates(mPositionListener); + mRenderNode.addPositionUpdateListener(mPositionListener); setWillNotDraw(true); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 7afdc7055e42..cc585b0294c7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -881,12 +881,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static boolean sAlwaysRemeasureExactly = false; /** - * Relax constraints around whether setLayoutParams() must be called after - * modifying the layout params. - */ - private static boolean sLayoutParamsAlwaysChanged = false; - - /** * Allow setForeground/setBackground to be called (and ignored) on a textureview, * without throwing */ @@ -4603,6 +4597,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private ArrayList<OnUnhandledKeyEventListener> mUnhandledKeyListeners; private WindowInsetsAnimationListener mWindowInsetsAnimationListener; + + /** + * This lives here since it's only valid for interactive views. + */ + private List<Rect> mSystemGestureExclusionRects; + + /** + * Used to track {@link #mSystemGestureExclusionRects} + */ + public RenderNode.PositionUpdateListener mPositionUpdateListener; } @UnsupportedAppUsage @@ -5170,11 +5174,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // modes, so we always need to run an additional EXACTLY pass. sAlwaysRemeasureExactly = targetSdkVersion <= Build.VERSION_CODES.M; - // Prior to N, layout params could change without requiring a - // subsequent call to setLayoutParams() and they would usually - // work. Partial layout breaks this assumption. - sLayoutParamsAlwaysChanged = targetSdkVersion <= Build.VERSION_CODES.M; - // Prior to N, TextureView would silently ignore calls to setBackground/setForeground. // On N+, we throw, but that breaks compatibility with apps that use these methods. sTextureViewIgnoresDrawableSetters = targetSdkVersion <= Build.VERSION_CODES.M; @@ -10974,6 +10973,95 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Sets a list of areas within this view's post-layout coordinate space where the system + * should not intercept touch or other pointing device gestures. <em>This method should + * be called by {@link #onLayout(boolean, int, int, int, int)} or {@link #onDraw(Canvas)}.</em> + * + * <p>Use this to tell the system which specific sub-areas of a view need to receive gesture + * input in order to function correctly in the presence of global system gestures that may + * conflict. For example, if the system wishes to capture swipe-in-from-screen-edge gestures + * to provide system-level navigation functionality, a view such as a navigation drawer + * container can mark the left (or starting) edge of itself as requiring gesture capture + * priority using this API. The system may then choose to relax its own gesture recognition + * to allow the app to consume the user's gesture. It is not necessary for an app to register + * exclusion rects for broadly spanning regions such as the entirety of a + * <code>ScrollView</code> or for simple press and release click targets such as + * <code>Button</code>. Mark an exclusion rect when interacting with a view requires + * a precision touch gesture in a small area in either the X or Y dimension, such as + * an edge swipe or dragging a <code>SeekBar</code> thumb.</p> + * + * <p>Do not modify the provided list after this method is called.</p> + * + * @param rects A list of precision gesture regions that this view needs to function correctly + */ + public void setSystemGestureExclusionRects(@NonNull List<Rect> rects) { + if (rects.isEmpty() && mListenerInfo == null) return; + + final ListenerInfo info = getListenerInfo(); + if (rects.isEmpty()) { + info.mSystemGestureExclusionRects = null; + if (info.mPositionUpdateListener != null) { + mRenderNode.removePositionUpdateListener(info.mPositionUpdateListener); + } + } else { + info.mSystemGestureExclusionRects = rects; + if (info.mPositionUpdateListener == null) { + info.mPositionUpdateListener = new RenderNode.PositionUpdateListener() { + @Override + public void positionChanged(long n, int l, int t, int r, int b) { + postUpdateSystemGestureExclusionRects(); + } + + @Override + public void positionLost(long frameNumber) { + postUpdateSystemGestureExclusionRects(); + } + }; + mRenderNode.addPositionUpdateListener(info.mPositionUpdateListener); + } + } + postUpdateSystemGestureExclusionRects(); + } + + /** + * WARNING: this can be called by a hwui worker thread, not just the UI thread! + */ + void postUpdateSystemGestureExclusionRects() { + // Potentially racey from a background thread. It's ok if it's not perfect. + final Handler h = getHandler(); + if (h != null) { + h.postAtFrontOfQueue(this::updateSystemGestureExclusionRects); + } + } + + void updateSystemGestureExclusionRects() { + final AttachInfo ai = mAttachInfo; + if (ai != null) { + ai.mViewRootImpl.updateSystemGestureExclusionRectsForView(this); + } + } + + /** + * Retrieve the list of areas within this view's post-layout coordinate space where the system + * should not intercept touch or other pointing device gestures. + * + * <p>Do not modify the returned list.</p> + * + * @return the list set by {@link #setSystemGestureExclusionRects(List)} + */ + @NonNull + public List<Rect> getSystemGestureExclusionRects() { + final ListenerInfo info = mListenerInfo; + if (info != null) { + final List<Rect> list = info.mSystemGestureExclusionRects; + if (list != null) { + return list; + } + } + return Collections.emptyList(); + } + + /** * Compute the view's coordinate within the surface. * * <p>Computes the coordinates of this view in its surface. The argument @@ -17988,21 +18076,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Utility method to transform a given Rect by the current matrix of this view. - */ - void transformRect(final Rect rect) { - if (!getMatrix().isIdentity()) { - RectF boundingRect = mAttachInfo.mTmpTransformRect; - boundingRect.set(rect); - getMatrix().mapRect(boundingRect); - rect.set((int) Math.floor(boundingRect.left), - (int) Math.floor(boundingRect.top), - (int) Math.ceil(boundingRect.right), - (int) Math.ceil(boundingRect.bottom)); - } - } - - /** * Used to indicate that the parent of this view should clear its caches. This functionality * is used to force the parent to rebuild its display list (when hardware-accelerated), * which is necessary when various parent-managed properties of the view change, such as diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index ad0aaa6edff6..65b1abd715d9 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -605,6 +605,8 @@ public final class ViewRootImpl implements ViewParent, private final InsetsController mInsetsController = new InsetsController(this); + private final GestureExclusionTracker mGestureExclusionTracker = new GestureExclusionTracker(); + static final class SystemUiVisibilityInfo { int seq; int globalVisibility; @@ -3977,6 +3979,20 @@ public final class ViewRootImpl implements ViewParent, return mAttachInfo.mAccessibilityFocusDrawable; } + void updateSystemGestureExclusionRectsForView(View view) { + mGestureExclusionTracker.updateRectsForView(view); + mHandler.sendEmptyMessage(MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED); + } + + void systemGestureExclusionChanged() { + final List<Rect> rectsForWindowManager = mGestureExclusionTracker.computeChangedRects(); + if (rectsForWindowManager != null) { + // TODO Send to WM + mAttachInfo.mTreeObserver + .dispatchOnSystemGestureExclusionRectsChanged(rectsForWindowManager); + } + } + /** * Requests that the root render node is invalidated next time we perform a draw, such that * {@link WindowCallbacks#onPostDraw} gets called. @@ -4433,35 +4449,36 @@ public final class ViewRootImpl implements ViewParent, } } - private final static int MSG_INVALIDATE = 1; - private final static int MSG_INVALIDATE_RECT = 2; - private final static int MSG_DIE = 3; - private final static int MSG_RESIZED = 4; - private final static int MSG_RESIZED_REPORT = 5; - private final static int MSG_WINDOW_FOCUS_CHANGED = 6; - private final static int MSG_DISPATCH_INPUT_EVENT = 7; - private final static int MSG_DISPATCH_APP_VISIBILITY = 8; - private final static int MSG_DISPATCH_GET_NEW_SURFACE = 9; - private final static int MSG_DISPATCH_KEY_FROM_IME = 11; - private final static int MSG_DISPATCH_KEY_FROM_AUTOFILL = 12; - private final static int MSG_CHECK_FOCUS = 13; - private final static int MSG_CLOSE_SYSTEM_DIALOGS = 14; - private final static int MSG_DISPATCH_DRAG_EVENT = 15; - private final static int MSG_DISPATCH_DRAG_LOCATION_EVENT = 16; - private final static int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17; - private final static int MSG_UPDATE_CONFIGURATION = 18; - private final static int MSG_PROCESS_INPUT_EVENTS = 19; - private final static int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 21; - private final static int MSG_INVALIDATE_WORLD = 22; - private final static int MSG_WINDOW_MOVED = 23; - private final static int MSG_SYNTHESIZE_INPUT_EVENT = 24; - private final static int MSG_DISPATCH_WINDOW_SHOWN = 25; - private final static int MSG_REQUEST_KEYBOARD_SHORTCUTS = 26; - private final static int MSG_UPDATE_POINTER_ICON = 27; - private final static int MSG_POINTER_CAPTURE_CHANGED = 28; - private final static int MSG_DRAW_FINISHED = 29; - private final static int MSG_INSETS_CHANGED = 30; - private final static int MSG_INSETS_CONTROL_CHANGED = 31; + private static final int MSG_INVALIDATE = 1; + private static final int MSG_INVALIDATE_RECT = 2; + private static final int MSG_DIE = 3; + private static final int MSG_RESIZED = 4; + private static final int MSG_RESIZED_REPORT = 5; + private static final int MSG_WINDOW_FOCUS_CHANGED = 6; + private static final int MSG_DISPATCH_INPUT_EVENT = 7; + private static final int MSG_DISPATCH_APP_VISIBILITY = 8; + private static final int MSG_DISPATCH_GET_NEW_SURFACE = 9; + private static final int MSG_DISPATCH_KEY_FROM_IME = 11; + private static final int MSG_DISPATCH_KEY_FROM_AUTOFILL = 12; + private static final int MSG_CHECK_FOCUS = 13; + private static final int MSG_CLOSE_SYSTEM_DIALOGS = 14; + private static final int MSG_DISPATCH_DRAG_EVENT = 15; + private static final int MSG_DISPATCH_DRAG_LOCATION_EVENT = 16; + private static final int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17; + private static final int MSG_UPDATE_CONFIGURATION = 18; + private static final int MSG_PROCESS_INPUT_EVENTS = 19; + private static final int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 21; + private static final int MSG_INVALIDATE_WORLD = 22; + private static final int MSG_WINDOW_MOVED = 23; + private static final int MSG_SYNTHESIZE_INPUT_EVENT = 24; + private static final int MSG_DISPATCH_WINDOW_SHOWN = 25; + private static final int MSG_REQUEST_KEYBOARD_SHORTCUTS = 26; + private static final int MSG_UPDATE_POINTER_ICON = 27; + private static final int MSG_POINTER_CAPTURE_CHANGED = 28; + private static final int MSG_DRAW_FINISHED = 29; + private static final int MSG_INSETS_CHANGED = 30; + private static final int MSG_INSETS_CONTROL_CHANGED = 31; + private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32; final class ViewRootHandler extends Handler { @Override @@ -4519,6 +4536,10 @@ public final class ViewRootImpl implements ViewParent, return "MSG_DRAW_FINISHED"; case MSG_INSETS_CHANGED: return "MSG_INSETS_CHANGED"; + case MSG_INSETS_CONTROL_CHANGED: + return "MSG_INSETS_CONTROL_CHANGED"; + case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: + return "MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED"; } return super.getMessageName(message); } @@ -4750,6 +4771,9 @@ public final class ViewRootImpl implements ViewParent, case MSG_DRAW_FINISHED: { pendingDrawFinished(); } break; + case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: { + systemGestureExclusionChanged(); + } break; } } } diff --git a/core/java/android/view/ViewTreeObserver.java b/core/java/android/view/ViewTreeObserver.java index 763ce4f45b01..2896bd049e7c 100644 --- a/core/java/android/view/ViewTreeObserver.java +++ b/core/java/android/view/ViewTreeObserver.java @@ -26,7 +26,9 @@ import android.os.Build; import android.util.Log; import java.util.ArrayList; +import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; /** * A view tree observer is used to register listeners that can be notified of global @@ -57,6 +59,7 @@ public final class ViewTreeObserver { private CopyOnWriteArray<OnScrollChangedListener> mOnScrollChangedListeners; private CopyOnWriteArray<OnPreDrawListener> mOnPreDrawListeners; private CopyOnWriteArray<OnWindowShownListener> mOnWindowShownListeners; + private CopyOnWriteArray<Consumer<List<Rect>>> mGestureExclusionListeners; // These listeners cannot be mutated during dispatch private boolean mInDispatchOnDraw; @@ -450,6 +453,14 @@ public final class ViewTreeObserver { } } + if (observer.mGestureExclusionListeners != null) { + if (mGestureExclusionListeners != null) { + mGestureExclusionListeners.addAll(observer.mGestureExclusionListeners); + } else { + mGestureExclusionListeners = observer.mGestureExclusionListeners; + } + } + observer.kill(); } @@ -913,6 +924,35 @@ public final class ViewTreeObserver { mOnEnterAnimationCompleteListeners.remove(listener); } + /** + * Add a listener to be notified when the tree's <em>transformed</em> gesture exclusion rects + * change. This could be the result of an animation or other layout change, or a view calling + * {@link View#setSystemGestureExclusionRects(List)}. + * + * @param listener listener to add + * @see View#setSystemGestureExclusionRects(List) + */ + public void addOnSystemGestureExclusionRectsChangedListener(Consumer<List<Rect>> listener) { + checkIsAlive(); + if (mGestureExclusionListeners == null) { + mGestureExclusionListeners = new CopyOnWriteArray<>(); + } + mGestureExclusionListeners.add(listener); + } + + /** + * Unsubscribe the given listener from gesture exclusion rect changes. + * @see #addOnSystemGestureExclusionRectsChangedListener(Consumer) + * @see View#setSystemGestureExclusionRects(List) + */ + public void removeOnSystemGestureExclusionRectsChangedListener(Consumer<List<Rect>> listener) { + checkIsAlive(); + if (mGestureExclusionListeners == null) { + return; + } + mGestureExclusionListeners.remove(listener); + } + private void checkIsAlive() { if (!mAlive) { throw new IllegalStateException("This ViewTreeObserver is not alive, call " @@ -1178,6 +1218,21 @@ public final class ViewTreeObserver { } } + void dispatchOnSystemGestureExclusionRectsChanged(@NonNull List<Rect> rects) { + final CopyOnWriteArray<Consumer<List<Rect>>> listeners = mGestureExclusionListeners; + if (listeners != null && listeners.size() > 0) { + CopyOnWriteArray.Access<Consumer<List<Rect>>> access = listeners.start(); + try { + final int count = access.size(); + for (int i = 0; i < count; i++) { + access.get(i).accept(rects); + } + } finally { + listeners.end(); + } + } + } + /** * Copy on write array. This array is not thread safe, and only one loop can * iterate over this array at any given time. This class avoids allocations diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java index 87e18b71069c..5d59e4205579 100644 --- a/core/java/android/view/accessibility/AccessibilityCache.java +++ b/core/java/android/view/accessibility/AccessibilityCache.java @@ -424,20 +424,28 @@ public class AccessibilityCache { * * @param nodes The nodes in the hosting window. * @param rootNodeId The id of the root to evict. + * + * @return {@code true} if the cache was cleared */ - private void clearSubTreeRecursiveLocked(LongSparseArray<AccessibilityNodeInfo> nodes, + private boolean clearSubTreeRecursiveLocked(LongSparseArray<AccessibilityNodeInfo> nodes, long rootNodeId) { AccessibilityNodeInfo current = nodes.get(rootNodeId); if (current == null) { - return; + // The node isn't in the cache, but its descendents might be. + clear(); + return true; } nodes.remove(rootNodeId); final int childCount = current.getChildCount(); for (int i = 0; i < childCount; i++) { final long childNodeId = current.getChildId(i); - clearSubTreeRecursiveLocked(nodes, childNodeId); + if (clearSubTreeRecursiveLocked(nodes, childNodeId)) { + current.recycle(); + return true; + } } current.recycle(); + return false; } /** diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java index e0950948afb8..3b60aee8f604 100644 --- a/core/java/android/view/animation/Animation.java +++ b/core/java/android/view/animation/Animation.java @@ -207,6 +207,7 @@ public abstract class Animation implements Cloneable { private float mScaleFactor = 1f; private boolean mShowWallpaper; + private boolean mHasRoundedCorners; private boolean mMore = true; private boolean mOneMoreTime = true; @@ -263,6 +264,8 @@ public abstract class Animation implements Cloneable { a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false)); setShowWallpaper( a.getBoolean(com.android.internal.R.styleable.Animation_showWallpaper, false)); + setHasRoundedCorners( + a.getBoolean(com.android.internal.R.styleable.Animation_hasRoundedCorners, false)); final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0); @@ -678,6 +681,19 @@ public abstract class Animation implements Cloneable { } /** + * If this is a window animation, the window will have rounded corners matching the display + * corner radius. + * + * @param hasRoundedCorners Whether the window should have rounded corners or not. + * @attr ref android.R.styleable#Animation_hasRoundedCorners + * @see com.android.internal.policy.ScreenDecorationsUtils#getWindowCornerRadius(Resources) + * @hide + */ + public void setHasRoundedCorners(boolean hasRoundedCorners) { + mHasRoundedCorners = hasRoundedCorners; + } + + /** * Gets the acceleration curve type for this animation. * * @return the {@link Interpolator} associated to this animation @@ -804,6 +820,16 @@ public abstract class Animation implements Cloneable { } /** + * @return if a window animation should have rounded corners or not. + * + * @attr ref android.R.styleable#Animation_hasRoundedCorners + * @hide + */ + public boolean hasRoundedCorners() { + return mHasRoundedCorners; + } + + /** * <p>Indicates whether or not this animation will affect the transformation * matrix. For instance, a fade animation will not affect the matrix whereas * a scale animation will.</p> diff --git a/core/java/android/view/contentcapture/ContentCaptureContext.java b/core/java/android/view/contentcapture/ContentCaptureContext.java index 8bb4d210ad44..f2d958faa160 100644 --- a/core/java/android/view/contentcapture/ContentCaptureContext.java +++ b/core/java/android/view/contentcapture/ContentCaptureContext.java @@ -214,6 +214,7 @@ public final class ContentCaptureContext implements Parcelable { /** * Helper that creates a {@link ContentCaptureContext} associated with the given {@code uri}. */ + @NonNull public static ContentCaptureContext forLocusId(@NonNull Uri uri) { return new Builder(new LocusId(uri)).build(); } @@ -269,6 +270,7 @@ public final class ContentCaptureContext implements Parcelable { * * @return the built {@code ContentCaptureContext} */ + @NonNull public ContentCaptureContext build() { throwIfDestroyed(); mDestroyed = true; @@ -355,6 +357,7 @@ public final class ContentCaptureContext implements Parcelable { new Parcelable.Creator<ContentCaptureContext>() { @Override + @NonNull public ContentCaptureContext createFromParcel(Parcel parcel) { final boolean hasClientContext = parcel.readInt() == 1; @@ -383,6 +386,7 @@ public final class ContentCaptureContext implements Parcelable { } @Override + @NonNull public ContentCaptureContext[] newArray(int size) { return new ContentCaptureContext[size]; } diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java index 2585b746583d..46c3414a521c 100644 --- a/core/java/android/view/contentcapture/ContentCaptureEvent.java +++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java @@ -387,6 +387,7 @@ public final class ContentCaptureEvent implements Parcelable { new Parcelable.Creator<ContentCaptureEvent>() { @Override + @NonNull public ContentCaptureEvent createFromParcel(Parcel parcel) { final String sessionId = parcel.readString(); final int type = parcel.readInt(); @@ -415,6 +416,7 @@ public final class ContentCaptureEvent implements Parcelable { } @Override + @NonNull public ContentCaptureEvent[] newArray(int size) { return new ContentCaptureEvent[size]; } diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java index ab8f346bdd2e..6bf1eba30f55 100644 --- a/core/java/android/view/contentcapture/ContentCaptureSession.java +++ b/core/java/android/view/contentcapture/ContentCaptureSession.java @@ -208,6 +208,7 @@ public abstract class ContentCaptureSession implements AutoCloseable { /** * Gets the id used to identify this session. */ + @NonNull public final ContentCaptureSessionId getContentCaptureSessionId() { if (mContentCaptureSessionId == null) { mContentCaptureSessionId = new ContentCaptureSessionId(mId); diff --git a/core/java/android/view/contentcapture/ContentCaptureSessionId.java b/core/java/android/view/contentcapture/ContentCaptureSessionId.java index d7f9fcc4f7af..9b1f172e0507 100644 --- a/core/java/android/view/contentcapture/ContentCaptureSessionId.java +++ b/core/java/android/view/contentcapture/ContentCaptureSessionId.java @@ -100,11 +100,13 @@ public final class ContentCaptureSessionId implements Parcelable { new Parcelable.Creator<ContentCaptureSessionId>() { @Override + @NonNull public ContentCaptureSessionId createFromParcel(Parcel parcel) { return new ContentCaptureSessionId(parcel.readString()); } @Override + @NonNull public ContentCaptureSessionId[] newArray(int size) { return new ContentCaptureSessionId[size]; } diff --git a/core/java/android/view/contentcapture/UserDataRemovalRequest.java b/core/java/android/view/contentcapture/UserDataRemovalRequest.java index 7d66af92e9f6..170a3a986358 100644 --- a/core/java/android/view/contentcapture/UserDataRemovalRequest.java +++ b/core/java/android/view/contentcapture/UserDataRemovalRequest.java @@ -121,6 +121,7 @@ public final class UserDataRemovalRequest implements Parcelable { * * @return this builder */ + @NonNull public Builder addLocusId(@NonNull LocusId locusId, boolean recursive) { throwIfDestroyed(); Preconditions.checkState(!mForEverything, "Already is for everything"); @@ -178,11 +179,13 @@ public final class UserDataRemovalRequest implements Parcelable { new Parcelable.Creator<UserDataRemovalRequest>() { @Override + @NonNull public UserDataRemovalRequest createFromParcel(Parcel parcel) { return new UserDataRemovalRequest(parcel); } @Override + @NonNull public UserDataRemovalRequest[] newArray(int size) { return new UserDataRemovalRequest[size]; } diff --git a/core/java/android/webkit/IWebViewUpdateService.aidl b/core/java/android/webkit/IWebViewUpdateService.aidl index dbca7ff72c7b..10cfea166abd 100644 --- a/core/java/android/webkit/IWebViewUpdateService.aidl +++ b/core/java/android/webkit/IWebViewUpdateService.aidl @@ -51,6 +51,7 @@ interface IWebViewUpdateService { * DevelopmentSettings uses this to get the current available WebView * providers (to display as choices to the user). */ + @UnsupportedAppUsage WebViewProviderInfo[] getValidWebViewPackages(); /** @@ -61,6 +62,7 @@ interface IWebViewUpdateService { /** * Used by DevelopmentSetting to get the name of the WebView provider currently in use. */ + @UnsupportedAppUsage String getCurrentWebViewPackageName(); /** @@ -72,6 +74,7 @@ interface IWebViewUpdateService { * Used by Settings to determine whether a certain package can be enabled/disabled by the user - * the package should not be modifiable in this way if it is a fallback package. */ + @UnsupportedAppUsage boolean isFallbackPackage(String packageName); /** diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java index baf582693bd8..4c8f72aa77eb 100644 --- a/core/java/android/webkit/WebViewProvider.java +++ b/core/java/android/webkit/WebViewProvider.java @@ -351,7 +351,7 @@ public interface WebViewProvider { } default void onProvideContentCaptureStructure( - @SuppressWarnings("unused") android.view.ViewStructure structure, + @NonNull @SuppressWarnings("unused") android.view.ViewStructure structure, @SuppressWarnings("unused") int flags) { } diff --git a/core/java/android/widget/ZoomControls.java b/core/java/android/widget/ZoomControls.java index dd6a27b8f1e4..7a5b7e8058f3 100644 --- a/core/java/android/widget/ZoomControls.java +++ b/core/java/android/widget/ZoomControls.java @@ -30,7 +30,11 @@ import com.android.internal.R; /** * The {@code ZoomControls} class displays a simple set of controls used for zooming and - * provides callbacks to register for events. */ + * provides callbacks to register for events. + * @deprecated This functionality and UI is better handled with custom views and layouts + * rather than a dedicated zoom-control widget + */ +@Deprecated @Widget public class ZoomControls extends LinearLayout { diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index 8a90cade35a2..c096961c57b8 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -32,6 +32,7 @@ interface IAppOpsService { int noteOperation(int code, int uid, String packageName); int startOperation(IBinder token, int code, int uid, String packageName, boolean startIfModeDefault); + @UnsupportedAppUsage void finishOperation(IBinder token, int code, int uid, String packageName); void startWatchingMode(int op, String packageName, IAppOpsCallback callback); void stopWatchingMode(IAppOpsCallback callback); @@ -42,7 +43,9 @@ interface IAppOpsService { // Remaining methods are only used in Java. int checkPackage(int uid, String packageName); + @UnsupportedAppUsage List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops); + @UnsupportedAppUsage List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops); void getHistoricalOps(int uid, String packageName, in List<String> ops, long beginTimeMillis, long endTimeMillis, in RemoteCallback callback); @@ -55,7 +58,9 @@ interface IAppOpsService { void clearHistory(); List<AppOpsManager.PackageOps> getUidOps(int uid, in int[] ops); void setUidMode(int code, int uid, int mode); + @UnsupportedAppUsage void setMode(int code, int uid, String packageName, int mode); + @UnsupportedAppUsage void resetAllModes(int reqUserId, String reqPackageName); int checkAudioOperation(int code, int usage, int uid, String packageName); void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages); diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index d7514d1fe26c..114d31f207bd 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -49,11 +49,13 @@ interface IBatteryStats { void noteResetFlashlight(); // Remaining methods are only used in Java. + @UnsupportedAppUsage byte[] getStatistics(); ParcelFileDescriptor getStatisticsStream(); // Return true if we see the battery as currently charging. + @UnsupportedAppUsage boolean isCharging(); // Return the computed amount of time remaining on battery, in milliseconds. @@ -62,6 +64,7 @@ interface IBatteryStats { // Return the computed amount of time remaining to fully charge, in milliseconds. // Returns -1 if nothing could be computed. + @UnsupportedAppUsage long computeChargeTimeRemaining(); void noteEvent(int code, String name, int uid); @@ -131,6 +134,7 @@ interface IBatteryStats { void noteDeviceIdleMode(int mode, String activeReason, int activeUid); void setBatteryState(int status, int health, int plugType, int level, int temp, int volt, int chargeUAh, int chargeFullUAh); + @UnsupportedAppUsage long getAwakeTimeBattery(); long getAwakeTimePlugged(); diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl index 9ce7ed1562ce..420749e558e0 100644 --- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl +++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl @@ -51,6 +51,7 @@ interface IVoiceInteractionManagerService { * @param keyphraseId The unique identifier for the keyphrase. * @param bcp47Locale The BCP47 language tag for the keyphrase's locale. */ + @UnsupportedAppUsage SoundTrigger.KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId, in String bcp47Locale); /** * Add/Update the given keyphrase sound model. diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl index f9bf3736422b..6d1d1abd1ec4 100644 --- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl +++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl @@ -42,6 +42,7 @@ interface IAppWidgetService { void deleteAppWidgetId(String callingPackage, int appWidgetId); void deleteHost(String packageName, int hostId); void deleteAllHosts(); + @UnsupportedAppUsage RemoteViews getAppWidgetViews(String callingPackage, int appWidgetId); int[] getAppWidgetIdsForHost(String callingPackage, int hostId); IntentSender createAppWidgetConfigIntentSender(String callingPackage, int appWidgetId, @@ -63,11 +64,14 @@ interface IAppWidgetService { AppWidgetProviderInfo getAppWidgetInfo(String callingPackage, int appWidgetId); boolean hasBindAppWidgetPermission(in String packageName, int userId); void setBindAppWidgetPermission(in String packageName, int userId, in boolean permission); + @UnsupportedAppUsage boolean bindAppWidgetId(in String callingPackage, int appWidgetId, int providerProfileId, in ComponentName providerComponent, in Bundle options); + @UnsupportedAppUsage boolean bindRemoteViewsService(String callingPackage, int appWidgetId, in Intent intent, IApplicationThread caller, IBinder token, IServiceConnection connection, int flags); + @UnsupportedAppUsage int[] getAppWidgetIds(in ComponentName providerComponent); boolean isBoundWidgetPackage(String packageName, int userId); boolean requestPinAppWidget(String packageName, in ComponentName providerComponent, diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 74c6651003e5..f3bf9130b163 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -81,5 +81,13 @@ public final class SystemUiDeviceConfigFlags { */ public static final String SSIN_MAX_NUM_ACTIONS = "ssin_max_num_actions"; + // Flags related to media notifications + + /** + * (boolean) If {@code true}, enables the seekbar in compact media notifications. + */ + public static final String COMPACT_MEDIA_SEEKBAR_ENABLED = + "compact_media_notification_seekbar_enabled"; + private SystemUiDeviceConfigFlags() { } } diff --git a/core/java/com/android/internal/os/IDropBoxManagerService.aidl b/core/java/com/android/internal/os/IDropBoxManagerService.aidl index 70844ee4ef11..5e60394e5675 100644 --- a/core/java/com/android/internal/os/IDropBoxManagerService.aidl +++ b/core/java/com/android/internal/os/IDropBoxManagerService.aidl @@ -37,5 +37,6 @@ interface IDropBoxManagerService { boolean isTagEnabled(String tag); /** @see DropBoxManager#getNextEntry */ + @UnsupportedAppUsage DropBoxManager.Entry getNextEntry(String tag, long millis, String packageName); } diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index e5d5685ab3e8..54f31f9199cb 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -88,8 +88,10 @@ oneway interface IKeyguardService { */ void onScreenTurnedOff(); + @UnsupportedAppUsage void setKeyguardEnabled(boolean enabled); void onSystemReady(); + @UnsupportedAppUsage void doKeyguardTimeout(in Bundle options); void setSwitchingUser(boolean switching); void setCurrentUser(int userId); diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index bfb50848df26..343761430762 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -31,16 +31,21 @@ import com.android.internal.statusbar.NotificationVisibility; /** @hide */ interface IStatusBarService { + @UnsupportedAppUsage void expandNotificationsPanel(); + @UnsupportedAppUsage void collapsePanels(); void togglePanel(); + @UnsupportedAppUsage void disable(int what, IBinder token, String pkg); void disableForUser(int what, IBinder token, String pkg, int userId); void disable2(int what, IBinder token, String pkg); void disable2ForUser(int what, IBinder token, String pkg, int userId); int[] getDisableFlags(IBinder token, int userId); void setIcon(String slot, String iconPackage, int iconId, int iconLevel, String contentDescription); + @UnsupportedAppUsage void setIconVisibility(String slot, boolean visible); + @UnsupportedAppUsage void removeIcon(String slot); // TODO(b/117478341): support back button change when IME is showing on a external display. void setImeWindowStatus(in IBinder token, int vis, int backDisposition, @@ -87,6 +92,7 @@ interface IStatusBarService void addTile(in ComponentName tile); void remTile(in ComponentName tile); void clickTile(in ComponentName tile); + @UnsupportedAppUsage void handleSystemKey(in int key); /** diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl index 1c5816c1578e..3be7c3e35895 100644 --- a/core/java/com/android/internal/widget/ILockSettings.aidl +++ b/core/java/com/android/internal/widget/ILockSettings.aidl @@ -30,11 +30,17 @@ import java.util.Map; /** {@hide} */ interface ILockSettings { + @UnsupportedAppUsage void setBoolean(in String key, in boolean value, in int userId); + @UnsupportedAppUsage void setLong(in String key, in long value, in int userId); + @UnsupportedAppUsage void setString(in String key, in String value, in int userId); + @UnsupportedAppUsage boolean getBoolean(in String key, in boolean defaultValue, in int userId); + @UnsupportedAppUsage long getLong(in String key, in long defaultValue, in int userId); + @UnsupportedAppUsage String getString(in String key, in String defaultValue, in int userId); void setLockCredential(in byte[] credential, int type, in byte[] savedCredential, int requestedQuality, int userId); void resetKeyStore(int userId); @@ -43,7 +49,9 @@ interface ILockSettings { VerifyCredentialResponse verifyCredential(in byte[] credential, int type, long challenge, int userId); VerifyCredentialResponse verifyTiedProfileChallenge(in byte[] credential, int type, long challenge, int userId); boolean checkVoldPassword(int userId); + @UnsupportedAppUsage boolean havePattern(int userId); + @UnsupportedAppUsage boolean havePassword(int userId); byte[] getHashFactor(in byte[] currentCredential, int userId); void setSeparateProfileChallengeEnabled(int userId, boolean enabled, in byte[] managedUserPassword); diff --git a/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl b/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl index 7317ecf68fe9..d6efca5d36eb 100644 --- a/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl +++ b/core/java/com/android/internal/widget/IRemoteViewsFactory.aidl @@ -21,15 +21,23 @@ import android.widget.RemoteViews; /** {@hide} */ interface IRemoteViewsFactory { + @UnsupportedAppUsage void onDataSetChanged(); oneway void onDataSetChangedAsync(); oneway void onDestroy(in Intent intent); + @UnsupportedAppUsage int getCount(); + @UnsupportedAppUsage RemoteViews getViewAt(int position); + @UnsupportedAppUsage RemoteViews getLoadingView(); + @UnsupportedAppUsage int getViewTypeCount(); + @UnsupportedAppUsage long getItemId(int position); + @UnsupportedAppUsage boolean hasStableIds(); + @UnsupportedAppUsage boolean isCreated(); } diff --git a/core/jni/Android.bp b/core/jni/Android.bp index c309f276d3ed..cd34d2e1b441 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -165,6 +165,8 @@ cc_library_shared { "android_media_AudioTrack.cpp", "android_media_AudioAttributes.cpp", "android_media_AudioProductStrategies.cpp", + "android_media_AudioVolumeGroups.cpp", + "android_media_AudioVolumeGroupCallback.cpp", "android_media_DeviceCallback.cpp", "android_media_JetPlayer.cpp", "android_media_MediaMetricsJNI.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 16517bf87afe..da27852a3a35 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -110,6 +110,8 @@ extern int register_android_media_AudioSystem(JNIEnv *env); extern int register_android_media_AudioTrack(JNIEnv *env); extern int register_android_media_AudioAttributes(JNIEnv *env); extern int register_android_media_AudioProductStrategies(JNIEnv *env); +extern int register_android_media_AudioVolumeGroups(JNIEnv *env); +extern int register_android_media_AudioVolumeGroupChangeHandler(JNIEnv *env); extern int register_android_media_MicrophoneInfo(JNIEnv *env); extern int register_android_media_JetPlayer(JNIEnv *env); extern int register_android_media_ToneGenerator(JNIEnv *env); @@ -1524,6 +1526,8 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_media_AudioTrack), REG_JNI(register_android_media_AudioAttributes), REG_JNI(register_android_media_AudioProductStrategies), + REG_JNI(register_android_media_AudioVolumeGroups), + REG_JNI(register_android_media_AudioVolumeGroupChangeHandler), REG_JNI(register_android_media_JetPlayer), REG_JNI(register_android_media_MicrophoneInfo), REG_JNI(register_android_media_RemoteDisplay), diff --git a/core/jni/android_media_AudioProductStrategies.cpp b/core/jni/android_media_AudioProductStrategies.cpp index d7d31e59ad30..822b74a6b990 100644 --- a/core/jni/android_media_AudioProductStrategies.cpp +++ b/core/jni/android_media_AudioProductStrategies.cpp @@ -57,7 +57,7 @@ static struct { static jclass gAudioAttributesGroupClass; static jmethodID gAudioAttributesGroupCstor; static struct { - jfieldID mGroupId; + jfieldID mVolumeGroupId; jfieldID mLegacyStreamType; jfieldID mAudioAttributes; } gAudioAttributesGroupsFields; @@ -207,7 +207,7 @@ android_media_AudioSystem_getProductStrategyFromAudioAttributes(JNIEnv *env, job } product_strategy_t psId; status_t status = AudioSystem::getProductStrategyFromAudioAttributes( - AudioAttributes(*attributes.get()), psId); + AudioAttributes(*attributes.get()), psId); if (status != NO_ERROR) { return nativeToJavaStatus(status); } @@ -249,8 +249,8 @@ int register_android_media_AudioProductStrategies(JNIEnv *env) gAudioAttributesGroupClass = MakeGlobalRefOrDie(env, audioAttributesGroupClass); gAudioAttributesGroupCstor = GetMethodIDOrDie(env, audioAttributesGroupClass, "<init>", "(II[Landroid/media/AudioAttributes;)V"); - gAudioAttributesGroupsFields.mGroupId = GetFieldIDOrDie( - env, audioAttributesGroupClass, "mGroupId", "I"); + gAudioAttributesGroupsFields.mVolumeGroupId = GetFieldIDOrDie( + env, audioAttributesGroupClass, "mVolumeGroupId", "I"); gAudioAttributesGroupsFields.mLegacyStreamType = GetFieldIDOrDie( env, audioAttributesGroupClass, "mLegacyStreamType", "I"); gAudioAttributesGroupsFields.mAudioAttributes = GetFieldIDOrDie( diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index bd998999ce63..1a90ebfee999 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -573,6 +573,81 @@ android_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env, } static jint +android_media_AudioSystem_setVolumeIndexForAttributes(JNIEnv *env, + jobject thiz, + jobject jaa, + jint index, + jint device) +{ + // read the AudioAttributes values + JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); + jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); + if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + return jStatus; + } + return (jint) check_AudioSystem_Command( + AudioSystem::setVolumeIndexForAttributes(*(paa.get()), index, (audio_devices_t)device)); +} + +static jint +android_media_AudioSystem_getVolumeIndexForAttributes(JNIEnv *env, + jobject thiz, + jobject jaa, + jint device) +{ + // read the AudioAttributes values + JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); + jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); + if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + return jStatus; + } + int index; + if (AudioSystem::getVolumeIndexForAttributes(*(paa.get()), index, (audio_devices_t)device) + != NO_ERROR) { + index = -1; + } + return (jint) index; +} + +static jint +android_media_AudioSystem_getMinVolumeIndexForAttributes(JNIEnv *env, + jobject thiz, + jobject jaa) +{ + // read the AudioAttributes values + JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); + jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); + if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + return jStatus; + } + int index; + if (AudioSystem::getMinVolumeIndexForAttributes(*(paa.get()), index) + != NO_ERROR) { + index = -1; + } + return (jint) index; +} + +static jint +android_media_AudioSystem_getMaxVolumeIndexForAttributes(JNIEnv *env, + jobject thiz, + jobject jaa) +{ + // read the AudioAttributes values + JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); + jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); + if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + return jStatus; + } + int index; + if (AudioSystem::getMaxVolumeIndexForAttributes(*(paa.get()), index) + != NO_ERROR) { + index = -1; + } + return (jint) index; +} + +static jint android_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jfloat value) { return (jint) check_AudioSystem_Command(AudioSystem::setMasterVolume(value)); @@ -2172,6 +2247,10 @@ static const JNINativeMethod gMethods[] = { {"initStreamVolume", "(III)I", (void *)android_media_AudioSystem_initStreamVolume}, {"setStreamVolumeIndex","(III)I", (void *)android_media_AudioSystem_setStreamVolumeIndex}, {"getStreamVolumeIndex","(II)I", (void *)android_media_AudioSystem_getStreamVolumeIndex}, + {"setVolumeIndexForAttributes","(Landroid/media/AudioAttributes;II)I", (void *)android_media_AudioSystem_setVolumeIndexForAttributes}, + {"getVolumeIndexForAttributes","(Landroid/media/AudioAttributes;I)I", (void *)android_media_AudioSystem_getVolumeIndexForAttributes}, + {"getMinVolumeIndexForAttributes","(Landroid/media/AudioAttributes;)I", (void *)android_media_AudioSystem_getMinVolumeIndexForAttributes}, + {"getMaxVolumeIndexForAttributes","(Landroid/media/AudioAttributes;)I", (void *)android_media_AudioSystem_getMaxVolumeIndexForAttributes}, {"setMasterVolume", "(F)I", (void *)android_media_AudioSystem_setMasterVolume}, {"getMasterVolume", "()F", (void *)android_media_AudioSystem_getMasterVolume}, {"setMasterMute", "(Z)I", (void *)android_media_AudioSystem_setMasterMute}, diff --git a/core/jni/android_media_AudioVolumeGroupCallback.cpp b/core/jni/android_media_AudioVolumeGroupCallback.cpp new file mode 100644 index 000000000000..cb4ddbd119d5 --- /dev/null +++ b/core/jni/android_media_AudioVolumeGroupCallback.cpp @@ -0,0 +1,175 @@ +/* + * 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. + */ + +//#define LOG_NDEBUG 0 + +#define LOG_TAG "AudioVolumeGroupCallback-JNI" + +#include <utils/Log.h> +#include <nativehelper/JNIHelp.h> +#include "core_jni_helpers.h" + +#include "android_media_AudioVolumeGroupCallback.h" + + +// ---------------------------------------------------------------------------- +using namespace android; + +static const char* const kAudioVolumeGroupChangeHandlerClassPathName = + "android/media/audiopolicy/AudioVolumeGroupChangeHandler"; + +static struct { + jfieldID mJniCallback; +} gAudioVolumeGroupChangeHandlerFields; + +static struct { + jmethodID postEventFromNative; +} gAudioVolumeGroupChangeHandlerMethods; + +static Mutex gLock; + +JNIAudioVolumeGroupCallback::JNIAudioVolumeGroupCallback(JNIEnv* env, + jobject thiz, + jobject weak_thiz) +{ + jclass clazz = env->GetObjectClass(thiz); + if (clazz == NULL) { + ALOGE("Can't find class %s", kAudioVolumeGroupChangeHandlerClassPathName); + return; + } + mClass = (jclass)env->NewGlobalRef(clazz); + + // We use a weak reference so the AudioVolumeGroupChangeHandler object can be garbage collected. + // The reference is only used as a proxy for callbacks. + mObject = env->NewGlobalRef(weak_thiz); +} + +JNIAudioVolumeGroupCallback::~JNIAudioVolumeGroupCallback() +{ + // remove global references + JNIEnv *env = AndroidRuntime::getJNIEnv(); + if (env == NULL) { + return; + } + env->DeleteGlobalRef(mObject); + env->DeleteGlobalRef(mClass); +} + +void JNIAudioVolumeGroupCallback::onAudioVolumeGroupChanged(volume_group_t group, int flags) +{ + JNIEnv *env = AndroidRuntime::getJNIEnv(); + if (env == NULL) { + return; + } + ALOGV("%s volume group id %d", __FUNCTION__, group); + env->CallStaticVoidMethod(mClass, + gAudioVolumeGroupChangeHandlerMethods.postEventFromNative, + mObject, + AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED, group, flags, NULL); + if (env->ExceptionCheck()) { + ALOGW("An exception occurred while notifying an event."); + env->ExceptionClear(); + } +} + +void JNIAudioVolumeGroupCallback::onServiceDied() +{ + JNIEnv *env = AndroidRuntime::getJNIEnv(); + if (env == NULL) { + return; + } + env->CallStaticVoidMethod(mClass, + gAudioVolumeGroupChangeHandlerMethods.postEventFromNative, + mObject, + AUDIOVOLUMEGROUP_EVENT_SERVICE_DIED, 0, 0, NULL); + if (env->ExceptionCheck()) { + ALOGW("An exception occurred while notifying an event."); + env->ExceptionClear(); + } +} + +static +sp<JNIAudioVolumeGroupCallback> setJniCallback(JNIEnv* env, + jobject thiz, + const sp<JNIAudioVolumeGroupCallback>& callback) +{ + Mutex::Autolock l(gLock); + sp<JNIAudioVolumeGroupCallback> old = (JNIAudioVolumeGroupCallback*)env->GetLongField( + thiz, gAudioVolumeGroupChangeHandlerFields.mJniCallback); + if (callback.get()) { + callback->incStrong((void*)setJniCallback); + } + if (old != 0) { + old->decStrong((void*)setJniCallback); + } + env->SetLongField(thiz, gAudioVolumeGroupChangeHandlerFields.mJniCallback, + (jlong)callback.get()); + return old; +} + +static void +android_media_AudioVolumeGroupChangeHandler_eventHandlerSetup(JNIEnv *env, + jobject thiz, + jobject weak_this) +{ + ALOGV("%s", __FUNCTION__); + sp<JNIAudioVolumeGroupCallback> callback = + new JNIAudioVolumeGroupCallback(env, thiz, weak_this); + + if (AudioSystem::addAudioVolumeGroupCallback(callback) == NO_ERROR) { + setJniCallback(env, thiz, callback); + } +} + +static void +android_media_AudioVolumeGroupChangeHandler_eventHandlerFinalize(JNIEnv *env, jobject thiz) +{ + ALOGV("%s", __FUNCTION__); + sp<JNIAudioVolumeGroupCallback> callback = setJniCallback(env, thiz, 0); + if (callback != 0) { + AudioSystem::removeAudioVolumeGroupCallback(callback); + } +} + +/* + * JNI registration. + */ +static const JNINativeMethod gMethods[] = { + {"native_setup", "(Ljava/lang/Object;)V", + (void *)android_media_AudioVolumeGroupChangeHandler_eventHandlerSetup}, + {"native_finalize", "()V", + (void *)android_media_AudioVolumeGroupChangeHandler_eventHandlerFinalize}, +}; + +int register_android_media_AudioVolumeGroupChangeHandler(JNIEnv *env) +{ + jclass audioVolumeGroupChangeHandlerClass = + FindClassOrDie(env, kAudioVolumeGroupChangeHandlerClassPathName); + gAudioVolumeGroupChangeHandlerMethods.postEventFromNative = + GetStaticMethodIDOrDie(env, audioVolumeGroupChangeHandlerClass, "postEventFromNative", + "(Ljava/lang/Object;IIILjava/lang/Object;)V"); + + gAudioVolumeGroupChangeHandlerFields.mJniCallback = + GetFieldIDOrDie(env, audioVolumeGroupChangeHandlerClass, "mJniCallback", "J"); + + env->DeleteLocalRef(audioVolumeGroupChangeHandlerClass); + + return RegisterMethodsOrDie(env, + kAudioVolumeGroupChangeHandlerClassPathName, + gMethods, + NELEM(gMethods)); +} + diff --git a/core/jni/android_media_AudioVolumeGroupCallback.h b/core/jni/android_media_AudioVolumeGroupCallback.h new file mode 100644 index 000000000000..de06549621b9 --- /dev/null +++ b/core/jni/android_media_AudioVolumeGroupCallback.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#pragma once + +#include <system/audio.h> +#include <media/AudioSystem.h> + +namespace android { + +// keep in sync with AudioManager.AudioVolumeGroupChangeHandler.java +#define AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED 1000 +#define AUDIOVOLUMEGROUP_EVENT_SERVICE_DIED 1001 + +class JNIAudioVolumeGroupCallback: public AudioSystem::AudioVolumeGroupCallback +{ +public: + JNIAudioVolumeGroupCallback(JNIEnv* env, jobject thiz, jobject weak_thiz); + ~JNIAudioVolumeGroupCallback(); + + void onAudioVolumeGroupChanged(volume_group_t group, int flags) override; + void onServiceDied() override; + +private: + void sendEvent(int event); + + jclass mClass; /**< Reference to AudioVolumeGroupChangeHandler class. */ + jobject mObject; /**< Weak ref to AudioVolumeGroupChangeHandler object to call on. */ +}; + +} // namespace android diff --git a/core/jni/android_media_AudioVolumeGroups.cpp b/core/jni/android_media_AudioVolumeGroups.cpp new file mode 100644 index 000000000000..64f0c1e33e1c --- /dev/null +++ b/core/jni/android_media_AudioVolumeGroups.cpp @@ -0,0 +1,183 @@ +/* + * 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. + */ + +//#define LOG_NDEBUG 0 + +#define LOG_TAG "AudioVolumeGroups-JNI" + +#include <inttypes.h> +#include <jni.h> +#include <nativehelper/JNIHelp.h> +#include "core_jni_helpers.h" + +#include <utils/Log.h> +#include <vector> + +#include <media/AudioSystem.h> +#include <media/AudioPolicy.h> + +#include <nativehelper/ScopedUtfChars.h> + +#include "android_media_AudioAttributes.h" +#include "android_media_AudioErrors.h" + +// ---------------------------------------------------------------------------- + +using namespace android; + +// ---------------------------------------------------------------------------- +static const char* const kClassPathName = "android/media/audiopolicy/AudioVolumeGroups"; +static const char* const kAudioVolumeGroupClassPathName = + "android/media/audiopolicy/AudioVolumeGroup"; + +static jclass gAudioVolumeGroupClass; +static jmethodID gAudioVolumeGroupCstor; +static struct { + jfieldID mName; + jfieldID mId; +} gAudioVolumeGroupFields; + +static jclass gArrayListClass; +static jmethodID gArrayListCstor; +static struct { + jmethodID add; + jmethodID toArray; +} gArrayListMethods; + + +static jint convertAudioVolumeGroupsFromNative( + JNIEnv *env, jobject *jGroup, const AudioVolumeGroup &group) +{ + jint jStatus = (jint)AUDIO_JAVA_SUCCESS; + jstring jName = NULL; + jint Id = NULL; + + jintArray jLegacyStreamTypes = NULL; + jobjectArray jAudioAttributes = NULL; + jint numAttributes; + jobject jAudioAttribute = NULL; + + jName = env->NewStringUTF(group.getName().c_str()); + Id = static_cast<jint>(group.getId()); + + // Legacy stream types array + jLegacyStreamTypes = env->NewIntArray(group.getStreamTypes().size()); + if (jLegacyStreamTypes == NULL) { + jStatus = (jint)AUDIO_JAVA_ERROR; + goto exit; + } + for (size_t streamIndex = 0; streamIndex < group.getStreamTypes().size(); streamIndex++) { + jint jStream = group.getStreamTypes()[streamIndex]; + env->SetIntArrayRegion(jLegacyStreamTypes, streamIndex, 1, &jStream); + } + + // Audio Attributes array + numAttributes = group.getAudioAttributes().size(); + jStatus = JNIAudioAttributeHelper::getJavaArray(env, &jAudioAttributes, numAttributes); + if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + goto exit; + } + + for (size_t j = 0; j < static_cast<size_t>(numAttributes); j++) { + auto attributes = group.getAudioAttributes()[j]; + + jStatus = JNIAudioAttributeHelper::nativeToJava(env, &jAudioAttribute, attributes); + if (jStatus != AUDIO_JAVA_SUCCESS) { + goto exit; + } + env->SetObjectArrayElement(jAudioAttributes, j, jAudioAttribute); + } + + *jGroup = env->NewObject(gAudioVolumeGroupClass, gAudioVolumeGroupCstor, + jName, Id, jAudioAttributes, jLegacyStreamTypes); +exit: + if (jName != NULL) { + env->DeleteLocalRef(jName); + } + return jStatus; +} + +static jint +android_media_AudioSystem_listAudioVolumeGroups(JNIEnv *env, jobject clazz, jobject jVolumeGroups) +{ + if (env == NULL) { + return AUDIO_JAVA_DEAD_OBJECT; + } + if (jVolumeGroups == NULL) { + ALOGE("listAudioVolumeGroups NULL AudioVolumeGroups"); + return (jint)AUDIO_JAVA_BAD_VALUE; + } + if (!env->IsInstanceOf(jVolumeGroups, gArrayListClass)) { + ALOGE("listAudioVolumeGroups not an arraylist"); + return (jint)AUDIO_JAVA_BAD_VALUE; + } + + status_t status; + AudioVolumeGroupVector groups; + jint jStatus; + jobject jGroup = NULL; + + status = AudioSystem::listAudioVolumeGroups(groups); + if (status != NO_ERROR) { + ALOGE("AudioSystem::listAudioVolumeGroups error %d", status); + return nativeToJavaStatus(status); + } + for (const auto &group : groups) { + jStatus = convertAudioVolumeGroupsFromNative(env, &jGroup, group); + if (jStatus != AUDIO_JAVA_SUCCESS) { + goto exit; + } + env->CallBooleanMethod(jVolumeGroups, gArrayListMethods.add, jGroup); + } +exit: + if (jGroup != NULL) { + env->DeleteLocalRef(jGroup); + } + return jStatus; +} + +/* + * JNI registration. + */ +static const JNINativeMethod gMethods[] = { + {"native_list_audio_volume_groups", "(Ljava/util/ArrayList;)I", + (void *)android_media_AudioSystem_listAudioVolumeGroups}, +}; + +int register_android_media_AudioVolumeGroups(JNIEnv *env) +{ + jclass arrayListClass = FindClassOrDie(env, "java/util/ArrayList"); + gArrayListClass = MakeGlobalRefOrDie(env, arrayListClass); + gArrayListCstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V"); + gArrayListMethods.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z"); + gArrayListMethods.toArray = GetMethodIDOrDie(env, arrayListClass, + "toArray", "()[Ljava/lang/Object;"); + + jclass audioVolumeGroupClass = FindClassOrDie(env, kAudioVolumeGroupClassPathName); + gAudioVolumeGroupClass = MakeGlobalRefOrDie(env, audioVolumeGroupClass); + gAudioVolumeGroupCstor = GetMethodIDOrDie( + env, audioVolumeGroupClass, "<init>", + "(Ljava/lang/String;I[Landroid/media/AudioAttributes;[I)V"); + + gAudioVolumeGroupFields.mName = GetFieldIDOrDie( + env, audioVolumeGroupClass, "mName", "Ljava/lang/String;"); + gAudioVolumeGroupFields.mId = GetFieldIDOrDie( + env, audioVolumeGroupClass, "mId", "I"); + + env->DeleteLocalRef(audioVolumeGroupClass); + + return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); +} diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp index fb6dd9392e82..7975c8675954 100644 --- a/core/jni/android_view_InputEventReceiver.cpp +++ b/core/jni/android_view_InputEventReceiver.cpp @@ -23,10 +23,9 @@ #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> -#include <utils/Log.h> +#include <log/log.h> #include <utils/Looper.h> #include <utils/Vector.h> -#include <utils/threads.h> #include <input/InputTransport.h> #include "android_os_MessageQueue.h" #include "android_view_InputChannel.h" diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp index aa10a2f98a7e..2542286635e6 100644 --- a/core/jni/android_view_InputEventSender.cpp +++ b/core/jni/android_view_InputEventSender.cpp @@ -21,10 +21,8 @@ #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> -#include <utils/Log.h> +#include <log/log.h> #include <utils/Looper.h> -#include <utils/threads.h> -#include <utils/KeyedVector.h> #include <input/InputTransport.h> #include "android_os_MessageQueue.h" #include "android_view_InputChannel.h" @@ -32,6 +30,7 @@ #include "android_view_MotionEvent.h" #include <nativehelper/ScopedLocalRef.h> +#include <unordered_map> #include "core_jni_helpers.h" @@ -65,7 +64,8 @@ private: jobject mSenderWeakGlobal; InputPublisher mInputPublisher; sp<MessageQueue> mMessageQueue; - KeyedVector<uint32_t, uint32_t> mPublishedSeqMap; + std::unordered_map<uint32_t, uint32_t> mPublishedSeqMap; + uint32_t mNextPublishedSeq; const std::string getInputChannelName() { @@ -122,7 +122,7 @@ status_t NativeInputEventSender::sendKeyEvent(uint32_t seq, const KeyEvent* even getInputChannelName().c_str(), status); return status; } - mPublishedSeqMap.add(publishedSeq, seq); + mPublishedSeqMap.emplace(publishedSeq, seq); return OK; } @@ -150,7 +150,7 @@ status_t NativeInputEventSender::sendMotionEvent(uint32_t seq, const MotionEvent return status; } } - mPublishedSeqMap.add(publishedSeq, seq); + mPublishedSeqMap.emplace(publishedSeq, seq); return OK; } @@ -199,35 +199,37 @@ status_t NativeInputEventSender::receiveFinishedSignals(JNIEnv* env) { return status; } - ssize_t index = mPublishedSeqMap.indexOfKey(publishedSeq); - if (index >= 0) { - uint32_t seq = mPublishedSeqMap.valueAt(index); - mPublishedSeqMap.removeItemsAt(index); + auto it = mPublishedSeqMap.find(publishedSeq); + if (it == mPublishedSeqMap.end()) { + continue; + } + + uint32_t seq = it->second; + mPublishedSeqMap.erase(it); - if (kDebugDispatchCycle) { - ALOGD("channel '%s' ~ Received finished signal, seq=%u, handled=%s, " - "pendingEvents=%zu.", - getInputChannelName().c_str(), seq, handled ? "true" : "false", - mPublishedSeqMap.size()); - } + if (kDebugDispatchCycle) { + ALOGD("channel '%s' ~ Received finished signal, seq=%u, handled=%s, " + "pendingEvents=%zu.", + getInputChannelName().c_str(), seq, handled ? "true" : "false", + mPublishedSeqMap.size()); + } - if (!skipCallbacks) { + if (!skipCallbacks) { + if (!senderObj.get()) { + senderObj.reset(jniGetReferent(env, mSenderWeakGlobal)); if (!senderObj.get()) { - senderObj.reset(jniGetReferent(env, mSenderWeakGlobal)); - if (!senderObj.get()) { - ALOGW("channel '%s' ~ Sender object was finalized " - "without being disposed.", getInputChannelName().c_str()); - return DEAD_OBJECT; - } + ALOGW("channel '%s' ~ Sender object was finalized " + "without being disposed.", getInputChannelName().c_str()); + return DEAD_OBJECT; } + } - env->CallVoidMethod(senderObj.get(), - gInputEventSenderClassInfo.dispatchInputEventFinished, - jint(seq), jboolean(handled)); - if (env->ExceptionCheck()) { - ALOGE("Exception dispatching finished signal."); - skipCallbacks = true; - } + env->CallVoidMethod(senderObj.get(), + gInputEventSenderClassInfo.dispatchInputEventFinished, + jint(seq), jboolean(handled)); + if (env->ExceptionCheck()) { + ALOGE("Exception dispatching finished signal."); + skipCallbacks = true; } } } diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 464f24901eb1..a9002945ff91 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -58,8 +58,6 @@ namespace android { -using ui::Dataspace; - static const char* const OutOfResourcesException = "android/view/Surface$OutOfResourcesException"; @@ -129,135 +127,17 @@ jobject android_view_Surface_createFromIGraphicBufferProducer(JNIEnv* env, } int android_view_Surface_mapPublicFormatToHalFormat(PublicFormat f) { - - switch(f) { - case PublicFormat::JPEG: - case PublicFormat::DEPTH_POINT_CLOUD: - case PublicFormat::DEPTH_JPEG: - case PublicFormat::HEIC: - return HAL_PIXEL_FORMAT_BLOB; - case PublicFormat::DEPTH16: - return HAL_PIXEL_FORMAT_Y16; - case PublicFormat::RAW_SENSOR: - case PublicFormat::RAW_DEPTH: - return HAL_PIXEL_FORMAT_RAW16; - default: - // Most formats map 1:1 - return static_cast<int>(f); - } + return mapPublicFormatToHalFormat(f); } android_dataspace android_view_Surface_mapPublicFormatToHalDataspace( PublicFormat f) { - Dataspace dataspace; - switch(f) { - case PublicFormat::JPEG: - dataspace = Dataspace::V0_JFIF; - break; - case PublicFormat::DEPTH_POINT_CLOUD: - case PublicFormat::DEPTH16: - case PublicFormat::RAW_DEPTH: - dataspace = Dataspace::DEPTH; - break; - case PublicFormat::RAW_SENSOR: - case PublicFormat::RAW_PRIVATE: - case PublicFormat::RAW10: - case PublicFormat::RAW12: - dataspace = Dataspace::ARBITRARY; - break; - case PublicFormat::YUV_420_888: - case PublicFormat::NV21: - case PublicFormat::YV12: - dataspace = Dataspace::V0_JFIF; - break; - case PublicFormat::DEPTH_JPEG: - dataspace = Dataspace::DYNAMIC_DEPTH; - break; - case PublicFormat::HEIC: - dataspace = Dataspace::HEIF; - break; - default: - // Most formats map to UNKNOWN - dataspace = Dataspace::UNKNOWN; - break; - } - return static_cast<android_dataspace>(dataspace); + return mapPublicFormatToHalDataspace(f); } PublicFormat android_view_Surface_mapHalFormatDataspaceToPublicFormat( int format, android_dataspace dataSpace) { - Dataspace ds = static_cast<Dataspace>(dataSpace); - switch(format) { - case HAL_PIXEL_FORMAT_RGBA_8888: - case HAL_PIXEL_FORMAT_RGBX_8888: - case HAL_PIXEL_FORMAT_RGBA_FP16: - case HAL_PIXEL_FORMAT_RGBA_1010102: - case HAL_PIXEL_FORMAT_RGB_888: - case HAL_PIXEL_FORMAT_RGB_565: - case HAL_PIXEL_FORMAT_Y8: - case HAL_PIXEL_FORMAT_RAW10: - case HAL_PIXEL_FORMAT_RAW12: - case HAL_PIXEL_FORMAT_YCbCr_420_888: - case HAL_PIXEL_FORMAT_YV12: - // Enums overlap in both name and value - return static_cast<PublicFormat>(format); - case HAL_PIXEL_FORMAT_RAW16: - switch (ds) { - case Dataspace::DEPTH: - return PublicFormat::RAW_DEPTH; - default: - return PublicFormat::RAW_SENSOR; - } - case HAL_PIXEL_FORMAT_RAW_OPAQUE: - // Name differs, though value is the same - return PublicFormat::RAW_PRIVATE; - case HAL_PIXEL_FORMAT_YCbCr_422_SP: - // Name differs, though the value is the same - return PublicFormat::NV16; - case HAL_PIXEL_FORMAT_YCrCb_420_SP: - // Name differs, though the value is the same - return PublicFormat::NV21; - case HAL_PIXEL_FORMAT_YCbCr_422_I: - // Name differs, though the value is the same - return PublicFormat::YUY2; - case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: - // Name differs, though the value is the same - return PublicFormat::PRIVATE; - case HAL_PIXEL_FORMAT_Y16: - // Dataspace-dependent - switch (ds) { - case Dataspace::DEPTH: - return PublicFormat::DEPTH16; - default: - // Assume non-depth Y16 is just Y16. - return PublicFormat::Y16; - } - break; - case HAL_PIXEL_FORMAT_BLOB: - // Dataspace-dependent - switch (ds) { - case Dataspace::DEPTH: - return PublicFormat::DEPTH_POINT_CLOUD; - case Dataspace::V0_JFIF: - return PublicFormat::JPEG; - case Dataspace::HEIF: - return PublicFormat::HEIC; - default: - if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_DYNAMIC_DEPTH)) { - return PublicFormat::DEPTH_JPEG; - } else { - // Assume otherwise-marked blobs are also JPEG - return PublicFormat::JPEG; - } - } - break; - case HAL_PIXEL_FORMAT_BGRA_8888: - // Not defined in public API - return PublicFormat::UNKNOWN; - - default: - return PublicFormat::UNKNOWN; - } + return mapHalFormatDataspaceToPublicFormat(format, dataSpace); } // ---------------------------------------------------------------------------- diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 4c25fd465301..af2bf2d40146 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -717,6 +717,29 @@ static jboolean nativeSetAllowedDisplayConfigs(JNIEnv* env, jclass clazz, return result == NO_ERROR ? JNI_TRUE : JNI_FALSE; } +static jintArray nativeGetAllowedDisplayConfigs(JNIEnv* env, jclass clazz, jobject tokenObj) { + sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); + if (token == nullptr) return JNI_FALSE; + + std::vector<int32_t> allowedConfigs; + size_t result = SurfaceComposerClient::getAllowedDisplayConfigs(token, &allowedConfigs); + if (result != NO_ERROR) { + return nullptr; + } + + jintArray allowedConfigsArray = env->NewIntArray(allowedConfigs.size()); + if (allowedConfigsArray == nullptr) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + return nullptr; + } + jint* allowedConfigsArrayValues = env->GetIntArrayElements(allowedConfigsArray, 0); + for (size_t i = 0; i < allowedConfigs.size(); i++) { + allowedConfigsArrayValues[i] = static_cast<jint>(allowedConfigs[i]); + } + env->ReleaseIntArrayElements(allowedConfigsArray, allowedConfigsArrayValues, 0); + return allowedConfigsArray; +} + static jint nativeGetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj) { sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); if (token == NULL) return -1; @@ -1215,6 +1238,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetActiveConfig }, {"nativeSetAllowedDisplayConfigs", "(Landroid/os/IBinder;[I)Z", (void*)nativeSetAllowedDisplayConfigs }, + {"nativeGetAllowedDisplayConfigs", "(Landroid/os/IBinder;)[I", + (void*)nativeGetAllowedDisplayConfigs }, {"nativeGetDisplayColorModes", "(Landroid/os/IBinder;)[I", (void*)nativeGetDisplayColorModes}, {"nativeGetDisplayNativePrimaries", "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DisplayPrimaries;", diff --git a/core/jni/include/android_runtime/android_view_Surface.h b/core/jni/include/android_runtime/android_view_Surface.h index 3f7c00c9ff01..04718cd981ff 100644 --- a/core/jni/include/android_runtime/android_view_Surface.h +++ b/core/jni/include/android_runtime/android_view_Surface.h @@ -19,6 +19,7 @@ #include <android/native_window.h> #include <system/graphics.h> +#include <ui/PublicFormat.h> #include "jni.h" @@ -27,41 +28,6 @@ namespace android { class Surface; class IGraphicBufferProducer; -/** - * Enum mirroring the public API definitions for image and pixel formats. - * Some of these are hidden in the public API - * - * Keep up to date with android.graphics.ImageFormat and - * android.graphics.PixelFormat - */ -enum class PublicFormat { - UNKNOWN = 0x0, - RGBA_8888 = 0x1, - RGBX_8888 = 0x2, - RGB_888 = 0x3, - RGB_565 = 0x4, - NV16 = 0x10, - NV21 = 0x11, - YUY2 = 0x14, - RGBA_FP16 = 0x16, - RAW_SENSOR = 0x20, - PRIVATE = 0x22, - YUV_420_888 = 0x23, - RAW_PRIVATE = 0x24, - RAW10 = 0x25, - RAW12 = 0x26, - RGBA_1010102 = 0x2b, - JPEG = 0x100, - DEPTH_POINT_CLOUD = 0x101, - RAW_DEPTH = 0x1002, // @hide - YV12 = 0x32315659, - Y8 = 0x20203859, - Y16 = 0x20363159, // @hide - DEPTH16 = 0x44363159, - DEPTH_JPEG = 0x69656963, - HEIC = 0x48454946, -}; - /* Gets the underlying ANativeWindow for a Surface. */ extern sp<ANativeWindow> android_view_Surface_getNativeWindow( JNIEnv* env, jobject surfaceObj); diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto index 6f9a5649d4ac..79a5dd78ffb3 100644 --- a/core/proto/android/server/activitymanagerservice.proto +++ b/core/proto/android/server/activitymanagerservice.proto @@ -132,6 +132,7 @@ message KeyguardControllerProto { optional bool keyguard_showing = 1; repeated KeyguardOccludedProto keyguard_occluded_states= 2; + optional bool aod_showing = 3; } message KeyguardOccludedProto { diff --git a/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml b/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml index 6f3dc8c7de0e..5add19bba51b 100644 --- a/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml +++ b/core/res/res/anim-ldrtl/cross_profile_apps_thumbnail_enter.xml @@ -18,7 +18,9 @@ --> <!-- This should be kept in sync with task_open_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" android:zAdjustment="top"> + android:hasRoundedCorners="true" + android:shareInterpolator="false" + android:zAdjustment="top"> <alpha android:fromAlpha="1" diff --git a/core/res/res/anim-ldrtl/task_close_enter.xml b/core/res/res/anim-ldrtl/task_close_enter.xml index 7abada332fb6..e00141a8c155 100644 --- a/core/res/res/anim-ldrtl/task_close_enter.xml +++ b/core/res/res/anim-ldrtl/task_close_enter.xml @@ -16,6 +16,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim-ldrtl/task_close_exit.xml b/core/res/res/anim-ldrtl/task_close_exit.xml index a017820a4b3e..71a44ae7d2fc 100644 --- a/core/res/res/anim-ldrtl/task_close_exit.xml +++ b/core/res/res/anim-ldrtl/task_close_exit.xml @@ -16,6 +16,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim-ldrtl/task_open_enter.xml b/core/res/res/anim-ldrtl/task_open_enter.xml index 0433664717eb..7815f7d661d0 100644 --- a/core/res/res/anim-ldrtl/task_open_enter.xml +++ b/core/res/res/anim-ldrtl/task_open_enter.xml @@ -18,6 +18,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml index 45ca80e00e22..5fccd6df14a5 100644 --- a/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml +++ b/core/res/res/anim-ldrtl/task_open_enter_cross_profile_apps.xml @@ -18,6 +18,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim-ldrtl/task_open_exit.xml b/core/res/res/anim-ldrtl/task_open_exit.xml index f50494d81eb5..025e1bdc05c9 100644 --- a/core/res/res/anim-ldrtl/task_open_exit.xml +++ b/core/res/res/anim-ldrtl/task_open_exit.xml @@ -16,6 +16,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml b/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml index 4c2559f1e47d..2cfeecf4685d 100644 --- a/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml +++ b/core/res/res/anim/cross_profile_apps_thumbnail_enter.xml @@ -18,7 +18,9 @@ --> <!-- This should be kept in sync with task_open_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" android:zAdjustment="top"> + android:shareInterpolator="false" + android:hasRoundedCorners="true" + android:zAdjustment="top"> <alpha android:fromAlpha="1" diff --git a/core/res/res/anim/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml index b059aa9cb28c..487ff5c748d3 100644 --- a/core/res/res/anim/task_close_enter.xml +++ b/core/res/res/anim/task_close_enter.xml @@ -18,6 +18,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim/task_close_exit.xml b/core/res/res/anim/task_close_exit.xml index c9ade227819b..afc3256cb617 100644 --- a/core/res/res/anim/task_close_exit.xml +++ b/core/res/res/anim/task_close_exit.xml @@ -18,6 +18,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim/task_open_enter.xml b/core/res/res/anim/task_open_enter.xml index 5c618594364f..0aafc1c0b91c 100644 --- a/core/res/res/anim/task_open_enter.xml +++ b/core/res/res/anim/task_open_enter.xml @@ -20,6 +20,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim/task_open_enter_cross_profile_apps.xml b/core/res/res/anim/task_open_enter_cross_profile_apps.xml index 644104721463..702f7ba162aa 100644 --- a/core/res/res/anim/task_open_enter_cross_profile_apps.xml +++ b/core/res/res/anim/task_open_enter_cross_profile_apps.xml @@ -20,6 +20,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/anim/task_open_exit.xml b/core/res/res/anim/task_open_exit.xml index 9394c577da78..691317d2e6e0 100644 --- a/core/res/res/anim/task_open_exit.xml +++ b/core/res/res/anim/task_open_exit.xml @@ -18,6 +18,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" + android:hasRoundedCorners="true" android:showWallpaper="true"> <alpha diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 088669da7b91..743496fdffb5 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -6488,6 +6488,9 @@ <!-- Special option for window animations: show the wallpaper behind when running this animation. --> <attr name="showWallpaper" format="boolean" /> + <!-- Special option for window animations: whether window should have rounded corners. + @see ScreenDecorationsUtils#getWindowCornerRadius(Resources) --> + <attr name="hasRoundedCorners" format="boolean" /> </declare-styleable> <declare-styleable name="AnimationSet"> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 1053184bc2fc..6b8e000777d8 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -1667,6 +1667,9 @@ This flag is turned on by default. <em>This attribute is usable only by system apps. </em> --> <attr name="allowClearUserDataOnFailedRestore"/> + <!-- If {@code true} the app's non sensitive audio can be capture by other apps. + The default value is true. --> + <attr name="allowAudioPlaybackCapture" format="boolean" /> </declare-styleable> <!-- The <code>permission</code> tag declares a security permission that can be used to control access from other packages to specific components or diff --git a/core/res/res/values/colors_device_defaults.xml b/core/res/res/values/colors_device_defaults.xml index 824b4b5977d1..7209103de981 100644 --- a/core/res/res/values/colors_device_defaults.xml +++ b/core/res/res/values/colors_device_defaults.xml @@ -26,6 +26,8 @@ <color name="primary_dark_device_default_settings">@color/primary_dark_material_settings</color> <color name="primary_dark_device_default_settings_light">@color/primary_dark_material_settings_light</color> + <color name="navigation_bar_divider_device_default_settings">#1f000000</color> + <color name="secondary_device_default_settings">@color/secondary_material_settings</color> <color name="secondary_device_default_settings_light">@color/secondary_material_settings_light</color> <color name="tertiary_device_default_settings">@color/tertiary_material_settings</color> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 910af4c63630..4e174c42fe73 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -127,7 +127,7 @@ <bool name="config_sendAudioBecomingNoisy">true</bool> <!-- Whether Hearing Aid profile is supported --> - <bool name="config_hearing_aid_profile_supported">true</bool> + <bool name="config_hearing_aid_profile_supported">false</bool> <!-- Flag to disable all transition animations --> <bool name="config_disableTransitionAnimation">false</bool> @@ -2267,7 +2267,7 @@ <!-- If the sensor that wakes up the lock screen is available or not. --> <bool name="config_dozeWakeLockScreenSensorAvailable">false</bool> - <integer name="config_dozeWakeLockScreenDebounce">3000</integer> + <integer name="config_dozeWakeLockScreenDebounce">1500</integer> <!-- Control whether the always on display mode is available. This should only be enabled on devices where the display has been tuned to be power efficient in DOZE and/or DOZE_SUSPEND diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 5a3c536b0042..61d530027eaa 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2941,6 +2941,7 @@ <public name="forceUriPermissions" /> <!-- @hide @SystemApi --> <public name="allowClearUserDataOnFailedRestore"/> + <public name="allowAudioPlaybackCapture"/> </public-group> <public-group type="drawable" first-id="0x010800b4"> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 194c86c2fb81..9a95ecca5876 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -1468,7 +1468,7 @@ easier. <item name="colorEdgeEffect">@android:color/black</item> <!-- Add white nav bar with divider that matches material --> - <item name="navigationBarDividerColor">#1f000000</item> + <item name="navigationBarDividerColor">@color/navigation_bar_divider_device_default_settings</item> <item name="navigationBarColor">@android:color/white</item> <item name="windowLightNavigationBar">true</item> diff --git a/core/tests/coretests/src/android/provider/DeviceConfigTest.java b/core/tests/coretests/src/android/provider/DeviceConfigTest.java index 5d5754bc41be..de1453ab5a99 100644 --- a/core/tests/coretests/src/android/provider/DeviceConfigTest.java +++ b/core/tests/coretests/src/android/provider/DeviceConfigTest.java @@ -59,6 +59,131 @@ public class DeviceConfigTest { } @Test + public void getString_empty() { + final String default_value = "default_value"; + final String result = DeviceConfig.getString(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(default_value); + } + + @Test + public void getString_nonEmpty() { + final String value = "new_value"; + final String default_value = "default"; + DeviceConfig.setProperty(sNamespace, sKey, value, false); + + final String result = DeviceConfig.getString(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(value); + } + + @Test + public void getBoolean_empty() { + final boolean default_value = true; + final boolean result = DeviceConfig.getBoolean(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(default_value); + } + + @Test + public void getBoolean_valid() { + final boolean value = true; + final boolean default_value = false; + DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false); + + final boolean result = DeviceConfig.getBoolean(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(value); + } + + @Test + public void getBoolean_invalid() { + final boolean default_value = true; + DeviceConfig.setProperty(sNamespace, sKey, "not_a_boolean", false); + + final boolean result = DeviceConfig.getBoolean(sNamespace, sKey, default_value); + // Anything non-null other than case insensitive "true" parses to false. + assertThat(result).isFalse(); + } + + @Test + public void getInt_empty() { + final int default_value = 999; + final int result = DeviceConfig.getInt(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(default_value); + } + + @Test + public void getInt_valid() { + final int value = 123; + final int default_value = 999; + DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false); + + final int result = DeviceConfig.getInt(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(value); + } + + @Test + public void getInt_invalid() { + final int default_value = 999; + DeviceConfig.setProperty(sNamespace, sKey, "not_an_int", false); + + final int result = DeviceConfig.getInt(sNamespace, sKey, default_value); + // Failure to parse results in using the default value + assertThat(result).isEqualTo(default_value); + } + + @Test + public void getLong_empty() { + final long default_value = 123456; + final long result = DeviceConfig.getLong(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(default_value); + } + + @Test + public void getLong_valid() { + final long value = 456789; + final long default_value = 123456; + DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false); + + final long result = DeviceConfig.getLong(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(value); + } + + @Test + public void getLong_invalid() { + final long default_value = 123456; + DeviceConfig.setProperty(sNamespace, sKey, "not_a_long", false); + + final long result = DeviceConfig.getLong(sNamespace, sKey, default_value); + // Failure to parse results in using the default value + assertThat(result).isEqualTo(default_value); + } + + @Test + public void getFloat_empty() { + final float default_value = 123.456f; + final float result = DeviceConfig.getFloat(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(default_value); + } + + @Test + public void getFloat_valid() { + final float value = 456.789f; + final float default_value = 123.456f; + DeviceConfig.setProperty(sNamespace, sKey, String.valueOf(value), false); + + final float result = DeviceConfig.getFloat(sNamespace, sKey, default_value); + assertThat(result).isEqualTo(value); + } + + @Test + public void getFloat_invalid() { + final float default_value = 123.456f; + DeviceConfig.setProperty(sNamespace, sKey, "not_a_float", false); + + final float result = DeviceConfig.getFloat(sNamespace, sKey, default_value); + // Failure to parse results in using the default value + assertThat(result).isEqualTo(default_value); + } + + @Test public void setAndGetProperty_sameNamespace() { DeviceConfig.setProperty(sNamespace, sKey, sValue, false); String result = DeviceConfig.getProperty(sNamespace, sKey); diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java index e3852e1b627e..a88968bfd089 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityCacheTest.java @@ -301,6 +301,26 @@ public class AccessibilityCacheTest { } @Test + public void subTreeChangeEventFromUncachedNode_clearsNodeInCache() { + AccessibilityNodeInfo nodeInfo = getNodeWithA11yAndWindowId(CHILD_VIEW_ID, WINDOW_ID_1); + long id = nodeInfo.getSourceNodeId(); + mAccessibilityCache.add(nodeInfo); + nodeInfo.recycle(); + + AccessibilityEvent event = AccessibilityEvent + .obtain(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE); + event.setSource(getMockViewWithA11yAndWindowIds(PARENT_VIEW_ID, WINDOW_ID_1)); + + mAccessibilityCache.onAccessibilityEvent(event); + AccessibilityNodeInfo shouldBeNull = mAccessibilityCache.getNode(WINDOW_ID_1, id); + if (shouldBeNull != null) { + shouldBeNull.recycle(); + } + assertNull(shouldBeNull); + } + + @Test public void scrollEvent_clearsNodeAndChild() { AccessibilityEvent event = AccessibilityEvent .obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED); diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 920fb4cffbca..c064402f8345 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -1845,6 +1845,7 @@ public final class Bitmap implements Parcelable { * @throws IllegalStateException if the bitmap's config is {@link Config#HARDWARE} * */ + @NonNull public Color getColor(int x, int y) { checkRecycled("Can't call getColor() on a recycled bitmap"); checkHardware("unable to getColor(), " diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java index e98879d0c5bd..42b6acd3b25a 100644 --- a/graphics/java/android/graphics/RenderNode.java +++ b/graphics/java/android/graphics/RenderNode.java @@ -27,6 +27,8 @@ import android.view.RenderNodeAnimator; import android.view.Surface; import android.view.View; +import com.android.internal.util.ArrayUtils; + import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; @@ -179,6 +181,10 @@ public final class RenderNode { private final AnimationHost mAnimationHost; private RecordingCanvas mCurrentRecordingCanvas; + // Will be null if not currently registered + @Nullable + private CompositePositionUpdateListener mCompositePositionUpdateListener; + /** * Creates a new RenderNode that can be used to record batches of * drawing operations, and store / apply render properties when drawn. @@ -248,15 +254,70 @@ public final class RenderNode { } + private static final class CompositePositionUpdateListener implements PositionUpdateListener { + private final PositionUpdateListener[] mListeners; + + CompositePositionUpdateListener(PositionUpdateListener... listeners) { + mListeners = listeners; + } + + public CompositePositionUpdateListener with(PositionUpdateListener listener) { + return new CompositePositionUpdateListener( + ArrayUtils.appendElement(PositionUpdateListener.class, mListeners, listener)); + } + + public CompositePositionUpdateListener without(PositionUpdateListener listener) { + return new CompositePositionUpdateListener( + ArrayUtils.removeElement(PositionUpdateListener.class, mListeners, listener)); + } + + @Override + public void positionChanged(long frameNumber, int left, int top, int right, int bottom) { + for (PositionUpdateListener pul : mListeners) { + pul.positionChanged(frameNumber, left, top, right, bottom); + } + } + + @Override + public void positionLost(long frameNumber) { + for (PositionUpdateListener pul : mListeners) { + pul.positionLost(frameNumber); + } + } + } + /** - * Enable callbacks for position changes. + * Enable callbacks for position changes. Call only from the UI thread or with + * external synchronization. * * @hide */ - public void requestPositionUpdates(PositionUpdateListener listener) { - nRequestPositionUpdates(mNativeRenderNode, listener); + public void addPositionUpdateListener(@NonNull PositionUpdateListener listener) { + CompositePositionUpdateListener comp = mCompositePositionUpdateListener; + if (comp == null) { + comp = new CompositePositionUpdateListener(listener); + } else { + comp = comp.with(listener); + } + mCompositePositionUpdateListener = comp; + nRequestPositionUpdates(mNativeRenderNode, comp); } + /** + * Disable a callback for position changes. Call only from the UI thread or with + * external synchronization. + * + * @param listener Callback to remove + * @hide + */ + public void removePositionUpdateListener(@NonNull PositionUpdateListener listener) { + CompositePositionUpdateListener comp = mCompositePositionUpdateListener; + if (comp != null) { + comp = comp.without(listener); + mCompositePositionUpdateListener = comp; + nRequestPositionUpdates(mNativeRenderNode, comp); + } + } /** * Starts recording a display list for the render node. All diff --git a/keystore/java/android/security/Credentials.java b/keystore/java/android/security/Credentials.java index 2ae28f507e0d..08f417662523 100644 --- a/keystore/java/android/security/Credentials.java +++ b/keystore/java/android/security/Credentials.java @@ -20,6 +20,7 @@ import com.android.org.bouncycastle.util.io.pem.PemObject; import com.android.org.bouncycastle.util.io.pem.PemReader; import com.android.org.bouncycastle.util.io.pem.PemWriter; +import android.annotation.UnsupportedAppUsage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -122,6 +123,7 @@ public class Credentials { * Convert objects to a PEM format which is used for * CA_CERTIFICATE and USER_CERTIFICATE entries. */ + @UnsupportedAppUsage public static byte[] convertToPem(Certificate... objects) throws IOException, CertificateEncodingException { ByteArrayOutputStream bao = new ByteArrayOutputStream(); diff --git a/keystore/java/android/security/IKeyChainService.aidl b/keystore/java/android/security/IKeyChainService.aidl index 0d32075d20d2..b3cdff7eedf7 100644 --- a/keystore/java/android/security/IKeyChainService.aidl +++ b/keystore/java/android/security/IKeyChainService.aidl @@ -27,6 +27,7 @@ import android.security.keystore.ParcelableKeyGenParameterSpec; */ interface IKeyChainService { // APIs used by KeyChain + @UnsupportedAppUsage String requestPrivateKey(String alias); byte[] getCertificate(String alias); byte[] getCaCertificates(String alias); diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp index d7b84ff1060d..117d05e837ef 100644 --- a/libs/androidfw/AssetManager2.cpp +++ b/libs/androidfw/AssetManager2.cpp @@ -35,6 +35,12 @@ #endif #endif +#ifdef __ANDROID__ +#define ANDROID_LOG(x) LOG(x) +#else +#define ANDROID_LOG(x) std::stringstream() +#endif + #include "androidfw/ResourceUtils.h" namespace android { @@ -380,7 +386,8 @@ ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_overri const uint8_t package_idx = package_ids_[package_id]; if (package_idx == 0xff) { - LOG(ERROR) << base::StringPrintf("No package ID %02x found for ID 0x%08x.", package_id, resid); + ANDROID_LOG(ERROR) << base::StringPrintf("No package ID %02x found for ID 0x%08x.", + package_id, resid); return kInvalidCookie; } diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 3b43f1297597..5af660c8738a 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -254,10 +254,36 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe float queuePriorities[1] = { 0.0 }; + void* queueNextPtr = nullptr; + + VkDeviceQueueGlobalPriorityCreateInfoEXT queuePriorityCreateInfo; + + if (Properties::contextPriority != 0 + && grExtensions.hasExtension(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, 2)) { + memset(&queuePriorityCreateInfo, 0, sizeof(VkDeviceQueueGlobalPriorityCreateInfoEXT)); + queuePriorityCreateInfo.sType = + VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT; + queuePriorityCreateInfo.pNext = nullptr; + switch (Properties::contextPriority) { + case EGL_CONTEXT_PRIORITY_LOW_IMG: + queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT; + break; + case EGL_CONTEXT_PRIORITY_MEDIUM_IMG: + queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT; + break; + case EGL_CONTEXT_PRIORITY_HIGH_IMG: + queuePriorityCreateInfo.globalPriority = VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT; + break; + default: + LOG_ALWAYS_FATAL("Unsupported context priority"); + } + queueNextPtr = &queuePriorityCreateInfo; + } + const VkDeviceQueueCreateInfo queueInfo[2] = { { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType - nullptr, // pNext + queueNextPtr, // pNext 0, // VkDeviceQueueCreateFlags mGraphicsQueueIndex, // queueFamilyIndex 1, // queueCount @@ -265,7 +291,7 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe }, { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType - nullptr, // pNext + queueNextPtr, // pNext 0, // VkDeviceQueueCreateFlags mPresentQueueIndex, // queueFamilyIndex 1, // queueCount diff --git a/location/java/android/location/IGeocodeProvider.aidl b/location/java/android/location/IGeocodeProvider.aidl index aaa70c74778a..7eaf7b84c83a 100644 --- a/location/java/android/location/IGeocodeProvider.aidl +++ b/location/java/android/location/IGeocodeProvider.aidl @@ -26,9 +26,11 @@ import android.location.GeocoderParams; */ interface IGeocodeProvider { + @UnsupportedAppUsage String getFromLocation(double latitude, double longitude, int maxResults, in GeocoderParams params, out List<Address> addrs); + @UnsupportedAppUsage String getFromLocationName(String locationName, double lowerLeftLatitude, double lowerLeftLongitude, double upperRightLatitude, double upperRightLongitude, int maxResults, diff --git a/location/java/android/location/IGeofenceProvider.aidl b/location/java/android/location/IGeofenceProvider.aidl index d4ff0dd70bf2..426ebef86b96 100644 --- a/location/java/android/location/IGeofenceProvider.aidl +++ b/location/java/android/location/IGeofenceProvider.aidl @@ -24,5 +24,6 @@ import android.hardware.location.IGeofenceHardware; * {@hide} */ oneway interface IGeofenceProvider { + @UnsupportedAppUsage void setGeofenceHardware(in IGeofenceHardware proxy); } diff --git a/location/java/android/location/ILocationListener.aidl b/location/java/android/location/ILocationListener.aidl index 180183e77668..ec1134566b24 100644 --- a/location/java/android/location/ILocationListener.aidl +++ b/location/java/android/location/ILocationListener.aidl @@ -25,10 +25,14 @@ import android.os.Bundle; */ oneway interface ILocationListener { + @UnsupportedAppUsage void onLocationChanged(in Location location); + @UnsupportedAppUsage void onProviderEnabled(String provider); + @UnsupportedAppUsage void onProviderDisabled(String provider); // --- deprecated --- + @UnsupportedAppUsage void onStatusChanged(String provider, int status, in Bundle extras); } diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index 57a0a725fb41..bb75c77f7e64 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -85,6 +85,7 @@ interface ILocationManager boolean stopGnssBatch(); boolean injectLocation(in Location location); + @UnsupportedAppUsage List<String> getAllProviders(); List<String> getProviders(in Criteria criteria, boolean enabledOnly); String getBestProvider(in Criteria criteria, boolean enabledOnly); diff --git a/location/java/android/location/INetInitiatedListener.aidl b/location/java/android/location/INetInitiatedListener.aidl index fc64dd67c116..a9e9136d3317 100644 --- a/location/java/android/location/INetInitiatedListener.aidl +++ b/location/java/android/location/INetInitiatedListener.aidl @@ -22,5 +22,6 @@ package android.location; */ interface INetInitiatedListener { + @UnsupportedAppUsage boolean sendNiResponse(int notifId, int userResponse); } diff --git a/location/java/com/android/internal/location/ILocationProvider.aidl b/location/java/com/android/internal/location/ILocationProvider.aidl index 71b54fb65ae5..a5716304f0d8 100644 --- a/location/java/com/android/internal/location/ILocationProvider.aidl +++ b/location/java/com/android/internal/location/ILocationProvider.aidl @@ -36,6 +36,8 @@ interface ILocationProvider { oneway void sendExtraCommand(String command, in Bundle extras); // --- deprecated and will be removed the future --- + @UnsupportedAppUsage int getStatus(out Bundle extras); + @UnsupportedAppUsage long getStatusUpdateTime(); } diff --git a/location/java/com/android/internal/location/ILocationProviderManager.aidl b/location/java/com/android/internal/location/ILocationProviderManager.aidl index 79166ae3a9b0..85e18ba5ec4b 100644 --- a/location/java/com/android/internal/location/ILocationProviderManager.aidl +++ b/location/java/com/android/internal/location/ILocationProviderManager.aidl @@ -28,9 +28,12 @@ interface ILocationProviderManager { void onSetAdditionalProviderPackages(in List<String> packageNames); + @UnsupportedAppUsage void onSetEnabled(boolean enabled); + @UnsupportedAppUsage void onSetProperties(in ProviderProperties properties); + @UnsupportedAppUsage void onReportLocation(in Location location); } diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 3fb2365cb006..15f9b47ede09 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -37,6 +37,8 @@ import android.content.Intent; import android.media.audiopolicy.AudioPolicy; import android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener; import android.media.audiopolicy.AudioProductStrategies; +import android.media.audiopolicy.AudioVolumeGroupChangeHandler; +import android.media.audiopolicy.AudioVolumeGroups; import android.media.projection.MediaProjection; import android.media.session.MediaController; import android.media.session.MediaSession; @@ -61,6 +63,7 @@ import android.util.Pair; import android.view.KeyEvent; import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.Preconditions; import java.io.IOException; import java.lang.annotation.Retention; @@ -90,6 +93,8 @@ public class AudioManager { private static final String TAG = "AudioManager"; private static final boolean DEBUG = false; private static final AudioPortEventHandler sAudioPortEventHandler = new AudioPortEventHandler(); + private static final AudioVolumeGroupChangeHandler sAudioAudioVolumeGroupChangedHandler = + new AudioVolumeGroupChangeHandler(); /** * Broadcast intent, a hint for applications that audio is about to become @@ -1164,6 +1169,93 @@ public class AudioManager { } /** + * Sets the volume index for a particular {@link AudioAttributes}. + * @param attr The {@link AudioAttributes} whose volume index should be set. + * @param index The volume index to set. See + * {@link #getMaxVolumeIndexForAttributes(AudioAttributes)} for the largest valid value + * {@link #getMinVolumeIndexForAttributes(AudioAttributes)} for the lowest valid value. + * @param flags One or more flags. + * @see #getMaxVolumeIndexForAttributes(AudioAttributes) + * @see #getMinVolumeIndexForAttributes(AudioAttributes) + * @see #isVolumeFixed() + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags) { + Preconditions.checkNotNull(attr, "attr must not be null"); + final IAudioService service = getService(); + try { + service.setVolumeIndexForAttributes(attr, index, flags, + getContext().getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Returns the current volume index for a particular {@link AudioAttributes}. + * + * @param attr The {@link AudioAttributes} whose volume index is returned. + * @return The current volume index for the stream. + * @see #getMaxVolumeIndexForAttributes(AudioAttributes) + * @see #getMinVolumeIndexForAttributes(AudioAttributes) + * @see #setVolumeForAttributes(AudioAttributes, int, int) + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public int getVolumeIndexForAttributes(@NonNull AudioAttributes attr) { + Preconditions.checkNotNull(attr, "attr must not be null"); + final IAudioService service = getService(); + try { + return service.getVolumeIndexForAttributes(attr); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Returns the maximum volume index for a particular {@link AudioAttributes}. + * + * @param attr The {@link AudioAttributes} whose maximum volume index is returned. + * @return The maximum valid volume index for the {@link AudioAttributes}. + * @see #getVolumeIndexForAttributes(AudioAttributes) + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attr) { + Preconditions.checkNotNull(attr, "attr must not be null"); + final IAudioService service = getService(); + try { + return service.getMaxVolumeIndexForAttributes(attr); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Returns the minimum volume index for a particular {@link AudioAttributes}. + * + * @param attr The {@link AudioAttributes} whose minimum volume index is returned. + * @return The minimum valid volume index for the {@link AudioAttributes}. + * @see #getVolumeIndexForAttributes(AudioAttributes) + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attr) { + Preconditions.checkNotNull(attr, "attr must not be null"); + final IAudioService service = getService(); + try { + return service.getMinVolumeIndexForAttributes(attr); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Solo or unsolo a particular stream. * <p> * Do not use. This method has been deprecated and is now a no-op. @@ -5246,6 +5338,65 @@ public class AudioManager { } } + /** + * @hide + * Introspection API to retrieve audio volume groups. + * When implementing {Car|Oem}AudioManager, use this method to retrieve the collection of + * audio volume groups. + * @return a (possibly zero-length) array of + * {@see android.media.audiopolicy.AudioVolumeGroups} objects. + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public @NonNull AudioVolumeGroups getAudioVolumeGroups() { + final IAudioService service = getService(); + try { + return service.listAudioVolumeGroups(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @hide + * Callback registered by client to be notified upon volume group change. + */ + @SystemApi + public abstract static class VolumeGroupCallback { + /** + * Callback method called upon audio volume group change. + * @param group the group for which the volume has changed + */ + public void onAudioVolumeGroupChanged(int group, int flags) {} + } + + /** + * @hide + * Register an audio volume group change listener. + * @param callback the {@link VolumeGroupCallback} to register + */ + @SystemApi + public void registerVolumeGroupCallback( + @NonNull Executor executor, + @NonNull VolumeGroupCallback callback) { + Preconditions.checkNotNull(executor, "executor must not be null"); + Preconditions.checkNotNull(callback, "volume group change cb must not be null"); + sAudioAudioVolumeGroupChangedHandler.init(); + // TODO: make use of executor + sAudioAudioVolumeGroupChangedHandler.registerListener(callback); + } + + /** + * @hide + * Unregister an audio volume group change listener. + * @param callback the {@link VolumeGroupCallback} to unregister + */ + @SystemApi + public void unregisterVolumeGroupCallback( + @NonNull VolumeGroupCallback callback) { + Preconditions.checkNotNull(callback, "volume group change cb must not be null"); + sAudioAudioVolumeGroupChangedHandler.unregisterListener(callback); + } //--------------------------------------------------------- // Inner classes diff --git a/media/java/android/media/AudioPlaybackCaptureConfiguration.java b/media/java/android/media/AudioPlaybackCaptureConfiguration.java index d714dc7772f9..9a16aea1e052 100644 --- a/media/java/android/media/AudioPlaybackCaptureConfiguration.java +++ b/media/java/android/media/AudioPlaybackCaptureConfiguration.java @@ -33,7 +33,7 @@ import com.android.internal.util.Preconditions; * - played by apps that MUST be in the same user profile as the capturing app * (eg work profile can not capture user profile apps and vice-versa). * - played by apps that MUST NOT have in their manifest.xml the application - * attribute android:allowPlaybackCapture="false" + * attribute android:allowAudioPlaybackCapture="false" * - played by apps that MUST have a targetSdkVersion higher or equal to 29 (Q). * * <p>An example for creating a capture configuration for capturing all media playback: diff --git a/media/java/android/media/AudioPresentation.java b/media/java/android/media/AudioPresentation.java index fca70747e202..894fbba6c983 100644 --- a/media/java/android/media/AudioPresentation.java +++ b/media/java/android/media/AudioPresentation.java @@ -45,6 +45,9 @@ import java.util.Objects; * accessibility, end point mastering and dialogue enhancement. An audio presentation may also have * a set of description labels in different languages to help the user to make an informed * selection. + * + * Applications that parse media streams and extract presentation information on their own + * can create instances of AudioPresentation by using {@link AudioPresentation.Builder} class. */ public final class AudioPresentation { private final int mPresentationId; @@ -66,7 +69,7 @@ public final class AudioPresentation { private final boolean mAudioDescriptionAvailable; private final boolean mSpokenSubtitlesAvailable; private final boolean mDialogueEnhancementAvailable; - private final Map<ULocale, String> mLabels; + private final Map<ULocale, CharSequence> mLabels; /** * No preferred reproduction channel layout. @@ -131,7 +134,7 @@ public final class AudioPresentation { boolean audioDescriptionAvailable, boolean spokenSubtitlesAvailable, boolean dialogueEnhancementAvailable, - @NonNull Map<ULocale, String> labels) { + @NonNull Map<ULocale, CharSequence> labels) { mPresentationId = presentationId; mProgramId = programId; mLanguage = language; @@ -139,7 +142,7 @@ public final class AudioPresentation { mAudioDescriptionAvailable = audioDescriptionAvailable; mSpokenSubtitlesAvailable = spokenSubtitlesAvailable; mDialogueEnhancementAvailable = dialogueEnhancementAvailable; - mLabels = new HashMap<ULocale, String>(labels); + mLabels = new HashMap<ULocale, CharSequence>(labels); } /** @@ -164,14 +167,14 @@ public final class AudioPresentation { * or ISO 639-2/T could be used. */ public Map<Locale, String> getLabels() { - Map<Locale, String> localeLabels = new HashMap<Locale, String>(); - for (Map.Entry<ULocale, String> entry : mLabels.entrySet()) { - localeLabels.put(entry.getKey().toLocale(), entry.getValue()); + Map<Locale, String> localeLabels = new HashMap<Locale, String>(mLabels.size()); + for (Map.Entry<ULocale, CharSequence> entry : mLabels.entrySet()) { + localeLabels.put(entry.getKey().toLocale(), entry.getValue().toString()); } return localeLabels; } - private Map<ULocale, String> getULabels() { + private Map<ULocale, CharSequence> getULabels() { return mLabels; } @@ -273,7 +276,7 @@ public final class AudioPresentation { /** * A builder class for creating {@link AudioPresentation} objects. */ - public static class Builder { + public static final class Builder { private final int mPresentationId; private int mProgramId = UNKNOWN_ID; private ULocale mLanguage = new ULocale(""); @@ -281,13 +284,13 @@ public final class AudioPresentation { private boolean mAudioDescriptionAvailable = false; private boolean mSpokenSubtitlesAvailable = false; private boolean mDialogueEnhancementAvailable = false; - private Map<ULocale, String> mLabels = new HashMap<ULocale, String>(); + private Map<ULocale, CharSequence> mLabels = new HashMap<ULocale, CharSequence>(); /** * Create a {@link Builder}. Any field that should be included in the * {@link AudioPresentation} must be added. * - * @param presentationId the presentation ID of this audio presentation + * @param presentationId The presentation ID of this audio presentation. */ public Builder(int presentationId) { mPresentationId = presentationId; @@ -295,7 +298,7 @@ public final class AudioPresentation { /** * Sets the ProgramId to which this audio presentation refers. * - * @param programId + * @param programId The program ID to be decoded. */ public @NonNull Builder setProgramId(int programId) { mProgramId = programId; @@ -304,9 +307,9 @@ public final class AudioPresentation { /** * Sets the language information of the audio presentation. * - * @param language code + * @param language Locale corresponding to ISO 639-1/639-2 language code. */ - public @NonNull Builder setLocale(ULocale language) { + public @NonNull Builder setLocale(@NonNull ULocale language) { mLanguage = language; return this; } @@ -339,17 +342,17 @@ public final class AudioPresentation { /** * Sets locale / text label pairs describing the presentation. * - * @param labels + * @param labels Text label indexed by its locale corresponding to the language code. */ - public @NonNull Builder setLabels(@NonNull Map<ULocale, String> labels) { - mLabels = new HashMap<ULocale, String>(labels); + public @NonNull Builder setLabels(@NonNull Map<ULocale, CharSequence> labels) { + mLabels = new HashMap<ULocale, CharSequence>(labels); return this; } /** * Indicate whether the presentation contains audio description for the visually impaired. * - * @param audioDescriptionAvailable + * @param audioDescriptionAvailable Audio description for the visually impaired. */ public @NonNull Builder setHasAudioDescription(boolean audioDescriptionAvailable) { mAudioDescriptionAvailable = audioDescriptionAvailable; @@ -359,7 +362,7 @@ public final class AudioPresentation { /** * Indicate whether the presentation contains spoken subtitles for the visually impaired. * - * @param spokenSubtitlesAvailable + * @param spokenSubtitlesAvailable Spoken subtitles for the visually impaired. */ public @NonNull Builder setHasSpokenSubtitles(boolean spokenSubtitlesAvailable) { mSpokenSubtitlesAvailable = spokenSubtitlesAvailable; @@ -369,7 +372,7 @@ public final class AudioPresentation { /** * Indicate whether the presentation supports dialogue enhancement. * - * @param dialogueEnhancementAvailable + * @param dialogueEnhancementAvailable Dialogue enhancement. */ public @NonNull Builder setHasDialogueEnhancement(boolean dialogueEnhancementAvailable) { mDialogueEnhancementAvailable = dialogueEnhancementAvailable; diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index ec1a854a66d5..3d5120f86db3 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -653,7 +653,16 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, AudioPolicy audioPolicy = new AudioPolicy.Builder(/*context=*/ null) .setMediaProjection(projection) .addMix(audioMix).build(); + + int error = AudioManager.registerAudioPolicyStatic(audioPolicy); + if (error != 0) { + throw new UnsupportedOperationException("Error: could not register audio policy"); + } + AudioRecord record = audioPolicy.createAudioRecordSink(audioMix); + if (record == null) { + throw new UnsupportedOperationException("Cannot create AudioRecord"); + } record.unregisterAudioPolicyOnRelease(audioPolicy); return record; } diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index b2f970a99207..a976d707f5cb 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -920,6 +920,41 @@ public class AudioSystem @UnsupportedAppUsage private static native int setStreamVolumeIndex(int stream, int index, int device); public static native int getStreamVolumeIndex(int stream, int device); + /** + * @hide + * set a volume for the given {@link AudioAttributes} and for all other stream that belong to + * the same volume group. + * @param attributes the {@link AudioAttributes} to be considered + * @param index to be applied + * @param device the volume device to be considered + * @return command completion status. + */ + public static native int setVolumeIndexForAttributes(@NonNull AudioAttributes attributes, + int index, int device); + /** + * @hide + * get the volume index for the given {@link AudioAttributes}. + * @param attributes the {@link AudioAttributes} to be considered + * @param device the volume device to be considered + * @return volume index for the given {@link AudioAttributes} and volume device. + */ + public static native int getVolumeIndexForAttributes(@NonNull AudioAttributes attributes, + int device); + /** + * @hide + * get the minimum volume index for the given {@link AudioAttributes}. + * @param attributes the {@link AudioAttributes} to be considered + * @return minimum volume index for the given {@link AudioAttributes}. + */ + public static native int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attributes); + /** + * @hide + * get the maximum volume index for the given {@link AudioAttributes}. + * @param attributes the {@link AudioAttributes} to be considered + * @return maximum volume index for the given {@link AudioAttributes}. + */ + public static native int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attributes); + public static native int setMasterVolume(float value); public static native float getMasterVolume(); @UnsupportedAppUsage diff --git a/media/java/android/media/IAudioFocusDispatcher.aidl b/media/java/android/media/IAudioFocusDispatcher.aidl index 3b33c5b7a46a..e3512fa58a7d 100644 --- a/media/java/android/media/IAudioFocusDispatcher.aidl +++ b/media/java/android/media/IAudioFocusDispatcher.aidl @@ -23,6 +23,7 @@ package android.media; */ oneway interface IAudioFocusDispatcher { + @UnsupportedAppUsage void dispatchAudioFocusChange(int focusChange, String clientId); void dispatchFocusResultFromExtPolicy(int requestResult, String clientId); diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index abdc3c9c834b..1b82fcc48bf8 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -34,6 +34,7 @@ import android.media.PlayerBase; import android.media.VolumePolicy; import android.media.audiopolicy.AudioPolicyConfig; import android.media.audiopolicy.AudioProductStrategies; +import android.media.audiopolicy.AudioVolumeGroups; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; @@ -65,6 +66,7 @@ interface IAudioService { void adjustStreamVolume(int streamType, int direction, int flags, String callingPackage); + @UnsupportedAppUsage void setStreamVolume(int streamType, int index, int flags, String callingPackage); boolean isStreamMute(int streamType); @@ -75,12 +77,24 @@ interface IAudioService { void setMasterMute(boolean mute, int flags, String callingPackage, int userId); + @UnsupportedAppUsage int getStreamVolume(int streamType); int getStreamMinVolume(int streamType); + @UnsupportedAppUsage int getStreamMaxVolume(int streamType); + AudioVolumeGroups listAudioVolumeGroups(); + + void setVolumeIndexForAttributes(in AudioAttributes aa, int index, int flags, String callingPackage); + + int getVolumeIndexForAttributes(in AudioAttributes aa); + + int getMaxVolumeIndexForAttributes(in AudioAttributes aa); + + int getMinVolumeIndexForAttributes(in AudioAttributes aa); + int getLastAudibleStreamVolume(int streamType); AudioProductStrategies getAudioProductStrategies(); @@ -160,6 +174,7 @@ interface IAudioService { int handleBluetoothA2dpActiveDeviceChange(in BluetoothDevice device, int state, int profile, boolean suppressNoisyIntent, int a2dpVolume); + @UnsupportedAppUsage AudioRoutesInfo startWatchingRoutes(in IAudioRoutesObserver observer); boolean isCameraSoundForced(); diff --git a/media/java/android/media/IMediaScannerService.aidl b/media/java/android/media/IMediaScannerService.aidl index c5316461ef1f..24b5595510f6 100644 --- a/media/java/android/media/IMediaScannerService.aidl +++ b/media/java/android/media/IMediaScannerService.aidl @@ -31,6 +31,7 @@ interface IMediaScannerService * @param listener an optional IMediaScannerListener. * If specified, the caller will be notified when scanning is complete via the listener. */ + @UnsupportedAppUsage void requestScanFile(String path, String mimeType, in IMediaScannerListener listener); /** @@ -40,5 +41,6 @@ interface IMediaScannerService * @param mimeType an optional mimeType for the file. * If mimeType is null, then the mimeType will be inferred from the file extension. */ + @UnsupportedAppUsage void scanFile(String path, String mimeType); } diff --git a/media/java/android/media/IRemoteDisplayCallback.aidl b/media/java/android/media/IRemoteDisplayCallback.aidl index 19cf070aa08e..584417d65121 100644 --- a/media/java/android/media/IRemoteDisplayCallback.aidl +++ b/media/java/android/media/IRemoteDisplayCallback.aidl @@ -22,5 +22,6 @@ import android.media.RemoteDisplayState; * {@hide} */ oneway interface IRemoteDisplayCallback { + @UnsupportedAppUsage void onStateChanged(in RemoteDisplayState state); } diff --git a/media/java/android/media/MediaHTTPConnection.java b/media/java/android/media/MediaHTTPConnection.java index 5f324f7f97ed..d72476269e18 100644 --- a/media/java/android/media/MediaHTTPConnection.java +++ b/media/java/android/media/MediaHTTPConnection.java @@ -37,7 +37,6 @@ import java.net.URL; import java.net.UnknownServiceException; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; /** @hide */ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub { @@ -67,7 +66,6 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub { // from com.squareup.okhttp.internal.http private final static int HTTP_TEMP_REDIRECT = 307; private final static int MAX_REDIRECTS = 20; - private AtomicBoolean mIsConnected = new AtomicBoolean(false); @UnsupportedAppUsage public MediaHTTPConnection() { @@ -91,7 +89,6 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub { mAllowCrossDomainRedirect = true; mURL = new URL(uri); mHeaders = convertHeaderStringToMap(headers); - mIsConnected.set(true); } catch (MalformedURLException e) { return null; } @@ -142,14 +139,7 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub { @Override @UnsupportedAppUsage public void disconnect() { - if (mIsConnected.getAndSet(false)) { - (new Thread() { - @Override - public void run() { - teardownConnection(); - } - }).start(); - } + teardownConnection(); mHeaders = null; mURL = null; } @@ -334,14 +324,7 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub { @Override @UnsupportedAppUsage public int readAt(long offset, int size) { - if (!mIsConnected.get()) { - return -1; - } - int result = native_readAt(offset, size); - if (!mIsConnected.get()) { - return -1; - } - return result; + return native_readAt(offset, size); } private int readAt(long offset, byte[] data, int size) { diff --git a/media/java/android/media/audiopolicy/AudioProductStrategies.java b/media/java/android/media/audiopolicy/AudioProductStrategies.java index 6a2375fe153d..d5938853569c 100644 --- a/media/java/android/media/audiopolicy/AudioProductStrategies.java +++ b/media/java/android/media/audiopolicy/AudioProductStrategies.java @@ -177,7 +177,50 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate @Nullable public AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull AudioAttributes aa) { Preconditions.checkNotNull(aa, "attributes must not be null"); - return getById(native_get_product_strategies_from_audio_attributes(aa)); + int productStrategyId = native_get_product_strategies_from_audio_attributes(aa); + if (productStrategyId < 0) { + Log.w(TAG, "no strategy found for Attributes " + aa.toString()); + return null; + } + return getById(productStrategyId); + } + + /** + * @hide + * @param attributes the {@link AudioAttributes} to be considered + * @return volume group associated to the given {@link AudioAttributes}. + * If no group supports the given {@link AudioAttributes}, it returns the volume group + * for the default attributes. + * If no group supports the default attributes, it returns {@link #DEFAULT_VOLUME_GROUP} + */ + @SystemApi + public int getVolumeGroupIdForAttributes(@NonNull AudioAttributes attributes) { + Preconditions.checkNotNull(attributes, "attributes must not be null"); + int volumeGroupId = getVolumeGroupIdForAttributesInt(attributes); + if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { + return volumeGroupId; + } + // The default volume group is the one hosted by default product strategy, i.e. + // supporting Default Attributes + return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes); + } + + /** + * @hide + * @param streamType to be considered + * @return volume group associated to the given stream type. + */ + @SystemApi + public int getVolumeGroupIdForLegacyStreamType(int streamType) { + for (final AudioProductStrategy productStrategy : this) { + int volumeGroupId = productStrategy.getVolumeGroupIdForLegacyStreamType(streamType); + if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { + return volumeGroupId; + } + } + // The default volume group is the one hosted by default product strategy, i.e. + // supporting Default Attributes + return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes); } @Override @@ -193,6 +236,21 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate } } + /** + * @param attributes to be considered + * @return volume group associated to the given {@link AudioAttributes}. + */ + private int getVolumeGroupIdForAttributesInt(@NonNull AudioAttributes attributes) { + Preconditions.checkNotNull(attributes, "attributes must not be null"); + for (final AudioProductStrategy productStrategy : this) { + int volumeGroupId = productStrategy.getVolumeGroupIdForAudioAttributes(attributes); + if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { + return volumeGroupId; + } + } + return AudioVolumeGroups.DEFAULT_VOLUME_GROUP; + } + public static final Parcelable.Creator<AudioProductStrategies> CREATOR = new Parcelable.Creator<AudioProductStrategies>() { @Override diff --git a/media/java/android/media/audiopolicy/AudioProductStrategy.java b/media/java/android/media/audiopolicy/AudioProductStrategy.java index af6e8bfdbd83..169484b79bd4 100644 --- a/media/java/android/media/audiopolicy/AudioProductStrategy.java +++ b/media/java/android/media/audiopolicy/AudioProductStrategy.java @@ -157,32 +157,32 @@ public final class AudioProductStrategy implements Parcelable { /** * @hide * @param streamType legacy stream type used for volume operation only - * @return the {@link AudioAttributes} relevant for the given streamType. - * If none is found, it builds the default attributes. + * @return the volume group id relevant for the given streamType. + * If none is found, {@link AudioVolumeGroups#DEFAULT_VOLUME_GROUP} is returned. */ - public int getGroupIdForLegacyStreamType(int streamType) { + public int getVolumeGroupIdForLegacyStreamType(int streamType) { for (final AudioAttributesGroup aag : mAudioAttributesGroups) { if (aag.supportsStreamType(streamType)) { - return aag.getGroupId(); + return aag.getVolumeGroupId(); } } - return DEFAULT_GROUP; + return AudioVolumeGroups.DEFAULT_VOLUME_GROUP; } /** * @hide * @param aa the {@link AudioAttributes} to be considered - * @return the group id associated with the given audio attributes if found, - * default value otherwise. + * @return the volume group id associated with the given audio attributes if found, + * {@link AudioVolumeGroups#DEFAULT_VOLUME_GROUP} otherwise. */ - public int getGroupIdForAudioAttributes(@NonNull AudioAttributes aa) { + public int getVolumeGroupIdForAudioAttributes(@NonNull AudioAttributes aa) { Preconditions.checkNotNull(aa, "AudioAttributes must not be null"); for (final AudioAttributesGroup aag : mAudioAttributesGroups) { if (aag.supportsAttributes(aa)) { - return aag.getGroupId(); + return aag.getVolumeGroupId(); } } - return DEFAULT_GROUP; + return AudioVolumeGroups.DEFAULT_VOLUME_GROUP; } @Override @@ -266,15 +266,14 @@ public final class AudioProductStrategy implements Parcelable { && ((refFormattedTags.length() == 0) || refFormattedTags.equals(cliFormattedTags)); } - private static final class AudioAttributesGroup implements Parcelable { - private int mGroupId; + private int mVolumeGroupId; private int mLegacyStreamType; private final AudioAttributes[] mAudioAttributes; - AudioAttributesGroup(int groupId, int streamType, + AudioAttributesGroup(int volumeGroupId, int streamType, @NonNull AudioAttributes[] audioAttributes) { - mGroupId = groupId; + mVolumeGroupId = volumeGroupId; mLegacyStreamType = streamType; mAudioAttributes = audioAttributes; } @@ -286,7 +285,7 @@ public final class AudioProductStrategy implements Parcelable { AudioAttributesGroup thatAag = (AudioAttributesGroup) o; - return mGroupId == thatAag.mGroupId + return mVolumeGroupId == thatAag.mVolumeGroupId && mLegacyStreamType == thatAag.mLegacyStreamType && mAudioAttributes.equals(thatAag.mAudioAttributes); } @@ -295,8 +294,8 @@ public final class AudioProductStrategy implements Parcelable { return mLegacyStreamType; } - public int getGroupId() { - return mGroupId; + public int getVolumeGroupId() { + return mVolumeGroupId; } public @NonNull AudioAttributes getAudioAttributes() { @@ -331,7 +330,7 @@ public final class AudioProductStrategy implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(mGroupId); + dest.writeInt(mVolumeGroupId); dest.writeInt(mLegacyStreamType); dest.writeInt(mAudioAttributes.length); for (AudioAttributes attributes : mAudioAttributes) { @@ -343,14 +342,14 @@ public final class AudioProductStrategy implements Parcelable { new Parcelable.Creator<AudioAttributesGroup>() { @Override public AudioAttributesGroup createFromParcel(@NonNull Parcel in) { - int groupId = in.readInt(); + int volumeGroupId = in.readInt(); int streamType = in.readInt(); int nbAttributes = in.readInt(); AudioAttributes[] aa = new AudioAttributes[nbAttributes]; for (int index = 0; index < nbAttributes; index++) { aa[index] = AudioAttributes.CREATOR.createFromParcel(in); } - return new AudioAttributesGroup(groupId, streamType, aa); + return new AudioAttributesGroup(volumeGroupId, streamType, aa); } @Override @@ -365,8 +364,8 @@ public final class AudioProductStrategy implements Parcelable { StringBuilder s = new StringBuilder(); s.append("\n Legacy Stream Type: "); s.append(Integer.toString(mLegacyStreamType)); - s.append(" Group Id: "); - s.append(Integer.toString(mGroupId)); + s.append(" Volume Group Id: "); + s.append(Integer.toString(mVolumeGroupId)); for (AudioAttributes attribute : mAudioAttributes) { s.append("\n -"); diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroup.aidl b/media/java/android/media/audiopolicy/AudioVolumeGroup.aidl new file mode 100644 index 000000000000..caf1e0db1ad7 --- /dev/null +++ b/media/java/android/media/audiopolicy/AudioVolumeGroup.aidl @@ -0,0 +1,18 @@ +/* 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.media.audiopolicy; + +parcelable AudioVolumeGroup; diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroup.java b/media/java/android/media/audiopolicy/AudioVolumeGroup.java new file mode 100644 index 000000000000..0b4ba937ad29 --- /dev/null +++ b/media/java/android/media/audiopolicy/AudioVolumeGroup.java @@ -0,0 +1,171 @@ +/* + * 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.media.audiopolicy; + +import android.annotation.NonNull; +import android.annotation.SystemApi; +import android.media.AudioAttributes; +import android.os.Parcel; +import android.os.Parcelable; + +import com.android.internal.util.Preconditions; + +import java.util.Arrays; +import java.util.List; + +/** + * A class to create the association between different playback attributes + * (e.g. media, mapping direction) to a single volume control. + * @hide + */ +@SystemApi +public final class AudioVolumeGroup implements Parcelable { + /** + * Unique identifier of a volume group. + */ + private int mId; + /** + * human-readable name of this volume group. + */ + private final String mName; + + private final AudioAttributes[] mAudioAttributes; + private int[] mLegacyStreamTypes; + + /** + * @param name of the volume group + * @param id of the volume group + * @param followers {@link AudioProductStrategies} strategy following this volume group + */ + AudioVolumeGroup(@NonNull String name, int id, + @NonNull AudioAttributes[] audioAttributes, + @NonNull int[] legacyStreamTypes) { + Preconditions.checkNotNull(name, "name must not be null"); + Preconditions.checkNotNull(audioAttributes, "audioAttributes must not be null"); + Preconditions.checkNotNull(legacyStreamTypes, "legacyStreamTypes must not be null"); + mName = name; + mId = id; + mAudioAttributes = audioAttributes; + mLegacyStreamTypes = legacyStreamTypes; + } + + @Override + public boolean equals(@NonNull Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + AudioVolumeGroup thatAvg = (AudioVolumeGroup) o; + + return mName == thatAvg.mName && mId == thatAvg.mId + && mAudioAttributes.equals(thatAvg.mAudioAttributes); + } + + /** + * @return List of {@link AudioAttributes} involved in this {@link AudioVolumeGroup}. + */ + public List<AudioAttributes> getAudioAttributes() { + return Arrays.asList(mAudioAttributes); + } + + /** + * @return the stream types involved in this {@link AudioVolumeGroup}. + */ + public @NonNull int[] getLegacyStreamTypes() { + return mLegacyStreamTypes; + } + + /** + * @return human-readable name of this volume group. + */ + public @NonNull String name() { + return mName; + } + + /** + * @return the volume group unique identifier id. + */ + public int getId() { + return mId; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeString(mName); + dest.writeInt(mId); + dest.writeInt(mAudioAttributes.length); + for (AudioAttributes attributes : mAudioAttributes) { + attributes.writeToParcel(dest, flags | AudioAttributes.FLATTEN_TAGS/*flags*/); + } + dest.writeInt(mLegacyStreamTypes.length); + for (int streamType : mLegacyStreamTypes) { + dest.writeInt(streamType); + } + } + + public static final Parcelable.Creator<AudioVolumeGroup> CREATOR = + new Parcelable.Creator<AudioVolumeGroup>() { + @Override + public @NonNull AudioVolumeGroup createFromParcel(@NonNull Parcel in) { + Preconditions.checkNotNull(in, "in Parcel must not be null"); + String name = in.readString(); + int id = in.readInt(); + int nbAttributes = in.readInt(); + AudioAttributes[] audioAttributes = new AudioAttributes[nbAttributes]; + for (int index = 0; index < nbAttributes; index++) { + audioAttributes[index] = AudioAttributes.CREATOR.createFromParcel(in); + } + int nbStreamTypes = in.readInt(); + int[] streamTypes = new int[nbStreamTypes]; + for (int index = 0; index < nbStreamTypes; index++) { + streamTypes[index] = in.readInt(); + } + return new AudioVolumeGroup(name, id, audioAttributes, streamTypes); + } + + @Override + public @NonNull AudioVolumeGroup[] newArray(int size) { + return new AudioVolumeGroup[size]; + } + }; + + @Override + public @NonNull String toString() { + StringBuilder s = new StringBuilder(); + s.append("\n Name: "); + s.append(mName); + s.append(" Id: "); + s.append(Integer.toString(mId)); + + s.append("\n Supported Audio Attributes:"); + for (AudioAttributes attribute : mAudioAttributes) { + s.append("\n -"); + s.append(attribute.toString()); + } + s.append("\n Supported Legacy Stream Types: { "); + for (int legacyStreamType : mLegacyStreamTypes) { + s.append(Integer.toString(legacyStreamType)); + s.append(" "); + } + s.append("}"); + return s.toString(); + } +} diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java b/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java new file mode 100644 index 000000000000..074188e01000 --- /dev/null +++ b/media/java/android/media/audiopolicy/AudioVolumeGroupChangeHandler.java @@ -0,0 +1,167 @@ +/* + * 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.media.audiopolicy; + +import android.annotation.NonNull; +import android.media.AudioManager; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Message; + +import com.android.internal.util.Preconditions; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; + +/** + * The AudioVolumeGroupChangeHandler handles AudioManager.OnAudioVolumeGroupChangedListener + * callbacks posted from JNI + * + * TODO: Make use of Executor of callbacks. + * @hide + */ +public class AudioVolumeGroupChangeHandler { + private Handler mHandler; + private HandlerThread mHandlerThread; + private final ArrayList<AudioManager.VolumeGroupCallback> mListeners = + new ArrayList<AudioManager.VolumeGroupCallback>(); + + private static final String TAG = "AudioVolumeGroupChangeHandler"; + + private static final int AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED = 1000; + private static final int AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER = 4; + + /** + * Accessed by native methods: JNI Callback context. + */ + @SuppressWarnings("unused") + private long mJniCallback; + + /** + * Initialization + */ + public void init() { + synchronized (this) { + if (mHandler != null) { + return; + } + // create a new thread for our new event handler + mHandlerThread = new HandlerThread(TAG); + mHandlerThread.start(); + + if (mHandlerThread.getLooper() == null) { + mHandler = null; + return; + } + mHandler = new Handler(mHandlerThread.getLooper()) { + @Override + public void handleMessage(Message msg) { + ArrayList<AudioManager.VolumeGroupCallback> listeners; + synchronized (this) { + if (msg.what == AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER) { + listeners = + new ArrayList<AudioManager.VolumeGroupCallback>(); + if (mListeners.contains(msg.obj)) { + listeners.add( + (AudioManager.VolumeGroupCallback) msg.obj); + } + } else { + listeners = mListeners; + } + } + if (listeners.isEmpty()) { + return; + } + + switch (msg.what) { + case AUDIOVOLUMEGROUP_EVENT_VOLUME_CHANGED: + for (int i = 0; i < listeners.size(); i++) { + listeners.get(i).onAudioVolumeGroupChanged((int) msg.arg1, + (int) msg.arg2); + } + break; + + default: + break; + } + } + }; + native_setup(new WeakReference<AudioVolumeGroupChangeHandler>(this)); + } + } + + private native void native_setup(Object moduleThis); + + @Override + protected void finalize() { + native_finalize(); + if (mHandlerThread.isAlive()) { + mHandlerThread.quit(); + } + } + private native void native_finalize(); + + /** + * @param cb the {@link AudioManager.VolumeGroupCallback} to register + */ + public void registerListener(@NonNull AudioManager.VolumeGroupCallback cb) { + Preconditions.checkNotNull(cb, "volume group callback shall not be null"); + synchronized (this) { + mListeners.add(cb); + } + if (mHandler != null) { + Message m = mHandler.obtainMessage( + AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER, 0, 0, cb); + mHandler.sendMessage(m); + } + } + + /** + * @param cb the {@link AudioManager.VolumeGroupCallback} to unregister + */ + public void unregisterListener(@NonNull AudioManager.VolumeGroupCallback cb) { + Preconditions.checkNotNull(cb, "volume group callback shall not be null"); + synchronized (this) { + mListeners.remove(cb); + } + } + + Handler handler() { + return mHandler; + } + + @SuppressWarnings("unused") + private static void postEventFromNative(Object moduleRef, + int what, int arg1, int arg2, Object obj) { + AudioVolumeGroupChangeHandler eventHandler = + (AudioVolumeGroupChangeHandler) ((WeakReference) moduleRef).get(); + if (eventHandler == null) { + return; + } + + if (eventHandler != null) { + Handler handler = eventHandler.handler(); + if (handler != null) { + Message m = handler.obtainMessage(what, arg1, arg2, obj); + if (what != AUDIOVOLUMEGROUP_EVENT_NEW_LISTENER) { + handler.removeMessages(what); + } + handler.sendMessage(m); + } + } + } +} diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl b/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl new file mode 100644 index 000000000000..918cac39f19a --- /dev/null +++ b/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl @@ -0,0 +1,18 @@ +/* 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.media.audiopolicy; + +parcelable AudioVolumeGroups; diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroups.java b/media/java/android/media/audiopolicy/AudioVolumeGroups.java new file mode 100644 index 000000000000..301bec7a10c4 --- /dev/null +++ b/media/java/android/media/audiopolicy/AudioVolumeGroups.java @@ -0,0 +1,135 @@ +/* + * 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.media.audiopolicy; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.media.AudioSystem; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Log; + +import com.android.internal.util.Preconditions; + +import java.util.ArrayList; +import java.util.Iterator; + +/** + * @hide + * A class to encapsulate a collection of {@link AudioVolumeGroup}. + */ +@SystemApi +public final class AudioVolumeGroups implements Iterable<AudioVolumeGroup>, Parcelable { + + private final ArrayList<AudioVolumeGroup> mAudioVolumeGroupList; + + private static final String TAG = "AudioVolumeGroups"; + + /** + * Volume group value to use when introspection API fails. + */ + public static final int DEFAULT_VOLUME_GROUP = -1; + + public AudioVolumeGroups() { + ArrayList<AudioVolumeGroup> avgList = new ArrayList<AudioVolumeGroup>(); + int status = native_list_audio_volume_groups(avgList); + if (status != AudioSystem.SUCCESS) { + Log.w(TAG, ": listAudioVolumeGroups failed"); + } + mAudioVolumeGroupList = avgList; + } + + private AudioVolumeGroups(@NonNull ArrayList<AudioVolumeGroup> audioVolumeGroupList) { + Preconditions.checkNotNull(audioVolumeGroupList, "audioVolumeGroupList must not be null"); + mAudioVolumeGroupList = audioVolumeGroupList; + } + + /** + * @return number of {@link AudioProductStrategy} objects + */ + public int size() { + return mAudioVolumeGroupList.size(); + } + + /** + * Returns an {@link Iterator} + */ + @Override + public Iterator<AudioVolumeGroup> iterator() { + return mAudioVolumeGroupList.iterator(); + } + + @Override + public boolean equals(@NonNull Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + AudioVolumeGroups that = (AudioVolumeGroups) o; + + return mAudioVolumeGroupList.equals(that.mAudioVolumeGroupList); + } + + /** + * @return the matching {@link AudioVolumeGroup} objects with the given id, + * null object if not found. + */ + public @Nullable AudioVolumeGroup getById(int volumeGroupId) { + for (final AudioVolumeGroup avg : this) { + if (avg.getId() == volumeGroupId) { + return avg; + } + } + Log.e(TAG, ": invalid volume group id: " + volumeGroupId + " requested"); + return null; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(size()); + for (final AudioVolumeGroup volumeGroup : this) { + volumeGroup.writeToParcel(dest, flags); + } + } + + private static native int native_list_audio_volume_groups( + ArrayList<AudioVolumeGroup> groups); + + public static final Parcelable.Creator<AudioVolumeGroups> CREATOR = + new Parcelable.Creator<AudioVolumeGroups>() { + @Override + public @NonNull AudioVolumeGroups createFromParcel(@NonNull Parcel in) { + Preconditions.checkNotNull(in, "in Parcel must not be null"); + ArrayList<AudioVolumeGroup> avgList = new ArrayList<AudioVolumeGroup>(); + int size = in.readInt(); + for (int index = 0; index < size; index++) { + avgList.add(AudioVolumeGroup.CREATOR.createFromParcel(in)); + } + return new AudioVolumeGroups(avgList); + } + + @Override + public @NonNull AudioVolumeGroups[] newArray(int size) { + return new AudioVolumeGroups[size]; + } + }; +} diff --git a/media/java/android/media/projection/IMediaProjectionManager.aidl b/media/java/android/media/projection/IMediaProjectionManager.aidl index 7e10c51fc5cd..d190fcec6c8c 100644 --- a/media/java/android/media/projection/IMediaProjectionManager.aidl +++ b/media/java/android/media/projection/IMediaProjectionManager.aidl @@ -24,6 +24,7 @@ import android.os.IBinder; /** {@hide} */ interface IMediaProjectionManager { + @UnsupportedAppUsage boolean hasProjectionPermission(int uid, String packageName); IMediaProjection createProjection(int uid, String packageName, int type, boolean permanentGrant); diff --git a/media/java/android/media/projection/MediaProjection.java b/media/java/android/media/projection/MediaProjection.java index f9c5b8d729c7..632cfb0f1e30 100644 --- a/media/java/android/media/projection/MediaProjection.java +++ b/media/java/android/media/projection/MediaProjection.java @@ -21,7 +21,6 @@ import android.annotation.Nullable; import android.content.Context; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; -import android.media.AudioRecord; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionCallback; import android.os.Handler; @@ -140,16 +139,6 @@ public final class MediaProjection { } /** - * Creates an AudioRecord to capture audio played back by the system. - * @hide - */ - public AudioRecord createAudioRecord( - int sampleRateInHz, int channelConfig, - int audioFormat, int bufferSizeInBytes) { - return null; - } - - /** * Stops projection. */ public void stop() { diff --git a/media/java/android/media/tv/ITvRemoteServiceInput.aidl b/media/java/android/media/tv/ITvRemoteServiceInput.aidl index df39299c0f93..a0b6c9bfc8d8 100644 --- a/media/java/android/media/tv/ITvRemoteServiceInput.aidl +++ b/media/java/android/media/tv/ITvRemoteServiceInput.aidl @@ -21,13 +21,22 @@ package android.media.tv; */ oneway interface ITvRemoteServiceInput { // InputBridge related + @UnsupportedAppUsage void openInputBridge(IBinder token, String name, int width, int height, int maxPointers); + @UnsupportedAppUsage void closeInputBridge(IBinder token); + @UnsupportedAppUsage void clearInputBridge(IBinder token); + @UnsupportedAppUsage void sendTimestamp(IBinder token, long timestamp); + @UnsupportedAppUsage void sendKeyDown(IBinder token, int keyCode); + @UnsupportedAppUsage void sendKeyUp(IBinder token, int keyCode); + @UnsupportedAppUsage void sendPointerDown(IBinder token, int pointerId, int x, int y); + @UnsupportedAppUsage void sendPointerUp(IBinder token, int pointerId); + @UnsupportedAppUsage void sendPointerSync(IBinder token); }
\ No newline at end of file diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp index 031e373241cb..cfcba76d3af2 100644 --- a/media/jni/android_media_ImageWriter.cpp +++ b/media/jni/android_media_ImageWriter.cpp @@ -18,8 +18,11 @@ #define LOG_TAG "ImageWriter_JNI" #include "android_media_Utils.h" +#include <utils/Condition.h> #include <utils/Log.h> +#include <utils/Mutex.h> #include <utils/String8.h> +#include <utils/Thread.h> #include <gui/IProducerListener.h> #include <gui/Surface.h> @@ -34,6 +37,8 @@ #include <inttypes.h> #include <android/hardware_buffer_jni.h> +#include <deque> + #define IMAGE_BUFFER_JNI_ID "mNativeBuffer" #define IMAGE_FORMAT_UNKNOWN 0 // This is the same value as ImageFormat#UNKNOWN. // ---------------------------------------------------------------------------- @@ -90,14 +95,124 @@ private: int mFormat; int mWidth; int mHeight; + + // Class for a shared thread used to detach buffers from buffer queues + // to discard buffers after consumers are done using them. + // This is needed because detaching buffers in onBufferReleased callback + // can lead to deadlock when consumer/producer are on the same process. + class BufferDetacher { + public: + // Called by JNIImageWriterContext ctor. Will start the thread for first ref. + void addRef(); + // Called by JNIImageWriterContext dtor. Will stop the thread after ref goes to 0. + void removeRef(); + // Called by onBufferReleased to signal this thread to detach a buffer + void detach(wp<Surface>); + + private: + + class DetachThread : public Thread { + public: + DetachThread() : Thread(/*canCallJava*/false) {}; + + void detach(wp<Surface>); + + virtual void requestExit() override; + + private: + virtual bool threadLoop() override; + + Mutex mLock; + Condition mCondition; + std::deque<wp<Surface>> mQueue; + + static const nsecs_t kWaitDuration = 20000000; // 20 ms + }; + sp<DetachThread> mThread; + + Mutex mLock; + int mRefCount = 0; + }; + + static BufferDetacher sBufferDetacher; }; +JNIImageWriterContext::BufferDetacher JNIImageWriterContext::sBufferDetacher; + +void JNIImageWriterContext::BufferDetacher::addRef() { + Mutex::Autolock l(mLock); + mRefCount++; + if (mRefCount == 1) { + mThread = new DetachThread(); + mThread->run("BufDtchThrd"); + } +} + +void JNIImageWriterContext::BufferDetacher::removeRef() { + Mutex::Autolock l(mLock); + mRefCount--; + if (mRefCount == 0) { + mThread->requestExit(); + mThread->join(); + mThread.clear(); + } +} + +void JNIImageWriterContext::BufferDetacher::detach(wp<Surface> bq) { + Mutex::Autolock l(mLock); + if (mThread == nullptr) { + ALOGE("%s: buffer detach thread is gone!", __FUNCTION__); + return; + } + mThread->detach(bq); +} + +void JNIImageWriterContext::BufferDetacher::DetachThread::detach(wp<Surface> bq) { + Mutex::Autolock l(mLock); + mQueue.push_back(bq); + mCondition.signal(); +} + +void JNIImageWriterContext::BufferDetacher::DetachThread::requestExit() { + Thread::requestExit(); + { + Mutex::Autolock l(mLock); + mQueue.clear(); + } + mCondition.signal(); +} + +bool JNIImageWriterContext::BufferDetacher::DetachThread::threadLoop() { + Mutex::Autolock l(mLock); + mCondition.waitRelative(mLock, kWaitDuration); + + while (!mQueue.empty()) { + if (exitPending()) { + return false; + } + + wp<Surface> wbq = mQueue.front(); + mQueue.pop_front(); + sp<Surface> bq = wbq.promote(); + if (bq != nullptr) { + sp<Fence> fence; + sp<GraphicBuffer> buffer; + ALOGV("%s: One buffer is detached", __FUNCTION__); + mLock.unlock(); + bq->detachNextBuffer(&buffer, &fence); + mLock.lock(); + } + } + return !exitPending(); +} + JNIImageWriterContext::JNIImageWriterContext(JNIEnv* env, jobject weakThiz, jclass clazz) : - mWeakThiz(env->NewGlobalRef(weakThiz)), - mClazz((jclass)env->NewGlobalRef(clazz)), - mFormat(0), - mWidth(-1), - mHeight(-1) { + mWeakThiz(env->NewGlobalRef(weakThiz)), + mClazz((jclass)env->NewGlobalRef(clazz)), + mFormat(0), + mWidth(-1), + mHeight(-1) { + sBufferDetacher.addRef(); } JNIImageWriterContext::~JNIImageWriterContext() { @@ -115,6 +230,7 @@ JNIImageWriterContext::~JNIImageWriterContext() { } mProducer.clear(); + sBufferDetacher.removeRef(); } JNIEnv* JNIImageWriterContext::getJNIEnv(bool* needsDetach) { @@ -153,10 +269,7 @@ void JNIImageWriterContext::onBufferReleased() { // need let this callback give a BufferItem, then only detach if it was attached to this // Writer. Do the detach unconditionally for opaque format now. see b/19977520 if (mFormat == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { - sp<Fence> fence; - sp<GraphicBuffer> buffer; - ALOGV("%s: One buffer is detached", __FUNCTION__); - mProducer->detachNextBuffer(&buffer, &fence); + sBufferDetacher.detach(mProducer); } env->CallStaticVoidMethod(mClazz, gImageWriterClassInfo.postEventFromNative, mWeakThiz); diff --git a/packages/CaptivePortalLogin/AndroidManifest.xml b/packages/CaptivePortalLogin/AndroidManifest.xml index 0894ee576a2d..2a4323851068 100644 --- a/packages/CaptivePortalLogin/AndroidManifest.xml +++ b/packages/CaptivePortalLogin/AndroidManifest.xml @@ -17,7 +17,9 @@ */ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.captiveportallogin" > + package="com.android.captiveportallogin" + android:versionCode="10" + android:versionName="Q-initial"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> diff --git a/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml b/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml index 781beaf96264..12993f5b8b7c 100644 --- a/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml +++ b/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml @@ -20,7 +20,7 @@ android:viewportHeight="70.0" android:viewportWidth="70.0"> <path - android:fillColor="@color/car_accent" + android:fillColor="?android:attr/colorAccent" android:fillType="evenOdd" android:pathData="M4,0L66,0A4,4 0,0 1,70 4L70,66A4,4 0,0 1,66 70L4,70A4,4 0,0 1,0 66L0,4A4,4 0,0 1,4 0z" android:strokeColor="#00000000" diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 369bb9fdd9dd..bd0e0b846abf 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -92,6 +92,10 @@ public class CarStatusBar extends StatusBar implements @Override public void start() { + // get the provisioned state before calling the parent class since it's that flow that + // builds the nav bar + mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); + mDeviceIsProvisioned = mDeviceProvisionedController.isDeviceProvisioned(); super.start(); mTaskStackListener = new TaskStackListenerImpl(); mActivityManagerWrapper = ActivityManagerWrapper.getInstance(); @@ -105,8 +109,6 @@ public class CarStatusBar extends StatusBar implements mHvacController.connectToCarService(); CarSystemUIFactory factory = SystemUIFactory.getInstance(); - mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); - mDeviceIsProvisioned = mDeviceProvisionedController.isDeviceProvisioned(); if (!mDeviceIsProvisioned) { mDeviceProvisionedController.addCallback( new DeviceProvisionedController.DeviceProvisionedListener() { diff --git a/packages/NetworkStack/AndroidManifest.xml b/packages/NetworkStack/AndroidManifest.xml index 52c209e5f247..90521de6a453 100644 --- a/packages/NetworkStack/AndroidManifest.xml +++ b/packages/NetworkStack/AndroidManifest.xml @@ -18,7 +18,9 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.networkstack" - android:sharedUserId="android.uid.networkstack"> + android:sharedUserId="android.uid.networkstack" + android:versionCode="10" + android:versionName="Q-initial"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> diff --git a/packages/NetworkStackPermissionStub/AndroidManifest.xml b/packages/NetworkStackPermissionStub/AndroidManifest.xml index a8742d7ab34f..ba8a178eaea4 100644 --- a/packages/NetworkStackPermissionStub/AndroidManifest.xml +++ b/packages/NetworkStackPermissionStub/AndroidManifest.xml @@ -18,7 +18,9 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.networkstack.permissionstub" - android:sharedUserId="android.uid.networkstack"> + android:sharedUserId="android.uid.networkstack" + android:versionCode="10" + android:versionName="Q-initial"> <!-- This package only exists to define the below permissions, and enforce that they are only granted to apps sharing the same signature. diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt index 337106bb5f1b..911cfcd115f4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt +++ b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt @@ -87,7 +87,8 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) invalidateSelf() } - open var criticalLevel: Int = 0 + open var criticalLevel: Int = context.resources.getInteger( + com.android.internal.R.integer.config_criticalBatteryWarningLevel) var charging = false set(value) { @@ -101,46 +102,40 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) postInvalidate() } - private val fillColorStrokePaint: Paint by lazy { - val p = Paint(Paint.ANTI_ALIAS_FLAG) + private val fillColorStrokePaint = Paint(Paint.ANTI_ALIAS_FLAG).also { p -> p.color = frameColor p.isDither = true p.strokeWidth = 5f p.style = Paint.Style.STROKE p.blendMode = BlendMode.SRC p.strokeMiter = 5f - p + p.strokeJoin = Paint.Join.ROUND } - private val fillColorStrokeProtection: Paint by lazy { - val p = Paint(Paint.ANTI_ALIAS_FLAG) + private val fillColorStrokeProtection = Paint(Paint.ANTI_ALIAS_FLAG).also { p -> p.isDither = true p.strokeWidth = 5f p.style = Paint.Style.STROKE p.blendMode = BlendMode.CLEAR p.strokeMiter = 5f - p + p.strokeJoin = Paint.Join.ROUND } - private val fillPaint: Paint by lazy { - val p = Paint(Paint.ANTI_ALIAS_FLAG) + private val fillPaint = Paint(Paint.ANTI_ALIAS_FLAG).also { p -> p.color = frameColor p.alpha = 255 p.isDither = true p.strokeWidth = 0f p.style = Paint.Style.FILL_AND_STROKE - p } // Only used if dualTone is set to true - private val dualToneBackgroundFill: Paint by lazy { - val p = Paint(Paint.ANTI_ALIAS_FLAG) + private val dualToneBackgroundFill = Paint(Paint.ANTI_ALIAS_FLAG).also { p -> p.color = frameColor p.alpha = 255 p.isDither = true p.strokeWidth = 0f p.style = Paint.Style.FILL_AND_STROKE - p } init { @@ -165,9 +160,6 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) levels.recycle() colors.recycle() - criticalLevel = context.resources.getInteger( - com.android.internal.R.integer.config_criticalBatteryWarningLevel) - loadPaths() } @@ -254,7 +246,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) private fun batteryColorForLevel(level: Int): Int { return when { - charging || powerSaveEnabled -> fillPaint.color + charging || powerSaveEnabled -> fillColor else -> getColorForLevel(level) } } @@ -347,6 +339,9 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) backgroundColor = bgColor dualToneBackgroundFill.color = bgColor + // Also update the level color, since fillColor may have changed + levelColor = batteryColorForLevel(level) + invalidateSelf() } @@ -360,7 +355,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) if (b.isEmpty) { scaleMatrix.setScale(1f, 1f) } else { - scaleMatrix.setScale((b.right / Companion.WIDTH), (b.bottom / Companion.HEIGHT)) + scaleMatrix.setScale((b.right / WIDTH), (b.bottom / HEIGHT)) } perimeterPath.transform(scaleMatrix, scaledPerimeter) @@ -368,6 +363,14 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) scaledFill.computeBounds(fillRect, true) boltPath.transform(scaleMatrix, scaledBolt) plusPath.transform(scaleMatrix, scaledPlus) + + // It is expected that this view only ever scale by the same factor in each dimension, so + // just pick one to scale the strokeWidths + val scaledStrokeWidth = + Math.max(b.right / WIDTH * PROTECTION_STROKE_WIDTH, PROTECTION_MIN_STROKE_WIDTH) + + fillColorStrokePaint.strokeWidth = scaledStrokeWidth + fillColorStrokeProtection.strokeWidth = scaledStrokeWidth } private fun loadPaths() { @@ -400,5 +403,10 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) private const val WIDTH = 12f private const val HEIGHT = 20f private const val CRITICAL_LEVEL = 15 + // On a 12x20 grid, how wide to make the fill protection stroke. + // Scales when our size changes + private const val PROTECTION_STROKE_WIDTH = 1.4f + // Arbitrarily chosen for visibility at small sizes + private const val PROTECTION_MIN_STROKE_WIDTH = 5f } } diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 26ea6ab2e8be..65e0c0fbc991 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -40,8 +40,8 @@ <bool name="def_wifi_display_on">false</bool> <bool name="def_install_non_market_apps">false</bool> <bool name="def_package_verifier_enable">true</bool> - <!-- Comma-separated list of location providers --> - <string name="def_location_providers_allowed" translatable="false">gps,network</string> + <!-- 0 == off, 3 == on --> + <integer name="def_location_mode">3</integer> <bool name="assisted_gps_enabled">true</bool> <bool name="def_netstats_enabled">true</bool> <bool name="def_usb_mass_storage_enabled">true</bool> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 0ee16a9e9ed2..5e2b7c86ee93 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -2340,9 +2340,6 @@ class DatabaseHelper extends SQLiteOpenHelper { stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)" + " VALUES(?,?);"); - loadStringSetting(stmt, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, - R.string.def_location_providers_allowed); - // Don't do this. The SystemServer will initialize ADB_ENABLED from a // persistent system property instead. //loadSetting(stmt, Settings.Secure.ADB_ENABLED, 0); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index ceafbfa4da15..d6c33a3b077c 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -969,6 +969,11 @@ public class SettingsProvider extends ContentProvider { try { synchronized (mLock) { Setting setting = getSecureSetting( + Settings.Secure.LOCATION_MODE, userId); + updateSecureSetting(Settings.Secure.LOCATION_MODE, + setting != null ? setting.getValue() : null, null, + true, userId, true); + setting = getSecureSetting( Settings.Secure.LOCATION_PROVIDERS_ALLOWED, userId); updateSecureSetting(Settings.Secure.LOCATION_PROVIDERS_ALLOWED, setting != null ? setting.getValue() : null, null, @@ -4229,23 +4234,18 @@ public class SettingsProvider extends ContentProvider { final Setting locationProvidersAllowed = secureSettings.getSettingLocked( Secure.LOCATION_PROVIDERS_ALLOWED); - String defLocationMode = Integer.toString( - !TextUtils.isEmpty(locationProvidersAllowed.getValue()) - ? Secure.LOCATION_MODE_ON - : Secure.LOCATION_MODE_OFF); - secureSettings.insertSettingLocked( - Secure.LOCATION_MODE, defLocationMode, - null, true, SettingsState.SYSTEM_PACKAGE_NAME); - - // also reset LOCATION_PROVIDERS_ALLOWED back to the default value - this - // setting is now only for debug/test purposes, and will likely be removed - // in a later release. LocationManagerService is responsible for adjusting - // these settings to the proper state. - - String defLocationProvidersAllowed = getContext().getResources().getString( - R.string.def_location_providers_allowed); + final int defLocationMode; + if (locationProvidersAllowed.isNull()) { + defLocationMode = getContext().getResources().getInteger( + R.integer.def_location_mode); + } else { + defLocationMode = + !TextUtils.isEmpty(locationProvidersAllowed.getValue()) + ? Secure.LOCATION_MODE_ON + : Secure.LOCATION_MODE_OFF; + } secureSettings.insertSettingLocked( - Secure.LOCATION_PROVIDERS_ALLOWED, defLocationProvidersAllowed, + Secure.LOCATION_MODE, Integer.toString(defLocationMode), null, true, SettingsState.SYSTEM_PACKAGE_NAME); } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java index 38bf77d5eb0e..7b7657a3d646 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java @@ -13,6 +13,7 @@ */ package com.android.systemui.plugins; +import android.graphics.Bitmap; import android.graphics.Paint.Style; import android.view.View; @@ -21,13 +22,30 @@ import com.android.systemui.plugins.annotations.ProvidesInterface; import java.util.TimeZone; /** - * This plugin is used to replace main clock in keyguard. + * Plugin used to replace main clock in keyguard. */ @ProvidesInterface(action = ClockPlugin.ACTION, version = ClockPlugin.VERSION) public interface ClockPlugin extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_CLOCK"; - int VERSION = 1; + int VERSION = 2; + + /** + * Get the name of the clock face. + * + * This name should not be translated. + */ + String getName(); + + /** + * Get the title of the clock face to be shown in the picker app. + */ + String getTitle(); + + /** + * Get thumbnail of clock face to be shown in the picker app. + */ + Bitmap getThumbnail(); /** * Get clock view. @@ -62,18 +80,22 @@ public interface ClockPlugin extends Plugin { default void setColorPalette(boolean supportsDarkText, int[] colors) {} /** - * Notifies that time tick alarm from doze service fired. - */ - default void dozeTimeTick() {} - - /** * Set the amount (ratio) that the device has transitioned to doze. * @param darkAmount Amount of transition to doze: 1f for doze and 0f for awake. */ default void setDarkAmount(float darkAmount) {} /** + * Notifies that time tick alarm from doze service fired. + * + * Implement this method instead of registering a broadcast listener for TIME_TICK. + */ + default void onTimeTick() {} + + /** * Notifies that the time zone has changed. + * + * Implement this method instead of registering a broadcast listener for TIME_ZONE_CHANGED. */ default void onTimeZoneChanged(TimeZone timeZone) {} diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml index d3c3a518f6ac..a2404b0834e9 100644 --- a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml +++ b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml @@ -1,9 +1,9 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="200dp" - android:width="200dp" - android:viewportHeight="100" - android:viewportWidth="100"> + android:height="350dp" + android:width="350dp" + android:viewportHeight="254.66145" + android:viewportWidth="254.66145"> <path android:fillColor="#000000" - android:pathData="M50.082,14.199m-13.985,0a13.985,13.985 0,1 1,27.97 0a13.985,13.985 0,1 1,-27.97 0"/> + android:pathData="M127.331,40.481m-10.914,0a10.914,10.914 0,1 1,21.828 0a10.914,10.914 0,1 1,-21.828 0"/> </vector> diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml index a4417fb65da4..be10b5d12af7 100644 --- a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml +++ b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml @@ -1,9 +1,11 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="200dp" - android:width="200dp" - android:viewportHeight="100" - android:viewportWidth="100" > + android:height="350dp" + android:width="350dp" + android:viewportHeight="254.66145" + android:viewportWidth="254.66145" > <path - android:fillColor="#000000" - android:pathData="M50.082,0.025L50.082,0.025A13.985,15.63 0,0 1,64.067 15.656L64.067,49.029A13.985,15.63 0,0 1,50.082 64.659L50.082,64.659A13.985,15.63 0,0 1,36.097 49.029L36.097,15.656A13.985,15.63 0,0 1,50.082 0.025z"/> + android:strokeColor="#000000" + android:strokeWidth="5" + android:pathData="M125.923,29.692L128.739,29.692A27.108,30.579 0,0 1,155.847 60.271L155.847,125.268A27.108,30.579 0,0 1,128.739 155.847L125.923,155.847A27.108,30.579 0,0 1,98.815 125.268L98.815,60.271A27.108,30.579 0,0 1,125.923 29.692z"/> </vector> + diff --git a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml index c8dc8e43893c..0bc13199d71e 100644 --- a/packages/SystemUI/res-keyguard/layout/bubble_clock.xml +++ b/packages/SystemUI/res-keyguard/layout/bubble_clock.xml @@ -42,15 +42,15 @@ > <ImageView android:id="@+id/minute_hand" - android:layout_width="300dp" - android:layout_height="300dp" + android:layout_width="350dp" + android:layout_height="350dp" android:src="@drawable/bubble_minute_hand" android:tint="@color/bubbleMinuteHandColor" /> <ImageView android:id="@+id/hour_hand" - android:layout_width="300dp" - android:layout_height="300dp" + android:layout_width="350dp" + android:layout_height="350dp" android:src="@drawable/bubble_hour_hand" android:tint="@color/bubbleHourHandColor" /> diff --git a/packages/SystemUI/res-keyguard/layout/default_clock_preview.xml b/packages/SystemUI/res-keyguard/layout/default_clock_preview.xml new file mode 100644 index 000000000000..3e6dd13e4b9f --- /dev/null +++ b/packages/SystemUI/res-keyguard/layout/default_clock_preview.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + > + <TextClock + android:id="@+id/time" + style="@style/widget_big" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@id/date" + android:letterSpacing="0.03" + android:gravity="center_horizontal" + android:format12Hour="@string/keyguard_widget_12_hours_format" + android:format24Hour="@string/keyguard_widget_24_hours_format" + /> + + <TextClock + android:id="@+id/date" + style="@stype/widget_big" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:letterSpacing="0.03" + android:gravity="center_horizontal" + android:format12Hour="EEE, MMM d" + android:format24Hour="EEE, MMM d" + /> +</RelativeLayout> diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index 91353d7fb8ba..863c1ccd7eaf 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -178,6 +178,7 @@ asked for it --> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" + android:maxWidth="100dp" style="@style/TextAppearance.NotificationInfo.Button"/> <LinearLayout @@ -186,6 +187,7 @@ asked for it --> android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_alignParentEnd="true" + android:maxWidth="200dp" android:orientation="horizontal"> <TextView android:id="@+id/deliver_silently" @@ -195,6 +197,7 @@ asked for it --> android:layout_centerVertical="true" android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing" android:paddingRight="24dp" + android:maxWidth="125dp" style="@style/TextAppearance.NotificationInfo.Button"/> <TextView android:id="@+id/block" @@ -203,6 +206,7 @@ asked for it --> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" + android:maxWidth="75dp" android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing" style="@style/TextAppearance.NotificationInfo.Button"/> <TextView @@ -212,6 +216,7 @@ asked for it --> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" + android:maxWidth="75dp" android:layout_marginStart="@dimen/notification_guts_button_horizontal_spacing" style="@style/TextAppearance.NotificationInfo.Button"/> </LinearLayout> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 4905e572af1d..d53c78543b65 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1579,7 +1579,7 @@ <string name="inline_blocking_helper">You usually dismiss these notifications. \nKeep showing them?</string> - <!-- Notification Inline controls: button to dismiss the blocking helper [CHAR_LIMIT=25] --> + <!-- Notification Inline controls: button to dismiss the blocking helper [CHAR_LIMIT=20] --> <string name="inline_done_button">Done</string> <!-- Notification Inline controls: continue receiving notifications prompt, channel level --> @@ -1588,7 +1588,7 @@ <!-- Notification inline controls: block notifications button [CHAR_LIMIT=25] --> <string name="inline_stop_button">Stop notifications</string> - <!-- Notification inline controls: button to deliver notifications silently from this channel [CHAR_LIMIT=35] --> + <!-- Notification inline controls: button to deliver notifications silently from this channel [CHAR_LIMIT=30] --> <string name="inline_deliver_silently_button">Deliver Silently</string> <!-- Notification inline controls: button to block notifications from this channel [CHAR_LIMIT=20] --> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 3d2f61ea027f..c54a4699964d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -48,6 +48,21 @@ public abstract class TaskStackChangeListener { onActivityLaunchOnSecondaryDisplayFailed(); } + /** + * @see #onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) + */ + public void onActivityLaunchOnSecondaryDisplayRerouted() { } + + /** + * Called when an activity was requested to be launched on a secondary display but was rerouted + * to default display. + * + * @param taskInfo info about the Activity's task + */ + public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo) { + onActivityLaunchOnSecondaryDisplayRerouted(); + } + public void onTaskProfileLocked(int taskId, int userId) { } public void onTaskCreated(int taskId, ComponentName componentName) { } public void onTaskRemoved(int taskId) { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index a9ac42f5be1e..7e4ab854adcf 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -141,6 +141,13 @@ public class TaskStackChangeListeners extends TaskStackListener { } @Override + public void onActivityLaunchOnSecondaryDisplayRerouted(RunningTaskInfo taskInfo, + int requestedDisplayId) throws RemoteException { + mHandler.obtainMessage(H.ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED, + requestedDisplayId, 0 /* unused */, taskInfo).sendToTarget(); + } + + @Override public void onTaskProfileLocked(int taskId, int userId) throws RemoteException { mHandler.obtainMessage(H.ON_TASK_PROFILE_LOCKED, taskId, userId).sendToTarget(); } @@ -189,6 +196,7 @@ public class TaskStackChangeListeners extends TaskStackListener { private static final int ON_TASK_REMOVED = 13; private static final int ON_TASK_MOVED_TO_FRONT = 14; private static final int ON_ACTIVITY_REQUESTED_ORIENTATION_CHANGE = 15; + private static final int ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED = 16; public H(Looper looper) { @@ -270,6 +278,14 @@ public class TaskStackChangeListeners extends TaskStackListener { } break; } + case ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED: { + final RunningTaskInfo info = (RunningTaskInfo) msg.obj; + for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { + mTaskStackListeners.get(i) + .onActivityLaunchOnSecondaryDisplayRerouted(info); + } + break; + } case ON_TASK_PROFILE_LOCKED: { for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { mTaskStackListeners.get(i).onTaskProfileLocked(msg.arg1, msg.arg2); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index 8de84bf4e2af..563b0077c7f4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -279,7 +279,7 @@ public class KeyguardClockSwitch extends RelativeLayout { */ public void dozeTimeTick() { if (mClockPlugin != null) { - mClockPlugin.dozeTimeTick(); + mClockPlugin.onTimeTick(); } } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java index 3114708de038..870ac8778f76 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java @@ -15,6 +15,9 @@ */ package com.android.keyguard.clock; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Paint.Style; import android.view.LayoutInflater; import android.view.View; @@ -31,6 +34,16 @@ import java.util.TimeZone; public class BubbleClockController implements ClockPlugin { /** + * Resources used to get title and thumbnail. + */ + private final Resources mResources; + + /** + * LayoutInflater used to inflate custom clock views. + */ + private final LayoutInflater mLayoutInflater; + + /** * Custom clock shown on AOD screen and behind stack scroller on lock. */ private View mView; @@ -48,25 +61,22 @@ public class BubbleClockController implements ClockPlugin { */ private CrossFadeDarkController mDarkController; - private BubbleClockController() { } - /** * Create a BubbleClockController instance. * * @param layoutInflater Inflater used to inflate custom clock views. */ - public static BubbleClockController build(LayoutInflater layoutInflater) { - BubbleClockController controller = new BubbleClockController(); - controller.createViews(layoutInflater); - return controller; + public BubbleClockController(Resources res, LayoutInflater inflater) { + mResources = res; + mLayoutInflater = inflater; } - private void createViews(LayoutInflater layoutInflater) { - mView = layoutInflater.inflate(R.layout.bubble_clock, null); + private void createViews() { + mView = mLayoutInflater.inflate(R.layout.bubble_clock, null); mDigitalClock = (TextClock) mView.findViewById(R.id.digital_clock); mAnalogClock = (ImageClock) mView.findViewById(R.id.analog_clock); - mLockClockContainer = layoutInflater.inflate(R.layout.digital_clock, null); + mLockClockContainer = mLayoutInflater.inflate(R.layout.digital_clock, null); mLockClock = (TextClock) mLockClockContainer.findViewById(R.id.lock_screen_clock); mLockClock.setVisibility(View.GONE); @@ -74,12 +84,33 @@ public class BubbleClockController implements ClockPlugin { } @Override + public String getName() { + return "bubble"; + } + + @Override + public String getTitle() { + return mResources.getString(R.string.clock_title_bubble); + } + + @Override + public Bitmap getThumbnail() { + return BitmapFactory.decodeResource(mResources, R.drawable.bubble_thumbnail); + } + + @Override public View getView() { + if (mLockClockContainer == null) { + createViews(); + } return mLockClockContainer; } @Override public View getBigClockView() { + if (mView == null) { + createViews(); + } return mView; } @@ -103,13 +134,13 @@ public class BubbleClockController implements ClockPlugin { } @Override - public void dozeTimeTick() { - mAnalogClock.onTimeChanged(); + public void setDarkAmount(float darkAmount) { + mDarkController.setDarkAmount(darkAmount); } @Override - public void setDarkAmount(float darkAmount) { - mDarkController.setDarkAmount(darkAmount); + public void onTimeTick() { + mAnalogClock.onTimeChanged(); } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 3827e445c136..294c725af481 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -23,7 +23,6 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; -import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.Handler; @@ -31,6 +30,7 @@ import android.os.Looper; import android.provider.Settings; import android.util.ArrayMap; import android.util.DisplayMetrics; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.MeasureSpec; @@ -39,17 +39,19 @@ import android.view.ViewGroup; import androidx.annotation.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; -import com.android.keyguard.R; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager.DockEventListener; import com.android.systemui.plugins.ClockPlugin; +import com.android.systemui.plugins.PluginListener; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.util.InjectionInflationController; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.function.Supplier; +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; import javax.inject.Inject; import javax.inject.Singleton; @@ -60,26 +62,49 @@ import javax.inject.Singleton; @Singleton public final class ClockManager { + private static final String TAG = "ClockOptsProvider"; + private static final String DEFAULT_CLOCK_ID = "default"; + private final List<ClockInfo> mClockInfos = new ArrayList<>(); /** * Map from expected value stored in settings to supplier of custom clock face. */ - private final Map<String, Supplier<ClockPlugin>> mClocks = new ArrayMap<>(); + private final Map<String, ClockPlugin> mClocks = new ArrayMap<>(); @Nullable private ClockPlugin mCurrentClock; private final ContentResolver mContentResolver; private final SettingsWrapper mSettingsWrapper; + private final Handler mMainHandler = new Handler(Looper.getMainLooper()); + /** * Observe settings changes to know when to switch the clock face. */ private final ContentObserver mContentObserver = - new ContentObserver(new Handler(Looper.getMainLooper())) { + new ContentObserver(mMainHandler) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); reload(); } }; + + private final PluginListener<ClockPlugin> mClockPluginListener = + new PluginListener<ClockPlugin>() { + @Override + public void onPluginConnected(ClockPlugin plugin, Context pluginContext) { + addClockPlugin(plugin); + reload(); + } + + @Override + public void onPluginDisconnected(ClockPlugin plugin) { + removeClockPlugin(plugin); + reload(); + } + }; + + private final PluginManager mPluginManager; + /** * Observe changes to dock state to know when to switch the clock face. */ @@ -107,56 +132,29 @@ public final class ClockManager { @Inject public ClockManager(Context context, InjectionInflationController injectionInflater, - @Nullable DockManager dockManager, SysuiColorExtractor colorExtractor) { - this(context, injectionInflater, dockManager, colorExtractor, context.getContentResolver(), - new SettingsWrapper(context.getContentResolver())); + PluginManager pluginManager, @Nullable DockManager dockManager, + SysuiColorExtractor colorExtractor) { + this(context, injectionInflater, pluginManager, dockManager, colorExtractor, + context.getContentResolver(), new SettingsWrapper(context.getContentResolver())); } ClockManager(Context context, InjectionInflationController injectionInflater, - @Nullable DockManager dockManager, SysuiColorExtractor colorExtractor, - ContentResolver contentResolver, SettingsWrapper settingsWrapper) { + PluginManager pluginManager, @Nullable DockManager dockManager, + SysuiColorExtractor colorExtractor, ContentResolver contentResolver, + SettingsWrapper settingsWrapper) { + mPluginManager = pluginManager; mDockManager = dockManager; mColorExtractor = colorExtractor; mContentResolver = contentResolver; mSettingsWrapper = settingsWrapper; Resources res = context.getResources(); - mClockInfos.add(ClockInfo.builder() - .setName("default") - .setTitle(res.getString(R.string.clock_title_default)) - .setId("default") - .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.default_thumbnail)) - .setPreview(() -> BitmapFactory.decodeResource(res, R.drawable.default_preview)) - .build()); - mClockInfos.add(ClockInfo.builder() - .setName("bubble") - .setTitle(res.getString(R.string.clock_title_bubble)) - .setId(BubbleClockController.class.getName()) - .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.bubble_thumbnail)) - .setPreview(() -> getClockPreview(BubbleClockController.class.getName())) - .build()); - mClockInfos.add(ClockInfo.builder() - .setName("stretch") - .setTitle(res.getString(R.string.clock_title_stretch)) - .setId(StretchAnalogClockController.class.getName()) - .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.stretch_thumbnail)) - .setPreview(() -> getClockPreview(StretchAnalogClockController.class.getName())) - .build()); - mClockInfos.add(ClockInfo.builder() - .setName("type") - .setTitle(res.getString(R.string.clock_title_type)) - .setId(TypeClockController.class.getName()) - .setThumbnail(() -> BitmapFactory.decodeResource(res, R.drawable.type_thumbnail)) - .setPreview(() -> getClockPreview(TypeClockController.class.getName())) - .build()); - LayoutInflater layoutInflater = injectionInflater.injectable(LayoutInflater.from(context)); - mClocks.put(BubbleClockController.class.getName(), - () -> BubbleClockController.build(layoutInflater)); - mClocks.put(StretchAnalogClockController.class.getName(), - () -> StretchAnalogClockController.build(layoutInflater)); - mClocks.put(TypeClockController.class.getName(), - () -> TypeClockController.build(layoutInflater)); + + addClockPlugin(new DefaultClockController(res, layoutInflater)); + addClockPlugin(new BubbleClockController(res, layoutInflater)); + addClockPlugin(new StretchAnalogClockController(res, layoutInflater)); + addClockPlugin(new TypeClockController(res, layoutInflater)); // Store the size of the display for generation of clock preview. DisplayMetrics dm = res.getDisplayMetrics(); @@ -211,6 +209,29 @@ public final class ClockManager { return mContentObserver; } + private void addClockPlugin(ClockPlugin plugin) { + final String id = plugin.getClass().getName(); + mClocks.put(plugin.getClass().getName(), plugin); + mClockInfos.add(ClockInfo.builder() + .setName(plugin.getName()) + .setTitle(plugin.getTitle()) + .setId(id) + .setThumbnail(() -> plugin.getThumbnail()) + .setPreview(() -> getClockPreview(id)) + .build()); + } + + private void removeClockPlugin(ClockPlugin plugin) { + final String id = plugin.getClass().getName(); + mClocks.remove(id); + for (int i = 0; i < mClockInfos.size(); i++) { + if (id.equals(mClockInfos.get(i).getId())) { + mClockInfos.remove(i); + break; + } + } + } + /** * Generate a realistic preview of a clock face. * @param clockId ID of clock to use for preview, should be obtained from {@link getClockInfos}. @@ -218,38 +239,54 @@ public final class ClockManager { */ @Nullable private Bitmap getClockPreview(String clockId) { - Supplier<ClockPlugin> supplier = mClocks.get(clockId); - if (supplier == null) { - return null; + FutureTask<Bitmap> task = new FutureTask<>(new Callable<Bitmap>() { + @Override + public Bitmap call() { + Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888); + ClockPlugin plugin = mClocks.get(clockId); + if (plugin == null) { + return null; + } + + // Use the big clock view for the preview + View clockView = plugin.getBigClockView(); + if (clockView == null) { + return null; + } + + // Initialize state of plugin before generating preview. + plugin.setDarkAmount(1f); + plugin.setTextColor(Color.WHITE); + + ColorExtractor.GradientColors colors = mColorExtractor.getColors( + WallpaperManager.FLAG_LOCK, true); + plugin.setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); + plugin.onTimeTick(); + + // Draw clock view hierarchy to canvas. + Canvas canvas = new Canvas(bitmap); + canvas.drawColor(Color.BLACK); + dispatchVisibilityAggregated(clockView, true); + clockView.measure(MeasureSpec.makeMeasureSpec(mWidth, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY)); + clockView.layout(0, 0, mWidth, mHeight); + clockView.draw(canvas); + return bitmap; + } + }); + + if (Looper.myLooper() == Looper.getMainLooper()) { + task.run(); + } else { + mMainHandler.post(task); } - ClockPlugin plugin = supplier.get(); - // Use the big clock view for the preview - View clockView = plugin.getBigClockView(); - if (clockView == null) { + try { + return task.get(); + } catch (Exception e) { + Log.e(TAG, "Error completing task", e); return null; } - - // Initialize state of plugin before generating preview. - plugin.setDarkAmount(1f); - plugin.setTextColor(Color.WHITE); - - ColorExtractor.GradientColors colors = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, - true); - plugin.setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); - plugin.dozeTimeTick(); - - // Draw clock view hierarchy to canvas. - Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - dispatchVisibilityAggregated(clockView, true); - clockView.measure(MeasureSpec.makeMeasureSpec(mWidth, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY)); - clockView.layout(0, 0, mWidth, mHeight); - canvas.drawColor(Color.BLACK); - clockView.draw(canvas); - - return bitmap; } private void dispatchVisibilityAggregated(View view, boolean isVisible) { @@ -279,6 +316,7 @@ public final class ClockManager { } private void register() { + mPluginManager.addPluginListener(mClockPluginListener, ClockPlugin.class, true); mContentResolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE), false, mContentObserver); @@ -291,6 +329,7 @@ public final class ClockManager { } private void unregister() { + mPluginManager.removePluginListener(mClockPluginListener); mContentResolver.unregisterContentObserver(mContentObserver); if (mDockManager != null) { mDockManager.removeListener(mDockEventListener); @@ -299,7 +338,11 @@ public final class ClockManager { private void reload() { mCurrentClock = getClockPlugin(); - notifyClockChanged(mCurrentClock); + if (mCurrentClock instanceof DefaultClockController) { + notifyClockChanged(null); + } else { + notifyClockChanged(mCurrentClock); + } } private ClockPlugin getClockPlugin() { @@ -307,21 +350,15 @@ public final class ClockManager { if (mIsDocked) { final String name = mSettingsWrapper.getDockedClockFace(); if (name != null) { - Supplier<ClockPlugin> supplier = mClocks.get(name); - if (supplier != null) { - plugin = supplier.get(); - if (plugin != null) { - return plugin; - } + plugin = mClocks.get(name); + if (plugin != null) { + return plugin; } } } final String name = mSettingsWrapper.getLockScreenCustomClockFace(); if (name != null) { - Supplier<ClockPlugin> supplier = mClocks.get(name); - if (supplier != null) { - plugin = supplier.get(); - } + plugin = mClocks.get(name); } return plugin; } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java new file mode 100644 index 000000000000..8a6a4cd95991 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java @@ -0,0 +1,131 @@ +/* + * 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.keyguard.clock; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Paint.Style; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import com.android.keyguard.R; +import com.android.systemui.plugins.ClockPlugin; + +import java.util.TimeZone; + +/** + * Plugin for the default clock face used only to provide a preview. + */ +public class DefaultClockController implements ClockPlugin { + + /** + * Resources used to get title and thumbnail. + */ + private final Resources mResources; + + /** + * LayoutInflater used to inflate custom clock views. + */ + private final LayoutInflater mLayoutInflater; + + /** + * Root view of preview. + */ + private View mView; + + /** + * Text clock in preview view hierarchy. + */ + private TextView mTextTime; + + /** + * Date showing below time in preview view hierarchy. + */ + private TextView mTextDate; + + /** + * Create a DefaultClockController instance. + * + * @param inflater Inflater used to inflate custom clock views. + */ + public DefaultClockController(Resources res, LayoutInflater inflater) { + mResources = res; + mLayoutInflater = inflater; + } + + private void createViews() { + mView = mLayoutInflater.inflate(R.layout.default_clock_preview, null); + mTextTime = mView.findViewById(R.id.time); + mTextDate = mView.findViewById(R.id.date); + } + + @Override + public String getName() { + return "default"; + } + + @Override + public String getTitle() { + return mResources.getString(R.string.clock_title_default); + } + + @Override + public Bitmap getThumbnail() { + return BitmapFactory.decodeResource(mResources, R.drawable.default_thumbnail); + } + + @Override + public View getView() { + return null; + } + + @Override + public View getBigClockView() { + if (mView == null) { + createViews(); + } + return mView; + } + + @Override + public void setStyle(Style style) {} + + @Override + public void setTextColor(int color) { + mTextTime.setTextColor(color); + mTextDate.setTextColor(color); + } + + @Override + public void setColorPalette(boolean supportsDarkText, int[] colorPalette) {} + + @Override + public void onTimeTick() { + } + + @Override + public void setDarkAmount(float darkAmount) {} + + @Override + public void onTimeZoneChanged(TimeZone timeZone) {} + + @Override + public boolean shouldShowStatusArea() { + return true; + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java index c4651149521c..7401819fde4d 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/StretchAnalogClockController.java @@ -15,6 +15,9 @@ */ package com.android.keyguard.clock; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Paint.Style; import android.view.LayoutInflater; import android.view.View; @@ -31,6 +34,16 @@ import java.util.TimeZone; public class StretchAnalogClockController implements ClockPlugin { /** + * Resources used to get title and thumbnail. + */ + private final Resources mResources; + + /** + * LayoutInflater used to inflate custom clock views. + */ + private final LayoutInflater mLayoutInflater; + + /** * Custom clock shown on AOD screen and behind stack scroller on lock. */ private View mBigClockView; @@ -48,25 +61,22 @@ public class StretchAnalogClockController implements ClockPlugin { */ private CrossFadeDarkController mDarkController; - private StretchAnalogClockController() { } - /** * Create a BubbleClockController instance. * * @param layoutInflater Inflater used to inflate custom clock views. */ - public static StretchAnalogClockController build(LayoutInflater layoutInflater) { - StretchAnalogClockController controller = new StretchAnalogClockController(); - controller.createViews(layoutInflater); - return controller; + public StretchAnalogClockController(Resources res, LayoutInflater inflater) { + mResources = res; + mLayoutInflater = inflater; } - private void createViews(LayoutInflater layoutInflater) { - mBigClockView = layoutInflater.inflate(R.layout.stretchanalog_clock, null); + private void createViews() { + mBigClockView = mLayoutInflater.inflate(R.layout.stretchanalog_clock, null); mAnalogClock = mBigClockView.findViewById(R.id.analog_clock); mDigitalClock = mBigClockView.findViewById(R.id.digital_clock); - mView = layoutInflater.inflate(R.layout.digital_clock, null); + mView = mLayoutInflater.inflate(R.layout.digital_clock, null); mLockClock = mView.findViewById(R.id.lock_screen_clock); mLockClock.setVisibility(View.GONE); @@ -74,12 +84,33 @@ public class StretchAnalogClockController implements ClockPlugin { } @Override + public String getName() { + return "stretch"; + } + + @Override + public String getTitle() { + return mResources.getString(R.string.clock_title_stretch); + } + + @Override + public Bitmap getThumbnail() { + return BitmapFactory.decodeResource(mResources, R.drawable.stretch_thumbnail); + } + + @Override public View getView() { + if (mView == null) { + createViews(); + } return mView; } @Override public View getBigClockView() { + if (mBigClockView == null) { + createViews(); + } return mBigClockView; } @@ -103,7 +134,7 @@ public class StretchAnalogClockController implements ClockPlugin { } @Override - public void dozeTimeTick() { + public void onTimeTick() { mAnalogClock.onTimeChanged(); } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java index 2ea39c40bee2..69f86c7886d3 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/TypeClockController.java @@ -15,6 +15,9 @@ */ package com.android.keyguard.clock; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Paint.Style; import android.view.LayoutInflater; import android.view.View; @@ -30,6 +33,16 @@ import java.util.TimeZone; public class TypeClockController implements ClockPlugin { /** + * Resources used to get title and thumbnail. + */ + private final Resources mResources; + + /** + * LayoutInflater used to inflate custom clock views. + */ + private final LayoutInflater mLayoutInflater; + + /** * Custom clock shown on AOD screen and behind stack scroller on lock. */ private View mView; @@ -45,36 +58,54 @@ public class TypeClockController implements ClockPlugin { */ private CrossFadeDarkController mDarkController; - private TypeClockController() {} - /** * Create a TypeClockController instance. * * @param inflater Inflater used to inflate custom clock views. */ - public static TypeClockController build(LayoutInflater inflater) { - TypeClockController controller = new TypeClockController(); - controller.createViews(inflater); - return controller; + TypeClockController(Resources res, LayoutInflater inflater) { + mResources = res; + mLayoutInflater = inflater; } - private void createViews(LayoutInflater inflater) { - mView = inflater.inflate(R.layout.type_clock, null); + private void createViews() { + mView = mLayoutInflater.inflate(R.layout.type_clock, null); mTypeClock = mView.findViewById(R.id.type_clock); // For now, this view is used to hide the default digital clock. // Need better transition to lock screen. - mLockClockContainer = inflater.inflate(R.layout.digital_clock, null); + mLockClockContainer = mLayoutInflater.inflate(R.layout.digital_clock, null); mLockClockContainer.setVisibility(View.GONE); } @Override + public String getName() { + return "type"; + } + + @Override + public String getTitle() { + return mResources.getString(R.string.clock_title_type); + } + + @Override + public Bitmap getThumbnail() { + return BitmapFactory.decodeResource(mResources, R.drawable.type_thumbnail); + } + + @Override public View getView() { + if (mLockClockContainer == null) { + createViews(); + } return mLockClockContainer; } @Override public View getBigClockView() { + if (mView == null) { + createViews(); + } return mView; } @@ -96,7 +127,7 @@ public class TypeClockController implements ClockPlugin { } @Override - public void dozeTimeTick() { + public void onTimeTick() { mTypeClock.onTimeChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java index 2a1d066d356e..f5451e952dd9 100644 --- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java +++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java @@ -63,6 +63,9 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable { public HardwareUiLayout(Context context, AttributeSet attrs) { super(context, attrs); + // Manually re-initialize mRotation to portrait-mode, since this view must always + // be constructed in portrait mode and rotated into the correct initial position. + mRotation = ROTATION_NONE; updateSettings(); } @@ -172,6 +175,10 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable { mSeparatedView.setBackground(mSeparatedViewBackground); updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding()); mOldHeight = mList.getMeasuredHeight(); + + // Must be called to initialize view rotation correctly. + // Requires LayoutParams, hence why this isn't called during the constructor. + updateRotation(); } else { return; } @@ -189,7 +196,18 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable { mSwapOrientation = swapOrientation; } - @Override + private void updateRotation() { + int rotation = RotationUtils.getRotation(getContext()); + if (rotation != mRotation) { + rotate(mRotation, rotation); + mRotation = rotation; + } + } + + /** + * Requires LayoutParams to be set to work correctly, and therefore must be run after after + * the HardwareUILayout has been added to the view hierarchy. + */ protected void rotate(int from, int to) { super.rotate(from, to); if (from != ROTATION_NONE && to != ROTATION_NONE) { @@ -522,4 +540,4 @@ public class HardwareUiLayout extends MultiListLayout implements Tunable { inoutInfo.contentInsets.set(mList.getLeft(), mList.getTop(), 0, getBottom() - mList.getBottom()); }; -} +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java index 165eb1dda077..c8eebac4da3e 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java @@ -81,8 +81,7 @@ class BubbleTouchHandler implements View.OnTouchListener { // anything, collapse the stack. if (action == MotionEvent.ACTION_OUTSIDE || mTouchedView == null) { mStack.collapseStack(); - cleanUpDismissTarget(); - mTouchedView = null; + resetForNextGesture(); return false; } @@ -135,8 +134,7 @@ class BubbleTouchHandler implements View.OnTouchListener { break; case MotionEvent.ACTION_CANCEL: - mTouchedView = null; - cleanUpDismissTarget(); + resetForNextGesture(); break; case MotionEvent.ACTION_UP: @@ -144,7 +142,7 @@ class BubbleTouchHandler implements View.OnTouchListener { if (mInDismissTarget && isStack) { mController.dismissStack(); } else if (mMovedEnough) { - mVelocityTracker.computeCurrentVelocity(1000); + mVelocityTracker.computeCurrentVelocity(/* maxVelocity */ 1000); final float velX = mVelocityTracker.getXVelocity(); final float velY = mVelocityTracker.getYVelocity(); if (isStack) { @@ -157,7 +155,7 @@ class BubbleTouchHandler implements View.OnTouchListener { mController.removeBubble(((BubbleView) mTouchedView).getKey()); } } - } else if (mTouchedView.equals(mStack.getExpandedBubbleView())) { + } else if (mTouchedView == mStack.getExpandedBubbleView()) { mStack.collapseStack(); } else if (isStack) { if (mStack.isExpanded()) { @@ -169,17 +167,25 @@ class BubbleTouchHandler implements View.OnTouchListener { mStack.setExpandedBubble(((BubbleView) mTouchedView).getKey()); } - cleanUpDismissTarget(); - mVelocityTracker.recycle(); - mVelocityTracker = null; - mTouchedView = null; - mMovedEnough = false; + resetForNextGesture(); break; } return true; } + /** Clears all touch-related state. */ + private void resetForNextGesture() { + cleanUpDismissTarget(); + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + mTouchedView = null; + mMovedEnough = false; + mInDismissTarget = false; + } + /** * Removes the dismiss target and cancels any pending callbacks to show it. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 490317b188c2..fa223670208b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -38,10 +38,12 @@ import android.media.session.PlaybackState; import android.os.Handler; import android.os.Trace; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.util.Log; import android.view.View; import android.widget.ImageView; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; @@ -115,6 +117,20 @@ public class NotificationMediaManager implements Dumpable { private ImageView mBackdropFront; private ImageView mBackdropBack; + private boolean mShowCompactMediaSeekbar; + private final DeviceConfig.OnPropertyChangedListener mPropertyChangedListener = + new DeviceConfig.OnPropertyChangedListener() { + @Override + public void onPropertyChanged(String namespace, String name, String value) { + if (SystemUiDeviceConfigFlags.COMPACT_MEDIA_SEEKBAR_ENABLED.equals(name)) { + if (DEBUG_MEDIA) { + Log.v(TAG, "DEBUG_MEDIA: compact media seekbar flag updated: " + value); + } + mShowCompactMediaSeekbar = "true".equals(value); + } + } + }; + private final MediaController.Callback mMediaListener = new MediaController.Callback() { @Override public void onPlaybackStateChanged(PlaybackState state) { @@ -168,6 +184,14 @@ public class NotificationMediaManager implements Dumpable { onNotificationRemoved(entry.key); } }); + + mShowCompactMediaSeekbar = "true".equals( + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.COMPACT_MEDIA_SEEKBAR_ENABLED)); + + DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI, + mContext.getMainExecutor(), + mPropertyChangedListener); } public void setUpWithPresenter(NotificationPresenter presenter) { @@ -189,6 +213,10 @@ public class NotificationMediaManager implements Dumpable { return mMediaMetadata; } + public boolean getShowCompactMediaSeekbar() { + return mShowCompactMediaSeekbar; + } + public Icon getMediaIcon() { if (mMediaNotificationKey == null) { return null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 2b643d0a2fea..0fbc55bc08bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -81,6 +81,7 @@ import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; @@ -90,7 +91,6 @@ import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.logging.NotificationCounters; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; -import com.android.systemui.statusbar.notification.row.wrapper.NotificationMediaTemplateViewWrapper; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.AnimationProperties; @@ -331,6 +331,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private boolean mWasChildInGroupWhenRemoved; private int mNotificationColorAmbient; private NotificationInlineImageResolver mImageResolver; + private NotificationMediaManager mMediaManager; private SystemNotificationAsyncTask mSystemNotificationAsyncTask = new SystemNotificationAsyncTask(); @@ -658,10 +659,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView View expandedView = layout.getExpandedChild(); boolean isMediaLayout = expandedView != null && expandedView.findViewById(com.android.internal.R.id.media_actions) != null; + boolean showCompactMediaSeekbar = mMediaManager.getShowCompactMediaSeekbar(); if (customView && beforeP && !mIsSummaryWithChildren) { minHeight = beforeN ? mNotificationMinHeightBeforeN : mNotificationMinHeightBeforeP; - } else if (isMediaLayout && !NotificationMediaTemplateViewWrapper.HIDE_COMPACT_SCRUBBER) { + } else if (isMediaLayout && showCompactMediaSeekbar) { minHeight = mNotificationMinHeightMedia; } else if (mUseIncreasedCollapsedHeight && layout == mPrivateLayout) { minHeight = mNotificationMinHeightLarge; @@ -1635,6 +1637,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mMenuRow = new NotificationMenuRow(mContext); mImageResolver = new NotificationInlineImageResolver(context, new NotificationInlineImageCache()); + mMediaManager = Dependency.get(NotificationMediaManager.class); initDimens(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index b65c4a5f71d8..b4dd1144e761 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -34,12 +34,17 @@ import android.widget.RemoteViews; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.ImageMessageConsumer; +import com.android.systemui.Dependency; import com.android.systemui.statusbar.InflationTask; +import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.notification.InflationException; import com.android.systemui.statusbar.notification.MediaNotificationProcessor; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; import com.android.systemui.statusbar.phone.StatusBar; +import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.InflatedSmartReplies; +import com.android.systemui.statusbar.policy.SmartReplyConstants; import com.android.systemui.util.Assert; import java.lang.annotation.Retention; @@ -278,6 +283,8 @@ public class NotificationContentInflater { InflationProgress result = createRemoteViews(reInflateFlags, builder, mIsLowPriority, mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient, packageContext); + result = inflateSmartReplyViews(result, reInflateFlags, mRow.getEntry(), + mRow.getContext(), mRow.getHeadsUpManager()); apply( inflateSynchronously, result, @@ -306,6 +313,7 @@ public class NotificationContentInflater { if (mRow.getPrivateLayout().isContentViewInactive(VISIBLE_TYPE_HEADSUP)) { mRow.getPrivateLayout().setHeadsUpChild(null); mCachedContentViews.remove(FLAG_CONTENT_VIEW_HEADS_UP); + mRow.getPrivateLayout().setHeadsUpInflatedSmartReplies(null); } break; case FLAG_CONTENT_VIEW_AMBIENT: @@ -336,12 +344,33 @@ public class NotificationContentInflater { } } + private static InflationProgress inflateSmartReplyViews(InflationProgress result, + @InflationFlag int reInflateFlags, NotificationEntry entry, Context context, + HeadsUpManager headsUpManager) { + SmartReplyConstants smartReplyConstants = Dependency.get(SmartReplyConstants.class); + SmartReplyController smartReplyController = Dependency.get(SmartReplyController.class); + if ((reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0 && result.newExpandedView != null) { + result.expandedInflatedSmartReplies = + InflatedSmartReplies.inflate( + context, entry, smartReplyConstants, smartReplyController, + headsUpManager); + } + if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0 && result.newHeadsUpView != null) { + result.headsUpInflatedSmartReplies = + InflatedSmartReplies.inflate( + context, entry, smartReplyConstants, smartReplyController, + headsUpManager); + } + return result; + } + private static InflationProgress createRemoteViews(@InflationFlag int reInflateFlags, Notification.Builder builder, boolean isLowPriority, boolean isChildInGroup, boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, boolean redactAmbient, Context packageContext) { InflationProgress result = new InflationProgress(); isLowPriority = isLowPriority && !isChildInGroup; + if ((reInflateFlags & FLAG_CONTENT_VIEW_CONTRACTED) != 0) { result.newContentView = createContentView(builder, isLowPriority, usesIncreasedHeight); } @@ -661,6 +690,12 @@ public class NotificationContentInflater { } else if (result.newExpandedView == null) { privateLayout.setExpandedChild(null); } + if (result.newExpandedView != null) { + privateLayout.setExpandedInflatedSmartReplies( + result.expandedInflatedSmartReplies); + } else { + privateLayout.setExpandedInflatedSmartReplies(null); + } cachedContentViews.put(FLAG_CONTENT_VIEW_EXPANDED, result.newExpandedView); row.setExpandable(result.newExpandedView != null); } @@ -671,6 +706,12 @@ public class NotificationContentInflater { } else if (result.newHeadsUpView == null) { privateLayout.setHeadsUpChild(null); } + if (result.newHeadsUpView != null) { + privateLayout.setHeadsUpInflatedSmartReplies( + result.headsUpInflatedSmartReplies); + } else { + privateLayout.setHeadsUpInflatedSmartReplies(null); + } cachedContentViews.put(FLAG_CONTENT_VIEW_HEADS_UP, result.newHeadsUpView); } @@ -846,9 +887,12 @@ public class NotificationContentInflater { packageContext); processor.processNotification(notification, recoveredBuilder); } - return createRemoteViews(mReInflateFlags, recoveredBuilder, mIsLowPriority, + InflationProgress inflationProgress = createRemoteViews(mReInflateFlags, + recoveredBuilder, mIsLowPriority, mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient, packageContext); + return inflateSmartReplyViews(inflationProgress, mReInflateFlags, mRow.getEntry(), + mRow.getContext(), mRow.getHeadsUpManager()); } catch (Exception e) { mError = e; return null; @@ -927,6 +971,9 @@ public class NotificationContentInflater { private View inflatedPublicView; private CharSequence headsUpStatusBarText; private CharSequence headsUpStatusBarTextPublic; + + private InflatedSmartReplies expandedInflatedSmartReplies; + private InflatedSmartReplies headsUpInflatedSmartReplies; } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 1dc48d4b18b9..646617c72128 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.row; import android.annotation.Nullable; import android.app.Notification; import android.app.PendingIntent; -import android.app.RemoteInput; import android.content.Context; import android.graphics.Rect; import android.os.Build; @@ -28,7 +27,6 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.AttributeSet; import android.util.Log; -import android.util.Pair; import android.view.MotionEvent; import android.view.NotificationHeaderView; import android.view.View; @@ -39,7 +37,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.ArrayUtils; import com.android.internal.util.ContrastColorUtil; import com.android.systemui.Dependency; import com.android.systemui.R; @@ -52,13 +49,14 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.wrapper.NotificationCustomViewWrapper; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; import com.android.systemui.statusbar.phone.NotificationGroupManager; +import com.android.systemui.statusbar.policy.InflatedSmartReplies; +import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; import com.android.systemui.statusbar.policy.RemoteInputView; import com.android.systemui.statusbar.policy.SmartReplyConstants; import com.android.systemui.statusbar.policy.SmartReplyView; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.util.List; /** * A frame layout containing the actual payload of the notification, including the contracted, @@ -95,6 +93,8 @@ public class NotificationContentView extends FrameLayout { private SmartReplyView mExpandedSmartReplyView; private SmartReplyView mHeadsUpSmartReplyView; private SmartReplyController mSmartReplyController; + private InflatedSmartReplies mExpandedInflatedSmartReplies; + private InflatedSmartReplies mHeadsUpInflatedSmartReplies; private NotificationViewWrapper mContractedWrapper; private NotificationViewWrapper mExpandedWrapper; @@ -1318,8 +1318,22 @@ public class NotificationContentView extends FrameLayout { return; } - SmartRepliesAndActions smartRepliesAndActions = - chooseSmartRepliesAndActions(mSmartReplyConstants, entry); + applyRemoteInput(entry, InflatedSmartReplies.hasFreeformRemoteInput(entry)); + + if (mExpandedInflatedSmartReplies == null && mHeadsUpInflatedSmartReplies == null) { + if (DEBUG) { + Log.d(TAG, "Both expanded, and heads-up InflatedSmartReplies are null, " + + "don't add smart replies."); + } + return; + } + // The inflated smart-reply objects for the expanded view and the heads-up view both contain + // the same SmartRepliesAndActions to avoid discrepancies between the two views. We here + // reuse that object for our local SmartRepliesAndActions to avoid discrepancies between + // this class and the InflatedSmartReplies classes. + SmartRepliesAndActions smartRepliesAndActions = mExpandedInflatedSmartReplies != null + ? mExpandedInflatedSmartReplies.getSmartRepliesAndActions() + : mHeadsUpInflatedSmartReplies.getSmartRepliesAndActions(); if (DEBUG) { Log.d(TAG, String.format("Adding suggestions for %s, %d actions, and %d replies.", entry.notification.getKey(), @@ -1328,86 +1342,9 @@ public class NotificationContentView extends FrameLayout { smartRepliesAndActions.smartReplies == null ? 0 : smartRepliesAndActions.smartReplies.choices.length)); } - - applyRemoteInput(entry, smartRepliesAndActions.hasFreeformRemoteInput); applySmartReplyView(smartRepliesAndActions, entry); } - /** - * Chose what smart replies and smart actions to display. App generated suggestions take - * precedence. So if the app provides any smart replies, we don't show any - * replies or actions generated by the NotificationAssistantService (NAS), and if the app - * provides any smart actions we also don't show any NAS-generated replies or actions. - */ - @VisibleForTesting - static SmartRepliesAndActions chooseSmartRepliesAndActions( - SmartReplyConstants smartReplyConstants, - final NotificationEntry entry) { - Notification notification = entry.notification.getNotification(); - Pair<RemoteInput, Notification.Action> remoteInputActionPair = - notification.findRemoteInputActionPair(false /* freeform */); - Pair<RemoteInput, Notification.Action> freeformRemoteInputActionPair = - notification.findRemoteInputActionPair(true /* freeform */); - - if (!smartReplyConstants.isEnabled()) { - if (DEBUG) { - Log.d(TAG, "Smart suggestions not enabled, not adding suggestions for " - + entry.notification.getKey()); - } - return new SmartRepliesAndActions(null, null, freeformRemoteInputActionPair != null); - } - // Only use smart replies from the app if they target P or above. We have this check because - // the smart reply API has been used for other things (Wearables) in the past. The API to - // add smart actions is new in Q so it doesn't require a target-sdk check. - boolean enableAppGeneratedSmartReplies = (!smartReplyConstants.requiresTargetingP() - || entry.targetSdk >= Build.VERSION_CODES.P); - - boolean appGeneratedSmartRepliesExist = - enableAppGeneratedSmartReplies - && remoteInputActionPair != null - && !ArrayUtils.isEmpty(remoteInputActionPair.first.getChoices()) - && remoteInputActionPair.second.actionIntent != null; - - List<Notification.Action> appGeneratedSmartActions = notification.getContextualActions(); - boolean appGeneratedSmartActionsExist = !appGeneratedSmartActions.isEmpty(); - - SmartReplyView.SmartReplies smartReplies = null; - SmartReplyView.SmartActions smartActions = null; - if (appGeneratedSmartRepliesExist) { - smartReplies = new SmartReplyView.SmartReplies( - remoteInputActionPair.first.getChoices(), - remoteInputActionPair.first, - remoteInputActionPair.second.actionIntent, - false /* fromAssistant */); - } - if (appGeneratedSmartActionsExist) { - smartActions = new SmartReplyView.SmartActions(appGeneratedSmartActions, - false /* fromAssistant */); - } - // Apps didn't provide any smart replies / actions, use those from NAS (if any). - if (!appGeneratedSmartRepliesExist && !appGeneratedSmartActionsExist) { - boolean useGeneratedReplies = !ArrayUtils.isEmpty(entry.systemGeneratedSmartReplies) - && freeformRemoteInputActionPair != null - && freeformRemoteInputActionPair.second.getAllowGeneratedReplies() - && freeformRemoteInputActionPair.second.actionIntent != null; - if (useGeneratedReplies) { - smartReplies = new SmartReplyView.SmartReplies( - entry.systemGeneratedSmartReplies, - freeformRemoteInputActionPair.first, - freeformRemoteInputActionPair.second.actionIntent, - true /* fromAssistant */); - } - boolean useSmartActions = !ArrayUtils.isEmpty(entry.systemGeneratedSmartActions) - && notification.getAllowSystemGeneratedContextualActions(); - if (useSmartActions) { - smartActions = new SmartReplyView.SmartActions( - entry.systemGeneratedSmartActions, true /* fromAssistant */); - } - } - return new SmartRepliesAndActions( - smartReplies, smartActions, freeformRemoteInputActionPair != null); - } - private void applyRemoteInput(NotificationEntry entry, boolean hasFreeformRemoteInput) { View bigContentView = mExpandedChild; if (bigContentView != null) { @@ -1507,11 +1444,12 @@ public class NotificationContentView extends FrameLayout { return null; } - private void applySmartReplyView(SmartRepliesAndActions smartRepliesAndActions, + private void applySmartReplyView( + SmartRepliesAndActions smartRepliesAndActions, NotificationEntry entry) { if (mExpandedChild != null) { - mExpandedSmartReplyView = - applySmartReplyView(mExpandedChild, smartRepliesAndActions, entry); + mExpandedSmartReplyView = applySmartReplyView(mExpandedChild, smartRepliesAndActions, + entry, mExpandedInflatedSmartReplies); if (mExpandedSmartReplyView != null) { if (smartRepliesAndActions.smartReplies != null || smartRepliesAndActions.smartActions != null) { @@ -1533,65 +1471,79 @@ public class NotificationContentView extends FrameLayout { } } if (mHeadsUpChild != null && mSmartReplyConstants.getShowInHeadsUp()) { - mHeadsUpSmartReplyView = - applySmartReplyView(mHeadsUpChild, smartRepliesAndActions, entry); + mHeadsUpSmartReplyView = applySmartReplyView(mHeadsUpChild, smartRepliesAndActions, + entry, mHeadsUpInflatedSmartReplies); } } + @Nullable private SmartReplyView applySmartReplyView(View view, - SmartRepliesAndActions smartRepliesAndActions, NotificationEntry entry) { + SmartRepliesAndActions smartRepliesAndActions, + NotificationEntry entry, InflatedSmartReplies inflatedSmartReplyView) { View smartReplyContainerCandidate = view.findViewById( com.android.internal.R.id.smart_reply_container); if (!(smartReplyContainerCandidate instanceof LinearLayout)) { return null; } + LinearLayout smartReplyContainer = (LinearLayout) smartReplyContainerCandidate; - // If there are no smart replies and no smart actions - early out. - if (smartRepliesAndActions.smartReplies == null - && smartRepliesAndActions.smartActions == null) { - smartReplyContainer.setVisibility(View.GONE); - return null; - } - // If we are showing the spinner we don't want to add the buttons. - boolean showingSpinner = entry.notification.getNotification() - .extras.getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false); - if (showingSpinner) { - smartReplyContainer.setVisibility(View.GONE); - return null; - } - // If we are keeping the notification around while sending we don't want to add the buttons. - boolean hideSmartReplies = entry.notification.getNotification() - .extras.getBoolean(Notification.EXTRA_HIDE_SMART_REPLIES, false); - if (hideSmartReplies) { + if (!InflatedSmartReplies.shouldShowSmartReplyView(entry, smartRepliesAndActions)) { smartReplyContainer.setVisibility(View.GONE); return null; } + SmartReplyView smartReplyView = null; - if (smartReplyContainer.getChildCount() == 0) { - smartReplyView = SmartReplyView.inflate(mContext, smartReplyContainer); + if (smartReplyContainer.getChildCount() == 1 + && smartReplyContainer.getChildAt(0) instanceof SmartReplyView) { + // If we already have a SmartReplyView - replace it with the newly inflated one. The + // newly inflated one is connected to the new inflated smart reply/action buttons. + smartReplyContainer.removeAllViews(); + } + if (smartReplyContainer.getChildCount() == 0 + && inflatedSmartReplyView != null + && inflatedSmartReplyView.getSmartReplyView() != null) { + smartReplyView = inflatedSmartReplyView.getSmartReplyView(); smartReplyContainer.addView(smartReplyView); - } else if (smartReplyContainer.getChildCount() == 1) { - View child = smartReplyContainer.getChildAt(0); - if (child instanceof SmartReplyView) { - smartReplyView = (SmartReplyView) child; - } } if (smartReplyView != null) { smartReplyView.resetSmartSuggestions(smartReplyContainer); - if (smartRepliesAndActions.smartReplies != null) { - smartReplyView.addRepliesFromRemoteInput( - smartRepliesAndActions.smartReplies, mSmartReplyController, entry); - } - if (smartRepliesAndActions.smartActions != null) { - smartReplyView.addSmartActions( - smartRepliesAndActions.smartActions, mSmartReplyController, entry, - mContainingNotification.getHeadsUpManager()); - } + smartReplyView.addPreInflatedButtons( + inflatedSmartReplyView.getSmartSuggestionButtons()); smartReplyContainer.setVisibility(View.VISIBLE); } return smartReplyView; } + /** + * Set pre-inflated views necessary to display smart replies and actions in the expanded + * notification state. + * + * @param inflatedSmartReplies the pre-inflated state to add to this view. If null the existing + * {@link SmartReplyView} related to the expanded notification state is cleared. + */ + public void setExpandedInflatedSmartReplies( + @Nullable InflatedSmartReplies inflatedSmartReplies) { + mExpandedInflatedSmartReplies = inflatedSmartReplies; + if (inflatedSmartReplies == null) { + mExpandedSmartReplyView = null; + } + } + + /** + * Set pre-inflated views necessary to display smart replies and actions in the heads-up + * notification state. + * + * @param inflatedSmartReplies the pre-inflated state to add to this view. If null the existing + * {@link SmartReplyView} related to the heads-up notification state is cleared. + */ + public void setHeadsUpInflatedSmartReplies( + @Nullable InflatedSmartReplies inflatedSmartReplies) { + mHeadsUpInflatedSmartReplies = inflatedSmartReplies; + if (inflatedSmartReplies == null) { + mHeadsUpSmartReplyView = null; + } + } + public void closeRemoteInput() { if (mHeadsUpRemoteInput != null) { mHeadsUpRemoteInput.close(); @@ -2005,22 +1957,4 @@ public class NotificationContentView extends FrameLayout { } pw.println(); } - - @VisibleForTesting - static class SmartRepliesAndActions { - @Nullable - public final SmartReplyView.SmartReplies smartReplies; - @Nullable - public final SmartReplyView.SmartActions smartActions; - public final boolean hasFreeformRemoteInput; - - SmartRepliesAndActions( - @Nullable SmartReplyView.SmartReplies smartReplies, - @Nullable SmartReplyView.SmartActions smartActions, - boolean hasFreeformRemoteInput) { - this.smartReplies = smartReplies; - this.smartActions = smartActions; - this.hasFreeformRemoteInput = hasFreeformRemoteInput; - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java index ddda3e50fc2c..99f5874448b5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java @@ -36,6 +36,7 @@ import android.widget.TextView; import com.android.internal.R; import com.android.systemui.Dependency; +import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.TransformableView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -58,12 +59,10 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private TextView mSeekBarTotalTime; private long mDuration = 0; private MediaController mMediaController; + private NotificationMediaManager mMediaManager; private View mSeekBarView; private Context mContext; - // TODO: implement as phenotype flag - public static final boolean HIDE_COMPACT_SCRUBBER = true; - private SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { @@ -102,6 +101,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi ExpandableNotificationRow row) { super(ctx, view, row); mContext = ctx; + mMediaManager = Dependency.get(NotificationMediaManager.class); } private void resolveViews() { @@ -110,7 +110,8 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi final MediaSession.Token token = mRow.getEntry().notification.getNotification().extras .getParcelable(Notification.EXTRA_MEDIA_SESSION); - if (token == null || (COMPACT_MEDIA_TAG.equals(mView.getTag()) && HIDE_COMPACT_SCRUBBER)) { + boolean showCompactSeekbar = mMediaManager.getShowCompactMediaSeekbar(); + if (token == null || (COMPACT_MEDIA_TAG.equals(mView.getTag()) && !showCompactSeekbar)) { if (mSeekBarView != null) { mSeekBarView.setVisibility(View.GONE); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java index f846036248d4..e0b1846fa7d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java @@ -42,6 +42,7 @@ import com.android.systemui.tuner.TunerService.Tunable; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.inject.Inject; @@ -122,7 +123,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu // Remove all the icons. for (int i = currentSlots.size() - 1; i >= 0; i--) { Slot s = currentSlots.get(i); - slotsToReAdd.put(s, s.getHolderListInViewOrder()); + slotsToReAdd.put(s, s.getHolderList()); removeAllIconsForSlot(s.getName()); } @@ -200,6 +201,10 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu Slot mobileSlot = getSlot(slot); int slotIndex = getSlotIndex(slot); + // Reverse the sort order to show icons with left to right([Slot1][Slot2]..). + // StatusBarIconList has UI design that first items go to the right of second items. + Collections.reverse(iconStates); + for (MobileIconState state : iconStates) { StatusBarIconHolder holder = mobileSlot.getHolderForTag(state.subId); if (holder == null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java index 2e4161787267..c876c3228eb8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java @@ -250,6 +250,25 @@ public class StatusBarIconList { return holders; } + /** + * Build a list of the {@link StatusBarIconHolder}s in the same order. + * This provides a safe list that can be iterated and inserted into its group. + * + * @return all holders contained here + */ + public List<StatusBarIconHolder> getHolderList() { + ArrayList<StatusBarIconHolder> holders = new ArrayList<>(); + if (mHolder != null) { + holders.add(mHolder); + } + + if (mSubSlots != null) { + holders.addAll(mSubSlots); + } + + return holders; + } + @Override public String toString() { return String.format("(%s) %s", mName, subSlotsString()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java new file mode 100644 index 000000000000..d8ea1f6eef5f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java @@ -0,0 +1,225 @@ +/* + * 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.policy; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.Notification; +import android.app.RemoteInput; +import android.content.Context; +import android.os.Build; +import android.util.Log; +import android.util.Pair; +import android.widget.Button; + +import com.android.internal.util.ArrayUtils; +import com.android.systemui.statusbar.SmartReplyController; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; + +import java.util.ArrayList; +import java.util.List; + +/** + * Holder for inflated smart replies and actions. These objects should be inflated on a background + * thread, to later be accessed and modified on the (performance critical) UI thread. + */ +public class InflatedSmartReplies { + private static final String TAG = "InflatedSmartReplies"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + @Nullable private final SmartReplyView mSmartReplyView; + @Nullable private final List<Button> mSmartSuggestionButtons; + @NonNull private final SmartRepliesAndActions mSmartRepliesAndActions; + + private InflatedSmartReplies( + @Nullable SmartReplyView smartReplyView, + @Nullable List<Button> smartSuggestionButtons, + @NonNull SmartRepliesAndActions smartRepliesAndActions) { + mSmartReplyView = smartReplyView; + mSmartSuggestionButtons = smartSuggestionButtons; + mSmartRepliesAndActions = smartRepliesAndActions; + } + + @Nullable public SmartReplyView getSmartReplyView() { + return mSmartReplyView; + } + + @Nullable public List<Button> getSmartSuggestionButtons() { + return mSmartSuggestionButtons; + } + + @NonNull public SmartRepliesAndActions getSmartRepliesAndActions() { + return mSmartRepliesAndActions; + } + + /** + * Inflate a SmartReplyView and its smart suggestions. + */ + public static InflatedSmartReplies inflate( + Context context, + NotificationEntry entry, + SmartReplyConstants smartReplyConstants, + SmartReplyController smartReplyController, + HeadsUpManager headsUpManager) { + SmartRepliesAndActions smartRepliesAndActions = + chooseSmartRepliesAndActions(smartReplyConstants, entry); + if (!shouldShowSmartReplyView(entry, smartRepliesAndActions)) { + return new InflatedSmartReplies(null /* smartReplyView */, + null /* smartSuggestionButtons */, smartRepliesAndActions); + } + + SmartReplyView smartReplyView = SmartReplyView.inflate(context); + + List<Button> suggestionButtons = new ArrayList<>(); + if (smartRepliesAndActions.smartReplies != null) { + suggestionButtons.addAll(smartReplyView.inflateRepliesFromRemoteInput( + smartRepliesAndActions.smartReplies, smartReplyController, entry)); + } + if (smartRepliesAndActions.smartActions != null) { + suggestionButtons.addAll( + smartReplyView.inflateSmartActions(smartRepliesAndActions.smartActions, + smartReplyController, entry, headsUpManager)); + } + + return new InflatedSmartReplies(smartReplyView, suggestionButtons, + smartRepliesAndActions); + } + + /** + * Returns whether we should show the smart reply view and its smart suggestions. + */ + public static boolean shouldShowSmartReplyView( + NotificationEntry entry, + SmartRepliesAndActions smartRepliesAndActions) { + if (smartRepliesAndActions.smartReplies == null + && smartRepliesAndActions.smartActions == null) { + // There are no smart replies and no smart actions. + return false; + } + // If we are showing the spinner we don't want to add the buttons. + boolean showingSpinner = entry.notification.getNotification() + .extras.getBoolean(Notification.EXTRA_SHOW_REMOTE_INPUT_SPINNER, false); + if (showingSpinner) { + return false; + } + // If we are keeping the notification around while sending we don't want to add the buttons. + boolean hideSmartReplies = entry.notification.getNotification() + .extras.getBoolean(Notification.EXTRA_HIDE_SMART_REPLIES, false); + if (hideSmartReplies) { + return false; + } + return true; + } + + /** + * Chose what smart replies and smart actions to display. App generated suggestions take + * precedence. So if the app provides any smart replies, we don't show any + * replies or actions generated by the NotificationAssistantService (NAS), and if the app + * provides any smart actions we also don't show any NAS-generated replies or actions. + */ + @NonNull + public static SmartRepliesAndActions chooseSmartRepliesAndActions( + SmartReplyConstants smartReplyConstants, + final NotificationEntry entry) { + Notification notification = entry.notification.getNotification(); + Pair<RemoteInput, Notification.Action> remoteInputActionPair = + notification.findRemoteInputActionPair(false /* freeform */); + Pair<RemoteInput, Notification.Action> freeformRemoteInputActionPair = + notification.findRemoteInputActionPair(true /* freeform */); + + if (!smartReplyConstants.isEnabled()) { + if (DEBUG) { + Log.d(TAG, "Smart suggestions not enabled, not adding suggestions for " + + entry.notification.getKey()); + } + return new SmartRepliesAndActions(null, null); + } + // Only use smart replies from the app if they target P or above. We have this check because + // the smart reply API has been used for other things (Wearables) in the past. The API to + // add smart actions is new in Q so it doesn't require a target-sdk check. + boolean enableAppGeneratedSmartReplies = (!smartReplyConstants.requiresTargetingP() + || entry.targetSdk >= Build.VERSION_CODES.P); + + boolean appGeneratedSmartRepliesExist = + enableAppGeneratedSmartReplies + && remoteInputActionPair != null + && !ArrayUtils.isEmpty(remoteInputActionPair.first.getChoices()) + && remoteInputActionPair.second.actionIntent != null; + + List<Notification.Action> appGeneratedSmartActions = notification.getContextualActions(); + boolean appGeneratedSmartActionsExist = !appGeneratedSmartActions.isEmpty(); + + SmartReplyView.SmartReplies smartReplies = null; + SmartReplyView.SmartActions smartActions = null; + if (appGeneratedSmartRepliesExist) { + smartReplies = new SmartReplyView.SmartReplies( + remoteInputActionPair.first.getChoices(), + remoteInputActionPair.first, + remoteInputActionPair.second.actionIntent, + false /* fromAssistant */); + } + if (appGeneratedSmartActionsExist) { + smartActions = new SmartReplyView.SmartActions(appGeneratedSmartActions, + false /* fromAssistant */); + } + // Apps didn't provide any smart replies / actions, use those from NAS (if any). + if (!appGeneratedSmartRepliesExist && !appGeneratedSmartActionsExist) { + boolean useGeneratedReplies = !ArrayUtils.isEmpty(entry.systemGeneratedSmartReplies) + && freeformRemoteInputActionPair != null + && freeformRemoteInputActionPair.second.getAllowGeneratedReplies() + && freeformRemoteInputActionPair.second.actionIntent != null; + if (useGeneratedReplies) { + smartReplies = new SmartReplyView.SmartReplies( + entry.systemGeneratedSmartReplies, + freeformRemoteInputActionPair.first, + freeformRemoteInputActionPair.second.actionIntent, + true /* fromAssistant */); + } + boolean useSmartActions = !ArrayUtils.isEmpty(entry.systemGeneratedSmartActions) + && notification.getAllowSystemGeneratedContextualActions(); + if (useSmartActions) { + smartActions = new SmartReplyView.SmartActions( + entry.systemGeneratedSmartActions, true /* fromAssistant */); + } + } + return new SmartRepliesAndActions(smartReplies, smartActions); + } + + /** + * Returns whether the {@link Notification} represented by entry has a free-form remote input. + * Such an input can be used e.g. to implement smart reply buttons - by passing the replies + * through the remote input. + */ + public static boolean hasFreeformRemoteInput(NotificationEntry entry) { + Notification notification = entry.notification.getNotification(); + return null != notification.findRemoteInputActionPair(true /* freeform */); + } + + /** + * A storage for smart replies and smart action. + */ + public static class SmartRepliesAndActions { + @Nullable public final SmartReplyView.SmartReplies smartReplies; + @Nullable public final SmartReplyView.SmartActions smartActions; + + SmartRepliesAndActions( + @Nullable SmartReplyView.SmartReplies smartReplies, + @Nullable SmartReplyView.SmartActions smartActions) { + this.smartReplies = smartReplies; + this.smartActions = smartActions; + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java index 45d215ef309c..ed5487f74356 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java @@ -196,66 +196,81 @@ public class SmartReplyView extends ViewGroup { } /** + * Add buttons to the {@link SmartReplyView} - these buttons must have been preinflated using + * one of the methods in this class. + */ + public void addPreInflatedButtons(List<Button> smartSuggestionButtons) { + for (Button button : smartSuggestionButtons) { + addView(button); + } + reallocateCandidateButtonQueueForSqueezing(); + } + + /** * Add smart replies to this view, using the provided {@link RemoteInput} and * {@link PendingIntent} to respond when the user taps a smart reply. Only the replies that fit * into the notification are shown. */ - public void addRepliesFromRemoteInput( - SmartReplies smartReplies, + public List<Button> inflateRepliesFromRemoteInput( + @NonNull SmartReplies smartReplies, SmartReplyController smartReplyController, NotificationEntry entry) { + List<Button> buttons = new ArrayList<>(); + if (smartReplies.remoteInput != null && smartReplies.pendingIntent != null) { if (smartReplies.choices != null) { for (int i = 0; i < smartReplies.choices.length; ++i) { - Button replyButton = inflateReplyButton( - getContext(), this, i, smartReplies, smartReplyController, entry); - addView(replyButton); + buttons.add(inflateReplyButton( + this, getContext(), i, smartReplies, smartReplyController, entry)); } this.mSmartRepliesGeneratedByAssistant = smartReplies.fromAssistant; } } - reallocateCandidateButtonQueueForSqueezing(); + return buttons; } /** * Add smart actions to be shown next to smart replies. Only the actions that fit into the * notification are shown. */ - public void addSmartActions(SmartActions smartActions, + public List<Button> inflateSmartActions(@NonNull SmartActions smartActions, SmartReplyController smartReplyController, NotificationEntry entry, HeadsUpManager headsUpManager) { + List<Button> buttons = new ArrayList<>(); int numSmartActions = smartActions.actions.size(); for (int n = 0; n < numSmartActions; n++) { Notification.Action action = smartActions.actions.get(n); if (action.actionIntent != null) { - Button actionButton = inflateActionButton( - getContext(), this, n, smartActions, smartReplyController, entry, - headsUpManager); - addView(actionButton); + buttons.add(inflateActionButton( + this, getContext(), n, smartActions, smartReplyController, entry, + headsUpManager)); } } - reallocateCandidateButtonQueueForSqueezing(); + return buttons; } - public static SmartReplyView inflate(Context context, ViewGroup root) { - return (SmartReplyView) - LayoutInflater.from(context).inflate(R.layout.smart_reply_view, root, false); + /** + * Inflate an instance of this class. + */ + public static SmartReplyView inflate(Context context) { + return (SmartReplyView) LayoutInflater.from(context).inflate( + R.layout.smart_reply_view, null /* root */); } @VisibleForTesting - Button inflateReplyButton(Context context, ViewGroup root, int replyIndex, - SmartReplies smartReplies, SmartReplyController smartReplyController, + static Button inflateReplyButton(SmartReplyView smartReplyView, Context context, + int replyIndex, SmartReplies smartReplies, SmartReplyController smartReplyController, NotificationEntry entry) { Button b = (Button) LayoutInflater.from(context).inflate( - R.layout.smart_reply_button, root, false); + R.layout.smart_reply_button, smartReplyView, false); CharSequence choice = smartReplies.choices[replyIndex]; b.setText(choice); OnDismissAction action = () -> { - if (mConstants.getEffectiveEditChoicesBeforeSending( + if (smartReplyView.mConstants.getEffectiveEditChoicesBeforeSending( smartReplies.remoteInput.getEditChoicesBeforeSending())) { EditedSuggestionInfo editedSuggestionInfo = new EditedSuggestionInfo(choice, replyIndex); - mRemoteInputManager.activateRemoteInput(b, + smartReplyView.mRemoteInputManager.activateRemoteInput(b, new RemoteInput[] { smartReplies.remoteInput }, smartReplies.remoteInput, smartReplies.pendingIntent, editedSuggestionInfo); return false; @@ -276,33 +291,41 @@ public class SmartReplyView extends ViewGroup { } catch (PendingIntent.CanceledException e) { Log.w(TAG, "Unable to send smart reply", e); } - mSmartReplyContainer.setVisibility(View.GONE); + // Note that as inflateReplyButton is called mSmartReplyContainer is null, but when the + // reply Button is added to the SmartReplyView mSmartReplyContainer will be set. So, it + // will not be possible for a user to trigger this on-click-listener without + // mSmartReplyContainer being set. + smartReplyView.mSmartReplyContainer.setVisibility(View.GONE); return false; // do not defer }; b.setOnClickListener(view -> { - mKeyguardDismissUtil.executeWhenUnlocked(action); + smartReplyView.mKeyguardDismissUtil.executeWhenUnlocked(action); }); b.setAccessibilityDelegate(new AccessibilityDelegate() { public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); - String label = getResources().getString(R.string.accessibility_send_smart_reply); + String label = smartReplyView.getResources().getString( + R.string.accessibility_send_smart_reply); info.addAction(new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK, label)); } }); - setColors(b, mCurrentBackgroundColor, mDefaultStrokeColor, mDefaultTextColor, mRippleColor); + SmartReplyView.setButtonColors(b, smartReplyView.mCurrentBackgroundColor, + smartReplyView.mDefaultStrokeColor, smartReplyView.mDefaultTextColor, + smartReplyView.mRippleColor, smartReplyView.mStrokeWidth); return b; } @VisibleForTesting - Button inflateActionButton(Context context, ViewGroup root, int actionIndex, - SmartActions smartActions, SmartReplyController smartReplyController, - NotificationEntry entry, HeadsUpManager headsUpManager) { + static Button inflateActionButton(SmartReplyView smartReplyView, Context context, + int actionIndex, SmartActions smartActions, + SmartReplyController smartReplyController, NotificationEntry entry, + HeadsUpManager headsUpManager) { Notification.Action action = smartActions.actions.get(actionIndex); Button button = (Button) LayoutInflater.from(context).inflate( - R.layout.smart_action_button, root, false); + R.layout.smart_action_button, smartReplyView, false); button.setText(action.title); Drawable iconDrawable = action.getIcon().loadDrawable(context); @@ -313,7 +336,7 @@ public class SmartReplyView extends ViewGroup { button.setCompoundDrawables(iconDrawable, null, null, null); button.setOnClickListener(view -> - getActivityStarter().startPendingIntentDismissingKeyguard( + smartReplyView.getActivityStarter().startPendingIntentDismissingKeyguard( action.actionIntent, () -> { smartReplyController.smartActionClicked( @@ -803,12 +826,13 @@ public class SmartReplyView extends ViewGroup { int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { final Button child = (Button) getChildAt(i); - setColors(child, backgroundColor, strokeColor, textColor, rippleColor); + setButtonColors(child, backgroundColor, strokeColor, textColor, rippleColor, + mStrokeWidth); } } - private void setColors(Button button, int backgroundColor, int strokeColor, int textColor, - int rippleColor) { + private static void setButtonColors(Button button, int backgroundColor, int strokeColor, + int textColor, int rippleColor, int strokeWidth) { Drawable drawable = button.getBackground(); if (drawable instanceof RippleDrawable) { // Mutate in case other notifications are using this drawable. @@ -821,7 +845,7 @@ public class SmartReplyView extends ViewGroup { if (background instanceof GradientDrawable) { GradientDrawable gradientDrawable = (GradientDrawable) background; gradientDrawable.setColor(backgroundColor); - gradientDrawable.setStroke(mStrokeWidth, strokeColor); + gradientDrawable.setStroke(strokeWidth, strokeColor); } } button.setBackground(drawable); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java index 9e946faf2a52..267468ffa4d6 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java @@ -17,6 +17,7 @@ package com.android.keyguard.clock; import static com.google.common.truth.Truth.assertThat; +import android.content.res.Resources; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -40,8 +41,9 @@ public final class BubbleClockControllerTest extends SysuiTestCase { @Before public void setUp() { + Resources res = getContext().getResources(); LayoutInflater layoutInflater = LayoutInflater.from(getContext()); - mClockController = BubbleClockController.build(layoutInflater); + mClockController = new BubbleClockController(res, layoutInflater); } @Test diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java index 58701e72e406..36265d485e2c 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java @@ -31,6 +31,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerFake; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.util.InjectionInflationController; import org.junit.After; @@ -52,6 +53,7 @@ public final class ClockManagerTest extends SysuiTestCase { private ContentObserver mContentObserver; private DockManagerFake mFakeDockManager; @Mock InjectionInflationController mMockInjectionInflationController; + @Mock PluginManager mMockPluginManager; @Mock SysuiColorExtractor mMockColorExtractor; @Mock ContentResolver mMockContentResolver; @Mock SettingsWrapper mMockSettingsWrapper; @@ -66,7 +68,8 @@ public final class ClockManagerTest extends SysuiTestCase { mFakeDockManager = new DockManagerFake(); mClockManager = new ClockManager(getContext(), mMockInjectionInflationController, - mFakeDockManager, mMockColorExtractor, mMockContentResolver, mMockSettingsWrapper); + mMockPluginManager, mFakeDockManager, mMockColorExtractor, mMockContentResolver, + mMockSettingsWrapper); mClockManager.addOnClockChangedListener(mMockListener); mContentObserver = mClockManager.getContentObserver(); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java index 8de8f3d0674d..0659b4fe71cd 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/StretchAnalogClockControllerTest.java @@ -17,6 +17,7 @@ package com.android.keyguard.clock; import static com.google.common.truth.Truth.assertThat; +import android.content.res.Resources; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -40,8 +41,9 @@ public final class StretchAnalogClockControllerTest extends SysuiTestCase { @Before public void setUp() { + Resources res = getContext().getResources(); LayoutInflater layoutInflater = LayoutInflater.from(getContext()); - mClockController = StretchAnalogClockController.build(layoutInflater); + mClockController = new StretchAnalogClockController(res, layoutInflater); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java index c80396d8292a..d756b0970346 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java @@ -16,8 +16,6 @@ package com.android.systemui.statusbar.notification.row; -import static com.google.common.truth.Truth.assertThat; - import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; @@ -31,62 +29,31 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; -import android.app.Notification; -import android.app.PendingIntent; -import android.app.RemoteInput; -import android.content.Intent; import android.graphics.drawable.Icon; -import android.service.notification.StatusBarNotification; import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.util.ArraySet; -import android.util.Pair; import android.view.NotificationHeaderView; import android.view.View; -import com.android.systemui.R; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.policy.SmartReplyConstants; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.List; @SmallTest @RunWith(AndroidJUnit4.class) public class NotificationContentViewTest extends SysuiTestCase { - private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION"; - NotificationContentView mView; - @Mock - SmartReplyConstants mSmartReplyConstants; - @Mock - StatusBarNotification mStatusBarNotification; - @Mock - Notification mNotification; - NotificationEntry mEntry; - @Mock - RemoteInput mRemoteInput; - @Mock - RemoteInput mFreeFormRemoteInput; - private Icon mActionIcon; - @Before @UiThreadTest public void setup() { - MockitoAnnotations.initMocks(this); - mView = new NotificationContentView(mContext, null); ExpandableNotificationRow row = new ExpandableNotificationRow(mContext, null); ExpandableNotificationRow mockRow = spy(row); @@ -103,13 +70,6 @@ public class NotificationContentViewTest extends SysuiTestCase { mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight()); - - // Smart replies and actions - when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(true); - when(mStatusBarNotification.getNotification()).thenReturn(mNotification); - mEntry = new NotificationEntry(mStatusBarNotification); - when(mSmartReplyConstants.isEnabled()).thenReturn(true); - mActionIcon = Icon.createWithResource(mContext, R.drawable.ic_person); } private View createViewWithHeight(int height) { @@ -158,204 +118,4 @@ public class NotificationContentViewTest extends SysuiTestCase { verify(mockAmbient, never()).showAppOpsIcons(ops); verify(mockHeadsUp, times(1)).showAppOpsIcons(any()); } - - private void setupAppGeneratedReplies(CharSequence[] smartReplies) { - setupAppGeneratedReplies(smartReplies, true /* allowSystemGeneratedReplies */); - } - - private void setupAppGeneratedReplies( - CharSequence[] smartReplies, boolean allowSystemGeneratedReplies) { - PendingIntent pendingIntent = - PendingIntent.getBroadcast(mContext, 0, new Intent(TEST_ACTION), 0); - Notification.Action action = - new Notification.Action.Builder(null, "Test Action", pendingIntent).build(); - when(mRemoteInput.getChoices()).thenReturn(smartReplies); - Pair<RemoteInput, Notification.Action> remoteInputActionPair = - Pair.create(mRemoteInput, action); - when(mNotification.findRemoteInputActionPair(false)).thenReturn(remoteInputActionPair); - - Notification.Action freeFormRemoteInputAction = - createActionBuilder("Freeform Test Action") - .setAllowGeneratedReplies(allowSystemGeneratedReplies) - .build(); - Pair<RemoteInput, Notification.Action> freeFormRemoteInputActionPair = - Pair.create(mFreeFormRemoteInput, freeFormRemoteInputAction); - when(mNotification.findRemoteInputActionPair(true)).thenReturn( - freeFormRemoteInputActionPair); - - when(mSmartReplyConstants.requiresTargetingP()).thenReturn(false); - } - - private void setupAppGeneratedSuggestions( - CharSequence[] smartReplies, List<Notification.Action> smartActions) { - setupAppGeneratedReplies(smartReplies); - when(mNotification.getContextualActions()).thenReturn(smartActions); - } - - @Test - public void chooseSmartRepliesAndActions_smartRepliesOff_noAppGeneratedSmartSuggestions() { - CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"}; - List<Notification.Action> smartActions = - createActions(new String[] {"Test Action 1", "Test Action 2"}); - setupAppGeneratedSuggestions(smartReplies, smartActions); - when(mSmartReplyConstants.isEnabled()).thenReturn(false); - - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions).isNull(); - } - - @Test - public void chooseSmartRepliesAndActions_smartRepliesOff_noSystemGeneratedSmartSuggestions() { - mEntry.systemGeneratedSmartReplies = - new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; - mEntry.systemGeneratedSmartActions = - createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); - when(mSmartReplyConstants.isEnabled()).thenReturn(false); - - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions).isNull(); - } - - @Test - public void chooseSmartRepliesAndActions_appGeneratedSmartReplies() { - CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"}; - setupAppGeneratedReplies(smartReplies); - - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies); - assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); - assertThat(repliesAndActions.smartActions).isNull(); - } - - @Test - public void chooseSmartRepliesAndActions_appGeneratedSmartRepliesAndActions() { - CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"}; - List<Notification.Action> smartActions = - createActions(new String[] {"Test Action 1", "Test Action 2"}); - setupAppGeneratedSuggestions(smartReplies, smartActions); - - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies); - assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); - assertThat(repliesAndActions.smartActions.actions).isEqualTo(smartActions); - assertThat(repliesAndActions.smartActions.fromAssistant).isFalse(); - } - - @Test - public void chooseSmartRepliesAndActions_sysGeneratedSmartReplies() { - // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart - // replies. - setupAppGeneratedReplies(null /* smartReplies */); - - mEntry.systemGeneratedSmartReplies = - new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies.choices).isEqualTo( - mEntry.systemGeneratedSmartReplies); - assertThat(repliesAndActions.smartReplies.fromAssistant).isTrue(); - assertThat(repliesAndActions.smartActions).isNull(); - } - - @Test - public void chooseSmartRepliesAndActions_noSysGeneratedSmartRepliesIfNotAllowed() { - // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart - // replies. - setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */); - - mEntry.systemGeneratedSmartReplies = - new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions).isNull(); - } - - @Test - public void chooseSmartRepliesAndActions_sysGeneratedSmartActions() { - // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart - // actions. - setupAppGeneratedReplies(null /* smartReplies */); - - mEntry.systemGeneratedSmartActions = - createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies).isNull(); - assertThat(repliesAndActions.smartActions.actions) - .isEqualTo(mEntry.systemGeneratedSmartActions); - assertThat(repliesAndActions.smartActions.fromAssistant).isTrue(); - } - - @Test - public void chooseSmartRepliesAndActions_appGenPreferredOverSysGen() { - CharSequence[] appGenSmartReplies = new String[] {"Reply1", "Reply2"}; - // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart - // replies. - List<Notification.Action> appGenSmartActions = - createActions(new String[] {"Test Action 1", "Test Action 2"}); - setupAppGeneratedSuggestions(appGenSmartReplies, appGenSmartActions); - - mEntry.systemGeneratedSmartReplies = - new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; - mEntry.systemGeneratedSmartActions = - createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); - - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartReplies.choices).isEqualTo(appGenSmartReplies); - assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); - assertThat(repliesAndActions.smartActions.actions).isEqualTo(appGenSmartActions); - assertThat(repliesAndActions.smartActions.fromAssistant).isFalse(); - } - - @Test - public void chooseSmartRepliesAndActions_disallowSysGenSmartActions() { - // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart - // actions. - setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */); - when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(false); - mEntry.systemGeneratedSmartReplies = - new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; - mEntry.systemGeneratedSmartActions = - createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); - - NotificationContentView.SmartRepliesAndActions repliesAndActions = - NotificationContentView.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); - - assertThat(repliesAndActions.smartActions).isNull(); - assertThat(repliesAndActions.smartReplies).isNull(); - } - - private Notification.Action.Builder createActionBuilder(String actionTitle) { - PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, - new Intent(TEST_ACTION), 0); - return new Notification.Action.Builder(mActionIcon, actionTitle, pendingIntent); - } - - private Notification.Action createAction(String actionTitle) { - return createActionBuilder(actionTitle).build(); - } - - private List<Notification.Action> createActions(String[] actionTitles) { - List<Notification.Action> actions = new ArrayList<>(); - for (String title : actionTitles) { - actions.add(createAction(title)); - } - return actions; - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java new file mode 100644 index 000000000000..3382a906d057 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java @@ -0,0 +1,279 @@ +/* + * 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.policy; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.when; + +import android.app.Notification; +import android.app.PendingIntent; +import android.app.RemoteInput; +import android.content.Intent; +import android.graphics.drawable.Icon; +import android.service.notification.StatusBarNotification; +import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.Pair; + +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class InflatedSmartRepliesTest extends SysuiTestCase { + + private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION"; + + @Mock + SmartReplyConstants mSmartReplyConstants; + @Mock + StatusBarNotification mStatusBarNotification; + @Mock + Notification mNotification; + NotificationEntry mEntry; + @Mock + RemoteInput mRemoteInput; + @Mock + RemoteInput mFreeFormRemoteInput; + + private Icon mActionIcon; + + @Before + @UiThreadTest + public void setUp() { + MockitoAnnotations.initMocks(this); + + when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(true); + when(mStatusBarNotification.getNotification()).thenReturn(mNotification); + mEntry = new NotificationEntry(mStatusBarNotification); + when(mSmartReplyConstants.isEnabled()).thenReturn(true); + mActionIcon = Icon.createWithResource(mContext, R.drawable.ic_person); + } + + @Test + public void chooseSmartRepliesAndActions_smartRepliesOff_noAppGeneratedSmartSuggestions() { + CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"}; + List<Notification.Action> smartActions = + createActions(new String[] {"Test Action 1", "Test Action 2"}); + setupAppGeneratedSuggestions(smartReplies, smartActions); + when(mSmartReplyConstants.isEnabled()).thenReturn(false); + + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies).isNull(); + assertThat(repliesAndActions.smartActions).isNull(); + } + + @Test + public void chooseSmartRepliesAndActions_smartRepliesOff_noSystemGeneratedSmartSuggestions() { + mEntry.systemGeneratedSmartReplies = + new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; + mEntry.systemGeneratedSmartActions = + createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); + when(mSmartReplyConstants.isEnabled()).thenReturn(false); + + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies).isNull(); + assertThat(repliesAndActions.smartActions).isNull(); + } + + @Test + public void chooseSmartRepliesAndActions_appGeneratedSmartReplies() { + CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"}; + setupAppGeneratedReplies(smartReplies); + + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies); + assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); + assertThat(repliesAndActions.smartActions).isNull(); + } + + @Test + public void chooseSmartRepliesAndActions_appGeneratedSmartRepliesAndActions() { + CharSequence[] smartReplies = new String[] {"Reply1", "Reply2"}; + List<Notification.Action> smartActions = + createActions(new String[] {"Test Action 1", "Test Action 2"}); + setupAppGeneratedSuggestions(smartReplies, smartActions); + + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies.choices).isEqualTo(smartReplies); + assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); + assertThat(repliesAndActions.smartActions.actions).isEqualTo(smartActions); + assertThat(repliesAndActions.smartActions.fromAssistant).isFalse(); + } + + @Test + public void chooseSmartRepliesAndActions_sysGeneratedSmartReplies() { + // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart + // replies. + setupAppGeneratedReplies(null /* smartReplies */); + + mEntry.systemGeneratedSmartReplies = + new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies.choices).isEqualTo( + mEntry.systemGeneratedSmartReplies); + assertThat(repliesAndActions.smartReplies.fromAssistant).isTrue(); + assertThat(repliesAndActions.smartActions).isNull(); + } + + @Test + public void chooseSmartRepliesAndActions_noSysGeneratedSmartRepliesIfNotAllowed() { + // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart + // replies. + setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */); + + mEntry.systemGeneratedSmartReplies = + new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies).isNull(); + assertThat(repliesAndActions.smartActions).isNull(); + } + + @Test + public void chooseSmartRepliesAndActions_sysGeneratedSmartActions() { + // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart + // actions. + setupAppGeneratedReplies(null /* smartReplies */); + + mEntry.systemGeneratedSmartActions = + createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies).isNull(); + assertThat(repliesAndActions.smartActions.actions) + .isEqualTo(mEntry.systemGeneratedSmartActions); + assertThat(repliesAndActions.smartActions.fromAssistant).isTrue(); + } + + @Test + public void chooseSmartRepliesAndActions_appGenPreferredOverSysGen() { + CharSequence[] appGenSmartReplies = new String[] {"Reply1", "Reply2"}; + // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart + // replies. + List<Notification.Action> appGenSmartActions = + createActions(new String[] {"Test Action 1", "Test Action 2"}); + setupAppGeneratedSuggestions(appGenSmartReplies, appGenSmartActions); + + mEntry.systemGeneratedSmartReplies = + new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; + mEntry.systemGeneratedSmartActions = + createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); + + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartReplies.choices).isEqualTo(appGenSmartReplies); + assertThat(repliesAndActions.smartReplies.fromAssistant).isFalse(); + assertThat(repliesAndActions.smartActions.actions).isEqualTo(appGenSmartActions); + assertThat(repliesAndActions.smartActions.fromAssistant).isFalse(); + } + + @Test + public void chooseSmartRepliesAndActions_disallowSysGenSmartActions() { + // Pass a null-array as app-generated smart replies, so that we use NAS-generated smart + // actions. + setupAppGeneratedReplies(null /* smartReplies */, false /* allowSystemGeneratedReplies */); + when(mNotification.getAllowSystemGeneratedContextualActions()).thenReturn(false); + mEntry.systemGeneratedSmartReplies = + new String[] {"Sys Smart Reply 1", "Sys Smart Reply 2"}; + mEntry.systemGeneratedSmartActions = + createActions(new String[] {"Sys Smart Action 1", "Sys Smart Action 2"}); + + SmartRepliesAndActions repliesAndActions = + InflatedSmartReplies.chooseSmartRepliesAndActions(mSmartReplyConstants, mEntry); + + assertThat(repliesAndActions.smartActions).isNull(); + assertThat(repliesAndActions.smartReplies).isNull(); + } + + private void setupAppGeneratedReplies(CharSequence[] smartReplies) { + setupAppGeneratedReplies(smartReplies, true /* allowSystemGeneratedReplies */); + } + + private void setupAppGeneratedReplies( + CharSequence[] smartReplies, boolean allowSystemGeneratedReplies) { + PendingIntent pendingIntent = + PendingIntent.getBroadcast(mContext, 0, new Intent(TEST_ACTION), 0); + Notification.Action action = + new Notification.Action.Builder(null, "Test Action", pendingIntent).build(); + when(mRemoteInput.getChoices()).thenReturn(smartReplies); + Pair<RemoteInput, Notification.Action> remoteInputActionPair = + Pair.create(mRemoteInput, action); + when(mNotification.findRemoteInputActionPair(false)).thenReturn(remoteInputActionPair); + + Notification.Action freeFormRemoteInputAction = + createActionBuilder("Freeform Test Action") + .setAllowGeneratedReplies(allowSystemGeneratedReplies) + .build(); + Pair<RemoteInput, Notification.Action> freeFormRemoteInputActionPair = + Pair.create(mFreeFormRemoteInput, freeFormRemoteInputAction); + when(mNotification.findRemoteInputActionPair(true)).thenReturn( + freeFormRemoteInputActionPair); + + when(mSmartReplyConstants.requiresTargetingP()).thenReturn(false); + } + + private void setupAppGeneratedSuggestions( + CharSequence[] smartReplies, List<Notification.Action> smartActions) { + setupAppGeneratedReplies(smartReplies); + when(mNotification.getContextualActions()).thenReturn(smartActions); + } + + private Notification.Action.Builder createActionBuilder(String actionTitle) { + PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, + new Intent(TEST_ACTION), 0); + return new Notification.Action.Builder(mActionIcon, actionTitle, pendingIntent); + } + + private Notification.Action createAction(String actionTitle) { + return createActionBuilder(actionTitle).build(); + } + + private List<Notification.Action> createActions(String[] actionTitles) { + List<Notification.Action> actions = new ArrayList<>(); + for (String title : actionTitles) { + actions.add(createAction(title)); + } + return actions; + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java index 6793ecaabdd7..60b0d61558e8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java @@ -113,7 +113,7 @@ public class SmartReplyViewTest extends SysuiTestCase { mDependency.injectTestDependency(SmartReplyConstants.class, mConstants); mContainer = new View(mContext, null); - mView = SmartReplyView.inflate(mContext, null); + mView = SmartReplyView.inflate(mContext); // Any number of replies are fine. when(mConstants.getMinNumSystemGeneratedReplies()).thenReturn(0); @@ -402,17 +402,18 @@ public class SmartReplyViewTest extends SysuiTestCase { } private void setSmartReplies(CharSequence[] choices) { - setSmartReplies(choices, false /* fromAssistant */); + mView.resetSmartSuggestions(mContainer); + List<Button> replyButtons = inflateSmartReplies(choices, false /* fromAssistant */); + mView.addPreInflatedButtons(replyButtons); } - private void setSmartReplies(CharSequence[] choices, boolean fromAssistant) { + private List<Button> inflateSmartReplies(CharSequence[] choices, boolean fromAssistant) { PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(TEST_ACTION), 0); RemoteInput input = new RemoteInput.Builder(TEST_RESULT_KEY).setChoices(choices).build(); SmartReplyView.SmartReplies smartReplies = new SmartReplyView.SmartReplies(choices, input, pendingIntent, fromAssistant); - mView.resetSmartSuggestions(mContainer); - mView.addRepliesFromRemoteInput(smartReplies, mLogger, mEntry); + return mView.inflateRepliesFromRemoteInput(smartReplies, mLogger, mEntry); } private Notification.Action createAction(String actionTitle) { @@ -431,11 +432,12 @@ public class SmartReplyViewTest extends SysuiTestCase { private void setSmartActions(String[] actionTitles) { mView.resetSmartSuggestions(mContainer); - mView.addSmartActions( + List<Button> actions = mView.inflateSmartActions( new SmartReplyView.SmartActions(createActions(actionTitles), false), mLogger, mEntry, mHeadsUpManager); + mView.addPreInflatedButtons(actions); } private void setSmartRepliesAndActions(CharSequence[] choices, String[] actionTitles) { @@ -444,12 +446,14 @@ public class SmartReplyViewTest extends SysuiTestCase { private void setSmartRepliesAndActions( CharSequence[] choices, String[] actionTitles, boolean fromAssistant) { - setSmartReplies(choices, fromAssistant); - mView.addSmartActions( + mView.resetSmartSuggestions(mContainer); + List<Button> smartSuggestions = inflateSmartReplies(choices, fromAssistant); + smartSuggestions.addAll(mView.inflateSmartActions( new SmartReplyView.SmartActions(createActions(actionTitles), fromAssistant), mLogger, mEntry, - mHeadsUpManager); + mHeadsUpManager)); + mView.addPreInflatedButtons(smartSuggestions); } private ViewGroup buildExpectedView(CharSequence[] choices, int lineCount) { @@ -485,8 +489,8 @@ public class SmartReplyViewTest extends SysuiTestCase { SmartReplyView.SmartReplies smartReplies = new SmartReplyView.SmartReplies(choices, null, null, false); for (int i = 0; i < choices.length; ++i) { - Button current = mView.inflateReplyButton(mContext, mView, i, smartReplies, - null, null); + Button current = SmartReplyView.inflateReplyButton(mView, mContext, i, smartReplies, + null /* SmartReplyController */, null /* NotificationEntry */); current.setPadding(paddingHorizontal, current.getPaddingTop(), paddingHorizontal, current.getPaddingBottom()); if (previous != null) { @@ -752,7 +756,7 @@ public class SmartReplyViewTest extends SysuiTestCase { } private Button inflateActionButton(Notification.Action action) { - return mView.inflateActionButton(getContext(), mView, 0, + return SmartReplyView.inflateActionButton(mView, getContext(), 0, new SmartReplyView.SmartActions(Collections.singletonList(action), false), mLogger, mEntry, mHeadsUpManager); } diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto index 7bf37ff379c9..d68442fcda35 100644 --- a/proto/src/wifi.proto +++ b/proto/src/wifi.proto @@ -527,6 +527,12 @@ message WifiLog { // List of NetworkSelectionExperimentDecisions stats for each experiment repeated NetworkSelectionExperimentDecisions network_selection_experiment_decisions_list = 140; + + // Network Request API surface metrics. + optional WifiNetworkRequestApiLog wifi_network_request_api_log = 141; + + // Network Suggestion API surface metrics. + optional WifiNetworkSuggestionApiLog wifi_network_suggestion_api_log = 142; } // Information that gets logged for every WiFi connection. @@ -2341,3 +2347,39 @@ message NetworkSelectionExperimentDecisions { // a single network choice, since choosing not to connect to that network is a valid choice. repeated MapEntryInt32Int32 different_selection_num_choices_counter = 4; } + +// NetworkRequest API metrics. +message WifiNetworkRequestApiLog { + // Number of requests via this API surface. + optional int32 num_request = 1; + + // Histogram of requests via this API surface to number of networks matched in scan results. + optional HistogramBucketInt32 network_match_size_histogram = 2; + + // Number of successful network connection from this API. + optional int32 num_connect_success = 3; + + // Number of requests via this API surface that bypassed user approval. + optional int32 num_user_approval_bypass = 4; + + // Number of requests via this API surface that was rejected by the user. + optional int32 num_user_reject = 5; + + // Number of unique apps using this API surface. + optional int32 num_apps = 6; +} + +// NetworkSuggestion API metrics. +message WifiNetworkSuggestionApiLog { + // Number of modifications to their suggestions by apps. + optional int32 num_modification = 1; + + // Number of successful network connection from app suggestions. + optional int32 num_connect_success = 2; + + // Number of network connection failures from app suggestions. + optional int32 num_connect_failure = 3; + + // Histogram for size of the network lists provided by various apps on the device. + repeated HistogramBucketInt32 network_list_size_histogram = 4; +} diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 2b94d10d6dac..7fbfc42800a4 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -335,7 +335,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState if (mContexts == null) { mContexts = new ArrayList<>(1); } - mContexts.add(new FillContext(requestId, structure)); + mContexts.add(new FillContext(requestId, structure, mCurrentViewId)); cancelCurrentRequestLocked(); diff --git a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java index 385bc6cf3932..a18686da653e 100644 --- a/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java +++ b/services/contentsuggestions/java/com/android/server/contentsuggestions/ContentSuggestionsPerUserService.java @@ -80,12 +80,7 @@ public final class ContentSuggestionsPerUserService extends @Override // from PerUserSystemService protected boolean updateLocked(boolean disabled) { final boolean enabledChanged = super.updateLocked(disabled); - if (enabledChanged) { - if (!isEnabledLocked()) { - // Clear the remote service for the next call - mRemoteService = null; - } - } + updateRemoteServiceLocked(); return enabledChanged; } @@ -133,6 +128,15 @@ public final class ContentSuggestionsPerUserService extends } @GuardedBy("mLock") + private void updateRemoteServiceLocked() { + if (mRemoteService != null) { + mRemoteService.destroy(); + mRemoteService = null; + } + } + + + @GuardedBy("mLock") @Nullable private RemoteContentSuggestionsService getRemoteServiceLocked() { if (mRemoteService == null) { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index c37a805bc30c..9dc673b848e5 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -71,6 +71,8 @@ import android.net.INetworkMonitorCallbacks; import android.net.INetworkPolicyListener; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; +import android.net.InetAddresses; +import android.net.IpPrefix; import android.net.LinkProperties; import android.net.LinkProperties.CompareResult; import android.net.MatchAllNetworkSpecifier; @@ -1742,6 +1744,12 @@ public class ConnectivityService extends IConnectivityManager.Stub } } } + + @Override + public void onNat64PrefixEvent(int netId, boolean added, + String prefixString, int prefixLength) { + mHandler.post(() -> handleNat64PrefixEvent(netId, added, prefixString, prefixLength)); + } }; @VisibleForTesting @@ -2783,6 +2791,29 @@ public class ConnectivityService extends IConnectivityManager.Stub handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties)); } + private void handleNat64PrefixEvent(int netId, boolean added, String prefixString, + int prefixLength) { + NetworkAgentInfo nai = mNetworkForNetId.get(netId); + if (nai == null) return; + + log(String.format("NAT64 prefix %s on netId %d: %s/%d", + (added ? "added" : "removed"), netId, prefixString, prefixLength)); + + IpPrefix prefix = null; + if (added) { + try { + prefix = new IpPrefix(InetAddresses.parseNumericAddress(prefixString), + prefixLength); + } catch (IllegalArgumentException e) { + loge("Invalid NAT64 prefix " + prefixString + "/" + prefixLength); + return; + } + } + + nai.clatd.setNat64Prefix(prefix); + handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties)); + } + private void updateLingerState(NetworkAgentInfo nai, long now) { // 1. Update the linger timer. If it's changed, reschedule or cancel the alarm. // 2. If the network was lingering and there are now requests, unlinger it. @@ -2910,7 +2941,7 @@ public class ConnectivityService extends IConnectivityManager.Stub e.rethrowFromSystemServer(); } mNetworkAgentInfos.remove(nai.messenger); - nai.maybeStopClat(); + nai.clatd.update(); synchronized (mNetworkForNetId) { // Remove the NetworkAgent, but don't mark the netId as // available until we've told netd to delete it below. @@ -4099,12 +4130,14 @@ public class ConnectivityService extends IConnectivityManager.Stub } /** - * Return the information of all ongoing VPNs. This method is used by NetworkStatsService - * and not available in ConnectivityManager. + * Return the information of all ongoing VPNs. + * + * <p>This method is used to update NetworkStatsService. + * + * <p>Must be called on the handler thread. */ - @Override - public VpnInfo[] getAllVpnInfo() { - enforceConnectivityInternalPermission(); + private VpnInfo[] getAllVpnInfo() { + ensureRunningOnConnectivityServiceThread(); synchronized (mVpns) { if (mLockdownEnabled) { return new VpnInfo[0]; @@ -5256,11 +5289,10 @@ public class ConnectivityService extends IConnectivityManager.Stub LinkProperties oldLp) { int netId = networkAgent.network.netId; - // The NetworkAgentInfo does not know whether clatd is running on its network or not. Before - // we do anything else, make sure its LinkProperties are accurate. - if (networkAgent.clatd != null) { - networkAgent.clatd.fixupLinkProperties(oldLp, newLp); - } + // The NetworkAgentInfo does not know whether clatd is running on its network or not, or + // whether there is a NAT64 prefix. Before we do anything else, make sure its LinkProperties + // are accurate. + networkAgent.clatd.fixupLinkProperties(oldLp, newLp); updateInterfaces(newLp, oldLp, netId, networkAgent.networkCapabilities); updateMtu(newLp, oldLp); @@ -5290,8 +5322,8 @@ public class ConnectivityService extends IConnectivityManager.Stub synchronized (networkAgent) { networkAgent.linkProperties = newLp; } - // Start or stop clat accordingly to network state. - networkAgent.updateClat(mNMS); + // Start or stop DNS64 detection and 464xlat according to network state. + networkAgent.clatd.update(); notifyIfacesChangedForNetworkStats(); if (networkAgent.everConnected) { try { @@ -6439,6 +6471,7 @@ public class ConnectivityService extends IConnectivityManager.Stub * Must be called on the handler thread. */ private Network[] getDefaultNetworks() { + ensureRunningOnConnectivityServiceThread(); ArrayList<Network> defaultNetworks = new ArrayList<>(); NetworkAgentInfo defaultNetwork = getDefaultNetwork(); for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { @@ -6454,8 +6487,15 @@ public class ConnectivityService extends IConnectivityManager.Stub * properties tracked by NetworkStatsService on an active iface has changed. */ private void notifyIfacesChangedForNetworkStats() { + ensureRunningOnConnectivityServiceThread(); + String activeIface = null; + LinkProperties activeLinkProperties = getActiveLinkProperties(); + if (activeLinkProperties != null) { + activeIface = activeLinkProperties.getInterfaceName(); + } try { - mStatsService.forceUpdateIfaces(getDefaultNetworks()); + mStatsService.forceUpdateIfaces( + getDefaultNetworks(), getAllVpnInfo(), getAllNetworkState(), activeIface); } catch (Exception ignored) { } } diff --git a/services/core/java/com/android/server/ExtconUEventObserver.java b/services/core/java/com/android/server/ExtconUEventObserver.java index 775e4c8cf4ed..6b42b3d06d4b 100644 --- a/services/core/java/com/android/server/ExtconUEventObserver.java +++ b/services/core/java/com/android/server/ExtconUEventObserver.java @@ -162,15 +162,6 @@ public abstract class ExtconUEventObserver extends UEventObserver { /** Does the {@link /sys/class/extcon} directory exist */ public static boolean extconExists() { File extconDir = new File("/sys/class/extcon"); - boolean retVal = extconDir.exists() && extconDir.isDirectory(); - // TODO(b/124364409): return the correct value after selinux policy is updated. - if (retVal) { - Slog.w(TAG, extconDir + " exists " + extconDir.exists() + " isDir " - + extconDir.isDirectory() - + " but reporting it does not exist until selinux policies are updated." - + " see b/124364409" - ); - } - return false; + return extconDir.exists() && extconDir.isDirectory(); } } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 4b8ba1056c85..d7cc19b6dbd4 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -337,7 +337,7 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public void onChange(boolean selfChange) { synchronized (mLock) { - onProviderAllowedChangedLocked(true); + onProviderAllowedChangedLocked(); } } }, UserHandle.USER_ALL); @@ -436,6 +436,10 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") private void onLocationModeChangedLocked(boolean broadcast) { + if (D) { + Log.d(TAG, "location enabled is now " + isLocationEnabled()); + } + for (LocationProvider p : mProviders) { p.onLocationModeChangedLocked(); } @@ -448,16 +452,10 @@ public class LocationManagerService extends ILocationManager.Stub { } @GuardedBy("mLock") - private void onProviderAllowedChangedLocked(boolean broadcast) { + private void onProviderAllowedChangedLocked() { for (LocationProvider p : mProviders) { p.onAllowedChangedLocked(); } - - if (broadcast) { - mContext.sendBroadcastAsUser( - new Intent(LocationManager.PROVIDERS_CHANGED_ACTION), - UserHandle.ALL); - } } @GuardedBy("mLock") @@ -827,6 +825,10 @@ public class LocationManagerService extends ILocationManager.Stub { return; } + if (D) { + Log.d(TAG, "foreground user is changing to " + userId); + } + // let providers know the current user is on the way out before changing the user for (LocationProvider p : mProviders) { p.onUserChangingLocked(); @@ -839,7 +841,12 @@ public class LocationManagerService extends ILocationManager.Stub { // if the user changes, per-user settings may also have changed onLocationModeChangedLocked(false); - onProviderAllowedChangedLocked(false); + onProviderAllowedChangedLocked(); + + // always force useability to be rechecked, even if no per-user settings have changed + for (LocationProvider p : mProviders) { + p.onUseableChangedLocked(false); + } } private class LocationProvider implements AbstractLocationProvider.LocationProviderManager { @@ -891,9 +898,13 @@ public class LocationManagerService extends ILocationManager.Stub { public void attachLocked(AbstractLocationProvider provider) { checkNotNull(provider); checkState(mProvider == null); - mProvider = provider; - onUseableChangedLocked(); + if (D) { + Log.d(TAG, mName + " provider attached"); + } + + mProvider = provider; + onUseableChangedLocked(false); } public String getName() { @@ -1054,26 +1065,12 @@ public class LocationManagerService extends ILocationManager.Stub { return; } - mEnabled = enabled; - - // update provider allowed settings to reflect enabled status - if (mIsManagedBySettings) { - if (mEnabled && !mAllowed) { - Settings.Secure.putStringForUser( - mContext.getContentResolver(), - Settings.Secure.LOCATION_PROVIDERS_ALLOWED, - "+" + mName, - mCurrentUserId); - } else if (!mEnabled && mAllowed) { - Settings.Secure.putStringForUser( - mContext.getContentResolver(), - Settings.Secure.LOCATION_PROVIDERS_ALLOWED, - "-" + mName, - mCurrentUserId); - } + if (D) { + Log.d(TAG, mName + " provider enabled is now " + mEnabled); } - onUseableChangedLocked(); + mEnabled = enabled; + onUseableChangedLocked(false); } }); } @@ -1091,41 +1088,28 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") public void onLocationModeChangedLocked() { - onUseableChangedLocked(); - } - - private boolean isAllowed() { - return isAllowedForUser(mCurrentUserId); - } - - private boolean isAllowedForUser(int userId) { - String allowedProviders = Settings.Secure.getStringForUser( - mContext.getContentResolver(), - Settings.Secure.LOCATION_PROVIDERS_ALLOWED, - userId); - return TextUtils.delimitedStringContains(allowedProviders, ',', mName); + onUseableChangedLocked(false); } @GuardedBy("mLock") public void onAllowedChangedLocked() { if (mIsManagedBySettings) { - boolean allowed = isAllowed(); + String allowedProviders = Settings.Secure.getStringForUser( + mContext.getContentResolver(), + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + mCurrentUserId); + boolean allowed = TextUtils.delimitedStringContains(allowedProviders, ',', mName); + if (allowed == mAllowed) { return; } - mAllowed = allowed; - // make a best effort to keep the setting matching the real enabled state of the - // provider so that legacy applications aren't broken. - if (mAllowed && !mEnabled) { - Settings.Secure.putStringForUser( - mContext.getContentResolver(), - Settings.Secure.LOCATION_PROVIDERS_ALLOWED, - "-" + mName, - mCurrentUserId); + if (D) { + Log.d(TAG, mName + " provider allowed is now " + mAllowed); } - onUseableChangedLocked(); + mAllowed = allowed; + onUseableChangedLocked(true); } } @@ -1140,17 +1124,49 @@ public class LocationManagerService extends ILocationManager.Stub { } @GuardedBy("mLock") - public void onUseableChangedLocked() { + private boolean isUseableIgnoringAllowedLocked() { + return mProvider != null && mProviders.contains(this) && isLocationEnabled() + && mEnabled; + } + + @GuardedBy("mLock") + public void onUseableChangedLocked(boolean isAllowedChanged) { // if any property that contributes to "useability" here changes state, it MUST result // in a direct or indrect call to onUseableChangedLocked. this allows the provider to // guarantee that it will always eventually reach the correct state. - boolean useable = mProvider != null - && mProviders.contains(this) && isLocationEnabled() && mAllowed && mEnabled; + boolean useableIgnoringAllowed = isUseableIgnoringAllowedLocked(); + boolean useable = useableIgnoringAllowed && mAllowed; + + // update deprecated provider allowed settings for backwards compatibility, and do this + // even if there is no change in overall useability state. this may result in trying to + // overwrite the same value, but Settings handles deduping this. + if (mIsManagedBySettings) { + // a "-" change derived from the allowed setting should not be overwritten, but a + // "+" change should be corrected if necessary + if (useableIgnoringAllowed && !isAllowedChanged) { + Settings.Secure.putStringForUser( + mContext.getContentResolver(), + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + "+" + mName, + mCurrentUserId); + } else if (!useableIgnoringAllowed) { + Settings.Secure.putStringForUser( + mContext.getContentResolver(), + Settings.Secure.LOCATION_PROVIDERS_ALLOWED, + "-" + mName, + mCurrentUserId); + } + } + if (useable == mUseable) { return; } mUseable = useable; + if (D) { + Log.d(TAG, mName + " provider useable is now " + mUseable); + } + if (!mUseable) { // If any provider has been disabled, clear all last locations for all // providers. This is to be on the safe side in case a provider has location @@ -1160,6 +1176,10 @@ public class LocationManagerService extends ILocationManager.Stub { } updateProviderUseableLocked(this); + + mContext.sendBroadcastAsUser( + new Intent(LocationManager.PROVIDERS_CHANGED_ACTION), + UserHandle.ALL); } @GuardedBy("mLock") @@ -1720,7 +1740,7 @@ public class LocationManagerService extends ILocationManager.Stub { mProviders.add(provider); provider.onAllowedChangedLocked(); // allowed state may change while provider was inactive - provider.onUseableChangedLocked(); + provider.onUseableChangedLocked(false); } @GuardedBy("mLock") @@ -1728,7 +1748,7 @@ public class LocationManagerService extends ILocationManager.Stub { if (mProviders.remove(provider)) { long identity = Binder.clearCallingIdentity(); try { - provider.onUseableChangedLocked(); + provider.onUseableChangedLocked(false); } finally { Binder.restoreCallingIdentity(identity); } @@ -2113,7 +2133,6 @@ public class LocationManagerService extends ILocationManager.Stub { } } - if (D) Log.d(TAG, "provider request: " + provider + " " + providerRequest); provider.setRequestLocked(providerRequest, worksource); } @@ -2507,7 +2526,6 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public Location getLastLocation(LocationRequest r, String packageName) { - if (D) Log.d(TAG, "getLastLocation: " + r); synchronized (mLock) { LocationRequest request = r != null ? r : DEFAULT_LOCATION_REQUEST; int allowedResolutionLevel = getCallerAllowedResolutionLevel(); diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index ada3947477de..c8e8ef862f84 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -205,6 +205,9 @@ class StorageManagerService extends IStorageManager.Stub private static final boolean ENABLE_ISOLATED_STORAGE = StorageManager.hasIsolatedStorage(); + private static final boolean ENABLE_LEGACY_GREYLIST = SystemProperties + .getBoolean(StorageManager.PROP_LEGACY_GREYLIST, true); + public static class Lifecycle extends SystemService { private StorageManagerService mStorageManagerService; @@ -2289,7 +2292,26 @@ class StorageManagerService extends IStorageManager.Stub refreshIsolatedStorageSettings(); // Perform hard reboot to kick policy into place - mContext.getSystemService(PowerManager.class).reboot(null); + mHandler.post(() -> { + mContext.getSystemService(PowerManager.class).reboot(null); + }); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + if ((mask & StorageManager.DEBUG_LEGACY_GREYLIST) != 0) { + final boolean enabled = (flags & StorageManager.DEBUG_LEGACY_GREYLIST) != 0; + + final long token = Binder.clearCallingIdentity(); + try { + SystemProperties.set(StorageManager.PROP_LEGACY_GREYLIST, + Boolean.toString(enabled)); + + // Perform hard reboot to kick policy into place + mHandler.post(() -> { + mContext.getSystemService(PowerManager.class).reboot(null); + }); } finally { Binder.restoreCallingIdentity(token); } @@ -2639,8 +2661,8 @@ class StorageManagerService extends IStorageManager.Stub mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, "no permission to access the crypt keeper"); - if (StorageManager.isFileEncryptedNativeOnly()) { - // Not supported on FBE devices + if (!StorageManager.isBlockEncrypted()) { + // Only supported on FDE devices return; } @@ -2663,8 +2685,8 @@ class StorageManagerService extends IStorageManager.Stub mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, "no permission to access the crypt keeper"); - if (StorageManager.isFileEncryptedNativeOnly()) { - // Not supported on FBE devices + if (!StorageManager.isBlockEncrypted()) { + // Only supported on FDE devices return null; } @@ -2961,7 +2983,9 @@ class StorageManagerService extends IStorageManager.Stub @Override public void mkdirs(String callingPkg, String appPath) { - final int userId = UserHandle.getUserId(Binder.getCallingUid()); + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(callingUid); final UserEnvironment userEnv = new UserEnvironment(userId); final String propertyName = "sys.user." + userId + ".ce_available"; @@ -2979,7 +3003,7 @@ class StorageManagerService extends IStorageManager.Stub // Validate that reported package name belongs to caller final AppOpsManager appOps = (AppOpsManager) mContext.getSystemService( Context.APP_OPS_SERVICE); - appOps.checkPackage(Binder.getCallingUid(), callingPkg); + appOps.checkPackage(callingUid, callingPkg); File appFile = null; try { @@ -2998,11 +3022,13 @@ class StorageManagerService extends IStorageManager.Stub appPath = appPath + "/"; } + final String systemPath = translateAppToSystem(appPath, callingPid, callingUid); + try { - mVold.mkdirs(appPath); + mVold.mkdirs(systemPath); return; } catch (Exception e) { - throw new IllegalStateException("Failed to prepare " + appPath + ": " + e); + throw new IllegalStateException("Failed to prepare " + systemPath + ": " + e); } } @@ -3675,16 +3701,17 @@ class StorageManagerService extends IStorageManager.Stub } else if (mPmInternal.isInstantApp(packageName, UserHandle.getUserId(uid))) { return Zygote.MOUNT_EXTERNAL_NONE; } else { - // STOPSHIP: remove this temporary workaround once developers - // fix bugs where they're opening _data paths in native code - switch (packageName) { - case "com.facebook.katana": // b/123996076 - case "jp.naver.line.android": // b/124767356 - case "com.mxtech.videoplayer.ad": // b/124531483 - return Zygote.MOUNT_EXTERNAL_LEGACY; - default: - return Zygote.MOUNT_EXTERNAL_WRITE; + if (ENABLE_LEGACY_GREYLIST) { + // STOPSHIP: remove this temporary workaround once developers + // fix bugs where they're opening _data paths in native code + switch (packageName) { + case "com.facebook.katana": // b/123996076 + case "jp.naver.line.android": // b/124767356 + case "com.mxtech.videoplayer.ad": // b/124531483 + return Zygote.MOUNT_EXTERNAL_LEGACY; + } } + return Zygote.MOUNT_EXTERNAL_WRITE; } } catch (RemoteException e) { // Should not happen diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 5633082ce4b3..0955cc56fe14 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -1455,7 +1455,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { synchronized (mRecords) { mPreciseDataConnectionState = new PreciseDataConnectionState( TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN, - ApnSetting.getApnTypesBitmaskFromString(apnType), "", null, + ApnSetting.getApnTypesBitmaskFromString(apnType), null, null, DataFailCause.NONE); for (Record r : mRecords) { if (r.matchPhoneStateListenerEvent( @@ -1471,7 +1471,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } broadcastDataConnectionFailed(apnType, subId); broadcastPreciseDataConnectionStateChanged(TelephonyManager.DATA_UNKNOWN, - TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, "", null, + TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, null, null, DataFailCause.NONE); } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index fb541e00f588..346492fccc21 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -933,6 +933,27 @@ public final class ActiveServices { } } + /** + * Return the current foregroundServiceType of the ServiceRecord. + * @param className ComponentName of the Service class. + * @param token IBinder token. + * @return current foreground service type. + */ + public int getForegroundServiceTypeLocked(ComponentName className, IBinder token) { + final int userId = UserHandle.getCallingUserId(); + final long origId = Binder.clearCallingIdentity(); + int ret = ServiceInfo.FOREGROUND_SERVICE_TYPE_NONE; + try { + ServiceRecord r = findServiceLocked(className, token, userId); + if (r != null) { + ret = r.foregroundServiceType; + } + } finally { + Binder.restoreCallingIdentity(origId); + } + return ret; + } + boolean foregroundAppShownEnoughLocked(ActiveForegroundApp aa, long nowElapsed) { if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Shown enough: pkg=" + aa.mPackageName + ", uid=" + aa.mUid); diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index de41152570d8..415a8927295d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -16,8 +16,6 @@ package com.android.server.am; -import static android.provider.DeviceConfig.ActivityManager.KEY_MAX_CACHED_PROCESSES; - import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK; import android.app.ActivityThread; @@ -105,6 +103,12 @@ final class ActivityManagerConstants extends ContentObserver { private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000; private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000; + // Flag stored in the DeviceConfig API. + /** + * Maximum number of cached processes. + */ + private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes"; + // Maximum number of cached processes we will allow. public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES; @@ -292,7 +296,7 @@ final class ActivityManagerConstants extends ContentObserver { updateConstants(); updateActivityStartsLoggingEnabled(); updateBackgroundActivityStartsEnabled(); - DeviceConfig.addOnPropertyChangedListener(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, ActivityThread.currentApplication().getMainExecutor(), mOnDeviceConfigChangedListener); updateMaxCachedProcesses(); @@ -412,7 +416,7 @@ final class ActivityManagerConstants extends ContentObserver { private void updateMaxCachedProcesses() { String maxCachedProcessesFlag = DeviceConfig.getProperty( - DeviceConfig.ActivityManager.NAMESPACE, KEY_MAX_CACHED_PROCESSES); + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MAX_CACHED_PROCESSES); try { CUR_MAX_CACHED_PROCESSES = mOverrideMaxCachedProcesses < 0 ? (TextUtils.isEmpty(maxCachedProcessesFlag) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f2902b172502..fe85d231b903 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13586,6 +13586,13 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override + public int getForegroundServiceType(ComponentName className, IBinder token) { + synchronized (this) { + return mServices.getForegroundServiceTypeLocked(className, token); + } + } + + @Override public int handleIncomingUser(int callingPid, int callingUid, int userId, boolean allowAll, boolean requireFull, String name, String callerPackage) { return mUserController.handleIncomingUser(callingPid, callingUid, userId, allowAll, diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java index 17ffd9c5e093..1f2116065bc1 100644 --- a/services/core/java/com/android/server/am/AppCompactor.java +++ b/services/core/java/com/android/server/am/AppCompactor.java @@ -17,14 +17,6 @@ package com.android.server.am; import static android.os.Process.THREAD_PRIORITY_FOREGROUND; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_4; -import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION; import android.app.ActivityManager; import android.app.ActivityThread; @@ -51,6 +43,17 @@ import java.util.Random; public final class AppCompactor { + // Flags stored in the DeviceConfig API. + @VisibleForTesting static final String KEY_USE_COMPACTION = "use_compaction"; + @VisibleForTesting static final String KEY_COMPACT_ACTION_1 = "compact_action_1"; + @VisibleForTesting static final String KEY_COMPACT_ACTION_2 = "compact_action_2"; + @VisibleForTesting static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1"; + @VisibleForTesting static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2"; + @VisibleForTesting static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3"; + @VisibleForTesting static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4"; + @VisibleForTesting static final String KEY_COMPACT_STATSD_SAMPLE_RATE = + "compact_statsd_sample_rate"; + // Phenotype sends int configurations and we map them to the strings we'll use on device, // preventing a weird string value entering the kernel. private static final int COMPACT_ACTION_FILE_FLAG = 1; @@ -165,7 +168,7 @@ public final class AppCompactor { * starts the background thread if necessary. */ public void init() { - DeviceConfig.addOnPropertyChangedListener(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, ActivityThread.currentApplication().getMainExecutor(), mOnFlagsChangedListener); synchronized (mPhenotypeFlagLock) { updateUseCompaction(); @@ -228,7 +231,7 @@ public final class AppCompactor { @GuardedBy("mPhenotypeFlagLock") private void updateUseCompaction() { String useCompactionFlag = - DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_USE_COMPACTION); mUseCompaction = TextUtils.isEmpty(useCompactionFlag) ? DEFAULT_USE_COMPACTION : Boolean.parseBoolean(useCompactionFlag); @@ -241,10 +244,10 @@ public final class AppCompactor { @GuardedBy("mPhenotypeFlagLock") private void updateCompactionActions() { String compactAction1Flag = - DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPACT_ACTION_1); String compactAction2Flag = - DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPACT_ACTION_2); int compactAction1 = DEFAULT_COMPACT_ACTION_1; @@ -271,16 +274,16 @@ public final class AppCompactor { private void updateCompactionThrottles() { boolean useThrottleDefaults = false; String throttleSomeSomeFlag = - DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPACT_THROTTLE_1); String throttleSomeFullFlag = - DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPACT_THROTTLE_2); String throttleFullSomeFlag = - DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPACT_THROTTLE_3); String throttleFullFullFlag = - DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPACT_THROTTLE_4); if (TextUtils.isEmpty(throttleSomeSomeFlag) || TextUtils.isEmpty(throttleSomeFullFlag) @@ -309,7 +312,7 @@ public final class AppCompactor { @GuardedBy("mPhenotypeFlagLock") private void updateStatsdSampleRate() { - String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPACT_STATSD_SAMPLE_RATE); try { mStatsdSampleRate = TextUtils.isEmpty(sampleRateFlag) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 5d802a76ae95..6bd412bcd536 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -89,6 +89,8 @@ import android.media.audiopolicy.AudioMix; import android.media.audiopolicy.AudioPolicy; import android.media.audiopolicy.AudioPolicyConfig; import android.media.audiopolicy.AudioProductStrategies; +import android.media.audiopolicy.AudioVolumeGroup; +import android.media.audiopolicy.AudioVolumeGroups; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionManager; @@ -128,6 +130,7 @@ import android.widget.Toast; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.DumpUtils; +import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.server.EventLogTags; import com.android.server.LocalServices; @@ -277,6 +280,8 @@ public class AudioService extends IAudioService.Stub /** @see AudioProductStrategies */ private static AudioProductStrategies sAudioProductStrategies; + /** @see AudioVolumeGroups */ + private static AudioVolumeGroups sAudioVolumeGroups; private int mMode = AudioSystem.MODE_NORMAL; // protects mRingerMode @@ -629,6 +634,7 @@ public class AudioService extends IAudioService.Stub mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator(); sAudioProductStrategies = new AudioProductStrategies(); + sAudioVolumeGroups = new AudioVolumeGroups(); // Initialize volume int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1); @@ -1002,6 +1008,14 @@ public class AudioService extends IAudioService.Stub return sAudioProductStrategies; } + /** + * @return the {@link android.media.audiopolicy.AudioVolumeGroups} discovered from the + * platform configuration file. + */ + public @NonNull AudioVolumeGroups listAudioVolumeGroups() { + return sAudioVolumeGroups; + } + private void checkAllAliasStreamVolumes() { synchronized (mSettingsLock) { synchronized (VolumeStreamState.class) { @@ -1892,6 +1906,62 @@ public class AudioService extends IAudioService.Stub mStreamStates[stream].mute(index == 0); } + private void enforceModifyAudioRoutingPermission() { + if (mContext.checkCallingPermission( + android.Manifest.permission.MODIFY_AUDIO_ROUTING) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Missing MODIFY_AUDIO_ROUTING permission"); + } + } + + /** @see AudioManager#setVolumeIndexForAttributes(attr, int, int) */ + public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags, + String callingPackage) { + enforceModifyAudioRoutingPermission(); + Preconditions.checkNotNull(attr, "attr must not be null"); + // @todo not hold the caller context, post message + int stream = sAudioProductStrategies.getLegacyStreamTypeForAudioAttributes(attr); + final int device = getDeviceForStream(stream); + + int oldIndex = AudioSystem.getVolumeIndexForAttributes(attr, device); + + AudioSystem.setVolumeIndexForAttributes(attr, index, device); + + final int volumeGroup = sAudioProductStrategies.getVolumeGroupIdForAttributes(attr); + final AudioVolumeGroup avg = sAudioVolumeGroups.getById(volumeGroup); + if (avg == null) { + return; + } + for (final int groupedStream : avg.getLegacyStreamTypes()) { + setStreamVolume(stream, index, flags, callingPackage, callingPackage, + Binder.getCallingUid()); + } + } + + /** @see AudioManager#getVolumeIndexForAttributes(attr) */ + public int getVolumeIndexForAttributes(@NonNull AudioAttributes attr) { + enforceModifyAudioRoutingPermission(); + Preconditions.checkNotNull(attr, "attr must not be null"); + int stream = sAudioProductStrategies.getLegacyStreamTypeForAudioAttributes(attr); + final int device = getDeviceForStream(stream); + + return AudioSystem.getVolumeIndexForAttributes(attr, device); + } + + /** @see AudioManager#getMaxVolumeIndexForAttributes(attr) */ + public int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attr) { + enforceModifyAudioRoutingPermission(); + Preconditions.checkNotNull(attr, "attr must not be null"); + return AudioSystem.getMaxVolumeIndexForAttributes(attr); + } + + /** @see AudioManager#getMinVolumeIndexForAttributes(attr) */ + public int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attr) { + enforceModifyAudioRoutingPermission(); + Preconditions.checkNotNull(attr, "attr must not be null"); + return AudioSystem.getMinVolumeIndexForAttributes(attr); + } + /** @see AudioManager#setStreamVolume(int, int, int) */ public void setStreamVolume(int streamType, int index, int flags, String callingPackage) { if ((streamType == AudioManager.STREAM_ACCESSIBILITY) && !canChangeAccessibilityVolume()) { diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java index 89fa2de92c1c..87b9eaaa9cbb 100644 --- a/services/core/java/com/android/server/biometrics/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java @@ -158,6 +158,7 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinder.D */ public boolean onAcquired(int acquiredInfo, int vendorCode) { super.logOnAcquired(acquiredInfo, vendorCode, getTargetUserId()); + if (DEBUG) Slog.v(getLogTag(), "Acquired: " + acquiredInfo + " " + vendorCode); try { if (mListener != null) { mListener.onAcquired(getHalDeviceId(), acquiredInfo, vendorCode); diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java index 9d9b1cfdf6e2..2646d7669d79 100644 --- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java +++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java @@ -18,19 +18,24 @@ package com.android.server.connectivity; import android.net.ConnectivityManager; import android.net.INetd; +import android.net.InetAddresses; import android.net.InterfaceConfiguration; +import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.RouteInfo; import android.os.INetworkManagementService; import android.os.RemoteException; +import android.os.ServiceSpecificException; import android.util.Slog; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.server.net.BaseNetworkObserver; import java.net.Inet4Address; +import java.net.Inet6Address; import java.util.Objects; /** @@ -67,15 +72,16 @@ public class Nat464Xlat extends BaseNetworkObserver { private final NetworkAgentInfo mNetwork; private enum State { - IDLE, // start() not called. Base iface and stacked iface names are null. - STARTING, // start() called. Base iface and stacked iface names are known. - RUNNING, // start() called, and the stacked iface is known to be up. - STOPPING; // stop() called, this Nat464Xlat is still registered as a network observer for - // the stacked interface. + IDLE, // start() not called. Base iface and stacked iface names are null. + DISCOVERING, // same as IDLE, except prefix discovery in progress. + STARTING, // start() called. Base iface and stacked iface names are known. + RUNNING, // start() called, and the stacked iface is known to be up. } + private IpPrefix mNat64Prefix; private String mBaseIface; private String mIface; + private Inet6Address mIPv6Address; private State mState = State.IDLE; public Nat464Xlat(NetworkAgentInfo nai, INetd netd, INetworkManagementService nmService) { @@ -85,20 +91,51 @@ public class Nat464Xlat extends BaseNetworkObserver { } /** - * Determines whether a network requires clat. + * Whether to attempt 464xlat on this network. This is true for an IPv6-only network that is + * currently connected and where the NetworkAgent has not disabled 464xlat. It is the signal to + * enable NAT64 prefix discovery. + * * @param network the NetworkAgentInfo corresponding to the network. * @return true if the network requires clat, false otherwise. */ - public static boolean requiresClat(NetworkAgentInfo nai) { + @VisibleForTesting + protected static boolean requiresClat(NetworkAgentInfo nai) { // TODO: migrate to NetworkCapabilities.TRANSPORT_*. final boolean supported = ArrayUtils.contains(NETWORK_TYPES, nai.networkInfo.getType()); final boolean connected = ArrayUtils.contains(NETWORK_STATES, nai.networkInfo.getState()); - // We only run clat on networks that don't have a native IPv4 address. - final boolean hasIPv4Address = - (nai.linkProperties != null) && nai.linkProperties.hasIPv4Address(); - final boolean skip464xlat = - (nai.netMisc() != null) && nai.netMisc().skip464xlat; - return supported && connected && !hasIPv4Address && !skip464xlat; + + // Only run clat on networks that have a global IPv6 address and don't have a native IPv4 + // address. + LinkProperties lp = nai.linkProperties; + final boolean isIpv6OnlyNetwork = (lp != null) && lp.hasGlobalIPv6Address() + && !lp.hasIPv4Address(); + + // If the network tells us it doesn't use clat, respect that. + final boolean skip464xlat = (nai.netMisc() != null) && nai.netMisc().skip464xlat; + + return supported && connected && isIpv6OnlyNetwork && !skip464xlat; + } + + /** + * Whether the clat demon should be started on this network now. This is true if requiresClat is + * true and a NAT64 prefix has been discovered. + * + * @param nai the NetworkAgentInfo corresponding to the network. + * @return true if the network should start clat, false otherwise. + */ + @VisibleForTesting + protected static boolean shouldStartClat(NetworkAgentInfo nai) { + LinkProperties lp = nai.linkProperties; + return requiresClat(nai) && lp != null && lp.getNat64Prefix() != null; + } + + /** + * @return true if we have started prefix discovery and not yet stopped it (regardless of + * whether it is still running or has succeeded). + * A true result corresponds to internal states DISCOVERING, STARTING and RUNNING. + */ + public boolean isPrefixDiscoveryStarted() { + return mState == State.DISCOVERING || isStarted(); } /** @@ -106,7 +143,7 @@ public class Nat464Xlat extends BaseNetworkObserver { * A true result corresponds to internal states STARTING and RUNNING. */ public boolean isStarted() { - return mState != State.IDLE; + return (mState == State.STARTING || mState == State.RUNNING); } /** @@ -124,32 +161,31 @@ public class Nat464Xlat extends BaseNetworkObserver { } /** - * @return true if clatd has been stopped. - */ - public boolean isStopping() { - return mState == State.STOPPING; - } - - /** * Start clatd, register this Nat464Xlat as a network observer for the stacked interface, * and set internal state. */ private void enterStartingState(String baseIface) { try { mNMService.registerObserver(this); - } catch(RemoteException e) { - Slog.e(TAG, - "startClat: Can't register interface observer for clat on " + mNetwork.name()); + } catch (RemoteException e) { + Slog.e(TAG, "Can't register interface observer for clat on " + mNetwork.name()); return; } + + String addrStr = null; try { - mNetd.clatdStart(baseIface); - } catch(RemoteException|IllegalStateException e) { - Slog.e(TAG, "Error starting clatd on " + baseIface, e); + addrStr = mNetd.clatdStart(baseIface, mNat64Prefix.toString()); + } catch (RemoteException | ServiceSpecificException e) { + Slog.e(TAG, "Error starting clatd on " + baseIface + ": " + e); } mIface = CLAT_PREFIX + baseIface; mBaseIface = baseIface; mState = State.STARTING; + try { + mIPv6Address = (Inet6Address) InetAddresses.parseNumericAddress(addrStr); + } catch (ClassCastException | IllegalArgumentException | NullPointerException e) { + Slog.e(TAG, "Invalid IPv6 address " + addrStr); + } } /** @@ -161,37 +197,27 @@ public class Nat464Xlat extends BaseNetworkObserver { } /** - * Stop clatd, and turn ND offload on if it had been turned off. - */ - private void enterStoppingState() { - try { - mNetd.clatdStop(mBaseIface); - } catch(RemoteException|IllegalStateException e) { - Slog.e(TAG, "Error stopping clatd on " + mBaseIface, e); - } - - mState = State.STOPPING; - } - - /** * Unregister as a base observer for the stacked interface, and clear internal state. */ - private void enterIdleState() { + private void leaveStartedState() { try { mNMService.unregisterObserver(this); - } catch(RemoteException|IllegalStateException e) { - Slog.e(TAG, "Error unregistering clatd observer on " + mBaseIface, e); + } catch (RemoteException | IllegalStateException e) { + Slog.e(TAG, "Error unregistering clatd observer on " + mBaseIface + ": " + e); } - mIface = null; mBaseIface = null; mState = State.IDLE; + if (requiresClat(mNetwork)) { + mState = State.DISCOVERING; + } else { + stopPrefixDiscovery(); + mState = State.IDLE; + } } - /** - * Starts the clat daemon. - */ - public void start() { + @VisibleForTesting + protected void start() { if (isStarted()) { Slog.e(TAG, "startClat: already started"); return; @@ -212,28 +238,92 @@ public class Nat464Xlat extends BaseNetworkObserver { enterStartingState(baseIface); } - /** - * Stops the clat daemon. - */ - public void stop() { + @VisibleForTesting + protected void stop() { if (!isStarted()) { + Slog.e(TAG, "stopClat: already stopped"); return; } + Slog.i(TAG, "Stopping clatd on " + mBaseIface); + try { + mNetd.clatdStop(mBaseIface); + } catch (RemoteException | ServiceSpecificException e) { + Slog.e(TAG, "Error stopping clatd on " + mBaseIface + ": " + e); + } + + String iface = mIface; + boolean wasRunning = isRunning(); + + // Change state before updating LinkProperties. handleUpdateLinkProperties ends up calling + // fixupLinkProperties, and if at that time the state is still RUNNING, fixupLinkProperties + // would wrongly inform ConnectivityService that there is still a stacked interface. + leaveStartedState(); + + if (wasRunning) { + LinkProperties lp = new LinkProperties(mNetwork.linkProperties); + lp.removeStackedLink(iface); + mNetwork.connService().handleUpdateLinkProperties(mNetwork, lp); + } + } + + private void startPrefixDiscovery() { + try { + mNetd.resolverStartPrefix64Discovery(getNetId()); + mState = State.DISCOVERING; + } catch (RemoteException | ServiceSpecificException e) { + Slog.e(TAG, "Error starting prefix discovery on netId " + getNetId() + ": " + e); + } + } - boolean wasStarting = isStarting(); - enterStoppingState(); - if (wasStarting) { - enterIdleState(); + private void stopPrefixDiscovery() { + try { + mNetd.resolverStopPrefix64Discovery(getNetId()); + } catch (RemoteException | ServiceSpecificException e) { + Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e); } } /** + * Starts/stops NAT64 prefix discovery and clatd as necessary. + */ + public void update() { + // TODO: turn this class into a proper StateMachine. // http://b/126113090 + if (requiresClat(mNetwork)) { + if (!isPrefixDiscoveryStarted()) { + startPrefixDiscovery(); + } else if (shouldStartClat(mNetwork)) { + // NAT64 prefix detected. Start clatd. + // TODO: support the NAT64 prefix changing after it's been discovered. There is no + // need to support this at the moment because it cannot happen without changes to + // the Dns64Configuration code in netd. + start(); + } else { + // NAT64 prefix removed. Stop clatd and go back into DISCOVERING state. + stop(); + } + } else { + // Network no longer requires clat. Stop clat and prefix discovery. + if (isStarted()) { + stop(); + } else if (isPrefixDiscoveryStarted()) { + leaveStartedState(); + } + } + } + + public void setNat64Prefix(IpPrefix nat64Prefix) { + mNat64Prefix = nat64Prefix; + } + + /** * Copies the stacked clat link in oldLp, if any, to the passed LinkProperties. * This is necessary because the LinkProperties in mNetwork come from the transport layer, which * has no idea that 464xlat is running on top of it. */ public void fixupLinkProperties(LinkProperties oldLp, LinkProperties lp) { + lp.setNat64Prefix(mNat64Prefix); + if (!isRunning()) { return; } @@ -272,7 +362,7 @@ public class Nat464Xlat extends BaseNetworkObserver { try { InterfaceConfiguration config = mNMService.getInterfaceConfig(iface); return config.getLinkAddress(); - } catch(RemoteException|IllegalStateException e) { + } catch (RemoteException | IllegalStateException e) { Slog.e(TAG, "Error getting link properties: " + e); return null; } @@ -282,6 +372,20 @@ public class Nat464Xlat extends BaseNetworkObserver { * Adds stacked link on base link and transitions to RUNNING state. */ private void handleInterfaceLinkStateChanged(String iface, boolean up) { + // TODO: if we call start(), then stop(), then start() again, and the + // interfaceLinkStateChanged notification for the first start is delayed past the first + // stop, then the code becomes out of sync with system state and will behave incorrectly. + // + // This is not trivial to fix because: + // 1. It is not guaranteed that start() will eventually result in the interface coming up, + // because there could be an error starting clat (e.g., if the interface goes down before + // the packet socket can be bound). + // 2. If start is called multiple times, there is nothing in the interfaceLinkStateChanged + // notification that says which start() call the interface was created by. + // + // Once this code is converted to StateMachine, it will be possible to use deferMessage to + // ensure it stays in STARTING state until the interfaceLinkStateChanged notification fires, + // and possibly use a timeout (or provide some guarantees at the lower layer) to address #1. if (!isStarting() || !up || !Objects.equals(mIface, iface)) { return; } @@ -307,20 +411,16 @@ public class Nat464Xlat extends BaseNetworkObserver { if (!Objects.equals(mIface, iface)) { return; } - if (!isRunning() && !isStopping()) { + if (!isRunning()) { return; } Slog.i(TAG, "interface " + iface + " removed"); - if (!isStopping()) { - // Ensure clatd is stopped if stop() has not been called: this likely means that clatd - // has crashed. - enterStoppingState(); - } - enterIdleState(); - LinkProperties lp = new LinkProperties(mNetwork.linkProperties); - lp.removeStackedLink(iface); - mNetwork.connService().handleUpdateLinkProperties(mNetwork, lp); + // If we're running, and the interface was removed, then we didn't call stop(), and it's + // likely that clatd crashed. Ensure we call stop() so we can start clatd again. Calling + // stop() will also update LinkProperties, and if clatd crashed, the LinkProperties update + // will cause ConnectivityService to call start() again. + stop(); } @Override @@ -337,4 +437,9 @@ public class Nat464Xlat extends BaseNetworkObserver { public String toString() { return "mBaseIface: " + mBaseIface + ", mIface: " + mIface + ", mState: " + mState; } + + @VisibleForTesting + protected int getNetId() { + return mNetwork.network.netId; + } } diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index cd4ce2d142bb..6ef9fbbf0da8 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -238,7 +238,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { public final int factorySerialNumber; // Used by ConnectivityService to keep track of 464xlat. - public Nat464Xlat clatd; + public final Nat464Xlat clatd; // Set after asynchronous creation of the NetworkMonitor. private volatile INetworkMonitor mNetworkMonitor; @@ -246,8 +246,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { private static final String TAG = ConnectivityService.class.getSimpleName(); private static final boolean VDBG = false; private final ConnectivityService mConnService; - private final INetd mNetd; - private final INetworkManagementService mNMS; private final Context mContext; private final Handler mHandler; @@ -262,9 +260,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { linkProperties = lp; networkCapabilities = nc; currentScore = score; + clatd = new Nat464Xlat(this, netd, nms); mConnService = connService; - mNetd = netd; - mNMS = nms; mContext = context; mHandler = handler; networkMisc = misc; @@ -598,32 +595,6 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { for (LingerTimer timer : mLingerTimers) { pw.println(timer); } } - public void updateClat(INetworkManagementService netd) { - if (Nat464Xlat.requiresClat(this)) { - maybeStartClat(); - } else { - maybeStopClat(); - } - } - - /** Ensure clat has started for this network. */ - public void maybeStartClat() { - if (clatd != null && clatd.isStarted()) { - return; - } - clatd = new Nat464Xlat(this, mNetd, mNMS); - clatd.start(); - } - - /** Ensure clat has stopped for this network. */ - public void maybeStopClat() { - if (clatd == null) { - return; - } - clatd.stop(); - clatd = null; - } - public String toString() { return "NetworkAgentInfo{ ni{" + networkInfo + "} " + "network{" + network + "} nethandle{" + network.getNetworkHandle() + "} " diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 8a208a56098f..9f80a83038af 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -1639,13 +1639,12 @@ public class SyncManager { } } - if (syncOperation.isAppStandbyExempted()) { - final UsageStatsManagerInternal usmi = LocalServices.getService( - UsageStatsManagerInternal.class); - if (usmi != null) { - usmi.reportExemptedSyncScheduled(syncOperation.owningPackage, - UserHandle.getUserId(syncOperation.owningUid)); - } + final UsageStatsManagerInternal usmi = + LocalServices.getService(UsageStatsManagerInternal.class); + if (usmi != null) { + usmi.reportSyncScheduled(syncOperation.owningPackage, + UserHandle.getUserId(syncOperation.owningUid), + syncOperation.isAppStandbyExempted()); } getJobScheduler().scheduleAsPackage(b.build(), syncOperation.owningPackage, diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index d57431e6b58b..1f28a6cf0951 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -288,6 +288,10 @@ class AutomaticBrightnessController { return mScreenAutoBrightness; } + public boolean hasValidAmbientLux() { + return mAmbientLuxValid; + } + public float getAutomaticScreenBrightnessAdjustment() { return mBrightnessMapper.getAutoBrightnessAdjustment(); } @@ -648,9 +652,9 @@ class AutomaticBrightnessController { mLightSensorWarmUpTimeConfig + mLightSensorEnableTime; if (time < timeWhenSensorWarmedUp) { if (mLoggingEnabled) { - Slog.d(TAG, "updateAmbientLux: Sensor not ready yet: " + - "time=" + time + ", " + - "timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp); + Slog.d(TAG, "updateAmbientLux: Sensor not ready yet: " + + "time=" + time + ", " + + "timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp); } mHandler.sendEmptyMessageAtTime(MSG_UPDATE_AMBIENT_LUX, timeWhenSensorWarmedUp); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 15c7ef75866f..74cda9df4323 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -874,7 +874,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // If the brightness is already set then it's been overridden by something other than the // user, or is a temporary adjustment. - final boolean userInitiatedChange = brightness < 0 + boolean userInitiatedChange = brightness < 0 && (autoBrightnessAdjustmentChanged || userSetBrightnessChanged); boolean hadUserBrightnessPoint = false; @@ -1010,6 +1010,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } if (!brightnessIsTemporary) { + if (userInitiatedChange && (mAutomaticBrightnessController == null + || !mAutomaticBrightnessController.hasValidAmbientLux())) { + // If we don't have a valid lux reading we can't report a valid + // slider event so notify as if the system changed the brightness. + userInitiatedChange = false; + } notifyBrightnessChanged(brightness, userInitiatedChange, hadUserBrightnessPoint); } diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 51563008464c..ae915037947e 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -687,7 +687,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } } - private void handleRequestLocation(boolean independentFromGnss) { + private void handleRequestLocation(boolean independentFromGnss, boolean isUserEmergency) { if (isRequestLocationRateLimited()) { if (DEBUG) { Log.d(TAG, "RequestLocation is denied due to too frequent requests."); @@ -723,9 +723,17 @@ public class GnssLocationProvider extends AbstractLocationProvider implements String.format( "GNSS HAL Requesting location updates from %s provider for %d millis.", provider, durationMillis)); + + LocationRequest locationRequest = LocationRequest.createFromDeprecatedProvider(provider, + LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /* minDistance= */ 0, + /* singleShot= */ false); + + // Ignore location settings if in emergency mode. + if (isUserEmergency && mNIHandler.getInEmergency()) { + locationRequest.setLocationSettingsIgnored(true); + } try { - locationManager.requestLocationUpdates(provider, - LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /*minDistance=*/ 0, + locationManager.requestLocationUpdates(locationRequest, locationListener, mHandler.getLooper()); locationListener.mNumLocationUpdateRequest++; mHandler.postDelayed(() -> { @@ -1828,11 +1836,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } @NativeEntryPoint - private void requestLocation(boolean independentFromGnss) { + private void requestLocation(boolean independentFromGnss, boolean isUserEmergency) { if (DEBUG) { - Log.d(TAG, "requestLocation. independentFromGnss: " + independentFromGnss); + Log.d(TAG, "requestLocation. independentFromGnss: " + independentFromGnss + + ", isUserEmergency: " + + isUserEmergency); } - sendMessage(REQUEST_LOCATION, 0, independentFromGnss); + sendMessage(REQUEST_LOCATION, independentFromGnss ? 1 : 0, isUserEmergency); } @NativeEntryPoint @@ -1923,7 +1933,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mNtpTimeHelper.retrieveAndInjectNtpTime(); break; case REQUEST_LOCATION: - handleRequestLocation((boolean) msg.obj); + handleRequestLocation(msg.arg1 == 1, (boolean) msg.obj); break; case DOWNLOAD_XTRA_DATA: handleDownloadXtraData(); diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java index fccff57e3234..270fbc68e143 100644 --- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java +++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java @@ -16,17 +16,15 @@ package com.android.server.media.projection; -import com.android.server.Watchdog; - import android.Manifest; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.display.DisplayManager; import android.media.MediaRouter; -import android.media.projection.IMediaProjectionManager; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionCallback; +import android.media.projection.IMediaProjectionManager; import android.media.projection.IMediaProjectionWatcherCallback; import android.media.projection.MediaProjectionInfo; import android.media.projection.MediaProjectionManager; @@ -41,6 +39,7 @@ import android.util.Slog; import com.android.internal.util.DumpUtils; import com.android.server.SystemService; +import com.android.server.Watchdog; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -361,8 +360,9 @@ public final class MediaProjectionManagerService extends SystemService @Override // Binder call public boolean canProjectAudio() { - return mType == MediaProjectionManager.TYPE_MIRRORING || - mType == MediaProjectionManager.TYPE_PRESENTATION; + return mType == MediaProjectionManager.TYPE_MIRRORING + || mType == MediaProjectionManager.TYPE_PRESENTATION + || mType == MediaProjectionManager.TYPE_SCREEN_CAPTURE; } @Override // Binder call diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index bffd60bcb87f..205ddb07ec44 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -82,7 +82,6 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.net.DataUsageRequest; -import android.net.IConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.INetworkStatsService; import android.net.INetworkStatsSession; @@ -196,8 +195,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private final boolean mUseBpfTrafficStats; - private IConnectivityManager mConnManager; - @VisibleForTesting public static final String ACTION_NETWORK_STATS_POLL = "com.android.server.action.NETWORK_STATS_POLL"; @@ -259,6 +256,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private final ArrayMap<String, NetworkIdentitySet> mActiveUidIfaces = new ArrayMap<>(); /** Current default active iface. */ + @GuardedBy("mStatsLock") private String mActiveIface; /** Set of any ifaces associated with mobile networks since boot. */ @@ -269,6 +267,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub { @GuardedBy("mStatsLock") private Network[] mDefaultNetworks = new Network[0]; + /** Set containing info about active VPNs and their underlying networks. */ + @GuardedBy("mStatsLock") + private VpnInfo[] mVpnInfos = new VpnInfo[0]; + private final DropBoxNonMonotonicObserver mNonMonotonicObserver = new DropBoxNonMonotonicObserver(); @@ -382,10 +384,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { mHandlerCallback = callback; } - public void bindConnectivityManager(IConnectivityManager connManager) { - mConnManager = checkNotNull(connManager, "missing IConnectivityManager"); - } - public void systemReady() { mSystemReady = true; @@ -864,13 +862,17 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } @Override - public void forceUpdateIfaces(Network[] defaultNetworks) { + public void forceUpdateIfaces( + Network[] defaultNetworks, + VpnInfo[] vpnArray, + NetworkState[] networkStates, + String activeIface) { mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG); assertBandwidthControlEnabled(); final long token = Binder.clearCallingIdentity(); try { - updateIfaces(defaultNetworks); + updateIfaces(defaultNetworks, vpnArray, networkStates, activeIface); } finally { Binder.restoreCallingIdentity(token); } @@ -1134,11 +1136,17 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } }; - private void updateIfaces(Network[] defaultNetworks) { + private void updateIfaces( + Network[] defaultNetworks, + VpnInfo[] vpnArray, + NetworkState[] networkStates, + String activeIface) { synchronized (mStatsLock) { mWakeLock.acquire(); try { - updateIfacesLocked(defaultNetworks); + mVpnInfos = vpnArray; + mActiveIface = activeIface; + updateIfacesLocked(defaultNetworks, networkStates); } finally { mWakeLock.release(); } @@ -1152,7 +1160,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { * {@link NetworkIdentitySet}. */ @GuardedBy("mStatsLock") - private void updateIfacesLocked(Network[] defaultNetworks) { + private void updateIfacesLocked(Network[] defaultNetworks, NetworkState[] states) { if (!mSystemReady) return; if (LOGV) Slog.v(TAG, "updateIfacesLocked()"); @@ -1164,18 +1172,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // will be persisted during next alarm poll event. performPollLocked(FLAG_PERSIST_NETWORK); - final NetworkState[] states; - final LinkProperties activeLink; - try { - states = mConnManager.getAllNetworkState(); - activeLink = mConnManager.getActiveLinkProperties(); - } catch (RemoteException e) { - // ignored; service lives in system_server - return; - } - - mActiveIface = activeLink != null ? activeLink.getInterfaceName() : null; - // Rebuild active interfaces based on connected networks mActiveIfaces.clear(); mActiveUidIfaces.clear(); @@ -1287,7 +1283,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { Trace.traceEnd(TRACE_TAG_NETWORK); // For per-UID stats, pass the VPN info so VPN traffic is reattributed to responsible apps. - VpnInfo[] vpnArray = mConnManager.getAllVpnInfo(); + VpnInfo[] vpnArray = mVpnInfos; Trace.traceBegin(TRACE_TAG_NETWORK, "recordUid"); mUidRecorder.recordSnapshotLocked(uidSnapshot, mActiveUidIfaces, vpnArray, currentTime); Trace.traceEnd(TRACE_TAG_NETWORK); diff --git a/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java b/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java index d53d81cf0860..a1ff76fc8c09 100644 --- a/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java +++ b/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java @@ -61,7 +61,7 @@ public class DynamicCodeLoggingService extends JobService { private static final Pattern EXECUTE_NATIVE_AUDIT_PATTERN = Pattern.compile(".*\\bavc: granted \\{ execute(?:_no_trans|) \\} .*" + "\\bpath=(?:\"([^\" ]*)\"|([0-9A-F]+)) .*" - + "\\bscontext=u:r:untrusted_app_2(?:5|7):.*" + + "\\bscontext=u:r:untrusted_app(?:_25|_27)?:.*" + "\\btcontext=u:object_r:app_data_file:.*" + "\\btclass=file\\b.*"); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 487861fa31ea..6fe085b38d40 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1935,7 +1935,7 @@ public class PackageManagerService extends IPackageManager.Stub final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting.getInstallReason(userId) != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { - setDefaultBrowserPackageName(null, userId); + setDefaultBrowserAsyncLPw(null, userId); } } @@ -13687,6 +13687,23 @@ public class PackageManagerService extends IPackageManager.Stub return true; } + private void setDefaultBrowserAsyncLPw(@Nullable String packageName, @UserIdInt int userId) { + if (userId == UserHandle.USER_ALL) { + return; + } + if (mDefaultBrowserProvider == null) { + Slog.e(TAG, "mDefaultBrowserProvider is null"); + return; + } + mDefaultBrowserProvider.setDefaultBrowserAsync(packageName, userId); + if (packageName != null) { + synchronized (mPackages) { + mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName, + userId); + } + } + } + @Override public String getDefaultBrowserPackageName(int userId) { if (UserHandle.getCallingUserId() != userId) { @@ -23100,6 +23117,18 @@ public class PackageManagerService extends IPackageManager.Stub } return 0; } + + @Override + public boolean[] isAudioPlaybackCaptureAllowed(String[] packageNames) + throws RemoteException { + int callingUser = UserHandle.getUserId(Binder.getCallingUid()); + boolean[] results = new boolean[packageNames.length]; + for (int i = results.length - 1; i >= 0; --i) { + ApplicationInfo appInfo = getApplicationInfo(packageNames[i], 0, callingUser); + results[i] = appInfo == null ? false : appInfo.isAudioPlaybackCaptureAllowed(); + } + return results; + } } private class PackageManagerInternalImpl extends PackageManagerInternal { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 92fe377e9495..59e5d7716369 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4372,6 +4372,7 @@ public final class Settings { ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE", ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION", ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE", + ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE, "ALLOW_AUDIO_PLAYBACK_CAPTURE", ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND, "BACKUP_IN_FOREGROUND", ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE", ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE, "DEFAULT_TO_DEVICE_PROTECTED_STORAGE", diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java index 8740256af04d..406cbc10a8aa 100644 --- a/services/core/java/com/android/server/power/AttentionDetector.java +++ b/services/core/java/com/android/server/power/AttentionDetector.java @@ -19,9 +19,13 @@ package com.android.server.power; import android.attention.AttentionManagerInternal; import android.attention.AttentionManagerInternal.AttentionCallbackInternal; import android.content.Context; +import android.database.ContentObserver; +import android.os.Handler; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.SystemClock; +import android.os.UserHandle; +import android.provider.Settings; import android.service.attention.AttentionService; import android.util.Slog; import android.util.StatsLog; @@ -44,6 +48,8 @@ public class AttentionDetector { private static final String TAG = "AttentionDetector"; private static final boolean DEBUG = false; + private boolean mIsSettingEnabled; + /** * Invoked whenever user attention is detected. */ @@ -128,15 +134,35 @@ public class AttentionDetector { mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE; } + @VisibleForTesting + void updateEnabledFromSettings(Context context) { + mIsSettingEnabled = Settings.System.getIntForUser(context.getContentResolver(), + Settings.System.ADAPTIVE_SLEEP, 0, UserHandle.USER_CURRENT) == 1; + } + public void systemReady(Context context) { + updateEnabledFromSettings(context); mAttentionManager = LocalServices.getService(AttentionManagerInternal.class); mMaximumExtensionMillis = context.getResources().getInteger( com.android.internal.R.integer.config_attentionMaximumExtension); mMaxAttentionApiTimeoutMillis = context.getResources().getInteger( com.android.internal.R.integer.config_attentionApiTimeout); + + context.getContentResolver().registerContentObserver(Settings.System.getUriFor( + Settings.System.ADAPTIVE_SLEEP), + false, new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + updateEnabledFromSettings(context); + } + }, UserHandle.USER_ALL); } public long updateUserActivity(long nextScreenDimming) { + if (!mIsSettingEnabled) { + return nextScreenDimming; + } + if (!isAttentionServiceSupported()) { return nextScreenDimming; } @@ -182,7 +208,7 @@ public class AttentionDetector { * the activity happened. * * @param eventTime Activity time, in uptime millis. - * @param event Activity type as defined in {@link PowerManager}. + * @param event Activity type as defined in {@link PowerManager}. * @return 0 when activity was ignored, 1 when handled, -1 when invalid. */ public int onUserActivity(long eventTime, int event) { diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 89d24b194b13..bb23bc0e2414 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -715,6 +715,15 @@ public final class PowerManagerService extends SystemService NativeWrapper createNativeWrapper() { return new NativeWrapper(); } + + WirelessChargerDetector createWirelessChargerDetector( + SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) { + return new WirelessChargerDetector(sensorManager, suspendBlocker, handler); + } + + AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) { + return new AmbientDisplayConfiguration(context); + } } final Constants mConstants; @@ -747,7 +756,7 @@ public final class PowerManagerService extends SystemService mHandlerThread.start(); mHandler = new PowerManagerHandler(mHandlerThread.getLooper()); mConstants = new Constants(mHandler); - mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext); + mAmbientDisplayConfiguration = mInjector.createAmbientDisplayConfiguration(context); mAttentionDetector = new AttentionDetector(this::onUserAttention, mLock); mBatterySavingStats = new BatterySavingStats(mLock); @@ -833,7 +842,7 @@ public final class PowerManagerService extends SystemService mInjector.createSuspendBlocker(this, "PowerManagerService.Broadcasts"), mPolicy); - mWirelessChargerDetector = new WirelessChargerDetector(sensorManager, + mWirelessChargerDetector = mInjector.createWirelessChargerDetector(sensorManager, mInjector.createSuspendBlocker( this, "PowerManagerService.WirelessChargerDetector"), mHandler); @@ -932,7 +941,8 @@ public final class PowerManagerService extends SystemService mContext.registerReceiver(new DockReceiver(), filter, null, mHandler); } - private void readConfigurationLocked() { + @VisibleForTesting + void readConfigurationLocked() { final Resources resources = mContext.getResources(); mDecoupleHalAutoSuspendModeFromDisplayConfig = resources.getBoolean( @@ -3865,7 +3875,8 @@ public final class PowerManagerService extends SystemService return workSource != null ? new WorkSource(workSource) : null; } - private final class BatteryReceiver extends BroadcastReceiver { + @VisibleForTesting + final class BatteryReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { synchronized (mLock) { @@ -3883,7 +3894,8 @@ public final class PowerManagerService extends SystemService } } - private final class UserSwitchedReceiver extends BroadcastReceiver { + @VisibleForTesting + final class UserSwitchedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { synchronized (mLock) { diff --git a/services/core/java/com/android/server/power/WirelessChargerDetector.java b/services/core/java/com/android/server/power/WirelessChargerDetector.java index 18e5ce465df6..e8e9c676135d 100644 --- a/services/core/java/com/android/server/power/WirelessChargerDetector.java +++ b/services/core/java/com/android/server/power/WirelessChargerDetector.java @@ -28,6 +28,8 @@ import android.util.Slog; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; +import com.android.internal.annotations.VisibleForTesting; + import java.io.PrintWriter; /** @@ -70,7 +72,8 @@ import java.io.PrintWriter; * sensor to detect this case. * </p> */ -final class WirelessChargerDetector { +@VisibleForTesting +public class WirelessChargerDetector { private static final String TAG = "WirelessChargerDetector"; private static final boolean DEBUG = false; diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index 17d3066bd37a..f533ad167761 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -743,6 +743,25 @@ public class RoleManagerService extends SystemService implements RoleUserState.C return false; } } + + @Override + public void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId) { + IRoleManagerCallback callback = new IRoleManagerCallback.Stub() { + @Override + public void onSuccess() {} + @Override + public void onFailure() { + Slog.e(LOG_TAG, "Failed to set default browser: " + packageName); + } + }; + if (packageName != null) { + getOrCreateControllerService(userId).onAddRoleHolder(RoleManager.ROLE_BROWSER, + packageName, 0, callback); + } else { + getOrCreateControllerService(userId).onClearRoleHolders(RoleManager.ROLE_BROWSER, 0, + callback); + } + } } private class DefaultHomeProvider implements PackageManagerInternal.DefaultHomeProvider { diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java index e9ccea54fe99..36f18f05c23e 100644 --- a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java +++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java @@ -166,7 +166,7 @@ public class AppDataRollbackHelper { List<RollbackData> rd = new ArrayList<>(); for (RollbackData data : availableRollbacks) { - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { final IntArray pendingBackupUsers = info.getPendingBackups(); if (pendingBackupUsers != null) { final int idx = pendingBackupUsers.indexOf(userId); @@ -246,13 +246,13 @@ public class AppDataRollbackHelper { if (!pendingBackupPackages.isEmpty()) { for (RollbackData data : pendingBackups) { - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { final IntArray pendingBackupUsers = info.getPendingBackups(); final int idx = pendingBackupUsers.indexOf(userId); if (idx != -1) { try { long ceSnapshotInode = mInstaller.snapshotAppData(info.getPackageName(), - userId, data.rollbackId, Installer.FLAG_STORAGE_CE); + userId, data.info.getRollbackId(), Installer.FLAG_STORAGE_CE); info.putCeSnapshotInode(userId, ceSnapshotInode); pendingBackupUsers.remove(idx); } catch (InstallerException ie) { diff --git a/services/core/java/com/android/server/rollback/RollbackData.java b/services/core/java/com/android/server/rollback/RollbackData.java index fcd5297f1363..655bf4ab57a7 100644 --- a/services/core/java/com/android/server/rollback/RollbackData.java +++ b/services/core/java/com/android/server/rollback/RollbackData.java @@ -16,12 +16,11 @@ package com.android.server.rollback; -import android.content.rollback.PackageRollbackInfo; +import android.content.rollback.RollbackInfo; import java.io.File; import java.time.Instant; import java.util.ArrayList; -import java.util.List; /** * Information about a rollback available for a set of atomically installed @@ -29,14 +28,9 @@ import java.util.List; */ class RollbackData { /** - * A unique identifier for this rollback. + * The rollback info for this rollback. */ - public final int rollbackId; - - /** - * The per-package rollback information. - */ - public final List<PackageRollbackInfo> packages = new ArrayList<>(); + public final RollbackInfo info; /** * The directory where the rollback data is stored. @@ -69,24 +63,49 @@ class RollbackData { public int apkSessionId = -1; /** - * Whether this Rollback is currently in progress. This field is true from the point - * we commit a {@code PackageInstaller} session containing these packages to the point the - * {@code PackageInstaller} calls into the {@code onFinished} callback. + * True if we are expecting the package manager to call restoreUserData + * for this rollback because it has just been committed but the rollback + * has not yet been fully applied. */ // NOTE: All accesses to this field are from the RollbackManager handler thread. - public boolean inProgress = false; + public boolean restoreUserDataInProgress = false; - RollbackData(int rollbackId, File backupDir, int stagedSessionId, boolean isAvailable) { - this.rollbackId = rollbackId; + /** + * Constructs a new, empty RollbackData instance. + * + * @param rollbackId the id of the rollback. + * @param backupDir the directory where the rollback data is stored. + * @param stagedSessionId the session id if this is a staged rollback, -1 otherwise. + */ + RollbackData(int rollbackId, File backupDir, int stagedSessionId) { + this.info = new RollbackInfo(rollbackId, + /* packages */ new ArrayList<>(), + /* isStaged */ stagedSessionId != -1, + /* causePackages */ new ArrayList<>(), + /* committedSessionId */ -1); + this.backupDir = backupDir; + this.stagedSessionId = stagedSessionId; + this.isAvailable = (stagedSessionId == -1); + } + + /** + * Constructs a RollbackData instance with full rollback data information. + */ + RollbackData(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId, + boolean isAvailable, int apkSessionId, boolean restoreUserDataInProgress) { + this.info = info; this.backupDir = backupDir; + this.timestamp = timestamp; this.stagedSessionId = stagedSessionId; this.isAvailable = isAvailable; + this.apkSessionId = apkSessionId; + this.restoreUserDataInProgress = restoreUserDataInProgress; } /** * Whether the rollback is for rollback of a staged install. */ public boolean isStaged() { - return stagedSessionId != -1; + return info.isStaged(); } } diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 88a5fb48ada4..52d441255da6 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -243,8 +243,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { for (int i = 0; i < mAvailableRollbacks.size(); ++i) { RollbackData data = mAvailableRollbacks.get(i); if (data.isAvailable) { - rollbacks.add(new RollbackInfo(data.rollbackId, - data.packages, data.isStaged())); + rollbacks.add(data.info); } } return new ParceledListSlice<>(rollbacks); @@ -297,12 +296,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { data.timestamp = data.timestamp.plusMillis(timeDifference); try { - mRollbackStore.saveAvailableRollback(data); + mRollbackStore.saveRollbackData(data); } catch (IOException ioe) { // TODO: figure out the right way to deal with this, especially if // it fails for some data and succeeds for others. - Log.e(TAG, "Unable to save rollback info for : " + data.rollbackId, - ioe); + Log.e(TAG, "Unable to save rollback info for : " + + data.info.getRollbackId(), ioe); } } @@ -335,7 +334,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return; } - if (data.inProgress) { + if (data.restoreUserDataInProgress) { sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE, "Rollback for package is already in progress."); return; @@ -349,7 +348,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // rollback racing with a roll-forward fix of a buggy package. // Figure out how to ensure we don't commit the rollback if // roll forward happens at the same time. - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { VersionedPackage installedVersion = getInstalledPackageVersion(info.getPackageName()); if (installedVersion == null) { // TODO: Test this case @@ -391,7 +390,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { int parentSessionId = packageInstaller.createSession(parentParams); PackageInstaller.Session parentSession = packageInstaller.openSession(parentSessionId); - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); // TODO: We can't get the installerPackageName for apex @@ -441,7 +440,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { getHandler().post(() -> { // We've now completed the rollback, so we mark it as no longer in // progress. - data.inProgress = false; + data.restoreUserDataInProgress = false; int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE); @@ -453,9 +452,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return; } - addRecentlyExecutedRollback(new RollbackInfo( - data.rollbackId, data.packages, data.isStaged(), - causePackages, parentSessionId)); + data.info.setCommittedSessionId(parentSessionId); + data.info.getCausePackages().addAll(causePackages); + addRecentlyExecutedRollback(data.info); sendSuccess(statusReceiver); Intent broadcast = new Intent(Intent.ACTION_ROLLBACK_COMMITTED); @@ -469,7 +468,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } ); - data.inProgress = true; + data.restoreUserDataInProgress = true; parentSession.commit(receiver.getIntentSender()); } catch (IOException e) { Log.e(TAG, "Rollback failed", e); @@ -510,7 +509,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Iterator<RollbackData> iter = mAvailableRollbacks.iterator(); while (iter.hasNext()) { RollbackData data = iter.next(); - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { if (info.getPackageName().equals(packageName)) { iter.remove(); deleteRollback(data); @@ -537,9 +536,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { for (RollbackData rd : changed) { try { - mRollbackStore.saveAvailableRollback(rd); + mRollbackStore.saveRollbackData(rd); } catch (IOException ioe) { - Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe); + Log.e(TAG, "Unable to save rollback info for : " + + rd.info.getRollbackId(), ioe); } } @@ -575,7 +575,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { synchronized (mLock) { ensureRollbackDataLoadedLocked(); for (RollbackData data : mAvailableRollbacks) { - if (data.stagedSessionId != -1) { + if (!data.isAvailable && data.isStaged()) { staged.add(data); } } @@ -591,10 +591,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { data.isAvailable = true; } try { - mRollbackStore.saveAvailableRollback(data); + mRollbackStore.saveRollbackData(data); } catch (IOException ioe) { Log.e(TAG, "Unable to save rollback info for : " - + data.rollbackId, ioe); + + data.info.getRollbackId(), ioe); } } else if (session.isStagedSessionFailed()) { // TODO: Do we need to remove this from @@ -641,7 +641,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private void loadAllRollbackDataLocked() { mAvailableRollbacks = mRollbackStore.loadAvailableRollbacks(); for (RollbackData data : mAvailableRollbacks) { - mAllocatedRollbackIds.put(data.rollbackId, true); + mAllocatedRollbackIds.put(data.info.getRollbackId(), true); } mRecentlyExecutedRollbacks = mRollbackStore.loadRecentlyExecutedRollbacks(); @@ -665,7 +665,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Iterator<RollbackData> iter = mAvailableRollbacks.iterator(); while (iter.hasNext()) { RollbackData data = iter.next(); - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { if (info.getPackageName().equals(packageName) && !packageVersionsEqual( info.getVersionRolledBackFrom(), @@ -897,18 +897,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return false; } String packageName = newPackage.packageName; - for (PackageRollbackInfo info : rd.packages) { + for (PackageRollbackInfo info : rd.info.getPackages()) { if (info.getPackageName().equals(packageName)) { info.getInstalledUsers().addAll(IntArray.wrap(installedUsers)); - mAppDataRollbackHelper.snapshotAppData(rd.rollbackId, info); + mAppDataRollbackHelper.snapshotAppData(rd.info.getRollbackId(), info); try { - mRollbackStore.saveAvailableRollback(rd); + mRollbackStore.saveRollbackData(rd); } catch (IOException ioe) { // TODO: Hopefully this is okay because we will try // again to save the rollback when the staged session // is applied. Just so long as the device doesn't // reboot before then. - Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe); + Log.e(TAG, "Unable to save rollback info for : " + + rd.info.getRollbackId(), ioe); } return true; } @@ -989,14 +990,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { if (data == null) { int rollbackId = allocateRollbackIdLocked(); if (session.isStaged()) { - data = mRollbackStore.createPendingStagedRollback(rollbackId, - parentSessionId); + data = mRollbackStore.createStagedRollback(rollbackId, parentSessionId); } else { - data = mRollbackStore.createAvailableRollback(rollbackId); + data = mRollbackStore.createNonStagedRollback(rollbackId); } mPendingRollbacks.put(parentSessionId, data); } - data.packages.add(info); + data.info.getPackages().add(info); } } catch (IOException e) { Log.e(TAG, "Unable to create rollback for " + packageName, e); @@ -1004,7 +1004,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } if (snapshotUserData && !isApex) { - mAppDataRollbackHelper.snapshotAppData(data.rollbackId, info); + mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), info); } try { @@ -1044,7 +1044,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { return; } - if (!rollbackData.inProgress) { + if (!rollbackData.restoreUserDataInProgress) { Log.e(TAG, "Request to restore userData for: " + packageName + ", but no rollback in progress."); return; @@ -1053,12 +1053,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { for (int userId : userIds) { final PackageRollbackInfo info = getPackageRollbackInfo(rollbackData, packageName); final boolean changedRollbackData = mAppDataRollbackHelper.restoreAppData( - rollbackData.rollbackId, info, userId, appId, seInfo); + rollbackData.info.getRollbackId(), info, userId, appId, seInfo); // We've updated metadata about this rollback, so save it to flash. if (changedRollbackData) { try { - mRollbackStore.saveAvailableRollback(rollbackData); + mRollbackStore.saveRollbackData(rollbackData); } catch (IOException ioe) { // TODO(narayan): What is the right thing to do here ? This isn't a fatal // error, since it will only result in us trying to restore data again, @@ -1137,9 +1137,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { if (rd != null) { try { - mRollbackStore.saveAvailableRollback(rd); + mRollbackStore.saveRollbackData(rd); } catch (IOException ioe) { - Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe); + Log.e(TAG, "Unable to save rollback info for : " + + rd.info.getRollbackId(), ioe); } } }); @@ -1212,7 +1213,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { try { data.timestamp = Instant.now(); - mRollbackStore.saveAvailableRollback(data); + mRollbackStore.saveRollbackData(data); synchronized (mLock) { // Note: There is a small window of time between when // the session has been committed by the package @@ -1233,8 +1234,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // After enabling and commiting any rollback, observe packages and // prepare to rollback if packages crashes too frequently. List<String> packages = new ArrayList<>(); - for (int i = 0; i < data.packages.size(); i++) { - packages.add(data.packages.get(i).getPackageName()); + for (int i = 0; i < data.info.getPackages().size(); i++) { + packages.add(data.info.getPackages().get(i).getPackageName()); } mPackageHealthObserver.startObservingHealth(packages, mRollbackLifetimeDurationInMillis); @@ -1307,7 +1308,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { ensureRollbackDataLoadedLocked(); for (int i = 0; i < mAvailableRollbacks.size(); ++i) { RollbackData data = mAvailableRollbacks.get(i); - if (data.isAvailable && data.rollbackId == rollbackId) { + if (data.isAvailable && data.info.getRollbackId() == rollbackId) { return data; } } @@ -1322,7 +1323,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { */ private static PackageRollbackInfo getPackageRollbackInfo(RollbackData data, String packageName) { - for (PackageRollbackInfo info : data.packages) { + for (PackageRollbackInfo info : data.info.getPackages()) { if (info.getPackageName().equals(packageName)) { return info; } @@ -1347,14 +1348,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } private void deleteRollback(RollbackData rollbackData) { - for (PackageRollbackInfo info : rollbackData.packages) { + for (PackageRollbackInfo info : rollbackData.info.getPackages()) { IntArray installedUsers = info.getInstalledUsers(); for (int i = 0; i < installedUsers.size(); i++) { int userId = installedUsers.get(i); - mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.rollbackId, info, - userId); + mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.info.getRollbackId(), + info, userId); } } - mRollbackStore.deleteAvailableRollback(rollbackData); + mRollbackStore.deleteRollbackData(rollbackData); } } diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java index bb4e89eca5da..ecdb2ccd872b 100644 --- a/services/core/java/com/android/server/rollback/RollbackStore.java +++ b/services/core/java/com/android/server/rollback/RollbackStore.java @@ -183,6 +183,25 @@ class RollbackStore { return ceSnapshotInodes; } + private static JSONObject rollbackInfoToJson(RollbackInfo rollback) throws JSONException { + JSONObject json = new JSONObject(); + json.put("rollbackId", rollback.getRollbackId()); + json.put("packages", toJson(rollback.getPackages())); + json.put("isStaged", rollback.isStaged()); + json.put("causePackages", versionedPackagesToJson(rollback.getCausePackages())); + json.put("committedSessionId", rollback.getCommittedSessionId()); + return json; + } + + private static RollbackInfo rollbackInfoFromJson(JSONObject json) throws JSONException { + return new RollbackInfo( + json.getInt("rollbackId"), + packageRollbackInfosFromJson(json.getJSONArray("packages")), + json.getBoolean("isStaged"), + versionedPackagesFromJson(json.getJSONArray("causePackages")), + json.getInt("committedSessionId")); + } + /** * Reads the list of recently executed rollbacks from persistent storage. */ @@ -197,17 +216,7 @@ class RollbackStore { JSONObject object = new JSONObject(jsonString); JSONArray array = object.getJSONArray("recentlyExecuted"); for (int i = 0; i < array.length(); ++i) { - JSONObject element = array.getJSONObject(i); - int rollbackId = element.getInt("rollbackId"); - List<PackageRollbackInfo> packages = packageRollbackInfosFromJson( - element.getJSONArray("packages")); - boolean isStaged = element.getBoolean("isStaged"); - List<VersionedPackage> causePackages = versionedPackagesFromJson( - element.getJSONArray("causePackages")); - int committedSessionId = element.getInt("committedSessionId"); - RollbackInfo rollback = new RollbackInfo(rollbackId, packages, isStaged, - causePackages, committedSessionId); - recentlyExecutedRollbacks.add(rollback); + recentlyExecutedRollbacks.add(rollbackInfoFromJson(array.getJSONObject(i))); } } catch (IOException | JSONException e) { // TODO: What to do here? Surely we shouldn't just forget about @@ -220,17 +229,22 @@ class RollbackStore { } /** - * Creates a new RollbackData instance with backupDir assigned. + * Creates a new RollbackData instance for a non-staged rollback with + * backupDir assigned. */ - RollbackData createAvailableRollback(int rollbackId) throws IOException { + RollbackData createNonStagedRollback(int rollbackId) throws IOException { File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId)); - return new RollbackData(rollbackId, backupDir, -1, true); + return new RollbackData(rollbackId, backupDir, -1); } - RollbackData createPendingStagedRollback(int rollbackId, int stagedSessionId) + /** + * Creates a new RollbackData instance for a staged rollback with + * backupDir assigned. + */ + RollbackData createStagedRollback(int rollbackId, int stagedSessionId) throws IOException { File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId)); - return new RollbackData(rollbackId, backupDir, stagedSessionId, false); + return new RollbackData(rollbackId, backupDir, stagedSessionId); } /** @@ -263,17 +277,17 @@ class RollbackStore { } /** - * Writes the metadata for an available rollback to persistent storage. + * Saves the rollback data to persistent storage. */ - void saveAvailableRollback(RollbackData data) throws IOException { + void saveRollbackData(RollbackData data) throws IOException { try { JSONObject dataJson = new JSONObject(); - dataJson.put("rollbackId", data.rollbackId); - dataJson.put("packages", toJson(data.packages)); + dataJson.put("info", rollbackInfoToJson(data.info)); dataJson.put("timestamp", data.timestamp.toString()); dataJson.put("stagedSessionId", data.stagedSessionId); dataJson.put("isAvailable", data.isAvailable); dataJson.put("apkSessionId", data.apkSessionId); + dataJson.put("restoreUserDataInProgress", data.restoreUserDataInProgress); PrintWriter pw = new PrintWriter(new File(data.backupDir, "rollback.json")); pw.println(dataJson.toString()); @@ -284,10 +298,9 @@ class RollbackStore { } /** - * Removes all persistant storage associated with the given available - * rollback. + * Removes all persistant storage associated with the given rollback data. */ - void deleteAvailableRollback(RollbackData data) { + void deleteRollbackData(RollbackData data) { removeFile(data.backupDir); } @@ -302,13 +315,7 @@ class RollbackStore { for (int i = 0; i < recentlyExecutedRollbacks.size(); ++i) { RollbackInfo rollback = recentlyExecutedRollbacks.get(i); - JSONObject element = new JSONObject(); - element.put("rollbackId", rollback.getRollbackId()); - element.put("packages", toJson(rollback.getPackages())); - element.put("isStaged", rollback.isStaged()); - element.put("causePackages", versionedPackagesToJson(rollback.getCausePackages())); - element.put("committedSessionId", rollback.getCommittedSessionId()); - array.put(element); + array.put(rollbackInfoToJson(rollback)); } PrintWriter pw = new PrintWriter(mRecentlyExecutedRollbacksFile); @@ -324,40 +331,39 @@ class RollbackStore { * Reads the metadata for a rollback from the given directory. * @throws IOException in case of error reading the data. */ - private RollbackData loadRollbackData(File backupDir) throws IOException { + private static RollbackData loadRollbackData(File backupDir) throws IOException { try { File rollbackJsonFile = new File(backupDir, "rollback.json"); JSONObject dataJson = new JSONObject( IoUtils.readFileAsString(rollbackJsonFile.getAbsolutePath())); - int rollbackId = dataJson.getInt("rollbackId"); - int stagedSessionId = dataJson.getInt("stagedSessionId"); - boolean isAvailable = dataJson.getBoolean("isAvailable"); - RollbackData data = new RollbackData(rollbackId, backupDir, - stagedSessionId, isAvailable); - data.packages.addAll(packageRollbackInfosFromJson(dataJson.getJSONArray("packages"))); - data.timestamp = Instant.parse(dataJson.getString("timestamp")); - data.apkSessionId = dataJson.getInt("apkSessionId"); - return data; + return new RollbackData( + rollbackInfoFromJson(dataJson.getJSONObject("info")), + backupDir, + Instant.parse(dataJson.getString("timestamp")), + dataJson.getInt("stagedSessionId"), + dataJson.getBoolean("isAvailable"), + dataJson.getInt("apkSessionId"), + dataJson.getBoolean("restoreUserDataInProgress")); } catch (JSONException | DateTimeParseException e) { throw new IOException(e); } } - private JSONObject toJson(VersionedPackage pkg) throws JSONException { + private static JSONObject toJson(VersionedPackage pkg) throws JSONException { JSONObject json = new JSONObject(); json.put("packageName", pkg.getPackageName()); json.put("longVersionCode", pkg.getLongVersionCode()); return json; } - private VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException { + private static VersionedPackage versionedPackageFromJson(JSONObject json) throws JSONException { String packageName = json.getString("packageName"); long longVersionCode = json.getLong("longVersionCode"); return new VersionedPackage(packageName, longVersionCode); } - private JSONObject toJson(PackageRollbackInfo info) throws JSONException { + private static JSONObject toJson(PackageRollbackInfo info) throws JSONException { JSONObject json = new JSONObject(); json.put("versionRolledBackFrom", toJson(info.getVersionRolledBackFrom())); json.put("versionRolledBackTo", toJson(info.getVersionRolledBackTo())); @@ -376,7 +382,8 @@ class RollbackStore { return json; } - private PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json) throws JSONException { + private static PackageRollbackInfo packageRollbackInfoFromJson(JSONObject json) + throws JSONException { VersionedPackage versionRolledBackFrom = versionedPackageFromJson( json.getJSONObject("versionRolledBackFrom")); VersionedPackage versionRolledBackTo = versionedPackageFromJson( @@ -397,7 +404,7 @@ class RollbackStore { pendingBackups, pendingRestores, isApex, installedUsers, ceSnapshotInodes); } - private JSONArray versionedPackagesToJson(List<VersionedPackage> packages) + private static JSONArray versionedPackagesToJson(List<VersionedPackage> packages) throws JSONException { JSONArray json = new JSONArray(); for (VersionedPackage pkg : packages) { @@ -406,7 +413,8 @@ class RollbackStore { return json; } - private List<VersionedPackage> versionedPackagesFromJson(JSONArray json) throws JSONException { + private static List<VersionedPackage> versionedPackagesFromJson(JSONArray json) + throws JSONException { List<VersionedPackage> packages = new ArrayList<>(); for (int i = 0; i < json.length(); ++i) { packages.add(versionedPackageFromJson(json.getJSONObject(i))); @@ -414,7 +422,7 @@ class RollbackStore { return packages; } - private JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException { + private static JSONArray toJson(List<PackageRollbackInfo> infos) throws JSONException { JSONArray json = new JSONArray(); for (PackageRollbackInfo info : infos) { json.put(toJson(info)); @@ -422,7 +430,7 @@ class RollbackStore { return json; } - private List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json) + private static List<PackageRollbackInfo> packageRollbackInfosFromJson(JSONArray json) throws JSONException { List<PackageRollbackInfo> infos = new ArrayList<>(); for (int i = 0; i < json.length(); ++i) { diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index e976975bd675..f70adefd7696 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -289,10 +289,11 @@ final class ActivityRecord extends ConfigurationContainer { private int windowFlags; // custom window flags for preview window. private TaskRecord task; // the task this is in. private long createTime = System.currentTimeMillis(); - long lastVisibleTime; // last time this activity became visible - long cpuTimeAtResume; // the cpu time of host process at the time of resuming activity - long pauseTime; // last time we started pausing the activity - long launchTickTime; // base time for launch tick messages + long lastVisibleTime; // last time this activity became visible + long cpuTimeAtResume; // the cpu time of host process at the time of resuming activity + long pauseTime; // last time we started pausing the activity + long launchTickTime; // base time for launch tick messages + long topResumedStateLossTime; // last time we reported top resumed state loss to an activity // Last configuration reported to the activity in the client process. private MergedConfiguration mLastReportedConfiguration; private int mLastReportedDisplayId; @@ -694,14 +695,14 @@ final class ActivityRecord extends ConfigurationContainer { void scheduleTopResumedActivityChanged(boolean onTop) { if (!attachedToProcess()) { - if (DEBUG_CONFIGURATION) { + if (DEBUG_STATES) { Slog.w(TAG, "Can't report activity position update - client not running" + ", activityRecord=" + this); } return; } try { - if (DEBUG_CONFIGURATION) { + if (DEBUG_STATES) { Slog.v(TAG, "Sending position change to " + this + ", onTop: " + onTop); } @@ -3285,7 +3286,7 @@ final class ActivityRecord extends ConfigurationContainer { transaction.addCallback(callbackItem); transaction.setLifecycleStateRequest(lifecycleItem); mAtmService.getLifecycleManager().scheduleTransaction(transaction); - mRootActivityContainer.updateTopResumedActivityIfNeeded(); + mStackSupervisor.updateTopResumedActivityIfNeeded(); // Note: don't need to call pauseIfSleepingLocked() here, because the caller will only // request resume if this activity is currently resumed, which implies we aren't // sleeping. diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index a4457e291cc3..ea2aff220030 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -1491,6 +1491,7 @@ class ActivityStack extends ConfigurationContainer { + " callers=" + Debug.getCallers(5)); r.setState(RESUMED, "minimalResumeActivityLocked"); r.completeResumeLocked(); + mStackSupervisor.updateTopResumedActivityIfNeeded(); if (DEBUG_SAVED_STATE) Slog.i(TAG_SAVED_STATE, "Launch completed; removing icicle of " + r.icicle); } @@ -2575,7 +2576,7 @@ class ActivityStack extends ConfigurationContainer { // Protect against recursion. mInResumeTopActivity = true; result = resumeTopActivityInnerLocked(prev, options); - mRootActivityContainer.updateTopResumedActivityIfNeeded(); + mStackSupervisor.updateTopResumedActivityIfNeeded(); // When resuming the top activity, it may be necessary to pause the top activity (for // example, returning to the lock screen. We suppress the normal pause logic in diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index df760306f12a..758a76546c9b 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -170,6 +170,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // How long we can hold the launch wake lock before giving up. static final int LAUNCH_TIMEOUT = 10 * 1000; + /** How long we wait until giving up on the activity telling us it released the top state. */ + static final int TOP_RESUMED_STATE_LOSS_TIMEOUT = 500; + static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG; static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1; static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; @@ -179,6 +182,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { static final int REPORT_MULTI_WINDOW_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 14; static final int REPORT_PIP_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 15; static final int REPORT_HOME_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 16; + static final int TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 17; // Used to indicate that windows of activities should be preserved during the resize. static final boolean PRESERVE_WINDOWS = true; @@ -300,6 +304,18 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { */ final ArrayList<ActivityRecord> mNoAnimActivities = new ArrayList<>(); + /** + * Cached value of the topmost resumed activity in the system. Updated when new activity is + * resumed. + */ + private ActivityRecord mTopResumedActivity; + + /** + * Flag indicating whether we're currently waiting for the previous top activity to handle the + * loss of the state and report back before making new activity top resumed. + */ + private boolean mTopResumedActivityWaitingForPrev; + /** The target stack bounds for the picture-in-picture mode changed that we need to report to * the application */ Rect mPipModeChangedTargetStackBounds; @@ -844,7 +860,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // Schedule transaction. mService.getLifecycleManager().scheduleTransaction(clientTransaction); - mRootActivityContainer.updateTopResumedActivityIfNeeded(); + updateTopResumedActivityIfNeeded(); if ((proc.mInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0 && mService.mHasHeavyWeightFeature) { @@ -2296,6 +2312,73 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { mHandler.sendEmptyMessage(IDLE_NOW_MSG); } + /** + * Updates the record of top resumed activity when it changes and handles reporting of the + * state changes to previous and new top activities. It will immediately dispatch top resumed + * state loss message to previous top activity (if haven't done it already). After the previous + * activity releases the top state and reports back, message about acquiring top state will be + * sent to the new top resumed activity. + */ + void updateTopResumedActivityIfNeeded() { + final ActivityRecord prevTopActivity = mTopResumedActivity; + final ActivityStack topStack = mRootActivityContainer.getTopDisplayFocusedStack(); + if (topStack == null || topStack.mResumedActivity == prevTopActivity) { + return; + } + + // Ask previous activity to release the top state. + final boolean prevActivityReceivedTopState = + prevTopActivity != null && !mTopResumedActivityWaitingForPrev; + // mTopResumedActivityWaitingForPrev == true at this point would mean that an activity + // before the prevTopActivity one hasn't reported back yet. So server never sent the top + // resumed state change message to prevTopActivity. + if (prevActivityReceivedTopState) { + prevTopActivity.scheduleTopResumedActivityChanged(false /* onTop */); + scheduleTopResumedStateLossTimeout(prevTopActivity); + mTopResumedActivityWaitingForPrev = true; + } + + // Update the current top activity. + mTopResumedActivity = topStack.mResumedActivity; + scheduleTopResumedActivityStateIfNeeded(); + } + + /** Schedule top resumed state change if previous top activity already reported back. */ + private void scheduleTopResumedActivityStateIfNeeded() { + if (mTopResumedActivity != null && !mTopResumedActivityWaitingForPrev) { + mTopResumedActivity.scheduleTopResumedActivityChanged(true /* onTop */); + } + } + + /** + * Limit the time given to the app to report handling of the state loss. + */ + private void scheduleTopResumedStateLossTimeout(ActivityRecord r) { + final Message msg = mHandler.obtainMessage(TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG); + msg.obj = r; + r.topResumedStateLossTime = SystemClock.uptimeMillis(); + mHandler.sendMessageDelayed(msg, TOP_RESUMED_STATE_LOSS_TIMEOUT); + if (DEBUG_STATES) Slog.v(TAG_STATES, "Waiting for top state to be released by " + r); + } + + /** + * Handle a loss of top resumed state by an activity - update internal state and inform next top + * activity if needed. + */ + void handleTopResumedStateReleased(boolean timeout) { + if (DEBUG_STATES) { + Slog.v(TAG_STATES, "Top resumed state released " + + (timeout ? " (due to timeout)" : " (transition complete)")); + } + mHandler.removeMessages(TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG); + if (!mTopResumedActivityWaitingForPrev) { + // Top resumed activity state loss already handled. + return; + } + mTopResumedActivityWaitingForPrev = false; + scheduleTopResumedActivityStateIfNeeded(); + } + void removeTimeoutsForActivityLocked(ActivityRecord r) { if (DEBUG_IDLE) Slog.d(TAG_IDLE, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4)); @@ -2351,6 +2434,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // Suppress the warning toast if the preferredDisplay was set to singleTask. // The singleTaskInstance displays will only contain one task and any attempt to // launch new task will re-route to the default display. + mService.getTaskChangeNotificationController() + .notifyActivityLaunchOnSecondaryDisplayRerouted(task.getTaskInfo(), + preferredDisplayId); return; } @@ -2587,8 +2673,18 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // Start home activities on displays with no activities. mRootActivityContainer.startHomeOnEmptyDisplays("homeChanged"); } - } - break; + } break; + case TOP_RESUMED_STATE_LOSS_TIMEOUT_MSG: { + ActivityRecord r = (ActivityRecord) msg.obj; + Slog.w(TAG, "Activity top resumed state loss timeout for " + r); + synchronized (mService.mGlobalLock) { + if (r.hasProcess()) { + mService.logAppTooSlow(r.app, r.topResumedStateLossTime, + "top state loss for " + r); + } + } + handleTopResumedStateReleased(true /* timeout */); + } break; } } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 486a4ea24f65..d747198bc3f1 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1634,6 +1634,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override + public final void activityTopResumedStateLost() { + final long origId = Binder.clearCallingIdentity(); + synchronized (mGlobalLock) { + mStackSupervisor.handleTopResumedStateReleased(false /* timeout */); + } + Binder.restoreCallingIdentity(origId); + } + + @Override public final void activityPaused(IBinder token) { final long origId = Binder.clearCallingIdentity(); synchronized (mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/AppWindowThumbnail.java b/services/core/java/com/android/server/wm/AppWindowThumbnail.java index 5519729c17f5..bbbf11d2a7a2 100644 --- a/services/core/java/com/android/server/wm/AppWindowThumbnail.java +++ b/services/core/java/com/android/server/wm/AppWindowThumbnail.java @@ -118,7 +118,8 @@ class AppWindowThumbnail implements Animatable { anim.scaleCurrentDuration(mAppToken.mWmService.getTransitionAnimationScaleLocked()); mSurfaceAnimator.startAnimation(t, new LocalAnimationAdapter( new WindowAnimationSpec(anim, position, - mAppToken.getDisplayContent().mAppTransition.canSkipFirstFrame()), + mAppToken.getDisplayContent().mAppTransition.canSkipFirstFrame(), + mAppToken.mWmService.mWindowCornerRadius), mAppToken.mWmService.mSurfaceAnimationRunner), false /* hidden */); } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 05c4c2793a01..78199d4412a6 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -582,6 +582,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } } } + // Changes in opening apps and closing apps may cause orientation change. + reportDescendantOrientationChangeIfNeeded(); return; } @@ -729,11 +731,31 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } SurfaceControl.closeTransaction(); } + + // Visibility changes may cause orientation request change. + reportDescendantOrientationChangeIfNeeded(); } return delayed; } + private void reportDescendantOrientationChangeIfNeeded() { + // Orientation request is exposed only when we're visible. Therefore visibility change + // will change requested orientation. Notify upward the hierarchy ladder to adjust + // configuration. This is important to cases where activities with incompatible + // orientations launch, or user goes back from an activity of bi-orientation to an + // activity with specified orientation. + if (mActivityRecord.getRequestedConfigurationOrientation() == getConfiguration().orientation + || getOrientationIgnoreVisibility() == SCREEN_ORIENTATION_UNSET) { + return; + } + + final IBinder freezeToken = + mActivityRecord.mayFreezeScreenLocked(mActivityRecord.app) + ? mActivityRecord.appToken : null; + onDescendantOrientationChanged(freezeToken, mActivityRecord); + } + /** * @return The to top most child window for which {@link LayoutParams#isFullscreen()} returns * true. @@ -2526,7 +2548,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree new WindowAnimationSpec(a, mTmpPoint, mTmpRect, getDisplayContent().mAppTransition.canSkipFirstFrame(), appStackClipMode, - true /* isAppAnimation */), + true /* isAppAnimation */, + mWmService.mWindowCornerRadius), mWmService.mSurfaceAnimationRunner); if (a.getZAdjustment() == Animation.ZORDER_TOP) { mNeedsZBoost = true; diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index feb711abaead..8c8b05f1307a 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -29,6 +29,7 @@ import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; +import static com.android.server.am.KeyguardControllerProto.AOD_SHOWING; import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED_STATES; import static com.android.server.am.KeyguardControllerProto.KEYGUARD_SHOWING; import static com.android.server.am.KeyguardOccludedProto.DISPLAY_ID; @@ -86,7 +87,7 @@ class KeyguardController { /** * @return true if either Keyguard or AOD are showing, not going away, and not being occluded - * on the given display, false otherwise + * on the given display, false otherwise. */ boolean isKeyguardOrAodShowing(int displayId) { return (mKeyguardShowing || mAodShowing) && !mKeyguardGoingAway @@ -94,6 +95,16 @@ class KeyguardController { } /** + * @return {@code true} if 1) Keyguard is showing, not going away, and not being occluded on the + * given display, or 2) AOD is showing, {@code false} otherwise. + * TODO(b/125198167): Replace isKeyguardOrAodShowing() by this logic. + */ + boolean isKeyguardUnoccludedOrAodShowing(int displayId) { + return (mKeyguardShowing && !mKeyguardGoingAway && !isDisplayOccluded(displayId)) + || mAodShowing; + } + + /** * @return true if Keyguard is showing, not going away, and not being occluded on the given * display, false otherwise */ @@ -380,10 +391,11 @@ class KeyguardController { for (int displayNdx = mRootActivityContainer.getChildCount() - 1; displayNdx >= 0; displayNdx--) { final ActivityDisplay display = mRootActivityContainer.getChildAt(displayNdx); - final KeyguardDisplayState state = getDisplay(display.mDisplayId); - if (isKeyguardOrAodShowing(display.mDisplayId) && state.mSleepToken == null) { + final int displayId = display.mDisplayId; + final KeyguardDisplayState state = getDisplay(displayId); + if (isKeyguardUnoccludedOrAodShowing(displayId) && state.mSleepToken == null) { state.acquiredSleepToken(); - } else if (!isKeyguardOrAodShowing(display.mDisplayId) && state.mSleepToken != null) { + } else if (!isKeyguardUnoccludedOrAodShowing(displayId) && state.mSleepToken != null) { state.releaseSleepToken(); } } @@ -528,6 +540,7 @@ class KeyguardController { void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); + proto.write(AOD_SHOWING, mAodShowing); proto.write(KEYGUARD_SHOWING, mKeyguardShowing); writeDisplayStatesToProto(proto, KEYGUARD_OCCLUDED_STATES); proto.end(token); diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 698835772df5..e3beb19408e1 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -175,12 +175,6 @@ class RootActivityContainer extends ConfigurationContainer private ActivityDisplay mDefaultDisplay; private final SparseArray<IntArray> mDisplayAccessUIDs = new SparseArray<>(); - /** - * Cached value of the topmost resumed activity in the system. Updated when new activity is - * resumed. - */ - private ActivityRecord mTopResumedActivity; - /** The current user */ int mCurrentUser; /** Stack id of the front stack when user switched, indexed by userId. */ @@ -1155,23 +1149,6 @@ class RootActivityContainer extends ConfigurationContainer return result; } - void updateTopResumedActivityIfNeeded() { - final ActivityRecord prevTopActivity = mTopResumedActivity; - final ActivityStack topStack = getTopDisplayFocusedStack(); - if (topStack == null || topStack.mResumedActivity == prevTopActivity) { - return; - } - // Clear previous top state - if (prevTopActivity != null) { - prevTopActivity.scheduleTopResumedActivityChanged(false /* onTop */); - } - // Update the current top activity - mTopResumedActivity = topStack.mResumedActivity; - if (mTopResumedActivity != null) { - mTopResumedActivity.scheduleTopResumedActivityChanged(true /* onTop */); - } - } - void applySleepTokens(boolean applyToStacks) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { // Set the sleeping state of the display. @@ -1434,7 +1411,7 @@ class RootActivityContainer extends ConfigurationContainer mActivityDisplays.remove(display); mActivityDisplays.add(position, display); } - updateTopResumedActivityIfNeeded(); + mStackSupervisor.updateTopResumedActivityIfNeeded(); } @VisibleForTesting diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 888d74163163..499cbaf915a1 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -330,7 +330,7 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta // No one in higher hierarchy handles this request, let's adjust our bounds to fulfill // it if possible. // TODO: Move to TaskRecord after unification is done. - if (mTaskRecord != null) { + if (mTaskRecord != null && mTaskRecord.getParent() != null) { mTaskRecord.onConfigurationChanged(mTaskRecord.getParent().getConfiguration()); return true; } diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 789f987e3d46..42d25833000d 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -50,6 +50,7 @@ class TaskChangeNotificationController { private static final int NOTIFY_PINNED_STACK_ANIMATION_STARTED_LISTENERS_MSG = 16; private static final int NOTIFY_ACTIVITY_UNPINNED_LISTENERS_MSG = 17; private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG = 18; + private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG = 19; // Delay in notifying task stack change listeners (in millis) private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100; @@ -130,6 +131,10 @@ class TaskChangeNotificationController { l.onActivityLaunchOnSecondaryDisplayFailed((RunningTaskInfo) m.obj, m.arg1); }; + private final TaskStackConsumer mNotifyActivityLaunchOnSecondaryDisplayRerouted = (l, m) -> { + l.onActivityLaunchOnSecondaryDisplayRerouted((RunningTaskInfo) m.obj, m.arg1); + }; + private final TaskStackConsumer mNotifyTaskProfileLocked = (l, m) -> { l.onTaskProfileLocked(m.arg1, m.arg2); }; @@ -202,6 +207,9 @@ class TaskChangeNotificationController { case NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_FAILED_MSG: forAllRemoteListeners(mNotifyActivityLaunchOnSecondaryDisplayFailed, msg); break; + case NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG: + forAllRemoteListeners(mNotifyActivityLaunchOnSecondaryDisplayRerouted, msg); + break; case NOTIFY_TASK_PROFILE_LOCKED_LISTENERS_MSG: forAllRemoteListeners(mNotifyTaskProfileLocked, msg); break; @@ -355,6 +363,15 @@ class TaskChangeNotificationController { msg.sendToTarget(); } + void notifyActivityLaunchOnSecondaryDisplayRerouted(TaskInfo ti, int requestedDisplayId) { + mHandler.removeMessages(NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG); + final Message msg = mHandler.obtainMessage( + NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG, requestedDisplayId, + 0 /* unused */, ti); + forAllLocalListeners(mNotifyActivityLaunchOnSecondaryDisplayRerouted, msg); + msg.sendToTarget(); + } + void notifyTaskCreated(int taskId, ComponentName componentName) { final Message msg = mHandler.obtainMessage(NOTIFY_TASK_ADDED_LISTENERS_MSG, taskId, 0 /* unused */, componentName); diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java index 98c77ac719f9..57311e19bc76 100644 --- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java +++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java @@ -17,10 +17,10 @@ package com.android.server.wm; import static com.android.server.wm.AnimationAdapter.STATUS_BAR_TRANSITION_DURATION; -import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; -import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; import static com.android.server.wm.AnimationSpecProto.WINDOW; import static com.android.server.wm.WindowAnimationSpecProto.ANIMATION; +import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; +import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; import android.graphics.Point; import android.graphics.Rect; @@ -51,18 +51,22 @@ public class WindowAnimationSpec implements AnimationSpec { private final Rect mStackBounds = new Rect(); private int mStackClipMode; private final Rect mTmpRect = new Rect(); + private final float mWindowCornerRadius; - public WindowAnimationSpec(Animation animation, Point position, boolean canSkipFirstFrame) { + public WindowAnimationSpec(Animation animation, Point position, boolean canSkipFirstFrame, + float windowCornerRadius) { this(animation, position, null /* stackBounds */, canSkipFirstFrame, STACK_CLIP_NONE, - false /* isAppAnimation */); + false /* isAppAnimation */, windowCornerRadius); } public WindowAnimationSpec(Animation animation, Point position, Rect stackBounds, - boolean canSkipFirstFrame, int stackClipMode, boolean isAppAnimation) { + boolean canSkipFirstFrame, int stackClipMode, boolean isAppAnimation, + float windowCornerRadius) { mAnimation = animation; if (position != null) { mPosition.set(position.x, position.y); } + mWindowCornerRadius = windowCornerRadius; mCanSkipFirstFrame = canSkipFirstFrame; mIsAppAnimation = isAppAnimation; mStackClipMode = stackClipMode; @@ -101,6 +105,9 @@ public class WindowAnimationSpec implements AnimationSpec { mTmpRect.intersect(tmp.transformation.getClipRect()); t.setWindowCrop(leash, mTmpRect); } + if (mAnimation.hasRoundedCorners() && mWindowCornerRadius > 0) { + t.setCornerRadius(leash, mWindowCornerRadius); + } } @Override diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 474a9dabf9c4..1bd1795dadd8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -145,6 +145,7 @@ import android.hardware.configstore.V1_0.OptionalBool; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; import android.hardware.input.InputManager; +import android.hardware.input.InputManagerInternal; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -234,6 +235,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.IResultReceiver; import com.android.internal.policy.IKeyguardDismissCallback; import com.android.internal.policy.IShortcutService; +import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastPrintWriter; import com.android.internal.util.LatencyTracker; @@ -753,24 +755,27 @@ public class WindowManagerService extends IWindowManager.Stub final DisplayManager mDisplayManager; final ActivityTaskManagerService mAtmService; - // Indicates whether this device supports wide color gamut / HDR rendering + /** Corner radius that windows should have in order to match the display. */ + final float mWindowCornerRadius; + + /** Indicates whether this device supports wide color gamut / HDR rendering */ private boolean mHasWideColorGamutSupport; private boolean mHasHdrSupport; - // Who is holding the screen on. + /** Who is holding the screen on. */ private Session mHoldingScreenOn; private PowerManager.WakeLock mHoldingScreenWakeLock; - // Whether or not a layout can cause a wake up when theater mode is enabled. + /** Whether or not a layout can cause a wake up when theater mode is enabled. */ boolean mAllowTheaterModeWakeFromLayout; final TaskPositioningController mTaskPositioningController; final DragDropController mDragDropController; - // For frozen screen animations. + /** For frozen screen animations. */ private int mExitAnimId, mEnterAnimId; - // The display that the rotation animation is applying to. + /** The display that the rotation animation is applying to. */ private int mFrozenDisplayId; /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this @@ -977,7 +982,7 @@ public class WindowManagerService extends IWindowManager.Stub mInputManager = inputManager; // Must be before createDisplayContentLocked. mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mDisplayWindowSettings = new DisplayWindowSettings(this); - + mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context.getResources()); mTransactionFactory = transactionFactory; mTransaction = mTransactionFactory.make(); @@ -7434,7 +7439,7 @@ public class WindowManagerService extends IWindowManager.Stub new SurfaceControl.Transaction().syncInputWindows().apply(true); - return mInputManager.injectInputEvent(ev, mode); + return LocalServices.getService(InputManagerInternal.class).injectInputEvent(ev, mode); } private void waitForAnimationsToComplete() { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index a13086dcc279..b7925f20be86 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -4458,7 +4458,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP anim.restrictDuration(MAX_ANIMATION_DURATION); anim.scaleCurrentDuration(mWmService.getWindowAnimationScaleLocked()); final AnimationAdapter adapter = new LocalAnimationAdapter( - new WindowAnimationSpec(anim, mSurfacePosition, false /* canSkipFirstFrame */), + new WindowAnimationSpec(anim, mSurfacePosition, false /* canSkipFirstFrame */, + mWmService.mWindowCornerRadius), mWmService.mSurfaceAnimationRunner); startAnimation(mPendingTransaction, adapter); commitPendingTransaction(); diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 03240c076ede..d39f20c0f214 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -548,12 +548,15 @@ struct GnssCallback : public IGnssCallback { Return<void> gnssReleaseWakelockCb() override; Return<void> gnssRequestTimeCb() override; Return<void> gnssRequestLocationCb(const bool independentFromGnss) override; + Return<void> gnssSetSystemInfoCb(const IGnssCallback::GnssSystemInfo& info) override; // New in 1.1 Return<void> gnssNameCb(const android::hardware::hidl_string& name) override; // New in 2.0 + Return<void> gnssRequestLocationCb_2_0(const bool independentFromGnss, const bool isUserEmergency) + override; Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override; Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override; @@ -713,8 +716,15 @@ Return<void> GnssCallback::gnssRequestTimeCb() { } Return<void> GnssCallback::gnssRequestLocationCb(const bool independentFromGnss) { + return GnssCallback::gnssRequestLocationCb_2_0(independentFromGnss, /* isUserEmergency= */ + false); +} + +Return<void> GnssCallback::gnssRequestLocationCb_2_0(const bool independentFromGnss, const bool + isUserEmergency) { JNIEnv* env = getJniEnv(); - env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss)); + env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss), + boolToJbool(isUserEmergency)); checkAndClearExceptionFromCallback(env, __FUNCTION__); return Void(); } @@ -1422,7 +1432,7 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V"); method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification", "(IIIIILjava/lang/String;Ljava/lang/String;II)V"); - method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(Z)V"); + method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(ZZ)V"); method_requestRefLocation = env->GetMethodID(clazz, "requestRefLocation", "()V"); method_requestSetID = env->GetMethodID(clazz, "requestSetID", "(I)V"); method_requestUtcTime = env->GetMethodID(clazz, "requestUtcTime", "()V"); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 512a745f5abe..a19d5d5a5d76 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1366,7 +1366,6 @@ public final class SystemServer { ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity, /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL); - networkStats.bindConnectivityManager(connectivity); networkPolicy.bindConnectivityManager(connectivity); } catch (Throwable e) { reportWtf("starting Connectivity Service", e); diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java index d32f1f77b88f..e100d162813b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java @@ -16,15 +16,6 @@ package com.android.server.am; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3; -import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_4; -import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION; - import static com.android.server.am.ActivityManagerService.Injector; import static com.android.server.am.AppCompactor.compactActionIntToString; @@ -117,28 +108,28 @@ public final class AppCompactorTest { // When the DeviceConfig already has a flag value stored (note this test will need to // change if the default value changes from false). assertThat(AppCompactor.DEFAULT_USE_COMPACTION).isFalse(); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_USE_COMPACTION, "true", false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_1, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_USE_COMPACTION, "true", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_1, Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_1 + 1 % 4) + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_2, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_2, Integer.toString((AppCompactor.DEFAULT_COMPACT_ACTION_2 + 1 % 4) + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_1, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_1, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_2, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_2, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_3, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_3, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_4, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_4, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_STATSD_SAMPLE_RATE, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false); // Then calling init will read and set that flag. @@ -169,8 +160,8 @@ public final class AppCompactorTest { // When we call init and change some the flag value... mCompactorUnderTest.init(); mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_USE_COMPACTION, "true", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_USE_COMPACTION, "true", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); // Then that new flag value is updated in the implementation. @@ -179,8 +170,8 @@ public final class AppCompactorTest { // And again, setting the flag the other way. mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_USE_COMPACTION, "false", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_USE_COMPACTION, "false", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCompactorUnderTest.useCompaction()).isFalse(); } @@ -193,8 +184,8 @@ public final class AppCompactorTest { // When we push an invalid flag value... mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_USE_COMPACTION, "foobar", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_USE_COMPACTION, "foobar", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); // Then we set the default. @@ -212,11 +203,11 @@ public final class AppCompactorTest { for (int i = 1; i < 5; i++) { mCountDown = new CountDownLatch(2); int expectedSome = (AppCompactor.DEFAULT_COMPACT_ACTION_1 + i) % 4 + 1; - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_1, Integer.toString(expectedSome), false); int expectedFull = (AppCompactor.DEFAULT_COMPACT_ACTION_2 + i) % 4 + 1; - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_2, Integer.toString(expectedFull), false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); // Then the updates are reflected in the flags. @@ -233,10 +224,10 @@ public final class AppCompactorTest { // When we override new values for the compaction action with bad values ... mCountDown = new CountDownLatch(2); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_1, "foo", false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_2, "foo", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_1, "foo", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_2, "foo", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); // Then the default values are reflected in the flag @@ -246,10 +237,10 @@ public final class AppCompactorTest { compactActionIntToString(AppCompactor.DEFAULT_COMPACT_ACTION_2)); mCountDown = new CountDownLatch(2); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_1, "", false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_ACTION_2, "", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_1, "", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_ACTION_2, "", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCompactorUnderTest.mCompactActionSome).isEqualTo( @@ -264,17 +255,17 @@ public final class AppCompactorTest { // When we override new reasonable throttle values after init... mCountDown = new CountDownLatch(4); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_1, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_1, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_1 + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_2, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_2, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_2 + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_3, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_3, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1), false); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_4, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_4, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); @@ -296,8 +287,8 @@ public final class AppCompactorTest { // When one of the throttles is overridden with a bad value... mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_1, "foo", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_1, "foo", false); // Then all the throttles have the defaults set. assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo( @@ -311,8 +302,8 @@ public final class AppCompactorTest { // Repeat for each of the throttle keys. mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_2, "foo", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_2, "foo", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo( AppCompactor.DEFAULT_COMPACT_THROTTLE_1); @@ -324,8 +315,8 @@ public final class AppCompactorTest { AppCompactor.DEFAULT_COMPACT_THROTTLE_4); mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_3, "foo", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_3, "foo", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo( AppCompactor.DEFAULT_COMPACT_THROTTLE_1); @@ -337,8 +328,8 @@ public final class AppCompactorTest { AppCompactor.DEFAULT_COMPACT_THROTTLE_4); mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_THROTTLE_4, "foo", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_THROTTLE_4, "foo", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCompactorUnderTest.mCompactThrottleSomeSome).isEqualTo( AppCompactor.DEFAULT_COMPACT_THROTTLE_1); @@ -356,8 +347,8 @@ public final class AppCompactorTest { // When we override mStatsdSampleRate with a reasonable values ... mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_STATSD_SAMPLE_RATE, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); @@ -373,8 +364,8 @@ public final class AppCompactorTest { // When we override mStatsdSampleRate with a reasonable values ... mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); // Then that override is reflected in the compactor. @@ -389,8 +380,8 @@ public final class AppCompactorTest { // When we override mStatsdSampleRate with an value outside of [0..1]... mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_STATSD_SAMPLE_RATE, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, Float.toString(-1.0f), false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); @@ -398,8 +389,8 @@ public final class AppCompactorTest { assertThat(mCompactorUnderTest.mStatsdSampleRate).isEqualTo(0.0f); mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, - KEY_COMPACT_STATSD_SAMPLE_RATE, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + AppCompactor.KEY_COMPACT_STATSD_SAMPLE_RATE, Float.toString(1.01f), false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); diff --git a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java index 6a937fabd3ec..a2f1f01b689f 100644 --- a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java +++ b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java @@ -32,10 +32,13 @@ import android.attention.AttentionManagerInternal; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.SystemClock; +import android.os.UserHandle; +import android.provider.Settings; import android.service.attention.AttentionService; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; @@ -49,6 +52,7 @@ public class AttentionDetectorTest extends AndroidTestCase { private TestableAttentionDetector mAttentionDetector; private long mAttentionTimeout; private long mNextDimming; + private int mIsSettingEnabled; @Before public void setUp() { @@ -59,6 +63,20 @@ public class AttentionDetectorTest extends AndroidTestCase { mAttentionDetector.onWakefulnessChangeStarted(PowerManagerInternal.WAKEFULNESS_AWAKE); mAttentionDetector.setAttentionServiceSupported(true); mNextDimming = SystemClock.uptimeMillis() + 3000L; + + // Save the existing state. + mIsSettingEnabled = Settings.System.getIntForUser(getContext().getContentResolver(), + Settings.System.ADAPTIVE_SLEEP, 0, UserHandle.USER_CURRENT); + + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.ADAPTIVE_SLEEP, 1, UserHandle.USER_CURRENT); + mAttentionDetector.updateEnabledFromSettings(getContext()); + } + + @After + public void tearDown() { + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.ADAPTIVE_SLEEP, mIsSettingEnabled, UserHandle.USER_CURRENT); } @Test @@ -69,6 +87,16 @@ public class AttentionDetectorTest extends AndroidTestCase { } @Test + public void testOnUserActivity_doesntCheckIfNotEnabled() { + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.ADAPTIVE_SLEEP, 0, UserHandle.USER_CURRENT); + mAttentionDetector.updateEnabledFromSettings(getContext()); + long when = registerAttention(); + verify(mAttentionManagerInternal, never()).checkAttention(anyInt(), anyLong(), any()); + assertThat(mNextDimming).isEqualTo(when); + } + + @Test public void testOnUserActivity_doesntCheckIfNotSupported() { mAttentionDetector.setAttentionServiceSupported(false); long when = registerAttention(); diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 911c4a2f4122..1bda412f2f89 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -18,44 +18,67 @@ package com.android.server.power; import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; +import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; +import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManagerInternal; import android.attention.AttentionManagerInternal; import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.hardware.SensorManager; +import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; +import android.os.BatteryManager; import android.os.BatteryManagerInternal; import android.os.Binder; +import android.os.Handler; +import android.os.IBinder; import android.os.Looper; import android.os.PowerManager; import android.os.PowerSaveState; import android.os.SystemClock; import android.os.SystemProperties; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; +import android.os.UserHandle; +import android.provider.Settings; + +import androidx.test.InstrumentationRegistry; import com.android.internal.app.IBatteryStats; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.lights.LightsManager; import com.android.server.policy.WindowManagerPolicy; +import com.android.server.power.PowerManagerService.BatteryReceiver; import com.android.server.power.PowerManagerService.Injector; import com.android.server.power.PowerManagerService.NativeWrapper; +import com.android.server.power.PowerManagerService.UserSwitchedReceiver; import com.android.server.power.batterysaver.BatterySaverPolicy; import com.android.server.power.batterysaver.BatterySavingStats; -import org.junit.Rule; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -65,29 +88,54 @@ import java.util.Map; /** * Tests for {@link com.android.server.power.PowerManagerService} */ -public class PowerManagerServiceTest extends AndroidTestCase { +public class PowerManagerServiceTest { private static final float PRECISION = 0.001f; private static final float BRIGHTNESS_FACTOR = 0.7f; private static final boolean BATTERY_SAVER_ENABLED = true; private static final String TEST_LAST_REBOOT_PROPERTY = "test.sys.boot.reason"; - private @Mock BatterySaverPolicy mBatterySaverPolicyMock; - private @Mock LightsManager mLightsManagerMock; - private @Mock DisplayManagerInternal mDisplayManagerInternalMock; - private @Mock BatteryManagerInternal mBatteryManagerInternalMock; - private @Mock ActivityManagerInternal mActivityManagerInternalMock; - private @Mock AttentionManagerInternal mAttentionManagerInternalMock; - private @Mock PowerManagerService.NativeWrapper mNativeWrapperMock; - private @Mock Notifier mNotifierMock; + @Mock private BatterySaverPolicy mBatterySaverPolicyMock; + @Mock private LightsManager mLightsManagerMock; + @Mock private DisplayManagerInternal mDisplayManagerInternalMock; + @Mock private BatteryManagerInternal mBatteryManagerInternalMock; + @Mock private ActivityManagerInternal mActivityManagerInternalMock; + @Mock private AttentionManagerInternal mAttentionManagerInternalMock; + @Mock private PowerManagerService.NativeWrapper mNativeWrapperMock; + @Mock private Notifier mNotifierMock; + @Mock private WirelessChargerDetector mWirelessChargerDetectorMock; + @Mock private AmbientDisplayConfiguration mAmbientDisplayConfigurationMock; + private PowerManagerService mService; private PowerSaveState mPowerSaveState; private DisplayPowerRequest mDisplayPowerRequest; + private ContextWrapper mContextSpy; + private BatteryReceiver mBatteryReceiver; + private UserSwitchedReceiver mUserSwitchedReceiver; + private Resources mResourcesSpy; + + private class IntentFilterMatcher implements ArgumentMatcher<IntentFilter> { + private final IntentFilter mFilter; + + IntentFilterMatcher(IntentFilter filter) { + mFilter = filter; + } + + @Override + public boolean matches(IntentFilter other) { + if (other.countActions() != mFilter.countActions()) { + return false; + } + for (int i = 0; i < mFilter.countActions(); i++) { + if (!mFilter.getAction(i).equals(other.getAction(i))) { + return false; + } + } + return true; + } + } - - - @Rule + @Before public void setUp() throws Exception { - super.setUp(); MockitoAnnotations.initMocks(this); mPowerSaveState = new PowerSaveState.Builder() @@ -105,33 +153,54 @@ public class PowerManagerServiceTest extends AndroidTestCase { addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock); addLocalServiceMock(AttentionManagerInternal.class, mAttentionManagerInternalMock); - mService = new PowerManagerService(getContext(), new Injector() { + mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext())); + mResourcesSpy = spy(mContextSpy.getResources()); + when(mContextSpy.getResources()).thenReturn(mResourcesSpy); + + mService = new PowerManagerService(mContextSpy, new Injector() { + @Override Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats, SuspendBlocker suspendBlocker, WindowManagerPolicy policy) { return mNotifierMock; } + @Override SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) { return mock(SuspendBlocker.class); } + @Override BatterySaverPolicy createBatterySaverPolicy( Object lock, Context context, BatterySavingStats batterySavingStats) { return mBatterySaverPolicyMock; } + @Override NativeWrapper createNativeWrapper() { return mNativeWrapperMock; } + + @Override + WirelessChargerDetector createWirelessChargerDetector( + SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) { + return mWirelessChargerDetectorMock; + } + + @Override + AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) { + return mAmbientDisplayConfigurationMock; + } }); } - @Override + @After public void tearDown() throws Exception { LocalServices.removeServiceForTest(LightsManager.class); LocalServices.removeServiceForTest(DisplayManagerInternal.class); LocalServices.removeServiceForTest(BatteryManagerInternal.class); LocalServices.removeServiceForTest(ActivityManagerInternal.class); + Settings.Global.putInt( + mContextSpy.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0); } /** @@ -142,7 +211,56 @@ public class PowerManagerServiceTest extends AndroidTestCase { LocalServices.addService(clazz, mock); } - @SmallTest + private void startSystem() throws Exception { + mService.systemReady(null); + + // Grab the BatteryReceiver + ArgumentCaptor<BatteryReceiver> batCaptor = ArgumentCaptor.forClass(BatteryReceiver.class); + IntentFilter batFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + batFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + verify(mContextSpy).registerReceiver(batCaptor.capture(), + argThat(new IntentFilterMatcher(batFilter)), isNull(), isA(Handler.class)); + mBatteryReceiver = batCaptor.getValue(); + + // Grab the UserSwitchedReceiver + ArgumentCaptor<UserSwitchedReceiver> userSwitchedCaptor = + ArgumentCaptor.forClass(UserSwitchedReceiver.class); + IntentFilter usFilter = new IntentFilter(Intent.ACTION_USER_SWITCHED); + verify(mContextSpy).registerReceiver(userSwitchedCaptor.capture(), + argThat(new IntentFilterMatcher(usFilter)), isNull(), isA(Handler.class)); + mUserSwitchedReceiver = userSwitchedCaptor.getValue(); + + mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); + } + + private void forceSleep() { + mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(), + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE); + } + + private void forceDream() { + mService.getBinderServiceInstance().nap(SystemClock.uptimeMillis()); + } + + private void forceAwake() { + mService.getBinderServiceInstance().wakeUp(SystemClock.uptimeMillis(), + PowerManager.WAKE_REASON_UNKNOWN, "testing IPowerManager.wakeUp()", "pkg.name"); + } + + private void forceDozing() { + mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(), + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0); + } + + private void setPluggedIn(boolean isPluggedIn) { + // Set the callback to return the new state + when(mBatteryManagerInternalMock.isPowered(BatteryManager.BATTERY_PLUGGED_ANY)) + .thenReturn(isPluggedIn); + // Trigger PowerManager to reread the plug-in state + mBatteryReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_BATTERY_CHANGED)); + } + + @Test public void testUpdatePowerScreenPolicy_UpdateDisplayPowerRequest() { mService.updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest); assertThat(mDisplayPowerRequest.lowPowerMode).isEqualTo(BATTERY_SAVER_ENABLED); @@ -150,7 +268,7 @@ public class PowerManagerServiceTest extends AndroidTestCase { .isWithin(PRECISION).of(BRIGHTNESS_FACTOR); } - @SmallTest + @Test public void testGetLastShutdownReasonInternal() { SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, "shutdown,thermal"); int reason = mService.getLastShutdownReasonInternal(TEST_LAST_REBOOT_PROPERTY); @@ -158,7 +276,7 @@ public class PowerManagerServiceTest extends AndroidTestCase { assertThat(reason).isEqualTo(PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN); } - @SmallTest + @Test public void testGetDesiredScreenPolicy_WithVR() throws Exception { // Brighten up the screen mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, PowerManager.WAKE_REASON_UNKNOWN, 0); @@ -187,42 +305,171 @@ public class PowerManagerServiceTest extends AndroidTestCase { DisplayPowerRequest.POLICY_BRIGHT); } - @SmallTest + @Test public void testWakefulnessAwake_InitialValue() throws Exception { assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); } - @SmallTest + @Test public void testWakefulnessSleep_NoDozeSleepFlag() throws Exception { // Start with AWAKE state + startSystem(); assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); - mService.systemReady(null); - mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); - - // Take a nap with a flag. + // Take a nap and verify. mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(), - PowerManager.GO_TO_SLEEP_REASON_APPLICATION, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE); + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); + } + + @Test + public void testWakefulnessAwake_AcquireCausesWakeup() throws Exception { + startSystem(); + forceSleep(); + + IBinder token = new Binder(); + String tag = "acq_causes_wakeup"; + String packageName = "pkg.name"; + + // First, ensure that a normal full wake lock does not cause a wakeup + int flags = PowerManager.FULL_WAKE_LOCK; + mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, + null /* workSource */, null /* historyTag */); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); + mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); + + // Ensure that the flag does *NOT* work with a partial wake lock. + flags = PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP; + mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, + null /* workSource */, null /* historyTag */); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); + mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); + + // Verify that flag forces a wakeup when paired to a FULL_WAKE_LOCK + flags = PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP; + mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, + null /* workSource */, null /* historyTag */); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); + mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); + } + + @Test + public void testWakefulnessAwake_IPowerManagerWakeUp() throws Exception { + startSystem(); + forceSleep(); + mService.getBinderServiceInstance().wakeUp(SystemClock.uptimeMillis(), + PowerManager.WAKE_REASON_UNKNOWN, "testing IPowerManager.wakeUp()", "pkg.name"); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); + } + + /** + * Tests a series of variants that control whether a device wakes-up when it is plugged in + * or docked. + */ + @Test + public void testWakefulnessAwake_ShouldWakeUpWhenPluggedIn() throws Exception { + boolean powerState; + startSystem(); + forceSleep(); + + // Test 1: + // Set config to prevent it wake up, test, verify, reset config value. + when(mResourcesSpy.getBoolean(com.android.internal.R.bool.config_unplugTurnsOnScreen)) + .thenReturn(false); + mService.readConfigurationLocked(); + setPluggedIn(true); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); + when(mResourcesSpy.getBoolean(com.android.internal.R.bool.config_unplugTurnsOnScreen)) + .thenReturn(true); + mService.readConfigurationLocked(); + + // Test 2: + // Turn the power off, sleep, then plug into a wireless charger. + // Verify that we do not wake up if the phone is being plugged into a wireless charger. + setPluggedIn(false); + forceSleep(); + when(mBatteryManagerInternalMock.getPlugType()) + .thenReturn(BatteryManager.BATTERY_PLUGGED_WIRELESS); + when(mWirelessChargerDetectorMock.update(true /* isPowered */, + BatteryManager.BATTERY_PLUGGED_WIRELESS)).thenReturn(false); + setPluggedIn(true); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); + + // Test 3: + // Do not wake up if the phone is being REMOVED from a wireless charger + when(mBatteryManagerInternalMock.getPlugType()).thenReturn(0); + setPluggedIn(false); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); + // Test 4: + // Do not wake if we are dreaming. + forceAwake(); // Needs to be awake first before it can dream. + forceDream(); + setPluggedIn(true); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DREAMING); + forceSleep(); + + // Test 5: + // Don't wake if the device is configured not to wake up in theater mode (and theater + // mode is enabled). + Settings.Global.putInt( + mContextSpy.getContentResolver(), Settings.Global.THEATER_MODE_ON, 1); + mUserSwitchedReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_USER_SWITCHED)); + when(mResourcesSpy.getBoolean( + com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug)) + .thenReturn(false); + setPluggedIn(false); assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); + Settings.Global.putInt( + mContextSpy.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0); + mUserSwitchedReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_USER_SWITCHED)); + + // Test 6: + // Don't wake up if we are Dozing away and always-on is enabled. + when(mAmbientDisplayConfigurationMock.alwaysOnEnabled(UserHandle.USER_CURRENT)) + .thenReturn(true); + mUserSwitchedReceiver.onReceive(mContextSpy, new Intent(Intent.ACTION_USER_SWITCHED)); + forceAwake(); + forceDozing(); + setPluggedIn(true); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DOZING); + + // Test 7: + // Finally, take away all the factors above and ensure the device wakes up! + forceAwake(); + forceSleep(); + setPluggedIn(false); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); + } + + @Test + public void testWakefulnessDoze_goToSleep() throws Exception { + // Start with AWAKE state + startSystem(); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); + + // Take a nap and verify. + mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(), + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DOZING); } - @MediumTest + @Test public void testWasDeviceIdleFor_true() { int interval = 1000; mService.onUserActivity(); - SystemClock.sleep(interval); + SystemClock.sleep(interval + 1 /* just a little more */); assertThat(mService.wasDeviceIdleForInternal(interval)).isTrue(); } - @SmallTest + @Test public void testWasDeviceIdleFor_false() { int interval = 1000; mService.onUserActivity(); assertThat(mService.wasDeviceIdleForInternal(interval)).isFalse(); } - @SmallTest + @Test public void testForceSuspend_putsDeviceToSleep() { mService.systemReady(null); mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); @@ -244,11 +491,11 @@ public class PowerManagerServiceTest extends AndroidTestCase { assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP); } - @SmallTest + @Test public void testForceSuspend_pakeLocksDisabled() { final String tag = "TestWakelockTag_098213"; final int flags = PowerManager.PARTIAL_WAKE_LOCK; - final String pkg = getContext().getOpPackageName(); + final String pkg = mContextSpy.getOpPackageName(); // Set up the Notification mock to keep track of the wakelocks that are currently // active or disabled. We'll use this to verify that wakelocks are disabled when @@ -292,7 +539,7 @@ public class PowerManagerServiceTest extends AndroidTestCase { } - @SmallTest + @Test public void testForceSuspend_forceSuspendFailurePropogated() { when(mNativeWrapperMock.nativeForceSuspend()).thenReturn(false); assertThat(mService.getBinderServiceInstance().forceSuspend()).isFalse(); diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java index d848b2dc75fe..fc7ccc576abb 100644 --- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java @@ -236,20 +236,20 @@ public class AppDataRollbackHelperTest { wasRecentlyRestored.getPendingRestores().add( new RestoreInfo(73 /* userId */, 239 /* appId*/, "seInfo")); - RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1, - true); - dataWithPendingBackup.packages.add(pendingBackup); + RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1); + dataWithPendingBackup.info.getPackages().add(pendingBackup); RollbackData dataWithRecentRestore = new RollbackData(17239, new File("/does/not/exist"), - -1, true); - dataWithRecentRestore.packages.add(wasRecentlyRestored); + -1); + dataWithRecentRestore.info.getPackages().add(wasRecentlyRestored); RollbackData dataForDifferentUser = new RollbackData(17239, new File("/does/not/exist"), - -1, true); - dataForDifferentUser.packages.add(ignoredInfo); + -1); + dataForDifferentUser.info.getPackages().add(ignoredInfo); RollbackInfo rollbackInfo = new RollbackInfo(17239, - Arrays.asList(pendingRestore, wasRecentlyRestored), false); + Arrays.asList(pendingRestore, wasRecentlyRestored), false, + new ArrayList<>(), -1); List<RollbackData> changed = helper.commitPendingBackupAndRestoreForUser(37, Arrays.asList(dataWithPendingBackup, dataWithRecentRestore, dataForDifferentUser), diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java index 2c575f59a020..68b40b92b9cc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java @@ -18,11 +18,11 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; -import static android.content.ActivityInfoProto.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; @@ -42,12 +42,16 @@ 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.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.verify; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; +import android.view.Display; import android.view.Surface; import android.view.WindowManager; @@ -55,6 +59,7 @@ import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; /** * Tests for the {@link AppWindowToken} class. @@ -332,6 +337,46 @@ public class AppWindowTokenTests extends WindowTestsBase { } @Test + public void testReportOrientationChangeOnVisibilityChange() { + synchronized (mWm.mGlobalLock) { + mToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); + + mDisplayContent.getDisplayRotation().setFixedToUserRotation( + DisplayRotation.FIXED_TO_USER_ROTATION_ENABLED); + + doReturn(Configuration.ORIENTATION_LANDSCAPE).when(mToken.mActivityRecord) + .getRequestedConfigurationOrientation(); + + mTask.mTaskRecord = Mockito.mock(TaskRecord.class, RETURNS_DEEP_STUBS); + mToken.commitVisibility(null, false /* visible */, TRANSIT_UNSET, + true /* performLayout */, false /* isVoiceInteraction */); + } + + verify(mTask.mTaskRecord).onConfigurationChanged(any(Configuration.class)); + } + + @Test + public void testReportOrientationChangeOnOpeningClosingAppChange() { + synchronized (mWm.mGlobalLock) { + mToken.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); + + mDisplayContent.getDisplayRotation().setFixedToUserRotation( + DisplayRotation.FIXED_TO_USER_ROTATION_ENABLED); + mDisplayContent.getDisplayInfo().state = Display.STATE_ON; + mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_CLOSE, + false /* alwaysKeepCurrent */, 0 /* flags */, true /* forceOverride */); + + doReturn(Configuration.ORIENTATION_LANDSCAPE).when(mToken.mActivityRecord) + .getRequestedConfigurationOrientation(); + + mTask.mTaskRecord = Mockito.mock(TaskRecord.class, RETURNS_DEEP_STUBS); + mToken.setVisibility(false, false); + } + + verify(mTask.mTaskRecord).onConfigurationChanged(any(Configuration.class)); + } + + @Test public void testCreateRemoveStartingWindow() { mToken.addStartingWindow(mPackageName, android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true, diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java index 6cce9f088ee4..c48348992196 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java @@ -213,7 +213,8 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase { final Animation a = new TranslateAnimation(-10, 10, 0, 0); a.initialize(0, 0, 0, 0); a.setDuration(50); - return new WindowAnimationSpec(a, new Point(0, 0), false /* canSkipFirstFrame */); + return new WindowAnimationSpec(a, new Point(0, 0), false /* canSkipFirstFrame */, + 0 /* windowCornerRadius */); } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java index 9a825e068584..897f0a2c6e81 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowAnimationSpecTest.java @@ -24,6 +24,8 @@ import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.when; import android.graphics.Point; import android.graphics.Rect; @@ -56,7 +58,7 @@ public class WindowAnimationSpecTest { Animation a = createClipRectAnimation(windowCrop, windowCrop); WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null, mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_NONE, - true /* isAppAnimation */); + true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(rect -> rect.equals(windowCrop))); @@ -66,7 +68,7 @@ public class WindowAnimationSpecTest { public void testApply_clipAfter() { WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null, mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_AFTER_ANIM, - true /* isAppAnimation */); + true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty)); } @@ -76,8 +78,7 @@ public class WindowAnimationSpecTest { // Stack bounds is (0, 0, 10, 10) position is (20, 40) WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, new Point(20, 40), mStackBounds, false /* canSkipFirstFrame */, - STACK_CLIP_AFTER_ANIM, - true /* isAppAnimation */); + STACK_CLIP_AFTER_ANIM, true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty)); } @@ -87,7 +88,7 @@ public class WindowAnimationSpecTest { // Stack bounds is (0, 0, 10, 10) animation clip is (0, 0, 0, 0) WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null, mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM, - true /* isAppAnimation */); + true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(rect -> rect.equals(mStackBounds))); @@ -101,19 +102,32 @@ public class WindowAnimationSpecTest { a.initialize(0, 0, 0, 0); WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null, null, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM, - true /* isAppAnimation */); + true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty)); } @Test + public void testApply_setCornerRadius() { + final float windowCornerRadius = 30f; + WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null, + mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM, + true /* isAppAnimation */, windowCornerRadius); + windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); + verify(mTransaction, never()).setCornerRadius(eq(mSurfaceControl), eq(windowCornerRadius)); + when(mAnimation.hasRoundedCorners()).thenReturn(true); + windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); + verify(mTransaction).setCornerRadius(eq(mSurfaceControl), eq(windowCornerRadius)); + } + + @Test public void testApply_clipBeforeSmallerAnimationClip() { // Stack bounds is (0, 0, 10, 10) animation clip is (0, 0, 5, 5) Rect windowCrop = new Rect(0, 0, 5, 5); Animation a = createClipRectAnimation(windowCrop, windowCrop); WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null, mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM, - true /* isAppAnimation */); + true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(rect -> rect.equals(windowCrop))); @@ -126,7 +140,7 @@ public class WindowAnimationSpecTest { Animation a = createClipRectAnimation(windowCrop, windowCrop); WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null, mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM, - true /* isAppAnimation */); + true /* isAppAnimation */, 0 /* windowCornerRadius */); windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0); verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(rect -> rect.equals(mStackBounds))); 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 da1defabeaaf..0dec8ee7776f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestUtils.java @@ -82,6 +82,8 @@ class WindowTestUtils { }, new ComponentName("", ""), false, dc, true /* fillsParent */); mTargetSdk = Build.VERSION_CODES.CUR_DEVELOPMENT; mSkipOnParentChanged = skipOnParentChanged; + mActivityRecord = mock(ActivityRecord.class); + mActivityRecord.app = mock(WindowProcessController.class); } int getWindowsCount() { diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java index 65ed85db17bd..ffafb6d0800e 100644 --- a/services/usage/java/com/android/server/usage/AppStandbyController.java +++ b/services/usage/java/com/android/server/usage/AppStandbyController.java @@ -35,6 +35,7 @@ import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SLICE_PINNED_ import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYNC_ADAPTER; import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_INTERACTION; import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_UPDATE; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED; import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACTION; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED; @@ -197,7 +198,7 @@ public class AppStandbyController { static final int MSG_ONE_TIME_CHECK_IDLE_STATES = 10; /** Check the state of one app: arg1 = userId, arg2 = uid, obj = (String) packageName */ static final int MSG_CHECK_PACKAGE_IDLE_STATE = 11; - static final int MSG_REPORT_EXEMPTED_SYNC_SCHEDULED = 12; + static final int MSG_REPORT_SYNC_SCHEDULED = 12; static final int MSG_REPORT_EXEMPTED_SYNC_START = 13; static final int MSG_UPDATE_STABLE_CHARGING= 14; @@ -231,6 +232,10 @@ public class AppStandbyController { * Maximum time an exempted sync should keep the buckets elevated, when sync is started. */ long mExemptedSyncStartTimeoutMillis; + /** + * Maximum time an unexempted sync should keep the buckets elevated, when sync is scheduled + */ + long mUnexemptedSyncScheduledTimeoutMillis; /** Maximum time a system interaction should keep the buckets elevated. */ long mSystemInteractionTimeoutMillis; /** The length of time phone must be charging before considered stable enough to run jobs */ @@ -447,6 +452,25 @@ public class AppStandbyController { } } + void reportUnexemptedSyncScheduled(String packageName, int userId) { + if (!mAppIdleEnabled) return; + + final long elapsedRealtime = mInjector.elapsedRealtime(); + synchronized (mAppIdleLock) { + final int currentBucket = + mAppIdleHistory.getAppStandbyBucket(packageName, userId, elapsedRealtime); + if (currentBucket == STANDBY_BUCKET_NEVER) { + // Bring the app out of the never bucket + AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId, + STANDBY_BUCKET_WORKING_SET, REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED, + 0, + elapsedRealtime + mUnexemptedSyncScheduledTimeoutMillis); + maybeInformListeners(packageName, userId, elapsedRealtime, + appUsage.currentBucket, appUsage.bucketingReason, false); + } + } + } + void reportExemptedSyncStart(String packageName, int userId) { if (!mAppIdleEnabled) return; @@ -1423,8 +1447,8 @@ public class AppStandbyController { .sendToTarget(); } - void postReportExemptedSyncScheduled(String packageName, int userId) { - mHandler.obtainMessage(MSG_REPORT_EXEMPTED_SYNC_SCHEDULED, userId, 0, packageName) + void postReportSyncScheduled(String packageName, int userId, boolean exempted) { + mHandler.obtainMessage(MSG_REPORT_SYNC_SCHEDULED, userId, exempted ? 1 : 0, packageName) .sendToTarget(); } @@ -1492,6 +1516,9 @@ public class AppStandbyController { pw.print(" mExemptedSyncStartTimeoutMillis="); TimeUtils.formatDuration(mExemptedSyncStartTimeoutMillis, pw); pw.println(); + pw.print(" mUnexemptedSyncScheduledTimeoutMillis="); + TimeUtils.formatDuration(mUnexemptedSyncScheduledTimeoutMillis, pw); + pw.println(); pw.print(" mSystemUpdateUsageTimeoutMillis="); TimeUtils.formatDuration(mSystemUpdateUsageTimeoutMillis, pw); @@ -1706,8 +1733,13 @@ public class AppStandbyController { mInjector.elapsedRealtime()); break; - case MSG_REPORT_EXEMPTED_SYNC_SCHEDULED: - reportExemptedSyncScheduled((String) msg.obj, msg.arg1); + case MSG_REPORT_SYNC_SCHEDULED: + final boolean exempted = msg.arg1 > 0 ? true : false; + if (exempted) { + reportExemptedSyncScheduled((String) msg.obj, msg.arg1); + } else { + reportUnexemptedSyncScheduled((String) msg.obj, msg.arg1); + } break; case MSG_REPORT_EXEMPTED_SYNC_START: @@ -1799,12 +1831,14 @@ public class AppStandbyController { "system_update_usage_duration"; private static final String KEY_PREDICTION_TIMEOUT = "prediction_timeout"; private static final String KEY_SYNC_ADAPTER_HOLD_DURATION = "sync_adapter_duration"; - private static final String KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION - = "exempted_sync_scheduled_nd_duration"; - private static final String KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION - = "exempted_sync_scheduled_d_duration"; - private static final String KEY_EXEMPTED_SYNC_START_HOLD_DURATION - = "exempted_sync_start_duration"; + private static final String KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION = + "exempted_sync_scheduled_nd_duration"; + private static final String KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION = + "exempted_sync_scheduled_d_duration"; + private static final String KEY_EXEMPTED_SYNC_START_HOLD_DURATION = + "exempted_sync_start_duration"; + private static final String KEY_UNEXEMPTED_SYNC_SCHEDULED_HOLD_DURATION = + "unexempted_sync_scheduled_duration"; private static final String KEY_SYSTEM_INTERACTION_HOLD_DURATION = "system_interaction_duration"; private static final String KEY_STABLE_CHARGING_THRESHOLD = "stable_charging_threshold"; @@ -1816,6 +1850,7 @@ public class AppStandbyController { public static final long DEFAULT_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_TIMEOUT = 10 * ONE_MINUTE; public static final long DEFAULT_EXEMPTED_SYNC_SCHEDULED_DOZE_TIMEOUT = 4 * ONE_HOUR; public static final long DEFAULT_EXEMPTED_SYNC_START_TIMEOUT = 10 * ONE_MINUTE; + public static final long DEFAULT_UNEXEMPTED_SYNC_SCHEDULED_TIMEOUT = 10 * ONE_MINUTE; public static final long DEFAULT_STABLE_CHARGING_THRESHOLD = 10 * ONE_MINUTE; private final KeyValueListParser mParser = new KeyValueListParser(','); @@ -1883,42 +1918,47 @@ public class AppStandbyController { ELAPSED_TIME_THRESHOLDS); mCheckIdleIntervalMillis = Math.min(mAppStandbyElapsedThresholds[1] / 4, COMPRESS_TIME ? ONE_MINUTE : 4 * 60 * ONE_MINUTE); // 4 hours - mStrongUsageTimeoutMillis = mParser.getDurationMillis - (KEY_STRONG_USAGE_HOLD_DURATION, + mStrongUsageTimeoutMillis = mParser.getDurationMillis( + KEY_STRONG_USAGE_HOLD_DURATION, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STRONG_USAGE_TIMEOUT); - mNotificationSeenTimeoutMillis = mParser.getDurationMillis - (KEY_NOTIFICATION_SEEN_HOLD_DURATION, + mNotificationSeenTimeoutMillis = mParser.getDurationMillis( + KEY_NOTIFICATION_SEEN_HOLD_DURATION, COMPRESS_TIME ? 12 * ONE_MINUTE : DEFAULT_NOTIFICATION_TIMEOUT); - mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis - (KEY_SYSTEM_UPDATE_HOLD_DURATION, + mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis( + KEY_SYSTEM_UPDATE_HOLD_DURATION, COMPRESS_TIME ? 2 * ONE_MINUTE : DEFAULT_SYSTEM_UPDATE_TIMEOUT); - mPredictionTimeoutMillis = mParser.getDurationMillis - (KEY_PREDICTION_TIMEOUT, + mPredictionTimeoutMillis = mParser.getDurationMillis( + KEY_PREDICTION_TIMEOUT, COMPRESS_TIME ? 10 * ONE_MINUTE : DEFAULT_PREDICTION_TIMEOUT); - mSyncAdapterTimeoutMillis = mParser.getDurationMillis - (KEY_SYNC_ADAPTER_HOLD_DURATION, + mSyncAdapterTimeoutMillis = mParser.getDurationMillis( + KEY_SYNC_ADAPTER_HOLD_DURATION, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYNC_ADAPTER_TIMEOUT); - mExemptedSyncScheduledNonDozeTimeoutMillis = mParser.getDurationMillis - (KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION, + mExemptedSyncScheduledNonDozeTimeoutMillis = mParser.getDurationMillis( + KEY_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_HOLD_DURATION, COMPRESS_TIME ? (ONE_MINUTE / 2) : DEFAULT_EXEMPTED_SYNC_SCHEDULED_NON_DOZE_TIMEOUT); - mExemptedSyncScheduledDozeTimeoutMillis = mParser.getDurationMillis - (KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION, + mExemptedSyncScheduledDozeTimeoutMillis = mParser.getDurationMillis( + KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_EXEMPTED_SYNC_SCHEDULED_DOZE_TIMEOUT); - mExemptedSyncStartTimeoutMillis = mParser.getDurationMillis - (KEY_EXEMPTED_SYNC_START_HOLD_DURATION, + mExemptedSyncStartTimeoutMillis = mParser.getDurationMillis( + KEY_EXEMPTED_SYNC_START_HOLD_DURATION, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_EXEMPTED_SYNC_START_TIMEOUT); - mSystemInteractionTimeoutMillis = mParser.getDurationMillis - (KEY_SYSTEM_INTERACTION_HOLD_DURATION, + mUnexemptedSyncScheduledTimeoutMillis = mParser.getDurationMillis( + KEY_EXEMPTED_SYNC_SCHEDULED_DOZE_HOLD_DURATION, + COMPRESS_TIME ? ONE_MINUTE + : DEFAULT_UNEXEMPTED_SYNC_SCHEDULED_TIMEOUT); // TODO + + mSystemInteractionTimeoutMillis = mParser.getDurationMillis( + KEY_SYSTEM_INTERACTION_HOLD_DURATION, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_SYSTEM_INTERACTION_TIMEOUT); - mStableChargingThresholdMillis = mParser.getDurationMillis - (KEY_STABLE_CHARGING_THRESHOLD, + mStableChargingThresholdMillis = mParser.getDurationMillis( + KEY_STABLE_CHARGING_THRESHOLD, COMPRESS_TIME ? ONE_MINUTE : DEFAULT_STABLE_CHARGING_THRESHOLD); } diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index ebb0210cb553..b14d7228dcb4 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -1751,8 +1751,8 @@ public class UsageStatsService extends SystemService implements } @Override - public void reportExemptedSyncScheduled(String packageName, int userId) { - mAppStandby.postReportExemptedSyncScheduled(packageName, userId); + public void reportSyncScheduled(String packageName, int userId, boolean exempted) { + mAppStandby.postReportSyncScheduled(packageName, userId, exempted); } @Override diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java index b6e6b0ed8270..d69d2cd756dc 100644 --- a/telecomm/java/android/telecom/ConnectionRequest.java +++ b/telecomm/java/android/telecom/ConnectionRequest.java @@ -337,7 +337,31 @@ public final class ConnectionRequest implements Parcelable { mAddress == null ? Uri.EMPTY : Connection.toLogSafePhoneNumber(mAddress.toString()), - mExtras == null ? "" : mExtras); + bundleToString(mExtras)); + } + + private static String bundleToString(Bundle extras){ + if (extras == null) { + return ""; + } + StringBuilder sb = new StringBuilder(); + sb.append("Bundle["); + for (String key : extras.keySet()) { + sb.append(key); + sb.append("="); + switch (key) { + case TelecomManager.EXTRA_INCOMING_CALL_ADDRESS: + case TelecomManager.EXTRA_UNKNOWN_CALL_HANDLE: + sb.append(Log.pii(extras.get(key))); + break; + default: + sb.append(extras.get(key)); + break; + } + sb.append(", "); + } + sb.append("]"); + return sb.toString(); } public static final Creator<ConnectionRequest> CREATOR = new Creator<ConnectionRequest> () { diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index 5030f90afd3e..93eea56f6490 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -182,6 +182,7 @@ interface ITelecomService { /** * @see TelecomServiceImpl#getCallState */ + @UnsupportedAppUsage int getCallState(); /** diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java index fecdb089ae48..79b78077609f 100644 --- a/telephony/java/android/provider/Telephony.java +++ b/telephony/java/android/provider/Telephony.java @@ -17,6 +17,7 @@ package android.provider; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; @@ -4340,6 +4341,7 @@ public final class Telephony { * @param subscriptionId the subscriptionId to receive updates on * @return the Uri used to observe precise carrier identity changes */ + @NonNull public static Uri getPreciseCarrierIdUriForSubscriptionId(int subscriptionId) { return Uri.withAppendedPath(Uri.withAppendedPath(CONTENT_URI, "precise"), String.valueOf(subscriptionId)); diff --git a/telephony/java/android/telephony/CellIdentityNr.java b/telephony/java/android/telephony/CellIdentityNr.java index 856f08107fd7..19bc0ceaf00a 100644 --- a/telephony/java/android/telephony/CellIdentityNr.java +++ b/telephony/java/android/telephony/CellIdentityNr.java @@ -81,7 +81,8 @@ public final class CellIdentityNr extends CellIdentity { /** * Get the NR Cell Identity. * - * @return The NR Cell Identity in range [0, 68719476735] or Long.MAX_VALUE if unknown. + * @return The 36-bit NR Cell Identity in range [0, 68719476735] or + * {@link CellInfo#UNAVAILABLE_LONG} if unknown. */ public long getNci() { return mNci; diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java index 8ce5c54c810e..c7853f184407 100644 --- a/telephony/java/android/telephony/CellInfo.java +++ b/telephony/java/android/telephony/CellInfo.java @@ -40,6 +40,11 @@ public abstract class CellInfo implements Parcelable { public static final int UNAVAILABLE = Integer.MAX_VALUE; /** + * This value indicates that the long field is unreported. + */ + public static final long UNAVAILABLE_LONG = Long.MAX_VALUE; + + /** * Cell identity type * @hide */ diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index bb0673f921e3..5fd36f4fb253 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -609,7 +609,7 @@ public class PhoneStateListener { @RequiresPermission((android.Manifest.permission.READ_PRECISE_PHONE_STATE)) @SystemApi public void onPreciseDataConnectionStateChanged( - PreciseDataConnectionState dataConnectionState) { + @NonNull PreciseDataConnectionState dataConnectionState) { // default implementation empty } diff --git a/telephony/java/android/telephony/PreciseDataConnectionState.java b/telephony/java/android/telephony/PreciseDataConnectionState.java index 57a18266259a..d59367821a5d 100644 --- a/telephony/java/android/telephony/PreciseDataConnectionState.java +++ b/telephony/java/android/telephony/PreciseDataConnectionState.java @@ -16,6 +16,8 @@ package android.telephony; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; import android.net.LinkProperties; @@ -25,6 +27,7 @@ import android.telephony.data.ApnSetting; import java.util.Objects; + /** * Contains precise data connection state. * @@ -119,6 +122,7 @@ public final class PreciseDataConnectionState implements Parcelable { /** * Returns APN {@link ApnSetting} of this data connection. */ + @Nullable public String getDataConnectionApn() { return mAPN; } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index c28d1fb6d43e..e0b7fc44ffaf 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -63,14 +63,17 @@ import com.android.internal.telephony.ISetOpportunisticDataCallback; import com.android.internal.telephony.ISub; import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.PhoneConstants; +import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -151,6 +154,7 @@ public class SubscriptionManager { * {@link Uri#withAppendedPath(Uri, String)}. * @hide */ + @NonNull @SystemApi public static final Uri WFC_ENABLED_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc"); @@ -169,6 +173,7 @@ public class SubscriptionManager { * {@link Uri#withAppendedPath(Uri, String)}. * @hide */ + @NonNull @SystemApi public static final Uri ADVANCED_CALLING_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "advanced_calling"); @@ -186,6 +191,7 @@ public class SubscriptionManager { * {@link Uri#withAppendedPath(Uri, String)}. * @hide */ + @NonNull @SystemApi public static final Uri WFC_MODE_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc_mode"); @@ -202,6 +208,7 @@ public class SubscriptionManager { * {@link Uri#withAppendedPath(Uri, String)}. * @hide */ + @NonNull @SystemApi public static final Uri WFC_ROAMING_MODE_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "wfc_roaming_mode"); @@ -220,6 +227,7 @@ public class SubscriptionManager { * {@link Uri#withAppendedPath(Uri, String)}. * @hide */ + @NonNull @SystemApi public static final Uri VT_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "vt_enabled"); @@ -237,6 +245,7 @@ public class SubscriptionManager { * {@link Uri#withAppendedPath(Uri, String)}. * @hide */ + @NonNull @SystemApi public static final Uri WFC_ROAMING_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "wfc_roaming_enabled"); @@ -1066,7 +1075,8 @@ public class SubscriptionManager { * @param listener that is to be unregistered. */ public void removeOnOpportunisticSubscriptionsChangedListener( - OnOpportunisticSubscriptionsChangedListener listener) { + @NonNull OnOpportunisticSubscriptionsChangedListener listener) { + Preconditions.checkNotNull(listener, "listener cannot be null"); String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>"; if (DBG) { logd("unregister OnOpportunisticSubscriptionsChangedListener pkgForDebug=" @@ -2682,7 +2692,8 @@ public class SubscriptionManager { * @param callbackIntent pending intent that will be sent after operation is done. */ @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) - public void switchToSubscription(int subId, PendingIntent callbackIntent) { + public void switchToSubscription(int subId, @NonNull PendingIntent callbackIntent) { + Preconditions.checkNotNull(callbackIntent, "callbackIntent cannot be null"); EuiccManager euiccManager = new EuiccManager(mContext); euiccManager.switchToSubscription(subId, callbackIntent); } @@ -2900,8 +2911,33 @@ public class SubscriptionManager { if (availableList == null) { return null; } else { - return availableList.stream().filter(subInfo -> !shouldHideSubscription(subInfo)) - .collect(Collectors.toList()); + // Multiple subscriptions in a group should only have one representative. + // It should be the current active primary subscription if any, or any + // primary subscription. + List<SubscriptionInfo> selectableList = new ArrayList<>(); + Map<String, SubscriptionInfo> groupMap = new HashMap<>(); + + for (SubscriptionInfo info : availableList) { + // Opportunistic subscriptions are considered invisible + // to users so they should never be returned. + if (isInvisibleSubscription(info)) continue; + + String groupUuid = info.getGroupUuid(); + if (groupUuid == null) { + // Doesn't belong to any group. Add in the list. + selectableList.add(info); + } else if (!groupMap.containsKey(groupUuid) + || (groupMap.get(groupUuid).getSimSlotIndex() == INVALID_SIM_SLOT_INDEX + && info.getSimSlotIndex() != INVALID_SIM_SLOT_INDEX)) { + // If it belongs to a group that has never been recorded or it's the current + // active subscription, add it in the list. + selectableList.remove(groupMap.get(groupUuid)); + selectableList.add(info); + groupMap.put(groupUuid, info); + } + + } + return selectableList; } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index d39c5f8892c8..31d8ddbbd35f 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3249,6 +3249,7 @@ public class TelephonyManager { * the caller does not have adequate permissions for that card. */ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @NonNull public List<UiccCardInfo> getUiccCardsInfo() { try { ITelephony telephony = getITelephony(); diff --git a/telephony/java/android/telephony/UiccCardInfo.java b/telephony/java/android/telephony/UiccCardInfo.java index 0192ffbe263c..d95a4992f808 100644 --- a/telephony/java/android/telephony/UiccCardInfo.java +++ b/telephony/java/android/telephony/UiccCardInfo.java @@ -15,6 +15,8 @@ */ package android.telephony; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; @@ -104,6 +106,7 @@ public final class UiccCardInfo implements Parcelable { * Note that this field may be omitted if the caller does not have the correct permissions * (see {@link TelephonyManager#getUiccCardsInfo()}). */ + @Nullable public String getEid() { if (!mIsEuicc) { return null; @@ -117,6 +120,7 @@ public final class UiccCardInfo implements Parcelable { * Note that this field may be omitted if the caller does not have the correct permissions * (see {@link TelephonyManager#getUiccCardsInfo()}). */ + @Nullable public String getIccId() { return mIccId; } @@ -129,11 +133,12 @@ public final class UiccCardInfo implements Parcelable { } /** - * Returns a copy of the UiccCardinfo with the clears the EID and ICCID set to null. These - * values are generally private and require carrier privileges to view. + * Returns a copy of the UiccCardinfo with the EID and ICCID set to null. These values are + * generally private and require carrier privileges to view. * * @hide */ + @NonNull public UiccCardInfo getUnprivileged() { return new UiccCardInfo(mIsEuicc, mCardId, null, null, mSlotIndex, mIsRemovable); } diff --git a/telephony/java/android/telephony/ims/ImsConferenceState.java b/telephony/java/android/telephony/ims/ImsConferenceState.java index 66d2f8d929d3..8af8cffcd878 100644 --- a/telephony/java/android/telephony/ims/ImsConferenceState.java +++ b/telephony/java/android/telephony/ims/ImsConferenceState.java @@ -16,17 +16,18 @@ package android.telephony.ims; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map.Entry; -import java.util.Set; - import android.annotation.SystemApi; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.telecom.Call; import android.telecom.Connection; +import android.telecom.Log; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.Set; /** * Provides the conference information (defined in RFC 4575) for IMS conference call. @@ -189,7 +190,7 @@ public final class ImsConferenceState implements Parcelable { sb.append("<"); while (iterator.hasNext()) { Entry<String, Bundle> entry = iterator.next(); - sb.append(entry.getKey()); + sb.append(Log.pii(entry.getKey())); sb.append(": "); Bundle participantData = entry.getValue(); @@ -197,7 +198,7 @@ public final class ImsConferenceState implements Parcelable { sb.append(key); sb.append("="); if (ENDPOINT.equals(key) || USER.equals(key)) { - sb.append(android.telecom.Log.pii(participantData.get(key))); + sb.append(Log.pii(participantData.get(key))); } else { sb.append(participantData.get(key)); } diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java index eb99d5dcaaeb..bb85be16eb3a 100644 --- a/telephony/java/android/telephony/ims/ImsMmTelManager.java +++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java @@ -139,7 +139,7 @@ public class ImsMmTelManager { if (mLocalCallback == null) return; Binder.withCleanCallingIdentity(() -> - mExecutor.execute(() -> mLocalCallback.onDeregistered(info))); + mExecutor.execute(() -> mLocalCallback.onUnregistered(info))); } @Override @@ -199,7 +199,7 @@ public class ImsMmTelManager { * * @param info the {@link ImsReasonInfo} associated with why registration was disconnected. */ - public void onDeregistered(ImsReasonInfo info) { + public void onUnregistered(ImsReasonInfo info) { } /** @@ -485,7 +485,7 @@ public class ImsMmTelManager { * @see android.telephony.CarrierConfigManager#KEY_HIDE_ENHANCED_4G_LTE_BOOL * @see android.telephony.CarrierConfigManager#KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL * @see android.telephony.CarrierConfigManager#KEY_CARRIER_VOLTE_AVAILABLE_BOOL - * @see #setAdvancedCallingSetting(boolean) + * @see #setAdvancedCallingSettingEnabled(boolean) * @return true if the user's setting for advanced calling is enabled, false otherwise. */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @@ -519,9 +519,9 @@ public class ImsMmTelManager { * @see #isAdvancedCallingSettingEnabled() */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) - public void setAdvancedCallingSetting(boolean isEnabled) { + public void setAdvancedCallingSettingEnabled(boolean isEnabled) { try { - getITelephony().setAdvancedCallingSetting(mSubId, isEnabled); + getITelephony().setAdvancedCallingSettingEnabled(mSubId, isEnabled); return; } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); @@ -589,7 +589,7 @@ public class ImsMmTelManager { /** * The user's setting for whether or not they have enabled the "Video Calling" setting. * @return true if the user’s “Video Calling” setting is currently enabled. - * @see #setVtSetting(boolean) + * @see #setVtSettingEnabled(boolean) */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVtSettingEnabled() { @@ -605,9 +605,9 @@ public class ImsMmTelManager { * @see #isVtSettingEnabled() */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) - public void setVtSetting(boolean isEnabled) { + public void setVtSettingEnabled(boolean isEnabled) { try { - getITelephony().setVtSetting(mSubId, isEnabled); + getITelephony().setVtSettingEnabled(mSubId, isEnabled); return; } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); @@ -616,7 +616,7 @@ public class ImsMmTelManager { /** * @return true if the user's setting for Voice over WiFi is enabled and false if it is not. - * @see #setVoWiFiSetting(boolean) + * @see #setVoWiFiSettingEnabled(boolean) */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVoWiFiSettingEnabled() { @@ -633,9 +633,9 @@ public class ImsMmTelManager { * @see #isVoWiFiSettingEnabled() */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) - public void setVoWiFiSetting(boolean isEnabled) { + public void setVoWiFiSettingEnabled(boolean isEnabled) { try { - getITelephony().setVoWiFiSetting(mSubId, isEnabled); + getITelephony().setVoWiFiSettingEnabled(mSubId, isEnabled); return; } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); @@ -645,7 +645,7 @@ public class ImsMmTelManager { /** * @return true if the user's setting for Voice over WiFi while roaming is enabled, false * if disabled. - * @see #setVoWiFiRoamingSetting(boolean) + * @see #setVoWiFiRoamingSettingEnabled(boolean) */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isVoWiFiRoamingSettingEnabled() { @@ -663,9 +663,9 @@ public class ImsMmTelManager { * @see #isVoWiFiRoamingSettingEnabled() */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) - public void setVoWiFiRoamingSetting(boolean isEnabled) { + public void setVoWiFiRoamingSettingEnabled(boolean isEnabled) { try { - getITelephony().setVoWiFiRoamingSetting(mSubId, isEnabled); + getITelephony().setVoWiFiRoamingSettingEnabled(mSubId, isEnabled); return; } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); @@ -682,7 +682,7 @@ public class ImsMmTelManager { * - {@link #WIFI_MODE_WIFI_ONLY} * - {@link #WIFI_MODE_CELLULAR_PREFERRED} * - {@link #WIFI_MODE_WIFI_PREFERRED} - * @see #setVoWiFiSetting(boolean) + * @see #setVoWiFiSettingEnabled(boolean) */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean isCapable, int mode) { @@ -700,7 +700,7 @@ public class ImsMmTelManager { * - {@link #WIFI_MODE_WIFI_ONLY} * - {@link #WIFI_MODE_CELLULAR_PREFERRED} * - {@link #WIFI_MODE_WIFI_PREFERRED} - * @see #setVoWiFiSetting(boolean) + * @see #setVoWiFiSettingEnabled(boolean) */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public @WiFiCallingMode int getVoWiFiModeSetting() { @@ -739,7 +739,7 @@ public class ImsMmTelManager { * - {@link #WIFI_MODE_WIFI_ONLY} * - {@link #WIFI_MODE_CELLULAR_PREFERRED} * - {@link #WIFI_MODE_WIFI_PREFERRED} - * @see #setVoWiFiRoamingSetting(boolean) + * @see #setVoWiFiRoamingSettingEnabled(boolean) */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public @WiFiCallingMode int getVoWiFiRoamingModeSetting() { diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl index c90ffc7726e4..c140127237d4 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl @@ -26,13 +26,17 @@ import android.telephony.mbms.StreamingServiceInfo; */ interface IMbmsStreamingService { + @UnsupportedAppUsage int initialize(IMbmsStreamingSessionCallback callback, int subId); + @UnsupportedAppUsage int requestUpdateStreamingServices(int subId, in List<String> serviceClasses); + @UnsupportedAppUsage int startStreaming(int subId, String serviceId, IStreamingServiceCallback callback); + @UnsupportedAppUsage Uri getPlaybackUri(int subId, String serviceId); void stopStreaming(int subId, String serviceId); diff --git a/telephony/java/com/android/ims/ImsConfigListener.aidl b/telephony/java/com/android/ims/ImsConfigListener.aidl index 64a501552550..4f229df252a6 100644 --- a/telephony/java/com/android/ims/ImsConfigListener.aidl +++ b/telephony/java/com/android/ims/ImsConfigListener.aidl @@ -47,6 +47,7 @@ oneway interface ImsConfigListener { * * @return void. */ + @UnsupportedAppUsage void onSetFeatureResponse(int feature, int network, int value, int status); /** diff --git a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl index 579369f4b549..b33a9f1ad23b 100644 --- a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl +++ b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl @@ -34,33 +34,47 @@ oneway interface IImsCallSessionListener { /** * Notifies the result of the basic session operation (setup / terminate). */ + @UnsupportedAppUsage void callSessionProgressing(in IImsCallSession session, in ImsStreamMediaProfile profile); + @UnsupportedAppUsage void callSessionStarted(in IImsCallSession session, in ImsCallProfile profile); + @UnsupportedAppUsage void callSessionStartFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo); + @UnsupportedAppUsage void callSessionTerminated(in IImsCallSession session, in ImsReasonInfo reasonInfo); /** * Notifies the result of the call hold/resume operation. */ + @UnsupportedAppUsage void callSessionHeld(in IImsCallSession session, in ImsCallProfile profile); + @UnsupportedAppUsage void callSessionHoldFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo); + @UnsupportedAppUsage void callSessionHoldReceived(in IImsCallSession session, in ImsCallProfile profile); + @UnsupportedAppUsage void callSessionResumed(in IImsCallSession session, in ImsCallProfile profile); + @UnsupportedAppUsage void callSessionResumeFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo); + @UnsupportedAppUsage void callSessionResumeReceived(in IImsCallSession session, in ImsCallProfile profile); /** * Notifies the result of call merge operation. */ + @UnsupportedAppUsage void callSessionMergeStarted(in IImsCallSession session, in IImsCallSession newSession, in ImsCallProfile profile); + @UnsupportedAppUsage void callSessionMergeComplete(in IImsCallSession session); + @UnsupportedAppUsage void callSessionMergeFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo); /** * Notifies the result of call upgrade / downgrade or any other call updates. */ + @UnsupportedAppUsage void callSessionUpdated(in IImsCallSession session, in ImsCallProfile profile); void callSessionUpdateFailed(in IImsCallSession session, @@ -81,7 +95,9 @@ oneway interface IImsCallSessionListener { /** * Notifies the result of the participant invitation / removal to/from the conference session. */ + @UnsupportedAppUsage void callSessionInviteParticipantsRequestDelivered(in IImsCallSession session); + @UnsupportedAppUsage void callSessionInviteParticipantsRequestFailed(in IImsCallSession session, in ImsReasonInfo reasonInfo); void callSessionRemoveParticipantsRequestDelivered(in IImsCallSession session); @@ -91,6 +107,7 @@ oneway interface IImsCallSessionListener { /** * Notifies the changes of the conference info. in the conference session. */ + @UnsupportedAppUsage void callSessionConferenceStateUpdated(in IImsCallSession session, in ImsConferenceState state); @@ -103,8 +120,10 @@ oneway interface IImsCallSessionListener { /** * Notifies of handover information for this call */ + @UnsupportedAppUsage void callSessionHandover(in IImsCallSession session, in int srcAccessTech, in int targetAccessTech, in ImsReasonInfo reasonInfo); + @UnsupportedAppUsage void callSessionHandoverFailed(in IImsCallSession session, in int srcAccessTech, in int targetAccessTech, in ImsReasonInfo reasonInfo); void callSessionMayHandover(in IImsCallSession session, @@ -118,6 +137,7 @@ oneway interface IImsCallSessionListener { * - {@link com.android.internal.telephony.Phone#TTY_MODE_HCO} * - {@link com.android.internal.telephony.Phone#TTY_MODE_VCO} */ + @UnsupportedAppUsage void callSessionTtyModeReceived(in IImsCallSession session, in int mode); /** @@ -126,11 +146,13 @@ oneway interface IImsCallSessionListener { * @param session The call session. * @param isMultiParty {@code true} if the session became multiparty, {@code false} otherwise. */ + @UnsupportedAppUsage void callSessionMultipartyStateChanged(in IImsCallSession session, in boolean isMultiParty); /** * Notifies the supplementary service information for the current session. */ + @UnsupportedAppUsage void callSessionSuppServiceReceived(in IImsCallSession session, in ImsSuppServiceNotification suppSrvNotification); diff --git a/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl b/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl index 2212109c8a67..a7a62a625478 100644 --- a/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl +++ b/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl @@ -32,6 +32,7 @@ oneway interface IImsRegistrationListener { * * @deprecated see {@link registrationConnectedWithRadioTech} */ + @UnsupportedAppUsage void registrationConnected(); /** @@ -47,6 +48,7 @@ oneway interface IImsRegistrationListener { * @param imsRadioTech the radio access technology. Valid values are {@code * RIL_RADIO_TECHNOLOGY_*} defined in {@link ServiceState}. */ + @UnsupportedAppUsage void registrationConnectedWithRadioTech(int imsRadioTech); /** @@ -55,12 +57,14 @@ oneway interface IImsRegistrationListener { * @param imsRadioTech the radio access technology. Valid values are {@code * RIL_RADIO_TECHNOLOGY_*} defined in {@link ServiceState}. */ + @UnsupportedAppUsage void registrationProgressingWithRadioTech(int imsRadioTech); /** * Notifies the application when the device is disconnected from the IMS network. */ + @UnsupportedAppUsage void registrationDisconnected(in ImsReasonInfo imsReasonInfo); /** @@ -94,6 +98,7 @@ oneway interface IImsRegistrationListener { * @param enabledFeatures features enabled as defined in com.android.ims.ImsConfig#FeatureConstants. * @param disabledFeatures features disabled as defined in com.android.ims.ImsConfig#FeatureConstants. */ + @UnsupportedAppUsage void registrationFeatureCapabilityChanged(int serviceClass, in int[] enabledFeatures, in int[] disabledFeatures); @@ -101,11 +106,13 @@ oneway interface IImsRegistrationListener { * Updates the application with the waiting voice message count. * @param count The number of waiting voice messages. */ + @UnsupportedAppUsage void voiceMessageCountUpdate(int count); /** * Notifies the application when the list of URIs associated with IMS client is updated. */ + @UnsupportedAppUsage void registrationAssociatedUriChanged(in Uri[] uris); /** @@ -116,5 +123,6 @@ oneway interface IImsRegistrationListener { * attempted. * @param imsReasonInfo Reason for the failure. */ + @UnsupportedAppUsage void registrationChangeFailed(in int targetAccessTech, in ImsReasonInfo imsReasonInfo); } diff --git a/telephony/java/com/android/ims/internal/IImsUtListener.aidl b/telephony/java/com/android/ims/internal/IImsUtListener.aidl index a603cd34dfcd..fcb9fb1f8773 100644 --- a/telephony/java/com/android/ims/internal/IImsUtListener.aidl +++ b/telephony/java/com/android/ims/internal/IImsUtListener.aidl @@ -31,30 +31,37 @@ oneway interface IImsUtListener { /** * Notifies the result of the supplementary service configuration udpate. */ + @UnsupportedAppUsage void utConfigurationUpdated(in IImsUt ut, int id); + @UnsupportedAppUsage void utConfigurationUpdateFailed(in IImsUt ut, int id, in ImsReasonInfo error); /** * Notifies the result of the supplementary service configuration query. */ + @UnsupportedAppUsage void utConfigurationQueried(in IImsUt ut, int id, in Bundle ssInfo); + @UnsupportedAppUsage void utConfigurationQueryFailed(in IImsUt ut, int id, in ImsReasonInfo error); /** * Notifies the status of the call barring supplementary service. */ + @UnsupportedAppUsage void utConfigurationCallBarringQueried(in IImsUt ut, int id, in ImsSsInfo[] cbInfo); /** * Notifies the status of the call forwarding supplementary service. */ + @UnsupportedAppUsage void utConfigurationCallForwardQueried(in IImsUt ut, int id, in ImsCallForwardInfo[] cfInfo); /** * Notifies the status of the call waiting supplementary service. */ + @UnsupportedAppUsage void utConfigurationCallWaitingQueried(in IImsUt ut, int id, in ImsSsInfo[] cwInfo); diff --git a/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl b/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl index 9499c9f5dde9..cf8d63794546 100644 --- a/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl +++ b/telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl @@ -31,18 +31,25 @@ import android.telecom.VideoProfile; * {@hide} */ oneway interface IImsVideoCallCallback { + @UnsupportedAppUsage void receiveSessionModifyRequest(in VideoProfile videoProfile); + @UnsupportedAppUsage void receiveSessionModifyResponse(int status, in VideoProfile requestedProfile, in VideoProfile responseProfile); + @UnsupportedAppUsage void handleCallSessionEvent(int event); + @UnsupportedAppUsage void changePeerDimensions(int width, int height); + @UnsupportedAppUsage void changeCallDataUsage(long dataUsage); + @UnsupportedAppUsage void changeCameraCapabilities(in VideoProfile.CameraCapabilities cameraCapabilities); + @UnsupportedAppUsage void changeVideoQuality(int videoQuality); } diff --git a/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl b/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl index 0da27e163df1..4d20bd675628 100644 --- a/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl +++ b/telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl @@ -41,6 +41,7 @@ import com.android.ims.internal.IImsVideoCallCallback; * @hide */ oneway interface IImsVideoCallProvider { + @UnsupportedAppUsage void setCallback(IImsVideoCallCallback callback); void setCamera(String cameraId, int uid); diff --git a/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl b/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl index 8cb1153c48bb..c69d5a94f760 100644 --- a/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl +++ b/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl @@ -29,6 +29,7 @@ interface IOptionsListener * @param version, version information of the service. * @hide */ + @UnsupportedAppUsage void getVersionCb(in String version ); /** @@ -37,6 +38,7 @@ interface IOptionsListener * @param statusCode, UCE_SUCCESS as service availability. * @hide */ + @UnsupportedAppUsage void serviceAvailable(in StatusCode statusCode); /** @@ -45,6 +47,7 @@ interface IOptionsListener * @param statusCode, UCE_SUCCESS as service unavailability. * @hide */ + @UnsupportedAppUsage void serviceUnavailable(in StatusCode statusCode); /** @@ -55,6 +58,7 @@ interface IOptionsListener * @param capInfo, capabilities of the remote entity received. * @hide */ + @UnsupportedAppUsage void sipResponseReceived( String uri, in OptionsSipResponse sipResponse, in OptionsCapInfo capInfo); @@ -63,6 +67,7 @@ interface IOptionsListener * @param cmdStatus, command status of the request placed. * @hide */ + @UnsupportedAppUsage void cmdStatus(in OptionsCmdStatus cmdStatus); /** @@ -73,6 +78,7 @@ interface IOptionsListener * @param tID, transation of the request received from network. * @hide */ + @UnsupportedAppUsage void incomingOptions( String uri, in OptionsCapInfo capInfo, in int tID); } diff --git a/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl b/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl index 839bb5574d33..2e49082988c3 100644 --- a/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl +++ b/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl @@ -33,6 +33,7 @@ interface IOptionsService * @return StatusCode, status of the request placed. * @hide */ + @UnsupportedAppUsage StatusCode getVersion(int optionsServiceHandle); /** @@ -44,6 +45,7 @@ interface IOptionsService * The service will fill UceLong.mUceLong with optionsServiceListenerHdl * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode addListener(int optionsServiceHandle, IOptionsListener optionsListener, inout UceLong optionsServiceListenerHdl); @@ -54,6 +56,7 @@ interface IOptionsService * @param optionsServiceListenerHdl provided in createOptionsService() or Addlistener(). * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode removeListener(int optionsServiceHandle, in UceLong optionsServiceListenerHdl); /** @@ -66,6 +69,7 @@ interface IOptionsService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode setMyInfo(int optionsServiceHandle , in CapInfo capInfo, int reqUserData); @@ -78,6 +82,7 @@ interface IOptionsService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode getMyInfo(int optionsServiceHandle , int reqUserdata); /** @@ -90,6 +95,7 @@ interface IOptionsService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode getContactCap(int optionsServiceHandle , String remoteURI, int reqUserData); @@ -103,6 +109,7 @@ interface IOptionsService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode getContactListCap(int optionsServiceHandle, in String[] remoteURIList, int reqUserData); @@ -119,6 +126,7 @@ interface IOptionsService * @param bContactInBL, true if the contact is blacklisted, else false. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode responseIncomingOptions(int optionsServiceHandle, int tId, int sipResponseCode, String reasonPhrase, in OptionsCapInfo capInfo, in boolean bContactInBL); diff --git a/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl b/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl index 2ae424f4af8e..65e7fc9756bb 100644 --- a/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl +++ b/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl @@ -36,6 +36,7 @@ interface IPresenceListener * Gets the version of the presence listener implementation. * @param version, version information. */ + @UnsupportedAppUsage void getVersionCb(in String version ); /** @@ -43,6 +44,7 @@ interface IPresenceListener * availability. * @param statusCode, UCE_SUCCESS as service availability. */ + @UnsupportedAppUsage void serviceAvailable(in StatusCode statusCode); /** @@ -50,6 +52,7 @@ interface IPresenceListener * unavailability. * @param statusCode, UCE_SUCCESS as service unAvailability. */ + @UnsupportedAppUsage void serviceUnAvailable(in StatusCode statusCode); /** @@ -57,12 +60,14 @@ interface IPresenceListener * publish request. * @param publishTrigger, Publish trigger for the network being supported. */ + @UnsupportedAppUsage void publishTriggering(in PresPublishTriggerType publishTrigger); /** * Callback function to be invoked to inform the client of the status of an asynchronous call. * @param cmdStatus, command status of the request placed. */ + @UnsupportedAppUsage void cmdStatus( in PresCmdStatus cmdStatus); /** @@ -70,6 +75,7 @@ interface IPresenceListener * such as PUBLISH or SUBSCRIBE, has been received. * @param sipResponse, network response received for the request placed. */ + @UnsupportedAppUsage void sipResponseReceived(in PresSipResponse sipResponse); /** @@ -78,6 +84,7 @@ interface IPresenceListener * @param presentityURI, URI of the remote entity the request was placed. * @param tupleInfo, array of capability information remote entity supports. */ + @UnsupportedAppUsage void capInfoReceived(in String presentityURI, in PresTupleInfo [] tupleInfo); @@ -87,6 +94,7 @@ interface IPresenceListener * @param rlmiInfo, resource infomation received from network. * @param resInfo, array of capabilities received from network for the list of remore URI. */ + @UnsupportedAppUsage void listCapInfoReceived(in PresRlmiInfo rlmiInfo, in PresResInfo [] resInfo); @@ -94,6 +102,7 @@ interface IPresenceListener * Callback function to be invoked to inform the client when Unpublish message * is sent to network. */ + @UnsupportedAppUsage void unpublishMessageSent(); }
\ No newline at end of file diff --git a/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl b/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl index fdea6d35c195..26a3e83efcfa 100644 --- a/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl +++ b/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl @@ -33,6 +33,7 @@ interface IPresenceService * @param presenceServiceHdl returned in createPresenceService(). * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode getVersion(int presenceServiceHdl); /** @@ -45,6 +46,7 @@ interface IPresenceService * * @return StatusCode, status of the request placed */ + @UnsupportedAppUsage StatusCode addListener(int presenceServiceHdl, IPresenceListener presenceServiceListener, inout UceLong presenceServiceListenerHdl); @@ -54,6 +56,7 @@ interface IPresenceService * @param presenceServiceListenerHdl provided in createPresenceService() or Addlistener(). * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode removeListener(int presenceServiceHdl, in UceLong presenceServiceListenerHdl); /** @@ -69,6 +72,7 @@ interface IPresenceService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode reenableService(int presenceServiceHdl, int userData); /** @@ -81,6 +85,7 @@ interface IPresenceService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode publishMyCap(int presenceServiceHdl, in PresCapInfo myCapInfo , int userData); /** @@ -94,6 +99,7 @@ interface IPresenceService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode getContactCap(int presenceServiceHdl , String remoteUri, int userData); /** @@ -107,6 +113,7 @@ interface IPresenceService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode getContactListCap(int presenceServiceHdl, in String[] remoteUriList, int userData); /** @@ -122,6 +129,7 @@ interface IPresenceService * with original request. * @return StatusCode, status of the request placed. */ + @UnsupportedAppUsage StatusCode setNewFeatureTag(int presenceServiceHdl, String featureTag, in PresServiceInfo serviceInfo, int userData); diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl b/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl index 13707a16a0c1..41abf7d1a1f0 100644 --- a/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl +++ b/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl @@ -25,5 +25,6 @@ interface IUceListener * @param serviceStatusValue defined in ImsUceManager * @hide */ + @UnsupportedAppUsage void setStatus(int serviceStatusValue); } diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl b/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl index 1fb8513d410a..ec45371689cf 100644 --- a/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl +++ b/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl @@ -38,6 +38,7 @@ interface IUceService * Service status is returned in setStatus callback in IUceListener. * @hide */ + @UnsupportedAppUsage boolean startService(IUceListener uceListener); /** @@ -45,6 +46,7 @@ interface IUceService * @return boolean true if the service stop request is processed successfully, FALSE otherwise. * @hide */ + @UnsupportedAppUsage boolean stopService(); @@ -54,6 +56,7 @@ interface IUceService * @return boolean true if service started else false. * @hide */ + @UnsupportedAppUsage boolean isServiceStarted(); /** @@ -71,6 +74,7 @@ interface IUceService * * @deprecated This is replaced with new API createOptionsServiceForSubscription() */ + @UnsupportedAppUsage int createOptionsService(IOptionsListener optionsListener, inout UceLong optionsServiceListenerHdl); /** @@ -97,6 +101,7 @@ interface IUceService * in IOptionsListener * @hide */ + @UnsupportedAppUsage void destroyOptionsService(int optionsServiceHandle); /** @@ -114,6 +119,7 @@ interface IUceService * * @deprecated This is replaced with new API createPresenceServiceForSubscription() */ + @UnsupportedAppUsage int createPresenceService(IPresenceListener presenceServiceListener, inout UceLong presenceServiceListenerHdl); /** @@ -141,6 +147,7 @@ interface IUceService * * @hide */ + @UnsupportedAppUsage void destroyPresenceService(int presenceServiceHdl); @@ -152,6 +159,7 @@ interface IUceService * * @hide */ + @UnsupportedAppUsage boolean getServiceStatus(); /** @@ -163,6 +171,7 @@ interface IUceService * * @deprecated use API getPresenceServiceForSubscription() */ + @UnsupportedAppUsage IPresenceService getPresenceService(); /** @@ -185,6 +194,7 @@ interface IUceService * * @hide */ + @UnsupportedAppUsage IOptionsService getOptionsService(); /** diff --git a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl index 5cd67d977ad5..8e50a8f9d7d5 100644 --- a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl +++ b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl @@ -23,6 +23,7 @@ import android.os.PersistableBundle; */ interface ICarrierConfigLoader { + @UnsupportedAppUsage PersistableBundle getConfigForSubId(int subId, String callingPackage); void overrideConfig(int subId, in PersistableBundle overrides); diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl index abcb15ae4d50..5b509b7260ba 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl @@ -60,6 +60,7 @@ interface IPhoneSubInfo { /** * Retrieves the unique sbuscriber ID, e.g., IMSI for GSM phones. */ + @UnsupportedAppUsage String getSubscriberId(String callingPackage); /** @@ -75,6 +76,7 @@ interface IPhoneSubInfo { /** * Retrieves the serial number of the ICC, if applicable. */ + @UnsupportedAppUsage String getIccSerialNumber(String callingPackage); /** diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index d1838370d023..5c5d44a8f42e 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -76,6 +76,7 @@ interface ITelephony { * @param number the number to be dialed. If null, this * would display the Dialer screen with no number pre-filled. */ + @UnsupportedAppUsage void dial(String number); /** @@ -83,6 +84,7 @@ interface ITelephony { * @param callingPackage The package making the call. * @param number the number to be called. */ + @UnsupportedAppUsage void call(String callingPackage, String number); /** @@ -98,6 +100,7 @@ interface ITelephony { * @param callingPackage the name of the package making the call. * @return returns true if the radio is on. */ + @UnsupportedAppUsage boolean isRadioOnForSubscriber(int subId, String callingPackage); /** @@ -105,6 +108,7 @@ interface ITelephony { * @param pin The pin to check. * @return whether the operation was a success. */ + @UnsupportedAppUsage boolean supplyPin(String pin); /** @@ -182,6 +186,7 @@ interface ITelephony { * @param dialString the MMI command to be executed. * @return true if MMI command is executed. */ + @UnsupportedAppUsage boolean handlePinMmi(String dialString); @@ -202,11 +207,13 @@ interface ITelephony { * @param subId user preferred subId. * @return true if MMI command is executed. */ + @UnsupportedAppUsage boolean handlePinMmiForSubscriber(int subId, String dialString); /** * Toggles the radio on or off. */ + @UnsupportedAppUsage void toggleRadioOnOff(); /** @@ -218,6 +225,7 @@ interface ITelephony { /** * Set the radio to on or off */ + @UnsupportedAppUsage boolean setRadio(boolean turnOn); /** @@ -234,6 +242,7 @@ interface ITelephony { /** * Request to update location information in service state */ + @UnsupportedAppUsage void updateServiceLocation(); /** @@ -245,6 +254,7 @@ interface ITelephony { /** * Enable location update notifications. */ + @UnsupportedAppUsage void enableLocationUpdates(); /** @@ -256,6 +266,7 @@ interface ITelephony { /** * Disable location update notifications. */ + @UnsupportedAppUsage void disableLocationUpdates(); /** @@ -267,11 +278,13 @@ interface ITelephony { /** * Allow mobile data connections. */ + @UnsupportedAppUsage boolean enableDataConnectivity(); /** * Disallow mobile data connections. */ + @UnsupportedAppUsage boolean disableDataConnectivity(); /** @@ -293,6 +306,7 @@ interface ITelephony { */ List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg); + @UnsupportedAppUsage int getCallState(); /** @@ -300,7 +314,9 @@ interface ITelephony { */ int getCallStateForSlot(int slotIndex); + @UnsupportedAppUsage int getDataActivity(); + @UnsupportedAppUsage int getDataState(); /** @@ -308,6 +324,7 @@ interface ITelephony { * Returns TelephonyManager.PHONE_TYPE_CDMA if RILConstants.CDMA_PHONE * and TelephonyManager.PHONE_TYPE_GSM if RILConstants.GSM_PHONE */ + @UnsupportedAppUsage int getActivePhoneType(); /** @@ -444,6 +461,7 @@ interface ITelephony { * Returns the network type for data transmission * Legacy call, permission-free */ + @UnsupportedAppUsage int getNetworkType(); /** @@ -477,6 +495,7 @@ interface ITelephony { /** * Return true if an ICC card is present */ + @UnsupportedAppUsage boolean hasIccCard(); /** @@ -557,6 +576,7 @@ interface ITelephony { * successful iccOpenLogicalChannel. * @return true if the channel was closed successfully. */ + @UnsupportedAppUsage boolean iccCloseLogicalChannel(int subId, int channel); /** @@ -577,6 +597,7 @@ interface ITelephony { * @return The APDU response from the ICC card with the status appended at * the end. */ + @UnsupportedAppUsage String iccTransmitApduLogicalChannel(int subId, int channel, int cla, int instruction, int p1, int p2, int p3, String data); @@ -829,6 +850,7 @@ interface ITelephony { * * @return true on enabled */ + @UnsupportedAppUsage boolean getDataEnabled(int subId); /** @@ -1679,7 +1701,7 @@ interface ITelephony { /** * Modify the user's setting for whether or not 4G LTE is enabled. */ - void setAdvancedCallingSetting(int subId, boolean isEnabled); + void setAdvancedCallingSettingEnabled(int subId, boolean isEnabled); /** * return true if the user's setting for VT is enabled for the subscription. @@ -1689,7 +1711,7 @@ interface ITelephony { /** * Modify the user's setting for whether or not VT is available for the subscrption specified. */ - void setVtSetting(int subId, boolean isEnabled); + void setVtSettingEnabled(int subId, boolean isEnabled); /** * return true if the user's setting for whether or not Voice over WiFi is currently enabled. @@ -1699,7 +1721,7 @@ interface ITelephony { /** * sets the user's setting for Voice over WiFi enabled state. */ - void setVoWiFiSetting(int subId, boolean isEnabled); + void setVoWiFiSettingEnabled(int subId, boolean isEnabled); /** * return true if the user's setting for Voice over WiFi while roaming is enabled. @@ -1710,7 +1732,7 @@ interface ITelephony { * Sets the user's preference for whether or not Voice over WiFi is enabled for the current * subscription while roaming. */ - void setVoWiFiRoamingSetting(int subId, boolean isEnabled); + void setVoWiFiRoamingSettingEnabled(int subId, boolean isEnabled); /** * Set the Voice over WiFi enabled state, but do not persist the setting. diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 6de608e7b53b..0610c5d106c3 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -38,9 +38,11 @@ interface ITelephonyRegistry { IOnSubscriptionsChangedListener callback); void removeOnSubscriptionsChangedListener(String pkg, IOnSubscriptionsChangedListener callback); + @UnsupportedAppUsage void listen(String pkg, IPhoneStateListener callback, int events, boolean notifyNow); void listenForSubscriber(in int subId, String pkg, IPhoneStateListener callback, int events, boolean notifyNow); + @UnsupportedAppUsage void notifyCallState(int state, String incomingNumber); void notifyCallStateForPhoneId(in int phoneId, in int subId, int state, String incomingNumber); void notifyServiceStateForPhoneId(in int phoneId, in int subId, in ServiceState state); @@ -57,11 +59,13 @@ interface ITelephonyRegistry { void notifyDataConnectionForSubscriber(int subId, int state, boolean isDataConnectivityPossible, String apn, String apnType, in LinkProperties linkProperties, in NetworkCapabilities networkCapabilities, int networkType, boolean roaming); + @UnsupportedAppUsage void notifyDataConnectionFailed(String apnType); void notifyDataConnectionFailedForSubscriber(int subId, String apnType); void notifyCellLocation(in Bundle cellLocation); void notifyCellLocationForSubscriber(in int subId, in Bundle cellLocation); void notifyOtaspChanged(in int otaspMode); + @UnsupportedAppUsage void notifyCellInfo(in List<CellInfo> cellInfo); void notifyPhysicalChannelConfiguration(in List<PhysicalChannelConfig> configs); void notifyPhysicalChannelConfigurationForSubscriber(in int subId, diff --git a/telephony/java/com/android/internal/telephony/IWapPushManager.aidl b/telephony/java/com/android/internal/telephony/IWapPushManager.aidl index d5ecb940c8d1..1c3df65336f8 100644 --- a/telephony/java/com/android/internal/telephony/IWapPushManager.aidl +++ b/telephony/java/com/android/internal/telephony/IWapPushManager.aidl @@ -30,6 +30,7 @@ interface IWapPushManager { * Returns true if inserting the information is successfull. Inserting the duplicated * record in the application ID table is not allowed. Use update/delete method. */ + @UnsupportedAppUsage boolean addPackage(String x_app_id, String content_type, String package_name, String class_name, int app_type, boolean need_signature, boolean further_processing); @@ -38,6 +39,7 @@ interface IWapPushManager { * Updates receiver application that is last added. * Returns true if updating the information is successfull. */ + @UnsupportedAppUsage boolean updatePackage(String x_app_id, String content_type, String package_name, String class_name, int app_type, boolean need_signature, boolean further_processing); @@ -46,6 +48,7 @@ interface IWapPushManager { * Delites receiver application information. * Returns true if deleting is successfull. */ + @UnsupportedAppUsage boolean deletePackage(String x_app_id, String content_type, String package_name, String class_name); } diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 77b797956cf5..5205973669ac 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -470,6 +470,7 @@ public interface RILConstants { int RIL_REQUEST_START_KEEPALIVE = 144; int RIL_REQUEST_STOP_KEEPALIVE = 145; int RIL_REQUEST_ENABLE_MODEM = 146; + int RIL_REQUEST_GET_MODEM_STATUS = 147; /* The following requests are not defined in RIL.h */ int RIL_REQUEST_HAL_NON_RIL_BASE = 200; diff --git a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java index 8ef15d869a0b..4f9aeea5bdb4 100644 --- a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java +++ b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/server/pm/dex/DynamicCodeLoggerIntegrationTests.java @@ -235,6 +235,34 @@ public final class DynamicCodeLoggerIntegrationTests { } @Test + public void testGeneratesEvents_spoofed_validFile_untrustedApp() throws Exception { + File privateCopyFile = privateFile("spoofed2"); + + String expectedContentHash = copyAndHashResource( + "/DynamicCodeLoggerNativeExecutable", privateCopyFile); + + EventLog.writeEvent(EventLog.getTagCode("auditd"), + "type=1400 avc: granted { execute_no_trans } " + + "path=\"" + privateCopyFile + "\" " + + "scontext=u:r:untrusted_app: " + + "tcontext=u:object_r:app_data_file: " + + "tclass=file "); + + String expectedNameHash = + "3E57AA59249154C391316FDCF07C1D499C26A564E4D305833CCD9A98ED895AC9"; + + // Run the job to scan generated audit log entries + runDynamicCodeLoggingJob(AUDIT_WATCHING_JOB_ID); + + // And then make sure we log events about it + long previousEventNanos = mostRecentEventTimeNanos(); + runDynamicCodeLoggingJob(IDLE_LOGGING_JOB_ID); + + assertDclLoggedSince(previousEventNanos, DCL_NATIVE_SUBTAG, + expectedNameHash, expectedContentHash); + } + + @Test public void testGeneratesEvents_spoofed_pathTraversal() throws Exception { File privateDir = privateFile("x").getParentFile(); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java index 316aad343d19..818d899413de 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/PositionListenerActivity.java @@ -53,7 +53,7 @@ public class PositionListenerActivity extends Activity { MyPositionReporter(Context c) { super(c); mNode = new RenderNode("positionListener"); - mNode.requestPositionUpdates(this); + mNode.addPositionUpdateListener(this); setTextAlignment(TEXT_ALIGNMENT_VIEW_START); } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index ed524f61e3bc..1a0e8fa490b3 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -17,10 +17,10 @@ package com.android.server; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; +import static android.net.ConnectivityManager.NETID_UNSET; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; -import static android.net.ConnectivityManager.NETID_UNSET; import static android.net.ConnectivityManager.TYPE_ETHERNET; import static android.net.ConnectivityManager.TYPE_MOBILE; import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA; @@ -125,6 +125,7 @@ import android.net.NetworkParcelable; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkStackClient; +import android.net.NetworkState; import android.net.NetworkUtils; import android.net.ProxyInfo; import android.net.RouteInfo; @@ -157,6 +158,7 @@ import android.util.Log; import android.util.SparseArray; import com.android.internal.net.VpnConfig; +import com.android.internal.net.VpnInfo; import com.android.internal.util.ArrayUtils; import com.android.internal.util.WakeupMessage; import com.android.internal.util.test.BroadcastInterceptingContext; @@ -1828,6 +1830,12 @@ public class ConnectivityServiceTest { fn.test((NetworkCapabilities) cbi.arg)); } + void expectLinkPropertiesLike(Predicate<LinkProperties> fn, MockNetworkAgent agent) { + CallbackInfo cbi = expectCallback(CallbackState.LINK_PROPERTIES, agent); + assertTrue("Received LinkProperties don't match expectations : " + cbi.arg, + fn.test((LinkProperties) cbi.arg)); + } + void expectBlockedStatusCallback(boolean expectBlocked, MockNetworkAgent agent) { CallbackInfo cbi = expectCallback(CallbackState.BLOCKED_STATUS, agent); boolean actualBlocked = (boolean) cbi.arg; @@ -4356,48 +4364,91 @@ public class ConnectivityServiceTest { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - Network[] onlyCell = new Network[]{mCellNetworkAgent.getNetwork()}; - Network[] onlyWifi = new Network[]{mWiFiNetworkAgent.getNetwork()}; + Network[] onlyCell = new Network[] {mCellNetworkAgent.getNetwork()}; + Network[] onlyWifi = new Network[] {mWiFiNetworkAgent.getNetwork()}; + + LinkProperties cellLp = new LinkProperties(); + cellLp.setInterfaceName(MOBILE_IFNAME); + LinkProperties wifiLp = new LinkProperties(); + wifiLp.setInterfaceName(WIFI_IFNAME); // Simple connection should have updated ifaces mCellNetworkAgent.connect(false); + mCellNetworkAgent.sendLinkProperties(cellLp); waitForIdle(); - verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell); + verify(mStatsService, atLeastOnce()) + .forceUpdateIfaces( + eq(onlyCell), + eq(new VpnInfo[0]), + any(NetworkState[].class), + eq(MOBILE_IFNAME)); reset(mStatsService); // Default network switch should update ifaces. mWiFiNetworkAgent.connect(false); + mWiFiNetworkAgent.sendLinkProperties(wifiLp); waitForIdle(); - verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyWifi); + assertEquals(wifiLp, mService.getActiveLinkProperties()); + verify(mStatsService, atLeastOnce()) + .forceUpdateIfaces( + eq(onlyWifi), + eq(new VpnInfo[0]), + any(NetworkState[].class), + eq(WIFI_IFNAME)); reset(mStatsService); // Disconnect should update ifaces. mWiFiNetworkAgent.disconnect(); waitForIdle(); - verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell); + verify(mStatsService, atLeastOnce()) + .forceUpdateIfaces( + eq(onlyCell), + eq(new VpnInfo[0]), + any(NetworkState[].class), + eq(MOBILE_IFNAME)); reset(mStatsService); // Metered change should update ifaces mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); waitForIdle(); - verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell); + verify(mStatsService, atLeastOnce()) + .forceUpdateIfaces( + eq(onlyCell), + eq(new VpnInfo[0]), + any(NetworkState[].class), + eq(MOBILE_IFNAME)); reset(mStatsService); mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); waitForIdle(); - verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell); + verify(mStatsService, atLeastOnce()) + .forceUpdateIfaces( + eq(onlyCell), + eq(new VpnInfo[0]), + any(NetworkState[].class), + eq(MOBILE_IFNAME)); reset(mStatsService); // Captive portal change shouldn't update ifaces mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL); waitForIdle(); - verify(mStatsService, never()).forceUpdateIfaces(onlyCell); + verify(mStatsService, never()) + .forceUpdateIfaces( + eq(onlyCell), + eq(new VpnInfo[0]), + any(NetworkState[].class), + eq(MOBILE_IFNAME)); reset(mStatsService); // Roaming change should update ifaces mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); waitForIdle(); - verify(mStatsService, atLeastOnce()).forceUpdateIfaces(onlyCell); + verify(mStatsService, atLeastOnce()) + .forceUpdateIfaces( + eq(onlyCell), + eq(new VpnInfo[0]), + any(NetworkState[].class), + eq(MOBILE_IFNAME)); reset(mStatsService); } @@ -5176,6 +5227,9 @@ public class ConnectivityServiceTest { public void testStackedLinkProperties() throws UnknownHostException, RemoteException { final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24"); final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64"); + final String kNat64PrefixString = "2001:db8:64:64:64:64::"; + final IpPrefix kNat64Prefix = new IpPrefix(InetAddress.getByName(kNat64PrefixString), 96); + final NetworkRequest networkRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_CELLULAR) .addCapability(NET_CAPABILITY_INTERNET) @@ -5183,8 +5237,9 @@ public class ConnectivityServiceTest { final TestNetworkCallback networkCallback = new TestNetworkCallback(); mCm.registerNetworkCallback(networkRequest, networkCallback); - // Prepare ipv6 only link properties and connect. + // Prepare ipv6 only link properties. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + final int cellNetId = mCellNetworkAgent.getNetwork().netId; final LinkProperties cellLp = new LinkProperties(); cellLp.setInterfaceName(MOBILE_IFNAME); cellLp.addLinkAddress(myIpv6); @@ -5194,15 +5249,44 @@ public class ConnectivityServiceTest { when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME)) .thenReturn(getClatInterfaceConfig(myIpv4)); - // Connect with ipv6 link properties, then expect clat setup ipv4 and update link - // properties properly. + // Connect with ipv6 link properties. Expect prefix discovery to be started. mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.connect(true); networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); - verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME); - Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent); + verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId); + + // Switching default network updates TCP buffer sizes. + verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES); - // Clat iface up, expect stack link updated. + // Add an IPv4 address. Expect prefix discovery to be stopped. Netd doesn't tell us that + // the NAT64 prefix was removed because one was never discovered. + cellLp.addLinkAddress(myIpv4); + mCellNetworkAgent.sendLinkProperties(cellLp); + networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId); + + verifyNoMoreInteractions(mMockNetd); + reset(mMockNetd); + + // Remove IPv4 address. Expect prefix discovery to be started again. + cellLp.removeLinkAddress(myIpv4); + cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); + mCellNetworkAgent.sendLinkProperties(cellLp); + networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId); + + // When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started. + Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent); + assertNull(mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getNat64Prefix()); + mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, + kNat64PrefixString, 96); + LinkProperties lpBeforeClat = (LinkProperties) networkCallback.expectCallback( + CallbackState.LINK_PROPERTIES, mCellNetworkAgent).arg; + assertEquals(0, lpBeforeClat.getStackedLinks().size()); + assertEquals(kNat64Prefix, lpBeforeClat.getNat64Prefix()); + verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString()); + + // Clat iface comes up. Expect stacked link to be added. clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); List<LinkProperties> stackedLps = mCm.getLinkProperties(mCellNetworkAgent.getNetwork()) @@ -5219,20 +5303,66 @@ public class ConnectivityServiceTest { assertNotEquals(stackedLpsAfterChange, Collections.EMPTY_LIST); assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0)); - // Add ipv4 address, expect stacked linkproperties be cleaned up + // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked + // linkproperties are cleaned up. cellLp.addLinkAddress(myIpv4); cellLp.addRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); mCellNetworkAgent.sendLinkProperties(cellLp); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); + verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId); - // Clat iface removed, expect linkproperties revert to original one - clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME); + // As soon as stop is called, the linkproperties lose the stacked interface. networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); LinkProperties actualLpAfterIpv4 = mCm.getLinkProperties(mCellNetworkAgent.getNetwork()); - assertEquals(cellLp, actualLpAfterIpv4); + LinkProperties expected = new LinkProperties(cellLp); + expected.setNat64Prefix(kNat64Prefix); + assertEquals(expected, actualLpAfterIpv4); + assertEquals(0, actualLpAfterIpv4.getStackedLinks().size()); - // Clean up + // The interface removed callback happens but has no effect after stop is called. + clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME); + networkCallback.assertNoCallback(); + + verifyNoMoreInteractions(mMockNetd); + reset(mMockNetd); + + // Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone. + mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, + kNat64PrefixString, 96); + networkCallback.expectLinkPropertiesLike((lp) -> lp.getNat64Prefix() == null, + mCellNetworkAgent); + + // Remove IPv4 address and expect prefix discovery and clatd to be started again. + cellLp.removeLinkAddress(myIpv4); + cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); + cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8")); + mCellNetworkAgent.sendLinkProperties(cellLp); + networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId); + mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, + kNat64PrefixString, 96); + networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString()); + + + // Clat iface comes up. Expect stacked link to be added. + clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true); + networkCallback.expectLinkPropertiesLike( + (lp) -> lp.getStackedLinks().size() == 1 && lp.getNat64Prefix() != null, + mCellNetworkAgent); + + // NAT64 prefix is removed. Expect that clat is stopped. + mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, + kNat64PrefixString, 96); + networkCallback.expectLinkPropertiesLike( + (lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null, + mCellNetworkAgent); + verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); + networkCallback.expectLinkPropertiesLike((lp) -> lp.getStackedLinks().size() == 0, + mCellNetworkAgent); + + // Clean up. mCellNetworkAgent.disconnect(); networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); networkCallback.assertNoCallback(); @@ -5313,30 +5443,34 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(networkCallback); } - private static final String TEST_TCP_BUFFER_SIZES = "1,2,3,4,5,6"; - - private void verifyTcpBufferSizeChange(String tcpBufferSizes) throws Exception { + private void verifyTcpBufferSizeChange(String tcpBufferSizes) { String[] values = tcpBufferSizes.split(","); String rmemValues = String.join(" ", values[0], values[1], values[2]); String wmemValues = String.join(" ", values[3], values[4], values[5]); waitForIdle(); - verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues); + try { + verify(mMockNetd, atLeastOnce()).setTcpRWmemorySize(rmemValues, wmemValues); + } catch (RemoteException e) { + fail("mMockNetd should never throw RemoteException"); + } reset(mMockNetd); } @Test - public void testTcpBufferReset() throws Exception { + public void testTcpBufferReset() { + final String testTcpBufferSizes = "1,2,3,4,5,6"; + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); reset(mMockNetd); - // Simple connection should have updated tcp buffer size. + // Switching default network updates TCP buffer sizes. mCellNetworkAgent.connect(false); verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES); // Change link Properties should have updated tcp buffer size. LinkProperties lp = new LinkProperties(); - lp.setTcpBufferSizes(TEST_TCP_BUFFER_SIZES); + lp.setTcpBufferSizes(testTcpBufferSizes); mCellNetworkAgent.sendLinkProperties(lp); - verifyTcpBufferSizeChange(TEST_TCP_BUFFER_SIZES); + verifyTcpBufferSizeChange(testTcpBufferSizes); } @Test diff --git a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java index 07b1d057c882..37c0df80f3e3 100644 --- a/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java +++ b/tests/net/java/com/android/server/connectivity/Nat464XlatTest.java @@ -16,9 +16,11 @@ package com.android.server.connectivity; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -27,6 +29,7 @@ import static org.mockito.Mockito.when; import android.net.ConnectivityManager; import android.net.INetd; import android.net.InterfaceConfiguration; +import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkInfo; @@ -43,6 +46,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -53,6 +57,8 @@ public class Nat464XlatTest { static final String BASE_IFACE = "test0"; static final String STACKED_IFACE = "v4-test0"; static final LinkAddress ADDR = new LinkAddress("192.0.2.5/29"); + static final String NAT64_PREFIX = "64:ff9b::/96"; + static final int NETID = 42; @Mock ConnectivityService mConnectivity; @Mock NetworkMisc mMisc; @@ -65,7 +71,11 @@ public class Nat464XlatTest { Handler mHandler; Nat464Xlat makeNat464Xlat() { - return new Nat464Xlat(mNai, mNetd, mNms); + return new Nat464Xlat(mNai, mNetd, mNms) { + @Override protected int getNetId() { + return NETID; + } + }; } @Before @@ -87,6 +97,24 @@ public class Nat464XlatTest { when(mConfig.getLinkAddress()).thenReturn(ADDR); } + private void assertRequiresClat(boolean expected, NetworkAgentInfo nai) { + String msg = String.format("requiresClat expected %b for type=%d state=%s skip=%b " + + "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(), + nai.networkInfo.getDetailedState(), + mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(), + nai.linkProperties.getLinkAddresses()); + assertEquals(msg, expected, Nat464Xlat.requiresClat(nai)); + } + + private void assertShouldStartClat(boolean expected, NetworkAgentInfo nai) { + String msg = String.format("shouldStartClat expected %b for type=%d state=%s skip=%b " + + "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(), + nai.networkInfo.getDetailedState(), + mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(), + nai.linkProperties.getLinkAddresses()); + assertEquals(msg, expected, Nat464Xlat.shouldStartClat(nai)); + } + @Test public void testRequiresClat() throws Exception { final int[] supportedTypes = { @@ -102,20 +130,45 @@ public class Nat464XlatTest { NetworkInfo.DetailedState.SUSPENDED, }; + LinkProperties oldLp = new LinkProperties(mNai.linkProperties); for (int type : supportedTypes) { mNai.networkInfo.setType(type); for (NetworkInfo.DetailedState state : supportedDetailedStates) { mNai.networkInfo.setDetailedState(state, "reason", "extraInfo"); - String msg = String.format("requiresClat expected for type=%d state=%s", - type, state); + + mNai.linkProperties.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96")); + assertRequiresClat(false, mNai); + assertShouldStartClat(false, mNai); + + mNai.linkProperties.addLinkAddress(new LinkAddress("fc00::1/64")); + assertRequiresClat(false, mNai); + assertShouldStartClat(false, mNai); + + mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64")); + assertRequiresClat(true, mNai); + assertShouldStartClat(true, mNai); mMisc.skip464xlat = true; - String errorMsg = msg + String.format(" skip464xlat=%b", mMisc.skip464xlat); - assertFalse(errorMsg, Nat464Xlat.requiresClat(mNai)); + assertRequiresClat(false, mNai); + assertShouldStartClat(false, mNai); mMisc.skip464xlat = false; - errorMsg = msg + String.format(" skip464xlat=%b", mMisc.skip464xlat); - assertTrue(errorMsg, Nat464Xlat.requiresClat(mNai)); + assertRequiresClat(true, mNai); + assertShouldStartClat(true, mNai); + + mNai.linkProperties.addLinkAddress(new LinkAddress("192.0.2.2/24")); + assertRequiresClat(false, mNai); + assertShouldStartClat(false, mNai); + + mNai.linkProperties.removeLinkAddress(new LinkAddress("192.0.2.2/24")); + assertRequiresClat(true, mNai); + assertShouldStartClat(true, mNai); + + mNai.linkProperties.setNat64Prefix(null); + assertRequiresClat(true, mNai); + assertShouldStartClat(false, mNai); + + mNai.linkProperties = new LinkProperties(oldLp); } } } @@ -125,11 +178,13 @@ public class Nat464XlatTest { Nat464Xlat nat = makeNat464Xlat(); ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class); - // ConnectivityService starts clat. + nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX)); + + // Start clat. nat.start(); verify(mNms).registerObserver(eq(nat)); - verify(mNetd).clatdStart(eq(BASE_IFACE)); + verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX)); // Stacked interface up notification arrives. nat.interfaceLinkStateChanged(STACKED_IFACE, true); @@ -141,22 +196,109 @@ public class Nat464XlatTest { assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); assertRunning(nat); - // ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...). + // Stop clat (Network disconnects, IPv4 addr appears, ...). nat.stop(); verify(mNetd).clatdStop(eq(BASE_IFACE)); + verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture()); + verify(mNms).unregisterObserver(eq(nat)); + assertTrue(c.getValue().getStackedLinks().isEmpty()); + assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); + verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); + assertIdle(nat); - // Stacked interface removed notification arrives. + // Stacked interface removed notification arrives and is ignored. nat.interfaceRemoved(STACKED_IFACE); mLooper.dispatchNext(); - verify(mNms).unregisterObserver(eq(nat)); - verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture()); + verifyNoMoreInteractions(mNetd, mNms, mConnectivity); + } + + private void checkStartStopStart(boolean interfaceRemovedFirst) throws Exception { + Nat464Xlat nat = makeNat464Xlat(); + ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class); + InOrder inOrder = inOrder(mNetd, mConnectivity); + + nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX)); + + nat.start(); + + inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX)); + + // Stacked interface up notification arrives. + nat.interfaceLinkStateChanged(STACKED_IFACE, true); + mLooper.dispatchNext(); + + inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture()); + assertFalse(c.getValue().getStackedLinks().isEmpty()); + assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); + assertRunning(nat); + + // ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...). + nat.stop(); + + inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE)); + + inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture()); assertTrue(c.getValue().getStackedLinks().isEmpty()); assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); assertIdle(nat); - verifyNoMoreInteractions(mNetd, mNms, mConnectivity); + if (interfaceRemovedFirst) { + // Stacked interface removed notification arrives and is ignored. + nat.interfaceRemoved(STACKED_IFACE); + mLooper.dispatchNext(); + nat.interfaceLinkStateChanged(STACKED_IFACE, false); + mLooper.dispatchNext(); + } + + assertTrue(c.getValue().getStackedLinks().isEmpty()); + assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); + assertIdle(nat); + inOrder.verifyNoMoreInteractions(); + + nat.start(); + + inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX)); + + if (!interfaceRemovedFirst) { + // Stacked interface removed notification arrives and is ignored. + nat.interfaceRemoved(STACKED_IFACE); + mLooper.dispatchNext(); + nat.interfaceLinkStateChanged(STACKED_IFACE, false); + mLooper.dispatchNext(); + } + + // Stacked interface up notification arrives. + nat.interfaceLinkStateChanged(STACKED_IFACE, true); + mLooper.dispatchNext(); + + inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture()); + assertFalse(c.getValue().getStackedLinks().isEmpty()); + assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); + assertRunning(nat); + + // ConnectivityService stops clat again. + nat.stop(); + + inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE)); + + inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture()); + assertTrue(c.getValue().getStackedLinks().isEmpty()); + assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); + assertIdle(nat); + + inOrder.verifyNoMoreInteractions(); + } + + @Test + public void testStartStopStart() throws Exception { + checkStartStopStart(true); + } + + @Test + public void testStartStopStartBeforeInterfaceRemoved() throws Exception { + checkStartStopStart(false); } @Test @@ -164,11 +306,12 @@ public class Nat464XlatTest { Nat464Xlat nat = makeNat464Xlat(); ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class); - // ConnectivityService starts clat. + nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX)); + nat.start(); verify(mNms).registerObserver(eq(nat)); - verify(mNetd).clatdStart(eq(BASE_IFACE)); + verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX)); // Stacked interface up notification arrives. nat.interfaceLinkStateChanged(STACKED_IFACE, true); @@ -184,9 +327,10 @@ public class Nat464XlatTest { nat.interfaceRemoved(STACKED_IFACE); mLooper.dispatchNext(); - verify(mNms).unregisterObserver(eq(nat)); verify(mNetd).clatdStop(eq(BASE_IFACE)); verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture()); + verify(mNms).unregisterObserver(eq(nat)); + verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); assertTrue(c.getValue().getStackedLinks().isEmpty()); assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); assertIdle(nat); @@ -201,24 +345,25 @@ public class Nat464XlatTest { public void testStopBeforeClatdStarts() throws Exception { Nat464Xlat nat = makeNat464Xlat(); - // ConnectivityService starts clat. + nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX)); + nat.start(); verify(mNms).registerObserver(eq(nat)); - verify(mNetd).clatdStart(eq(BASE_IFACE)); + verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX)); // ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...) nat.stop(); - verify(mNms).unregisterObserver(eq(nat)); verify(mNetd).clatdStop(eq(BASE_IFACE)); + verify(mNms).unregisterObserver(eq(nat)); + verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); assertIdle(nat); // In-flight interface up notification arrives: no-op nat.interfaceLinkStateChanged(STACKED_IFACE, true); mLooper.dispatchNext(); - // Interface removed notification arrives after stopClatd() takes effect: no-op. nat.interfaceRemoved(STACKED_IFACE); mLooper.dispatchNext(); @@ -232,17 +377,19 @@ public class Nat464XlatTest { public void testStopAndClatdNeverStarts() throws Exception { Nat464Xlat nat = makeNat464Xlat(); - // ConnectivityService starts clat. + nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX)); + nat.start(); verify(mNms).registerObserver(eq(nat)); - verify(mNetd).clatdStart(eq(BASE_IFACE)); + verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX)); // ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...) nat.stop(); - verify(mNms).unregisterObserver(eq(nat)); verify(mNetd).clatdStop(eq(BASE_IFACE)); + verify(mNms).unregisterObserver(eq(nat)); + verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); assertIdle(nat); verifyNoMoreInteractions(mNetd, mNms, mConnectivity); diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index f89f303a1345..d91d3eb10f87 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -70,7 +70,6 @@ import android.app.usage.NetworkStatsManager; import android.content.Context; import android.content.Intent; import android.net.DataUsageRequest; -import android.net.IConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.INetworkStatsSession; import android.net.LinkProperties; @@ -163,7 +162,6 @@ public class NetworkStatsServiceTest { private @Mock INetworkManagementService mNetManager; private @Mock NetworkStatsSettings mSettings; - private @Mock IConnectivityManager mConnManager; private @Mock IBinder mBinder; private @Mock AlarmManager mAlarmManager; private HandlerThread mHandlerThread; @@ -205,7 +203,6 @@ public class NetworkStatsServiceTest { Handler.Callback callback = new NetworkStatsService.HandlerCallback(mService); mHandler = new Handler(mHandlerThread.getLooper(), callback); mService.setHandler(mHandler, callback); - mService.bindConnectivityManager(mConnManager); mElapsedRealtime = 0L; @@ -234,7 +231,6 @@ public class NetworkStatsServiceTest { mNetManager = null; mSettings = null; - mConnManager = null; mSession.close(); mService = null; @@ -245,12 +241,12 @@ public class NetworkStatsServiceTest { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. expectDefaultSettings(); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); @@ -289,12 +285,12 @@ public class NetworkStatsServiceTest { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. expectDefaultSettings(); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); @@ -363,12 +359,12 @@ public class NetworkStatsServiceTest { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // modify some number on wifi, and trigger poll event @@ -405,12 +401,12 @@ public class NetworkStatsServiceTest { public void testUidStatsAcrossNetworks() throws Exception { // pretend first mobile network comes online expectDefaultSettings(); - expectNetworkState(buildMobile3gState(IMSI_1)); + NetworkState[] states = new NetworkState[] {buildMobile3gState(IMSI_1)}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE); + mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); // create some traffic on first network @@ -437,7 +433,7 @@ public class NetworkStatsServiceTest { // disappearing, to verify we don't count backwards. incrementCurrentTime(HOUR_IN_MILLIS); expectDefaultSettings(); - expectNetworkState(buildMobile3gState(IMSI_2)); + states = new NetworkState[] {buildMobile3gState(IMSI_2)}; expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L)); expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) @@ -446,7 +442,7 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L)); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE); + mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); forcePollAndWaitForIdle(); @@ -481,12 +477,12 @@ public class NetworkStatsServiceTest { public void testUidRemovedIsMoved() throws Exception { // pretend that network comes online expectDefaultSettings(); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // create some traffic @@ -540,12 +536,12 @@ public class NetworkStatsServiceTest { public void testUid3g4gCombinedByTemplate() throws Exception { // pretend that network comes online expectDefaultSettings(); - expectNetworkState(buildMobile3gState(IMSI_1)); + NetworkState[] states = new NetworkState[] {buildMobile3gState(IMSI_1)}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE); + mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); // create some traffic @@ -566,14 +562,14 @@ public class NetworkStatsServiceTest { // now switch over to 4g network incrementCurrentTime(HOUR_IN_MILLIS); expectDefaultSettings(); - expectNetworkState(buildMobile4gState(TEST_IFACE2)); + states = new NetworkState[] {buildMobile4gState(TEST_IFACE2)}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE); + mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); forcePollAndWaitForIdle(); @@ -598,12 +594,12 @@ public class NetworkStatsServiceTest { public void testSummaryForAllUid() throws Exception { // pretend that network comes online expectDefaultSettings(); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // create some traffic for two apps @@ -657,12 +653,12 @@ public class NetworkStatsServiceTest { public void testDetailedUidStats() throws Exception { // pretend that network comes online expectDefaultSettings(); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); NetworkStats.Entry entry1 = new NetworkStats.Entry( TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L); @@ -700,13 +696,13 @@ public class NetworkStatsServiceTest { stackedProp.setInterfaceName(stackedIface); final NetworkState wifiState = buildWifiState(); wifiState.linkProperties.addStackedLink(stackedProp); - expectNetworkState(wifiState); + NetworkState[] states = new NetworkState[] {wifiState}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); NetworkStats.Entry uidStats = new NetworkStats.Entry( TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xF00D, 1024L, 8L, 512L, 4L, 0L); @@ -745,12 +741,12 @@ public class NetworkStatsServiceTest { public void testForegroundBackground() throws Exception { // pretend that network comes online expectDefaultSettings(); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // create some initial traffic @@ -803,12 +799,12 @@ public class NetworkStatsServiceTest { public void testMetered() throws Exception { // pretend that network comes online expectDefaultSettings(); - expectNetworkState(buildWifiState(true /* isMetered */)); + NetworkState[] states = new NetworkState[] {buildWifiState(true /* isMetered */)}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // create some initial traffic @@ -843,12 +839,13 @@ public class NetworkStatsServiceTest { public void testRoaming() throws Exception { // pretend that network comes online expectDefaultSettings(); - expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */)); + NetworkState[] states = + new NetworkState[] {buildMobile3gState(IMSI_1, true /* isRoaming */)}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE); + mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); // Create some traffic @@ -882,12 +879,12 @@ public class NetworkStatsServiceTest { public void testTethering() throws Exception { // pretend first mobile network comes online expectDefaultSettings(); - expectNetworkState(buildMobile3gState(IMSI_1)); + NetworkState[] states = new NetworkState[] {buildMobile3gState(IMSI_1)}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE); + mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); // create some tethering traffic @@ -925,12 +922,12 @@ public class NetworkStatsServiceTest { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. expectDefaultSettings(); - expectNetworkState(buildWifiState()); + NetworkState[] states = new NetworkState[] {buildWifiState()}; expectNetworkStatsSummary(buildEmptyStats()); expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI); + mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); @@ -1077,11 +1074,11 @@ public class NetworkStatsServiceTest { expectBandwidthControlCheck(); } - private void expectNetworkState(NetworkState... state) throws Exception { - when(mConnManager.getAllNetworkState()).thenReturn(state); - - final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null; - when(mConnManager.getActiveLinkProperties()).thenReturn(linkProp); + private String getActiveIface(NetworkState... states) throws Exception { + if (states == null || states.length == 0 || states[0].linkProperties == null) { + return null; + } + return states[0].linkProperties.getInterfaceName(); } private void expectNetworkStatsSummary(NetworkStats summary) throws Exception { @@ -1090,8 +1087,6 @@ public class NetworkStatsServiceTest { private void expectNetworkStatsSummary(NetworkStats summary, NetworkStats tetherStats) throws Exception { - when(mConnManager.getAllVpnInfo()).thenReturn(new VpnInfo[0]); - expectNetworkStatsTethering(STATS_PER_IFACE, tetherStats); expectNetworkStatsSummaryDev(summary.clone()); expectNetworkStatsSummaryXt(summary.clone()); diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py index 4c02d94542d0..295e3de544ee 100644 --- a/tools/apilint/apilint.py +++ b/tools/apilint/apilint.py @@ -79,6 +79,7 @@ class Field(): self.value = raw[3].strip(';"') else: self.value = None + self.annotations = [] self.ident = "-".join((self.typ, self.name, self.value or "")) @@ -88,6 +89,18 @@ class Field(): def __repr__(self): return self.raw + +class Argument(object): + + __slots__ = ["type", "annotations", "name", "default"] + + def __init__(self, type): + self.type = type + self.annotations = [] + self.name = None + self.default = None + + class Method(): def __init__(self, clazz, line, raw, blame, sig_format = 1): self.clazz = clazz @@ -118,21 +131,24 @@ class Method(): self.name = raw[1] # parse args - self.args = [] + self.detailed_args = [] for arg in re.split(",\s*", raw_args): arg = re.split("\s", arg) # ignore annotations for now arg = [ a for a in arg if not a.startswith("@") ] if len(arg[0]) > 0: - self.args.append(arg[0]) + self.detailed_args.append(Argument(arg[0])) # parse throws self.throws = [] for throw in re.split(",\s*", raw_throws): self.throws.append(throw) + + self.annotations = [] else: raise ValueError("Unknown signature format: " + sig_format) + self.args = map(lambda a: a.type, self.detailed_args) self.ident = "-".join((self.typ, self.name, "-".join(self.args))) def sig_matches(self, typ, name, args): @@ -312,10 +328,10 @@ class V2LineParser(object): method.split = [] kind = self.parse_one_of("ctor", "method") method.split.append(kind) - annotations = self.parse_annotations() + method.annotations = self.parse_annotations() method.split.extend(self.parse_modifiers()) self.parse_matching_paren("<", ">") - if "@Deprecated" in annotations: + if "@Deprecated" in method.annotations: method.split.append("deprecated") if kind == "ctor": method.typ = "ctor" @@ -325,7 +341,7 @@ class V2LineParser(object): method.name = self.parse_name() method.split.append(method.name) self.parse_token("(") - method.args = self.parse_args() + method.detailed_args = self.parse_args() self.parse_token(")") method.throws = self.parse_throws() if "@interface" in method.clazz.split: @@ -360,8 +376,8 @@ class V2LineParser(object): def parse_into_field(self, field): kind = self.parse_one_of(*V2LineParser.FIELD_KINDS) field.split = [kind] - annotations = self.parse_annotations() - if "@Deprecated" in annotations: + field.annotations = self.parse_annotations() + if "@Deprecated" in field.annotations: field.split.append("deprecated") field.split.extend(self.parse_modifiers()) field.typ = self.parse_type() @@ -488,15 +504,16 @@ class V2LineParser(object): def parse_arg(self): self.parse_if("vararg") # kotlin vararg - self.parse_annotations() - type = self.parse_arg_type() + annotations = self.parse_annotations() + arg = Argument(self.parse_arg_type()) + arg.annotations = annotations l = self.lookahead() if l != "," and l != ")": if self.lookahead() != '=': - self.parse_token() # kotlin argument name + arg.name = self.parse_token() # kotlin argument name if self.parse_if('='): # kotlin default value - self.parse_expression() - return type + arg.default = self.parse_expression() + return arg def parse_expression(self): while not self.lookahead() in [')', ',', ';']: @@ -593,7 +610,7 @@ def _parse_stream_to_generator(f): blame = None sig_format = 1 - re_blame = re.compile("^([a-z0-9]{7,}) \(<([^>]+)>.+?\) (.+?)$") + re_blame = re.compile(r"^(\^?[a-z0-9]{7,}) \(<([^>]+)>.+?\) (.+?)$") field_prefixes = map(lambda kind: " %s" % (kind,), V2LineParser.FIELD_KINDS) def startsWithFieldPrefix(raw): @@ -608,11 +625,13 @@ def _parse_stream_to_generator(f): match = re_blame.match(raw) if match is not None: blame = match.groups()[0:2] + if blame[0].startswith("^"): # Outside of blame range + blame = None raw = match.groups()[2] else: blame = None - if line == 1 and raw.startswith("// Signature format: "): + if line == 1 and V2Tokenizer.SIGNATURE_PREFIX in raw: sig_format_string = raw[len(V2Tokenizer.SIGNATURE_PREFIX):] if sig_format_string in ["2.0", "3.0"]: sig_format = 2 @@ -1109,6 +1128,9 @@ def verify_builder(clazz): if not has_build: warn(clazz, None, None, "Missing build() method") + if "final" not in clazz.split: + error(clazz, None, None, "Builder should be final") + def verify_aidl(clazz): """Catch people exposing raw AIDL.""" @@ -1868,6 +1890,35 @@ def verify_numbers(clazz): if arg in discouraged: warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead") +PRIMITIVES = {"void", "int", "float", "boolean", "short", "char", "byte", "long", "double"} + +def verify_nullability(clazz): + """Catches missing nullability annotations""" + + for f in clazz.fields: + if f.value is not None and 'static' in f.split and 'final' in f.split: + continue # Nullability of constants can be inferred. + if f.typ not in PRIMITIVES and not has_nullability(f.annotations): + error(clazz, f, "M12", "Field must be marked either @NonNull or @Nullable") + + for c in clazz.ctors: + verify_nullability_args(clazz, c) + + for m in clazz.methods: + if m.name == "writeToParcel" or m.name == "onReceive": + continue # Parcelable.writeToParcel() and BroadcastReceiver.onReceive() are not yet annotated + + if m.typ not in PRIMITIVES and not has_nullability(m.annotations): + error(clazz, m, "M12", "Return value must be marked either @NonNull or @Nullable") + verify_nullability_args(clazz, m) + +def verify_nullability_args(clazz, m): + for i, arg in enumerate(m.detailed_args): + if arg.type not in PRIMITIVES and not has_nullability(arg.annotations): + error(clazz, m, "M12", "Argument %d must be marked either @NonNull or @Nullable" % (i+1,)) + +def has_nullability(annotations): + return "@NonNull" in annotations or "@Nullable" in annotations def verify_singleton(clazz): """Catch singleton objects with constructors.""" @@ -1956,6 +2007,7 @@ def examine_clazz(clazz): verify_pfd(clazz) verify_numbers(clazz) verify_singleton(clazz) + verify_nullability(clazz) def examine_stream(stream, base_stream=None, in_classes_with_base=[], out_classes_with_base=None): diff --git a/tools/apilint/apilint_test.py b/tools/apilint/apilint_test.py index c10ef15d02ad..f34492d644ce 100644 --- a/tools/apilint/apilint_test.py +++ b/tools/apilint/apilint_test.py @@ -88,20 +88,22 @@ class UtilTests(unittest.TestCase): faulty_current_txt = """ +// Signature format: 2.0 package android.app { public final class Activity { } public final class WallpaperColors implements android.os.Parcelable { - ctor public WallpaperColors(android.os.Parcel); + ctor public WallpaperColors(@NonNull android.os.Parcel); method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR; + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR; } } -""".split('\n') +""".strip().split('\n') ok_current_txt = """ +// Signature format: 2.0 package android.app { public final class Activity { } @@ -109,19 +111,20 @@ package android.app { public final class WallpaperColors implements android.os.Parcelable { ctor public WallpaperColors(); method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR; + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.app.WallpaperColors> CREATOR; } } -""".split('\n') +""".strip().split('\n') system_current_txt = """ +// Signature format: 2.0 package android.app { public final class WallpaperColors implements android.os.Parcelable { method public int getSomething(); } } -""".split('\n') +""".strip().split('\n') diff --git a/tools/bit/main.cpp b/tools/bit/main.cpp index 860094aef1f4..082ccf38299b 100644 --- a/tools/bit/main.cpp +++ b/tools/bit/main.cpp @@ -33,6 +33,8 @@ using namespace std; +#define NATIVE_TESTS "NATIVE_TESTS" + /** * An entry from the command line for something that will be built, installed, * and/or tested. @@ -132,6 +134,32 @@ InstallApk::InstallApk(const string& filename, bool always) { } +struct PushedFile +{ + TrackedFile file; + string dest; + + PushedFile(); + PushedFile(const PushedFile& that); + PushedFile(const string& filename, const string& dest); + ~PushedFile() {}; +}; + +PushedFile::PushedFile() +{ +} + +PushedFile::PushedFile(const PushedFile& that) + :file(that.file), + dest(that.dest) +{ +} + +PushedFile::PushedFile(const string& f, const string& d) + :file(f), + dest(d) +{ +} /** * Record for an test that is going to be launched. @@ -658,12 +686,14 @@ run_phases(vector<Target*> targets, const Options& options) } // Figure out whether we need to sync the system and which apks to install - string systemPath = buildOut + "/target/product/" + buildDevice + "/system/"; - string dataPath = buildOut + "/target/product/" + buildDevice + "/data/"; + string deviceTargetPath = buildOut + "/target/product/" + buildDevice; + string systemPath = deviceTargetPath + "/system/"; + string dataPath = deviceTargetPath + "/data/"; bool syncSystem = false; bool alwaysSyncSystem = false; vector<string> systemFiles; vector<InstallApk> installApks; + vector<PushedFile> pushedFiles; for (size_t i=0; i<targets.size(); i++) { Target* target = targets[i]; if (target->install) { @@ -687,6 +717,11 @@ run_phases(vector<Target*> targets, const Options& options) installApks.push_back(InstallApk(file, !target->build)); continue; } + // If it's a native test module, push it. + if (target->module.HasClass(NATIVE_TESTS) && starts_with(file, dataPath)) { + string installedPath(file.c_str() + deviceTargetPath.length()); + pushedFiles.push_back(PushedFile(file, installedPath)); + } } } } @@ -701,6 +736,13 @@ run_phases(vector<Target*> targets, const Options& options) printf(" %s\n", systemFiles[i].c_str()); } } + if (pushedFiles.size() > 0){ + print_info("Files to push:"); + for (size_t i=0; i<pushedFiles.size(); i++) { + printf(" %s\n", pushedFiles[i].file.filename.c_str()); + printf(" --> %s\n", pushedFiles[i].dest.c_str()); + } + } if (installApks.size() > 0){ print_info("APKs to install:"); for (size_t i=0; i<installApks.size(); i++) { @@ -784,6 +826,25 @@ run_phases(vector<Target*> targets, const Options& options) } } + // Push files + if (pushedFiles.size() > 0) { + print_status("Pushing files"); + for (size_t i=0; i<pushedFiles.size(); i++) { + const PushedFile& pushed = pushedFiles[i]; + string dir = dirname(pushed.dest); + if (dir.length() == 0 || dir == "/") { + // This isn't really a file inside the data directory. Just skip it. + continue; + } + // TODO: if (!apk.file.fileInfo.exists || apk.file.HasChanged()) + err = run_adb("shell", "mkdir", "-p", dir.c_str(), NULL); + check_error(err); + err = run_adb("push", pushed.file.filename.c_str(), pushed.dest.c_str()); + check_error(err); + // pushed.installed = true; + } + } + // Install APKs if (installApks.size() > 0) { print_status("Installing APKs"); @@ -804,6 +865,74 @@ run_phases(vector<Target*> targets, const Options& options) // Actions // + // Whether there have been any tests run, so we can print a summary. + bool testsRun = false; + + // Run the native tests. + // TODO: We don't have a good way of running these and capturing the output of + // them live. It'll take some work. On the other hand, if they're gtest tests, + // the output of gtest is not completely insane like the text output of the + // instrumentation tests. So for now, we'll just live with that. + for (size_t i=0; i<targets.size(); i++) { + Target* target = targets[i]; + if (target->test && target->module.HasClass(NATIVE_TESTS)) { + // We don't have a clear signal from the build system which of the installed + // files is actually the test, so we guess by looking for one with the same + // leaf name as the module that is executable. + for (size_t j=0; j<target->module.installed.size(); j++) { + string filename = target->module.installed[j]; + if (!starts_with(filename, dataPath)) { + // Native tests go into the data directory. + continue; + } + if (leafname(filename) != target->module.name) { + // This isn't the test executable. + continue; + } + if (!is_executable(filename)) { + continue; + } + string installedPath(filename.c_str() + deviceTargetPath.length()); + printf("the magic one is: %s\n", filename.c_str()); + printf(" and it's installed at: %s\n", installedPath.c_str()); + + // Convert bit-style actions to gtest test filter arguments + if (target->actions.size() > 0) { + testsRun = true; + target->testActionCount++; + bool runAll = false; + string filterArg("--gtest_filter="); + for (size_t k=0; k<target->actions.size(); k++) { + string actionString = target->actions[k]; + if (actionString == "*") { + runAll = true; + } else { + filterArg += actionString; + if (k != target->actions.size()-1) { + // We would otherwise have to worry about this condition + // being true, and appending an extra ':', but we know that + // if the extra action is "*", then we'll just run all and + // won't use filterArg anyway, so just keep this condition + // simple. + filterArg += ':'; + } + } + } + if (runAll) { + err = run_adb("shell", installedPath.c_str(), NULL); + } else { + err = run_adb("shell", installedPath.c_str(), filterArg.c_str(), NULL); + } + if (err == 0) { + target->testPassCount++; + } else { + target->testFailCount++; + } + } + } + } + } + // Inspect the apks, and figure out what is an activity and what needs a test runner bool printedInspecting = false; vector<TestAction> testActions; @@ -872,6 +1001,7 @@ run_phases(vector<Target*> targets, const Options& options) TestResults testResults; if (testActions.size() > 0) { print_status("Running tests"); + testsRun = true; for (size_t i=0; i<testActions.size(); i++) { TestAction& action = testActions[i]; testResults.SetCurrentAction(&action); @@ -969,7 +1099,7 @@ run_phases(vector<Target*> targets, const Options& options) // Tests bool hasErrors = false; - if (testActions.size() > 0) { + if (testsRun) { printf("%sRan tests:%s\n", g_escapeBold, g_escapeEndColor); size_t maxNameLength = 0; for (size_t i=0; i<targets.size(); i++) { diff --git a/tools/bit/make.cpp b/tools/bit/make.cpp index 627091321b2e..df64a801e213 100644 --- a/tools/bit/make.cpp +++ b/tools/bit/make.cpp @@ -51,6 +51,18 @@ make_cache_filename(const string& outDir) return filename + "/.bit_cache"; } +bool +Module::HasClass(const string& cl) +{ + for (vector<string>::const_iterator c = classes.begin(); c != classes.end(); c++) { + if (*c == cl) { + return true; + } + } + return false; +} + + BuildVars::BuildVars(const string& outDir, const string& buildProduct, const string& buildVariant, const string& buildType) :m_filename(), diff --git a/tools/bit/make.h b/tools/bit/make.h index db0b69f88a0e..785912a6594d 100644 --- a/tools/bit/make.h +++ b/tools/bit/make.h @@ -29,6 +29,8 @@ struct Module vector<string> classes; vector<string> paths; vector<string> installed; + + bool HasClass(const string& cl); }; /** diff --git a/tools/bit/util.cpp b/tools/bit/util.cpp index a502a9dbe736..63399d69a166 100644 --- a/tools/bit/util.cpp +++ b/tools/bit/util.cpp @@ -254,4 +254,42 @@ read_file(const string& filename) return result; } +bool +is_executable(const string& filename) +{ + int err; + struct stat st; + + err = stat(filename.c_str(), &st); + if (err != 0) { + return false; + } + + return (st.st_mode & S_IXUSR) != 0; +} + +string +dirname(const string& filename) +{ + size_t slash = filename.rfind('/'); + if (slash == string::npos) { + return ""; + } else if (slash == 0) { + return "/"; + } else { + return string(filename, 0, slash); + } +} +string +leafname(const string& filename) +{ + size_t slash = filename.rfind('/'); + if (slash == string::npos) { + return filename; + } else if (slash == filename.length() - 1) { + return ""; + } else { + return string(filename, slash + 1); + } +} diff --git a/tools/bit/util.h b/tools/bit/util.h index 718f1474a969..7ccdab103d9a 100644 --- a/tools/bit/util.h +++ b/tools/bit/util.h @@ -79,5 +79,10 @@ void split_lines(vector<string>* result, const string& str); string read_file(const string& filename); +bool is_executable(const string& filename); + +string dirname(const string& filename); +string leafname(const string& filename); + #endif // UTIL_H diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index d5497990aefd..17948e7e1bc0 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -147,8 +147,10 @@ interface IWifiManager void stopWatchLocalOnlyHotspot(); + @UnsupportedAppUsage int getWifiApEnabledState(); + @UnsupportedAppUsage WifiConfiguration getWifiApConfiguration(); boolean setWifiApConfiguration(in WifiConfiguration wifiConfig, String packageName); @@ -173,6 +175,7 @@ interface IWifiManager void factoryReset(String packageName); + @UnsupportedAppUsage Network getCurrentNetwork(); byte[] retrieveBackupData(); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 6c645fc8ce5d..5ca30fcbf0db 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -4575,7 +4575,8 @@ public class WifiManager { public static final int DEVICE_MOBILITY_STATE_UNKNOWN = 0; /** - * High movement device mobility state + * High movement device mobility state. + * e.g. on a bike, in a motor vehicle * * @see #setDeviceMobilityState(int) * @@ -4585,7 +4586,8 @@ public class WifiManager { public static final int DEVICE_MOBILITY_STATE_HIGH_MVMT = 1; /** - * Low movement device mobility state + * Low movement device mobility state. + * e.g. walking, running * * @see #setDeviceMobilityState(int) * @@ -4607,6 +4609,8 @@ public class WifiManager { /** * Updates the device mobility state. Wifi uses this information to adjust the interval between * Wifi scans in order to balance power consumption with scan accuracy. + * The default mobility state when the device boots is {@link #DEVICE_MOBILITY_STATE_UNKNOWN}. + * This API should be called whenever there is a change in the mobility state. * @param state the updated device mobility state * @hide */ |