diff options
143 files changed, 8853 insertions, 1997 deletions
diff --git a/Android.bp b/Android.bp index da5d62429035..48d955955425 100644 --- a/Android.bp +++ b/Android.bp @@ -1299,6 +1299,13 @@ droidstubs { "framework-annotations-lib", "android.hardware.radio-V1.5-java", ], + check_api: { + current: { + // TODO(b/147699819): remove telephony prefix when moved + api_file: "telephony/api/system-current.txt", + removed_api_file: "telephony/api/system-removed.txt", + }, + }, defaults: ["framework-module-stubs-defaults-systemapi"], filter_packages: ["android.telephony"], sdk_version: "system_current", diff --git a/apex/Android.bp b/apex/Android.bp index 39137fb908d2..19439401a7fb 100644 --- a/apex/Android.bp +++ b/apex/Android.bp @@ -44,6 +44,12 @@ stubs_defaults { args: mainline_stubs_args, installable: false, sdk_version: "current", + check_api: { + current: { + api_file: "api/current.txt", + removed_api_file: "api/removed.txt", + }, + }, } stubs_defaults { @@ -52,6 +58,12 @@ stubs_defaults { libs: ["framework-annotations-lib"], installable: false, sdk_version: "system_current", + check_api: { + current: { + api_file: "api/system-current.txt", + removed_api_file: "api/system-removed.txt", + }, + }, } // The defaults for module_libs comes in two parts - defaults for API checks @@ -65,6 +77,12 @@ stubs_defaults { libs: ["framework-annotations-lib"], installable: false, sdk_version: "module_current", + check_api: { + current: { + api_file: "api/module-lib-current.txt", + removed_api_file: "api/module-lib-removed.txt", + }, + }, } stubs_defaults { diff --git a/apex/media/OWNERS b/apex/media/OWNERS index 0ac750cde41d..9b853c5dd7d8 100644 --- a/apex/media/OWNERS +++ b/apex/media/OWNERS @@ -1,4 +1,4 @@ andrewlewis@google.com -dwkang@google.com +aquilescanta@google.com marcone@google.com sungsoo@google.com diff --git a/apex/media/framework/api/current.txt b/apex/media/framework/api/current.txt new file mode 100644 index 000000000000..2b7dcd3301bc --- /dev/null +++ b/apex/media/framework/api/current.txt @@ -0,0 +1,206 @@ +// Signature format: 2.0 +package android.media { + + public class MediaController2 implements java.lang.AutoCloseable { + method public void cancelSessionCommand(@NonNull Object); + method public void close(); + method @Nullable public android.media.Session2Token getConnectedToken(); + method public boolean isPlaybackActive(); + method @NonNull public Object sendSessionCommand(@NonNull android.media.Session2Command, @Nullable android.os.Bundle); + } + + public static final class MediaController2.Builder { + ctor public MediaController2.Builder(@NonNull android.content.Context, @NonNull android.media.Session2Token); + method @NonNull public android.media.MediaController2 build(); + method @NonNull public android.media.MediaController2.Builder setConnectionHints(@NonNull android.os.Bundle); + method @NonNull public android.media.MediaController2.Builder setControllerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaController2.ControllerCallback); + } + + public abstract static class MediaController2.ControllerCallback { + ctor public MediaController2.ControllerCallback(); + method public void onCommandResult(@NonNull android.media.MediaController2, @NonNull Object, @NonNull android.media.Session2Command, @NonNull android.media.Session2Command.Result); + method public void onConnected(@NonNull android.media.MediaController2, @NonNull android.media.Session2CommandGroup); + method public void onDisconnected(@NonNull android.media.MediaController2); + method public void onPlaybackActiveChanged(@NonNull android.media.MediaController2, boolean); + method @Nullable public android.media.Session2Command.Result onSessionCommand(@NonNull android.media.MediaController2, @NonNull android.media.Session2Command, @Nullable android.os.Bundle); + } + + public final class MediaParser { + method public boolean advance(@NonNull android.media.MediaParser.SeekableInputReader) throws java.io.IOException; + method @NonNull public static android.media.MediaParser create(@NonNull android.media.MediaParser.OutputConsumer, @NonNull java.lang.String...); + method @NonNull public static android.media.MediaParser createByName(@NonNull String, @NonNull android.media.MediaParser.OutputConsumer); + method @Nullable public String getParserName(); + method @NonNull public static java.util.List<java.lang.String> getParserNames(@NonNull android.media.MediaFormat); + method public void release(); + method public void seek(@NonNull android.media.MediaParser.SeekPoint); + method @NonNull public android.media.MediaParser setParameter(@NonNull String, @NonNull Object); + method public boolean supportsParameter(@NonNull String); + field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "android.media.mediaparser.adts.enableCbrSeeking"; + field public static final String PARAMETER_AMR_ENABLE_CBR_SEEKING = "android.media.mediaparser.amr.enableCbrSeeking"; + field public static final String PARAMETER_FLAC_DISABLE_ID3 = "android.media.mediaparser.flac.disableId3"; + field public static final String PARAMETER_MATROSKA_DISABLE_CUES_SEEKING = "android.media.mediaparser.matroska.disableCuesSeeking"; + field public static final String PARAMETER_MP3_DISABLE_ID3 = "android.media.mediaparser.mp3.disableId3"; + field public static final String PARAMETER_MP3_ENABLE_CBR_SEEKING = "android.media.mediaparser.mp3.enableCbrSeeking"; + field public static final String PARAMETER_MP3_ENABLE_INDEX_SEEKING = "android.media.mediaparser.mp3.enableIndexSeeking"; + field public static final String PARAMETER_MP4_IGNORE_EDIT_LISTS = "android.media.mediaparser.mp4.ignoreEditLists"; + field public static final String PARAMETER_MP4_IGNORE_TFDT_BOX = "android.media.mediaparser.mp4.ignoreTfdtBox"; + field public static final String PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES = "android.media.mediaparser.mp4.treatVideoFramesAsKeyframes"; + field public static final String PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES = "android.media.mediaparser.ts.allowNonIdrAvcKeyframes"; + field public static final String PARAMETER_TS_DETECT_ACCESS_UNITS = "android.media.mediaparser.ts.ignoreDetectAccessUnits"; + field public static final String PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS = "android.media.mediaparser.ts.enableHdmvDtsAudioStreams"; + field public static final String PARAMETER_TS_IGNORE_AAC_STREAM = "android.media.mediaparser.ts.ignoreAacStream"; + field public static final String PARAMETER_TS_IGNORE_AVC_STREAM = "android.media.mediaparser.ts.ignoreAvcStream"; + field public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM = "android.media.mediaparser.ts.ignoreSpliceInfoStream"; + field public static final String PARAMETER_TS_MODE = "android.media.mediaparser.ts.mode"; + } + + public static interface MediaParser.InputReader { + method public long getLength(); + method public long getPosition(); + method public int read(@NonNull byte[], int, int) throws java.io.IOException; + } + + public static interface MediaParser.OutputConsumer { + method public void onSampleCompleted(int, long, int, int, int, @Nullable android.media.MediaCodec.CryptoInfo); + method public void onSampleDataFound(int, @NonNull android.media.MediaParser.InputReader) throws java.io.IOException; + method public void onSeekMapFound(@NonNull android.media.MediaParser.SeekMap); + method public void onTrackCountFound(int); + method public void onTrackDataFound(int, @NonNull android.media.MediaParser.TrackData); + } + + public static final class MediaParser.ParsingException extends java.io.IOException { + } + + public static final class MediaParser.SeekMap { + method public long getDurationMicros(); + method @NonNull public android.util.Pair<android.media.MediaParser.SeekPoint,android.media.MediaParser.SeekPoint> getSeekPoints(long); + method public boolean isSeekable(); + field public static final int UNKNOWN_DURATION = -2147483648; // 0x80000000 + } + + public static final class MediaParser.SeekPoint { + field @NonNull public static final android.media.MediaParser.SeekPoint START; + field public final long position; + field public final long timeMicros; + } + + public static interface MediaParser.SeekableInputReader extends android.media.MediaParser.InputReader { + method public void seekToPosition(long); + } + + public static final class MediaParser.TrackData { + field @Nullable public final android.media.DrmInitData drmInitData; + field @NonNull public final android.media.MediaFormat mediaFormat; + } + + public static final class MediaParser.UnrecognizedInputFormatException extends java.io.IOException { + } + + public class MediaSession2 implements java.lang.AutoCloseable { + method public void broadcastSessionCommand(@NonNull android.media.Session2Command, @Nullable android.os.Bundle); + method public void cancelSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull Object); + method public void close(); + method @NonNull public java.util.List<android.media.MediaSession2.ControllerInfo> getConnectedControllers(); + method @NonNull public String getId(); + method @NonNull public android.media.Session2Token getToken(); + method public boolean isPlaybackActive(); + method @NonNull public Object sendSessionCommand(@NonNull android.media.MediaSession2.ControllerInfo, @NonNull android.media.Session2Command, @Nullable android.os.Bundle); + method public void setPlaybackActive(boolean); + } + + public static final class MediaSession2.Builder { + ctor public MediaSession2.Builder(@NonNull android.content.Context); + method @NonNull public android.media.MediaSession2 build(); + method @NonNull public android.media.MediaSession2.Builder setExtras(@NonNull android.os.Bundle); + method @NonNull public android.media.MediaSession2.Builder setId(@NonNull String); + method @NonNull public android.media.MediaSession2.Builder setSessionActivity(@Nullable android.app.PendingIntent); + method @NonNull public android.media.MediaSession2.Builder setSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaSession2.SessionCallback); + } + + public static final class MediaSession2.ControllerInfo { + method @NonNull public android.os.Bundle getConnectionHints(); + method @NonNull public String getPackageName(); + method @NonNull public android.media.session.MediaSessionManager.RemoteUserInfo getRemoteUserInfo(); + method public int getUid(); + } + + public abstract static class MediaSession2.SessionCallback { + ctor public MediaSession2.SessionCallback(); + method public void onCommandResult(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo, @NonNull Object, @NonNull android.media.Session2Command, @NonNull android.media.Session2Command.Result); + method @Nullable public android.media.Session2CommandGroup onConnect(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo); + method public void onDisconnected(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo); + method public void onPostConnect(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo); + method @Nullable public android.media.Session2Command.Result onSessionCommand(@NonNull android.media.MediaSession2, @NonNull android.media.MediaSession2.ControllerInfo, @NonNull android.media.Session2Command, @Nullable android.os.Bundle); + } + + public abstract class MediaSession2Service extends android.app.Service { + ctor public MediaSession2Service(); + method public final void addSession(@NonNull android.media.MediaSession2); + method @NonNull public final java.util.List<android.media.MediaSession2> getSessions(); + method @CallSuper @Nullable public android.os.IBinder onBind(@NonNull android.content.Intent); + method @Nullable public abstract android.media.MediaSession2 onGetSession(@NonNull android.media.MediaSession2.ControllerInfo); + method @Nullable public abstract android.media.MediaSession2Service.MediaNotification onUpdateNotification(@NonNull android.media.MediaSession2); + method public final void removeSession(@NonNull android.media.MediaSession2); + field public static final String SERVICE_INTERFACE = "android.media.MediaSession2Service"; + } + + public static class MediaSession2Service.MediaNotification { + ctor public MediaSession2Service.MediaNotification(int, @NonNull android.app.Notification); + method @NonNull public android.app.Notification getNotification(); + method public int getNotificationId(); + } + + public final class Session2Command implements android.os.Parcelable { + ctor public Session2Command(int); + ctor public Session2Command(@NonNull String, @Nullable android.os.Bundle); + method public int describeContents(); + method public int getCommandCode(); + method @Nullable public String getCustomAction(); + method @Nullable public android.os.Bundle getCustomExtras(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field public static final int COMMAND_CODE_CUSTOM = 0; // 0x0 + field @NonNull public static final android.os.Parcelable.Creator<android.media.Session2Command> CREATOR; + } + + public static final class Session2Command.Result { + ctor public Session2Command.Result(int, @Nullable android.os.Bundle); + method public int getResultCode(); + method @Nullable public android.os.Bundle getResultData(); + field public static final int RESULT_ERROR_UNKNOWN_ERROR = -1; // 0xffffffff + field public static final int RESULT_INFO_SKIPPED = 1; // 0x1 + field public static final int RESULT_SUCCESS = 0; // 0x0 + } + + public final class Session2CommandGroup implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public java.util.Set<android.media.Session2Command> getCommands(); + method public boolean hasCommand(@NonNull android.media.Session2Command); + method public boolean hasCommand(int); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.media.Session2CommandGroup> CREATOR; + } + + public static final class Session2CommandGroup.Builder { + ctor public Session2CommandGroup.Builder(); + ctor public Session2CommandGroup.Builder(@NonNull android.media.Session2CommandGroup); + method @NonNull public android.media.Session2CommandGroup.Builder addCommand(@NonNull android.media.Session2Command); + method @NonNull public android.media.Session2CommandGroup build(); + method @NonNull public android.media.Session2CommandGroup.Builder removeCommand(@NonNull android.media.Session2Command); + } + + public final class Session2Token implements android.os.Parcelable { + ctor public Session2Token(@NonNull android.content.Context, @NonNull android.content.ComponentName); + method public int describeContents(); + method @NonNull public android.os.Bundle getExtras(); + method @NonNull public String getPackageName(); + method @Nullable public String getServiceName(); + method public int getType(); + method public int getUid(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.media.Session2Token> CREATOR; + field public static final int TYPE_SESSION = 0; // 0x0 + field public static final int TYPE_SESSION_SERVICE = 1; // 0x1 + } + +} + diff --git a/apex/media/framework/api/module-lib-current.txt b/apex/media/framework/api/module-lib-current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/media/framework/api/module-lib-current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/media/framework/api/module-lib-removed.txt b/apex/media/framework/api/module-lib-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/media/framework/api/module-lib-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/media/framework/api/removed.txt b/apex/media/framework/api/removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/media/framework/api/removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/media/framework/api/system-current.txt b/apex/media/framework/api/system-current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/media/framework/api/system-current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/media/framework/api/system-removed.txt b/apex/media/framework/api/system-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/media/framework/api/system-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index 0d9cbf0edf03..0ff55dabbaae 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -443,60 +443,64 @@ public final class MediaParser { // Public constants. /** - * Sets whether constant bitrate seeking should be enabled for exo.AdtsParser. {@code boolean} + * Sets whether constant bitrate seeking should be enabled for ADTS parsing. {@code boolean} * expected. Default value is {@code false}. */ public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = - "exo.AdtsParser.enableCbrSeeking"; + "android.media.mediaparser.adts.enableCbrSeeking"; /** - * Sets whether constant bitrate seeking should be enabled for exo.AmrParser. {@code boolean} - * expected. Default value is {@code false}. + * Sets whether constant bitrate seeking should be enabled for AMR. {@code boolean} expected. + * Default value is {@code false}. */ - public static final String PARAMETER_AMR_ENABLE_CBR_SEEKING = "exo.AmrParser.enableCbrSeeking"; + public static final String PARAMETER_AMR_ENABLE_CBR_SEEKING = + "android.media.mediaparser.amr.enableCbrSeeking"; /** - * Sets whether the ID3 track should be disabled for exo.FlacParser. {@code boolean} expected. - * Default value is {@code false}. + * Sets whether the ID3 track should be disabled for FLAC. {@code boolean} expected. Default + * value is {@code false}. */ - public static final String PARAMETER_FLAC_DISABLE_ID3 = "exo.FlacParser.disableId3"; + public static final String PARAMETER_FLAC_DISABLE_ID3 = + "android.media.mediaparser.flac.disableId3"; /** - * Sets whether exo.FragmentedMp4Parser should ignore edit lists. {@code boolean} expected. - * Default value is {@code false}. + * Sets whether MP4 parsing should ignore edit lists. {@code boolean} expected. Default value is + * {@code false}. */ - public static final String PARAMETER_FMP4_IGNORE_EDIT_LISTS = - "exo.FragmentedMp4Parser.ignoreEditLists"; + public static final String PARAMETER_MP4_IGNORE_EDIT_LISTS = + "android.media.mediaparser.mp4.ignoreEditLists"; /** - * Sets whether exo.FragmentedMp4Parser should ignore the tfdt box. {@code boolean} expected. - * Default value is {@code false}. + * Sets whether MP4 parsing should ignore the tfdt box. {@code boolean} expected. Default value + * is {@code false}. */ - public static final String PARAMETER_FMP4_IGNORE_TFDT_BOX = - "exo.FragmentedMp4Parser.ignoreTfdtBox"; + public static final String PARAMETER_MP4_IGNORE_TFDT_BOX = + "android.media.mediaparser.mp4.ignoreTfdtBox"; /** - * Sets whether exo.FragmentedMp4Parser should treat all video frames as key frames. {@code - * boolean} expected. Default value is {@code false}. + * Sets whether MP4 parsing should treat all video frames as key frames. {@code boolean} + * expected. Default value is {@code false}. */ - public static final String PARAMETER_FMP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES = - "exo.FragmentedMp4Parser.treatVideoFramesAsKeyframes"; + public static final String PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES = + "android.media.mediaparser.mp4.treatVideoFramesAsKeyframes"; /** - * Sets whether exo.MatroskaParser should avoid seeking to the cues element. {@code boolean} + * Sets whether Matroska parsing should avoid seeking to the cues element. {@code boolean} * expected. Default value is {@code false}. * * <p>If this flag is enabled and the cues element occurs after the first cluster, then the * media is treated as unseekable. */ public static final String PARAMETER_MATROSKA_DISABLE_CUES_SEEKING = - "exo.MatroskaParser.disableCuesSeeking"; + "android.media.mediaparser.matroska.disableCuesSeeking"; /** - * Sets whether the ID3 track should be disabled for exo.Mp3Parser. {@code boolean} expected. - * Default value is {@code false}. + * Sets whether the ID3 track should be disabled for MP3. {@code boolean} expected. Default + * value is {@code false}. */ - public static final String PARAMETER_MP3_DISABLE_ID3 = "exo.Mp3Parser.disableId3"; + public static final String PARAMETER_MP3_DISABLE_ID3 = + "android.media.mediaparser.mp3.disableId3"; /** - * Sets whether constant bitrate seeking should be enabled for exo.Mp3Parser. {@code boolean} - * expected. Default value is {@code false}. + * Sets whether constant bitrate seeking should be enabled for MP3. {@code boolean} expected. + * Default value is {@code false}. */ - public static final String PARAMETER_MP3_ENABLE_CBR_SEEKING = "exo.Mp3Parser.enableCbrSeeking"; + public static final String PARAMETER_MP3_ENABLE_CBR_SEEKING = + "android.media.mediaparser.mp3.enableCbrSeeking"; /** - * Sets whether exo.Mp3Parser should generate a time-to-byte mapping. {@code boolean} expected. + * Sets whether MP3 parsing should generate a time-to-byte mapping. {@code boolean} expected. * Default value is {@code false}. * * <p>Enabling this flag may require to scan a significant portion of the file to compute a seek @@ -509,18 +513,13 @@ public final class MediaParser { * </ul> */ public static final String PARAMETER_MP3_ENABLE_INDEX_SEEKING = - "exo.Mp3Parser.enableIndexSeeking"; + "android.media.mediaparser.mp3.enableIndexSeeking"; /** - * Sets whether exo.Mp4Parser should ignore edit lists. {@code boolean} expected. Default value - * is {@code false}. - */ - public static final String PARAMETER_MP4_IGNORE_EDIT_LISTS = "exo.Mp4Parser.ignoreEditLists"; - /** - * Sets the operation mode for exo.TsParser. {@code String} expected. Valid values are {@code + * Sets the operation mode for TS parsing. {@code String} expected. Valid values are {@code * "single_pmt"}, {@code "multi_pmt"}, and {@code "hls"}. Default value is {@code "single_pmt"}. * - * <p>The operation modes alter the way exo.TsParser behaves so that it can handle certain kinds - * of commonly-occurring malformed media. + * <p>The operation modes alter the way TS behaves so that it can handle certain kinds of + * commonly-occurring malformed media. * * <ul> * <li>{@code "single_pmt"}: Only the first found PMT is parsed. Others are ignored, even if @@ -529,47 +528,48 @@ public final class MediaParser { * <li>{@code "hls"}: Enable {@code "single_pmt"} mode, and ignore continuity counters. * </ul> */ - public static final String PARAMETER_TS_MODE = "exo.TsParser.mode"; + public static final String PARAMETER_TS_MODE = "android.media.mediaparser.ts.mode"; /** - * Sets whether exo.TsParser should treat samples consisting of non-IDR I slices as - * synchronization samples (key-frames). {@code boolean} expected. Default value is {@code - * false}. + * Sets whether TS should treat samples consisting of non-IDR I slices as synchronization + * samples (key-frames). {@code boolean} expected. Default value is {@code false}. */ public static final String PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES = - "exo.TsParser.allowNonIdrAvcKeyframes"; + "android.media.mediaparser.ts.allowNonIdrAvcKeyframes"; /** - * Sets whether exo.TsParser should ignore AAC elementary streams. {@code boolean} expected. + * Sets whether TS parsing should ignore AAC elementary streams. {@code boolean} expected. * Default value is {@code false}. */ - public static final String PARAMETER_TS_IGNORE_AAC_STREAM = "exo.TsParser.ignoreAacStream"; + public static final String PARAMETER_TS_IGNORE_AAC_STREAM = + "android.media.mediaparser.ts.ignoreAacStream"; /** - * Sets whether exo.TsParser should ignore AVC elementary streams. {@code boolean} expected. + * Sets whether TS parsing should ignore AVC elementary streams. {@code boolean} expected. * Default value is {@code false}. */ - public static final String PARAMETER_TS_IGNORE_AVC_STREAM = "exo.TsParser.ignoreAvcStream"; + public static final String PARAMETER_TS_IGNORE_AVC_STREAM = + "android.media.mediaparser.ts.ignoreAvcStream"; /** - * Sets whether exo.TsParser should ignore splice information streams. {@code boolean} expected. + * Sets whether TS parsing should ignore splice information streams. {@code boolean} expected. * Default value is {@code false}. */ public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM = - "exo.TsParser.ignoreSpliceInfoStream"; + "android.media.mediaparser.ts.ignoreSpliceInfoStream"; /** - * Sets whether exo.TsParser should split AVC stream into access units based on slice headers. + * Sets whether TS parsing should split AVC stream into access units based on slice headers. * {@code boolean} expected. Default value is {@code false}. * * <p>This flag should be left disabled if the stream contains access units delimiters in order * to avoid unnecessary computational costs. */ public static final String PARAMETER_TS_DETECT_ACCESS_UNITS = - "exo.TsParser.ignoreDetectAccessUnits"; + "android.media.mediaparser.ts.ignoreDetectAccessUnits"; /** - * Sets whether exo.TsParser should handle HDMV DTS audio streams. {@code boolean} expected. + * Sets whether TS parsing should handle HDMV DTS audio streams. {@code boolean} expected. * Default value is {@code false}. * * <p>Enabling this flag will disable the detection of SCTE subtitles. */ public static final String PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS = - "exo.TsParser.enableHdmvDtsAudioStreams"; + "android.media.mediaparser.ts.enableHdmvDtsAudioStreams"; // Private constants. @@ -1185,15 +1185,14 @@ public final class MediaParser { expectedTypeByParameterName.put(PARAMETER_ADTS_ENABLE_CBR_SEEKING, Boolean.class); expectedTypeByParameterName.put(PARAMETER_AMR_ENABLE_CBR_SEEKING, Boolean.class); expectedTypeByParameterName.put(PARAMETER_FLAC_DISABLE_ID3, Boolean.class); - expectedTypeByParameterName.put(PARAMETER_FMP4_IGNORE_EDIT_LISTS, Boolean.class); - expectedTypeByParameterName.put(PARAMETER_FMP4_IGNORE_TFDT_BOX, Boolean.class); + expectedTypeByParameterName.put(PARAMETER_MP4_IGNORE_EDIT_LISTS, Boolean.class); + expectedTypeByParameterName.put(PARAMETER_MP4_IGNORE_TFDT_BOX, Boolean.class); expectedTypeByParameterName.put( - PARAMETER_FMP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES, Boolean.class); + PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES, Boolean.class); expectedTypeByParameterName.put(PARAMETER_MATROSKA_DISABLE_CUES_SEEKING, Boolean.class); expectedTypeByParameterName.put(PARAMETER_MP3_DISABLE_ID3, Boolean.class); expectedTypeByParameterName.put(PARAMETER_MP3_ENABLE_CBR_SEEKING, Boolean.class); expectedTypeByParameterName.put(PARAMETER_MP3_ENABLE_INDEX_SEEKING, Boolean.class); - expectedTypeByParameterName.put(PARAMETER_MP4_IGNORE_EDIT_LISTS, Boolean.class); expectedTypeByParameterName.put(PARAMETER_TS_MODE, String.class); expectedTypeByParameterName.put(PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES, Boolean.class); expectedTypeByParameterName.put(PARAMETER_TS_IGNORE_AAC_STREAM, Boolean.class); diff --git a/apex/permission/framework/api/current.txt b/apex/permission/framework/api/current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/permission/framework/api/current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/permission/framework/api/module-lib-current.txt b/apex/permission/framework/api/module-lib-current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/permission/framework/api/module-lib-current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/permission/framework/api/module-lib-removed.txt b/apex/permission/framework/api/module-lib-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/permission/framework/api/module-lib-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/permission/framework/api/removed.txt b/apex/permission/framework/api/removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/permission/framework/api/removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/permission/framework/api/system-current.txt b/apex/permission/framework/api/system-current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/permission/framework/api/system-current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/permission/framework/api/system-removed.txt b/apex/permission/framework/api/system-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/permission/framework/api/system-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/sdkextensions/framework/api/current.txt b/apex/sdkextensions/framework/api/current.txt new file mode 100644 index 000000000000..9041262cd07e --- /dev/null +++ b/apex/sdkextensions/framework/api/current.txt @@ -0,0 +1,10 @@ +// Signature format: 2.0 +package android.os.ext.test { + + @Deprecated public class Test { + ctor @Deprecated public Test(); + method @Deprecated public void testE(); + } + +} + diff --git a/apex/sdkextensions/framework/api/module-lib-current.txt b/apex/sdkextensions/framework/api/module-lib-current.txt new file mode 100644 index 000000000000..494c12f73b00 --- /dev/null +++ b/apex/sdkextensions/framework/api/module-lib-current.txt @@ -0,0 +1,9 @@ +// Signature format: 2.0 +package android.os.ext.test { + + @Deprecated public class Test { + method @Deprecated public void testD(); + } + +} + diff --git a/apex/sdkextensions/framework/api/module-lib-removed.txt b/apex/sdkextensions/framework/api/module-lib-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/sdkextensions/framework/api/module-lib-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/sdkextensions/framework/api/removed.txt b/apex/sdkextensions/framework/api/removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/sdkextensions/framework/api/removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/sdkextensions/framework/api/system-current.txt b/apex/sdkextensions/framework/api/system-current.txt new file mode 100644 index 000000000000..056eb416473f --- /dev/null +++ b/apex/sdkextensions/framework/api/system-current.txt @@ -0,0 +1,18 @@ +// Signature format: 2.0 +package android.os.ext { + + public class SdkExtensions { + method public static int getExtensionVersion(int); + } + +} + +package android.os.ext.test { + + @Deprecated public class Test { + method @Deprecated public void testF(); + method @Deprecated public void testG(); + } + +} + diff --git a/apex/sdkextensions/framework/api/system-removed.txt b/apex/sdkextensions/framework/api/system-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/sdkextensions/framework/api/system-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/statsd/framework/Android.bp b/apex/statsd/framework/Android.bp index 8185bb036b22..986682e6a8c9 100644 --- a/apex/statsd/framework/Android.bp +++ b/apex/statsd/framework/Android.bp @@ -166,10 +166,8 @@ java_library { android_test { name: "FrameworkStatsdTest", - platform_apis: true, + sdk_version: "module_current", srcs: [ - // TODO(b/147705194): Use framework-statsd as a lib dependency instead. - ":framework-statsd-sources", "test/**/*.java", ], manifest: "test/AndroidManifest.xml", @@ -180,6 +178,7 @@ android_test { libs: [ "android.test.runner.stubs", "android.test.base.stubs", + "framework-statsd", ], test_suites: [ "device-tests", diff --git a/apex/statsd/framework/api/current.txt b/apex/statsd/framework/api/current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/statsd/framework/api/current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/statsd/framework/api/module-lib-current.txt b/apex/statsd/framework/api/module-lib-current.txt new file mode 100644 index 000000000000..8b6e2170002e --- /dev/null +++ b/apex/statsd/framework/api/module-lib-current.txt @@ -0,0 +1,10 @@ +// Signature format: 2.0 +package android.os { + + public class StatsFrameworkInitializer { + method public static void registerServiceWrappers(); + method public static void setStatsServiceManager(@NonNull android.os.StatsServiceManager); + } + +} + diff --git a/apex/statsd/framework/api/module-lib-removed.txt b/apex/statsd/framework/api/module-lib-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/statsd/framework/api/module-lib-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/statsd/framework/api/removed.txt b/apex/statsd/framework/api/removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/statsd/framework/api/removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/apex/statsd/framework/api/system-current.txt b/apex/statsd/framework/api/system-current.txt new file mode 100644 index 000000000000..3ea572450c1c --- /dev/null +++ b/apex/statsd/framework/api/system-current.txt @@ -0,0 +1,111 @@ +// Signature format: 2.0 +package android.app { + + public final class StatsManager { + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException; + method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]); + method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void clearPullAtomCallback(int); + method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getData(long); + method @Deprecated @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getMetadata(); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] getRegisteredExperimentIds() throws android.app.StatsManager.StatsUnavailableException; + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException; + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException; + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException; + method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean removeConfiguration(long); + method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public long[] setActiveConfigsChangedOperation(@Nullable android.app.PendingIntent) throws android.app.StatsManager.StatsUnavailableException; + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException; + method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent); + method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean setDataFetchOperation(long, android.app.PendingIntent); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException; + method @RequiresPermission(android.Manifest.permission.REGISTER_STATS_PULL_ATOM) public void setPullAtomCallback(int, @Nullable android.app.StatsManager.PullAtomMetadata, @NonNull java.util.concurrent.Executor, @NonNull android.app.StatsManager.StatsPullAtomCallback); + field public static final String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED"; + field public static final String EXTRA_STATS_ACTIVE_CONFIG_KEYS = "android.app.extra.STATS_ACTIVE_CONFIG_KEYS"; + field public static final String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES"; + field public static final String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY"; + field public static final String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID"; + field public static final String EXTRA_STATS_DIMENSIONS_VALUE = "android.app.extra.STATS_DIMENSIONS_VALUE"; + field public static final String EXTRA_STATS_SUBSCRIPTION_ID = "android.app.extra.STATS_SUBSCRIPTION_ID"; + field public static final String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID"; + field public static final int PULL_SKIP = 1; // 0x1 + field public static final int PULL_SUCCESS = 0; // 0x0 + } + + public static class StatsManager.PullAtomMetadata { + method @Nullable public int[] getAdditiveFields(); + method public long getCoolDownMillis(); + method public long getTimeoutMillis(); + } + + public static class StatsManager.PullAtomMetadata.Builder { + ctor public StatsManager.PullAtomMetadata.Builder(); + method @NonNull public android.app.StatsManager.PullAtomMetadata build(); + method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setAdditiveFields(@NonNull int[]); + method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setCoolDownMillis(long); + method @NonNull public android.app.StatsManager.PullAtomMetadata.Builder setTimeoutMillis(long); + } + + public static interface StatsManager.StatsPullAtomCallback { + method public int onPullAtom(int, @NonNull java.util.List<android.util.StatsEvent>); + } + + public static class StatsManager.StatsUnavailableException extends android.util.AndroidException { + ctor public StatsManager.StatsUnavailableException(String); + ctor public StatsManager.StatsUnavailableException(String, Throwable); + } + +} + +package android.os { + + public final class StatsDimensionsValue implements android.os.Parcelable { + method public int describeContents(); + method public boolean getBooleanValue(); + method public int getField(); + method public float getFloatValue(); + method public int getIntValue(); + method public long getLongValue(); + method public String getStringValue(); + method public java.util.List<android.os.StatsDimensionsValue> getTupleValueList(); + method public int getValueType(); + method public boolean isValueType(int); + method public void writeToParcel(android.os.Parcel, int); + field public static final int BOOLEAN_VALUE_TYPE = 5; // 0x5 + field @NonNull public static final android.os.Parcelable.Creator<android.os.StatsDimensionsValue> CREATOR; + field public static final int FLOAT_VALUE_TYPE = 6; // 0x6 + field public static final int INT_VALUE_TYPE = 3; // 0x3 + field public static final int LONG_VALUE_TYPE = 4; // 0x4 + field public static final int STRING_VALUE_TYPE = 2; // 0x2 + field public static final int TUPLE_VALUE_TYPE = 7; // 0x7 + } + +} + +package android.util { + + public final class StatsEvent { + method @NonNull public static android.util.StatsEvent.Builder newBuilder(); + } + + public static final class StatsEvent.Builder { + method @NonNull public android.util.StatsEvent.Builder addBooleanAnnotation(byte, boolean); + method @NonNull public android.util.StatsEvent.Builder addIntAnnotation(byte, int); + method @NonNull public android.util.StatsEvent build(); + method @NonNull public android.util.StatsEvent.Builder setAtomId(int); + method @NonNull public android.util.StatsEvent.Builder usePooledBuffer(); + method @NonNull public android.util.StatsEvent.Builder writeAttributionChain(@NonNull int[], @NonNull String[]); + method @NonNull public android.util.StatsEvent.Builder writeBoolean(boolean); + method @NonNull public android.util.StatsEvent.Builder writeByteArray(@NonNull byte[]); + method @NonNull public android.util.StatsEvent.Builder writeFloat(float); + method @NonNull public android.util.StatsEvent.Builder writeInt(int); + method @NonNull public android.util.StatsEvent.Builder writeKeyValuePairs(@Nullable android.util.SparseIntArray, @Nullable android.util.SparseLongArray, @Nullable android.util.SparseArray<java.lang.String>, @Nullable android.util.SparseArray<java.lang.Float>); + method @NonNull public android.util.StatsEvent.Builder writeLong(long); + method @NonNull public android.util.StatsEvent.Builder writeString(@NonNull String); + } + + public final class StatsLog { + method public static void write(@NonNull android.util.StatsEvent); + method public static void writeRaw(@NonNull byte[], int); + } + +} + diff --git a/apex/statsd/framework/api/system-removed.txt b/apex/statsd/framework/api/system-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/apex/statsd/framework/api/system-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/api/current.txt b/api/current.txt index 05c7cbcf5c84..ce43f21e78cd 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23601,13 +23601,13 @@ package android.location { method @FloatRange(from=0, to=63) public double getCn0DbHz(); method @NonNull public String getCodeType(); method public int getConstellationType(); + method public double getFullInterSignalBiasNanos(); + method @FloatRange(from=0.0) public double getFullInterSignalBiasUncertaintyNanos(); method public int getMultipathIndicator(); method public double getPseudorangeRateMetersPerSecond(); method public double getPseudorangeRateUncertaintyMetersPerSecond(); method public long getReceivedSvTimeNanos(); method public long getReceivedSvTimeUncertaintyNanos(); - method public double getReceiverInterSignalBiasNanos(); - method @FloatRange(from=0.0) public double getReceiverInterSignalBiasUncertaintyNanos(); method public double getSatelliteInterSignalBiasNanos(); method @FloatRange(from=0.0) public double getSatelliteInterSignalBiasUncertaintyNanos(); method public double getSnrInDb(); @@ -23621,8 +23621,8 @@ package android.location { method @Deprecated public boolean hasCarrierPhase(); method @Deprecated public boolean hasCarrierPhaseUncertainty(); method public boolean hasCodeType(); - method public boolean hasReceiverInterSignalBiasNanos(); - method public boolean hasReceiverInterSignalBiasUncertaintyNanos(); + method public boolean hasFullInterSignalBiasNanos(); + method public boolean hasFullInterSignalBiasUncertaintyNanos(); method public boolean hasSatelliteInterSignalBiasNanos(); method public boolean hasSatelliteInterSignalBiasUncertaintyNanos(); method public boolean hasSnrInDb(); @@ -26428,24 +26428,23 @@ package android.media { method public void seek(@NonNull android.media.MediaParser.SeekPoint); method @NonNull public android.media.MediaParser setParameter(@NonNull String, @NonNull Object); method public boolean supportsParameter(@NonNull String); - field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "exo.AdtsParser.enableCbrSeeking"; - field public static final String PARAMETER_AMR_ENABLE_CBR_SEEKING = "exo.AmrParser.enableCbrSeeking"; - field public static final String PARAMETER_FLAC_DISABLE_ID3 = "exo.FlacParser.disableId3"; - field public static final String PARAMETER_FMP4_IGNORE_EDIT_LISTS = "exo.FragmentedMp4Parser.ignoreEditLists"; - field public static final String PARAMETER_FMP4_IGNORE_TFDT_BOX = "exo.FragmentedMp4Parser.ignoreTfdtBox"; - field public static final String PARAMETER_FMP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES = "exo.FragmentedMp4Parser.treatVideoFramesAsKeyframes"; - field public static final String PARAMETER_MATROSKA_DISABLE_CUES_SEEKING = "exo.MatroskaParser.disableCuesSeeking"; - field public static final String PARAMETER_MP3_DISABLE_ID3 = "exo.Mp3Parser.disableId3"; - field public static final String PARAMETER_MP3_ENABLE_CBR_SEEKING = "exo.Mp3Parser.enableCbrSeeking"; - field public static final String PARAMETER_MP3_ENABLE_INDEX_SEEKING = "exo.Mp3Parser.enableIndexSeeking"; - field public static final String PARAMETER_MP4_IGNORE_EDIT_LISTS = "exo.Mp4Parser.ignoreEditLists"; - field public static final String PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES = "exo.TsParser.allowNonIdrAvcKeyframes"; - field public static final String PARAMETER_TS_DETECT_ACCESS_UNITS = "exo.TsParser.ignoreDetectAccessUnits"; - field public static final String PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS = "exo.TsParser.enableHdmvDtsAudioStreams"; - field public static final String PARAMETER_TS_IGNORE_AAC_STREAM = "exo.TsParser.ignoreAacStream"; - field public static final String PARAMETER_TS_IGNORE_AVC_STREAM = "exo.TsParser.ignoreAvcStream"; - field public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM = "exo.TsParser.ignoreSpliceInfoStream"; - field public static final String PARAMETER_TS_MODE = "exo.TsParser.mode"; + field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "android.media.mediaparser.adts.enableCbrSeeking"; + field public static final String PARAMETER_AMR_ENABLE_CBR_SEEKING = "android.media.mediaparser.amr.enableCbrSeeking"; + field public static final String PARAMETER_FLAC_DISABLE_ID3 = "android.media.mediaparser.flac.disableId3"; + field public static final String PARAMETER_MATROSKA_DISABLE_CUES_SEEKING = "android.media.mediaparser.matroska.disableCuesSeeking"; + field public static final String PARAMETER_MP3_DISABLE_ID3 = "android.media.mediaparser.mp3.disableId3"; + field public static final String PARAMETER_MP3_ENABLE_CBR_SEEKING = "android.media.mediaparser.mp3.enableCbrSeeking"; + field public static final String PARAMETER_MP3_ENABLE_INDEX_SEEKING = "android.media.mediaparser.mp3.enableIndexSeeking"; + field public static final String PARAMETER_MP4_IGNORE_EDIT_LISTS = "android.media.mediaparser.mp4.ignoreEditLists"; + field public static final String PARAMETER_MP4_IGNORE_TFDT_BOX = "android.media.mediaparser.mp4.ignoreTfdtBox"; + field public static final String PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES = "android.media.mediaparser.mp4.treatVideoFramesAsKeyframes"; + field public static final String PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES = "android.media.mediaparser.ts.allowNonIdrAvcKeyframes"; + field public static final String PARAMETER_TS_DETECT_ACCESS_UNITS = "android.media.mediaparser.ts.ignoreDetectAccessUnits"; + field public static final String PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS = "android.media.mediaparser.ts.enableHdmvDtsAudioStreams"; + field public static final String PARAMETER_TS_IGNORE_AAC_STREAM = "android.media.mediaparser.ts.ignoreAacStream"; + field public static final String PARAMETER_TS_IGNORE_AVC_STREAM = "android.media.mediaparser.ts.ignoreAvcStream"; + field public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM = "android.media.mediaparser.ts.ignoreSpliceInfoStream"; + field public static final String PARAMETER_TS_MODE = "android.media.mediaparser.ts.mode"; } public static interface MediaParser.InputReader { @@ -32454,7 +32453,7 @@ package android.nfc.cardemulation { method public boolean categoryAllowsForegroundPreference(String); method @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public java.util.List<java.lang.String> getAidsForPreferredPaymentService(); method public java.util.List<java.lang.String> getAidsForService(android.content.ComponentName, String); - method @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public String getDescriptionForPreferredPaymentService(); + method @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public CharSequence getDescriptionForPreferredPaymentService(); method public static android.nfc.cardemulation.CardEmulation getInstance(android.nfc.NfcAdapter); method @Nullable @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) public String getRouteDestinationForPreferredPaymentService(); method public int getSelectionModeForCategory(String); @@ -53620,6 +53619,7 @@ package android.view { public static final class SurfaceControlViewHost.SurfacePackage implements android.os.Parcelable { method public int describeContents(); + method public void release(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.view.SurfaceControlViewHost.SurfacePackage> CREATOR; } @@ -55573,7 +55573,8 @@ package android.view { } public interface WindowInsetsAnimationControlListener { - method public void onCancelled(); + method public void onCancelled(@Nullable android.view.WindowInsetsAnimationController); + method public void onFinished(@NonNull android.view.WindowInsetsAnimationController); method public void onReady(@NonNull android.view.WindowInsetsAnimationController, int); } @@ -55585,6 +55586,9 @@ package android.view { method @NonNull public android.graphics.Insets getHiddenStateInsets(); method @NonNull public android.graphics.Insets getShownStateInsets(); method public int getTypes(); + method public boolean isCancelled(); + method public boolean isFinished(); + method public default boolean isReady(); method public void setInsetsAndAlpha(@Nullable android.graphics.Insets, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float); } diff --git a/api/system-current.txt b/api/system-current.txt index 76d230a7628b..0fb80a205248 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -206,7 +206,7 @@ package android { field public static final String REVIEW_ACCESSIBILITY_SERVICES = "android.permission.REVIEW_ACCESSIBILITY_SERVICES"; field public static final String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS"; field public static final String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS"; - field public static final String SECURE_ELEMENT_PRIVILEGED = "android.permission.SECURE_ELEMENT_PRIVILEGED"; + field public static final String SECURE_ELEMENT_PRIVILEGED_OPERATION = "android.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION"; field public static final String SEND_DEVICE_CUSTOMIZATION_READY = "android.permission.SEND_DEVICE_CUSTOMIZATION_READY"; field public static final String SEND_SHOW_SUSPENDED_APP_DETAILS = "android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS"; field public static final String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION"; @@ -7448,7 +7448,15 @@ package android.net.wifi { } public final class WifiMigration { + method @Nullable public static java.io.InputStream convertAndRetrieveSharedConfigStoreFile(int); + method @Nullable public static java.io.InputStream convertAndRetrieveUserConfigStoreFile(int, @NonNull android.os.UserHandle); method @NonNull public static android.net.wifi.WifiMigration.SettingsMigrationData loadFromSettings(@NonNull android.content.Context); + method public static void removeSharedConfigStoreFile(int); + method public static void removeUserConfigStoreFile(int, @NonNull android.os.UserHandle); + field public static final int STORE_FILE_SHARED_GENERAL = 0; // 0x0 + field public static final int STORE_FILE_SHARED_SOFTAP = 1; // 0x1 + field public static final int STORE_FILE_USER_GENERAL = 2; // 0x2 + field public static final int STORE_FILE_USER_NETWORK_SUGGESTIONS = 3; // 0x3 } public static final class WifiMigration.SettingsMigrationData implements android.os.Parcelable { @@ -9341,32 +9349,6 @@ package android.provider { method @RequiresPermission(android.Manifest.permission.MODIFY_SETTINGS_OVERRIDEABLE_BY_RESTORE) public static boolean putString(@NonNull android.content.ContentResolver, @NonNull String, @Nullable String, boolean); } - public static interface Telephony.CarrierColumns extends android.provider.BaseColumns { - field @NonNull public static final android.net.Uri CONTENT_URI; - field public static final String EXPIRATION_TIME = "expiration_time"; - field public static final String KEY_IDENTIFIER = "key_identifier"; - field public static final String KEY_TYPE = "key_type"; - field public static final String LAST_MODIFIED = "last_modified"; - field public static final String MCC = "mcc"; - field public static final String MNC = "mnc"; - field public static final String MVNO_MATCH_DATA = "mvno_match_data"; - field public static final String MVNO_TYPE = "mvno_type"; - field public static final String PUBLIC_KEY = "public_key"; - } - - public static final class Telephony.CarrierId.All implements android.provider.BaseColumns { - field public static final String APN = "apn"; - field @NonNull public static final android.net.Uri CONTENT_URI; - field public static final String GID1 = "gid1"; - field public static final String GID2 = "gid2"; - field public static final String ICCID_PREFIX = "iccid_prefix"; - field public static final String IMSI_PREFIX_XPATTERN = "imsi_prefix_xpattern"; - field public static final String MCCMNC = "mccmnc"; - field public static final String PLMN = "plmn"; - field public static final String PRIVILEGE_ACCESS_RULE = "privilege_access_rule"; - field public static final String SPN = "spn"; - } - public static final class Telephony.Carriers implements android.provider.BaseColumns { field public static final String APN_SET_ID = "apn_set_id"; field public static final int CARRIER_EDITED = 4; // 0x4 @@ -9530,7 +9512,7 @@ package android.provider { package android.se.omapi { public final class Reader { - method @RequiresPermission(android.Manifest.permission.SECURE_ELEMENT_PRIVILEGED) public boolean reset(); + method @RequiresPermission(android.Manifest.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION) public boolean reset(); } } diff --git a/api/test-current.txt b/api/test-current.txt index 5bd1f89ec081..323f2449ba1b 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1355,8 +1355,8 @@ package android.location { method @Deprecated public void resetCarrierPhase(); method @Deprecated public void resetCarrierPhaseUncertainty(); method public void resetCodeType(); - method public void resetReceiverInterSignalBiasNanos(); - method public void resetReceiverInterSignalBiasUncertaintyNanos(); + method public void resetFullInterSignalBiasNanos(); + method public void resetFullInterSignalBiasUncertaintyNanos(); method public void resetSatelliteInterSignalBiasNanos(); method public void resetSatelliteInterSignalBiasUncertaintyNanos(); method public void resetSnrInDb(); @@ -1373,13 +1373,13 @@ package android.location { method public void setCn0DbHz(double); method public void setCodeType(@NonNull String); method public void setConstellationType(int); + method public void setFullInterSignalBiasNanos(double); + method public void setFullInterSignalBiasUncertaintyNanos(@FloatRange(from=0.0) double); method public void setMultipathIndicator(int); method public void setPseudorangeRateMetersPerSecond(double); method public void setPseudorangeRateUncertaintyMetersPerSecond(double); method public void setReceivedSvTimeNanos(long); method public void setReceivedSvTimeUncertaintyNanos(long); - method public void setReceiverInterSignalBiasNanos(double); - method public void setReceiverInterSignalBiasUncertaintyNanos(@FloatRange(from=0.0) double); method public void setSatelliteInterSignalBiasNanos(double); method public void setSatelliteInterSignalBiasUncertaintyNanos(@FloatRange(from=0.0) double); method public void setSnrInDb(double); diff --git a/api/test-lint-baseline.txt b/api/test-lint-baseline.txt index 94db3464c8de..caf8fdbeca0d 100644 --- a/api/test-lint-baseline.txt +++ b/api/test-lint-baseline.txt @@ -421,9 +421,9 @@ GetterSetterNames: android.location.GnssMeasurement#setCarrierFrequencyHz(float) GetterSetterNames: android.location.GnssMeasurement#setCodeType(String): -GetterSetterNames: android.location.GnssMeasurement#setReceiverInterSignalBiasNanos(double): +GetterSetterNames: android.location.GnssMeasurement#setFullInterSignalBiasNanos(double): -GetterSetterNames: android.location.GnssMeasurement#setReceiverInterSignalBiasUncertaintyNanos(double): +GetterSetterNames: android.location.GnssMeasurement#setFullInterSignalBiasUncertaintyNanos(double): GetterSetterNames: android.location.GnssMeasurement#setSatelliteInterSignalBiasNanos(double): diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp index e65b38e6594d..4848918f4865 100644 --- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp @@ -2495,1004 +2495,898 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse) { // EXPECT_EQ(0UL, valueProducer->mCurrentSlicedBucket.size()); // EXPECT_EQ(1UL, valueProducer->mPastBuckets.size()); //} -// -// TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onConditionChanged) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // First onConditionChanged -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(3); -// event->init(); -// data->push_back(event); -// return true; -// })) -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 10); -// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// ValueMetricProducer::Interval& curInterval = -// valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// ValueMetricProducer::BaseInfo curBaseInfo = -// valueProducer->mCurrentBaseInfo.begin()->second[0]; EXPECT_EQ(true, curBaseInfo.hasBase); -// EXPECT_EQ(false, curInterval.hasValue); -// EXPECT_EQ(true, valueProducer->mHasGlobalBase); -// -// // Empty pull. -// valueProducer->onConditionChanged(false, bucketStartTimeNs + 10); -// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; -// EXPECT_EQ(false, curBaseInfo.hasBase); -// EXPECT_EQ(false, curInterval.hasValue); -// EXPECT_EQ(false, valueProducer->mHasGlobalBase); -//} -// -// TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onBucketBoundary) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // First onConditionChanged -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(1); -// event->init(); -// data->push_back(event); -// return true; -// })) -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(2); -// event->init(); -// data->push_back(event); -// return true; -// })) -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(5); -// event->init(); -// data->push_back(event); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 10); -// valueProducer->onConditionChanged(false, bucketStartTimeNs + 11); -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 12); -// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// ValueMetricProducer::Interval& curInterval = -// valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// ValueMetricProducer::BaseInfo curBaseInfo = -// valueProducer->mCurrentBaseInfo.begin()->second[0]; EXPECT_EQ(true, curBaseInfo.hasBase); -// EXPECT_EQ(true, curInterval.hasValue); -// EXPECT_EQ(true, valueProducer->mHasGlobalBase); -// -// // End of bucket -// vector<shared_ptr<LogEvent>> allData; -// allData.clear(); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; -// // Data is empty, base should be reset. -// EXPECT_EQ(false, curBaseInfo.hasBase); -// EXPECT_EQ(5, curBaseInfo.base.long_value); -// EXPECT_EQ(false, curInterval.hasValue); -// EXPECT_EQ(true, valueProducer->mHasGlobalBase); -// -// EXPECT_EQ(1UL, valueProducer->mPastBuckets.size()); -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {1}, {bucketSizeNs - 12 + 1}); -//} -// -// TEST(ValueMetricProducerTest, TestPartialResetOnBucketBoundaries) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// metric.mutable_dimensions_in_what()->set_field(tagId); -// metric.mutable_dimensions_in_what()->add_child()->set_field(1); -// metric.set_condition(StringToId("SCREEN_ON")); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // First onConditionChanged -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(1); -// event->write(1); -// event->init(); -// data->push_back(event); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 10); -// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// -// // End of bucket -// vector<shared_ptr<LogEvent>> allData; -// allData.clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1); -// event->write(2); -// event->write(2); -// event->init(); -// allData.push_back(event); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// // Key 1 should be reset since in not present in the most pull. -// EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size()); -// auto iterator = valueProducer->mCurrentSlicedBucket.begin(); -// auto baseInfoIter = valueProducer->mCurrentBaseInfo.begin(); -// EXPECT_EQ(true, baseInfoIter->second[0].hasBase); -// EXPECT_EQ(2, baseInfoIter->second[0].base.long_value); -// EXPECT_EQ(false, iterator->second[0].hasValue); -// iterator++; -// baseInfoIter++; -// EXPECT_EQ(false, baseInfoIter->second[0].hasBase); -// EXPECT_EQ(1, baseInfoIter->second[0].base.long_value); -// EXPECT_EQ(false, iterator->second[0].hasValue); -// -// EXPECT_EQ(true, valueProducer->mHasGlobalBase); -//} -// -// TEST(ValueMetricProducerTest, TestFullBucketResetWhenLastBucketInvalid) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Initialization. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs, 1)); -// return true; -// })) -// // notifyAppUpgrade. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent( -// bucketStartTimeNs + bucketSizeNs / 2, 10)); -// return true; -// })); -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); -// ASSERT_EQ(0UL, valueProducer->mCurrentFullBucket.size()); -// -// valueProducer->notifyAppUpgrade(bucketStartTimeNs + bucketSizeNs / 2, "com.foo", 10000, 1); -// ASSERT_EQ(1UL, valueProducer->mCurrentFullBucket.size()); -// -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket3StartTimeNs + 1, 4)); -// valueProducer->onDataPulled(allData, /** fails */ false, bucket3StartTimeNs + 1); -// ASSERT_EQ(0UL, valueProducer->mCurrentFullBucket.size()); -//} -// -// TEST(ValueMetricProducerTest, TestBucketBoundariesOnConditionChange) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Second onConditionChanged. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back( -// ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 10, 5)); -// return true; -// })) -// // Third onConditionChanged. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back( -// ValueMetricProducerTestHelper::createEvent(bucket3StartTimeNs + 10, 7)); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// valueProducer->mCondition = ConditionState::kUnknown; -// -// valueProducer->onConditionChanged(false, bucketStartTimeNs); -// ASSERT_EQ(0UL, valueProducer->mCurrentSlicedBucket.size()); -// -// // End of first bucket -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 1, 4)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 1); -// ASSERT_EQ(0UL, valueProducer->mCurrentSlicedBucket.size()); -// -// valueProducer->onConditionChanged(true, bucket2StartTimeNs + 10); -// ASSERT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// auto curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// auto curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; -// EXPECT_EQ(true, curBaseInfo.hasBase); -// EXPECT_EQ(5, curBaseInfo.base.long_value); -// EXPECT_EQ(false, curInterval.hasValue); -// -// valueProducer->onConditionChanged(false, bucket3StartTimeNs + 10); -// -// // Bucket should have been completed. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {bucketSizeNs - 10}); -//} -// -// TEST(ValueMetricProducerTest, TestLateOnDataPulledWithoutDiff) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// metric.set_use_diff(false); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); -// -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs + 30, 10)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucketStartTimeNs + 30); -// -// allData.clear(); -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs, 20)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// // Bucket should have been completed. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs}); -//} -// -// TEST(ValueMetricProducerTest, TestLateOnDataPulledWithDiff) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Initialization. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs, 1)); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); -// -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs + 30, 10)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucketStartTimeNs + 30); -// -// allData.clear(); -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs, 20)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// // Bucket should have been completed. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {19}, {bucketSizeNs}); -//} -// -// TEST(ValueMetricProducerTest, TestBucketBoundariesOnAppUpgrade) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Initialization. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs, 1)); -// return true; -// })) -// // notifyAppUpgrade. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back( -// ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 2, 10)); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); -// -// valueProducer->notifyAppUpgrade(bucket2StartTimeNs + 2, "com.foo", 10000, 1); -// -// // Bucket should have been completed. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {9}, {bucketSizeNs}); -//} -// -// TEST(ValueMetricProducerTest, TestDataIsNotUpdatedWhenNoConditionChanged) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // First on condition changed. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs, 1)); -// return true; -// })) -// // Second on condition changed. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs, 3)); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); -// valueProducer->onConditionChanged(false, bucketStartTimeNs + 10); -// valueProducer->onConditionChanged(false, bucketStartTimeNs + 10); -// -// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// auto curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// auto curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; -// EXPECT_EQ(true, curInterval.hasValue); -// EXPECT_EQ(2, curInterval.value.long_value); -// -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 1, 10)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 1); -// -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {2}); -//} -// -//// TODO: b/145705635 fix or delete this test -// TEST(ValueMetricProducerTest, TestBucketInvalidIfGlobalBaseIsNotSet) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // First condition change. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs, 1)); -// return true; -// })) -// // 2nd condition change. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs, -// 1)); return true; -// })) -// // 3rd condition change. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs, -// 1)); return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// valueProducer->onConditionChanged(true, bucket2StartTimeNs + 10); -// -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs + 3, 10)); -// valueProducer->onDataPulled(allData, /** succeed */ false, bucketStartTimeNs + 3); -// -// allData.clear(); -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs, 20)); -// valueProducer->onDataPulled(allData, /** succeed */ false, bucket2StartTimeNs); -// -// valueProducer->onConditionChanged(false, bucket2StartTimeNs + 8); -// valueProducer->onConditionChanged(true, bucket2StartTimeNs + 10); -// -// allData.clear(); -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket3StartTimeNs, 30)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// // There was not global base available so all buckets are invalid. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}); -//} -// -// TEST(ValueMetricProducerTest, TestPullNeededFastDump) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// -// UidMap uidMap; -// SimpleAtomMatcher atomMatcher; -// atomMatcher.set_atom_id(tagId); -// sp<EventMatcherWizard> eventMatcherWizard = -// new EventMatcherWizard({new SimpleLogMatchingTracker( -// atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); -// sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); -// EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); -// -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Initial pull. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(1); -// event->write(1); -// event->init(); -// data->push_back(event); -// return true; -// })); -// -// ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex, -// eventMatcherWizard, tagId, bucketStartTimeNs, -// bucketStartTimeNs, pullerManager); -// -// ProtoOutputStream output; -// std::set<string> strSet; -// valueProducer.onDumpReport(bucketStartTimeNs + 10, true /* include recent buckets */, true, -// FAST, &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// // Bucket is invalid since we did not pull when dump report was called. -// EXPECT_EQ(0, report.value_metrics().data_size()); -//} -// -// TEST(ValueMetricProducerTest, TestFastDumpWithoutCurrentBucket) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// -// UidMap uidMap; -// SimpleAtomMatcher atomMatcher; -// atomMatcher.set_atom_id(tagId); -// sp<EventMatcherWizard> eventMatcherWizard = -// new EventMatcherWizard({new SimpleLogMatchingTracker( -// atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); -// sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); -// EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); -// -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Initial pull. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(1); -// event->write(1); -// event->init(); -// data->push_back(event); -// return true; -// })); -// -// ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex, -// eventMatcherWizard, tagId, bucketStartTimeNs, -// bucketStartTimeNs, pullerManager); -// -// vector<shared_ptr<LogEvent>> allData; -// allData.clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1); -// event->write(tagId); -// event->write(2); -// event->write(2); -// event->init(); -// allData.push_back(event); -// valueProducer.onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// ProtoOutputStream output; -// std::set<string> strSet; -// valueProducer.onDumpReport(bucket4StartTimeNs, false /* include recent buckets */, true, FAST, -// &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// // Previous bucket is part of the report. -// EXPECT_EQ(1, report.value_metrics().data_size()); -// EXPECT_EQ(0, report.value_metrics().data(0).bucket_info(0).bucket_num()); -//} -// -// TEST(ValueMetricProducerTest, TestPullNeededNoTimeConstraints) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// -// UidMap uidMap; -// SimpleAtomMatcher atomMatcher; -// atomMatcher.set_atom_id(tagId); -// sp<EventMatcherWizard> eventMatcherWizard = -// new EventMatcherWizard({new SimpleLogMatchingTracker( -// atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); -// sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); -// EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); -// -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Initial pull. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs); -// event->write(tagId); -// event->write(1); -// event->write(1); -// event->init(); -// data->push_back(event); -// return true; -// })) -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10); -// event->write(tagId); -// event->write(3); -// event->write(3); -// event->init(); -// data->push_back(event); -// return true; -// })); -// -// ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex, -// eventMatcherWizard, tagId, bucketStartTimeNs, -// bucketStartTimeNs, pullerManager); -// -// ProtoOutputStream output; -// std::set<string> strSet; -// valueProducer.onDumpReport(bucketStartTimeNs + 10, true /* include recent buckets */, true, -// NO_TIME_CONSTRAINTS, &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// EXPECT_EQ(1, report.value_metrics().data_size()); -// EXPECT_EQ(1, report.value_metrics().data(0).bucket_info_size()); -// EXPECT_EQ(2, report.value_metrics().data(0).bucket_info(0).values(0).value_long()); -//} -// -// TEST(ValueMetricProducerTest, TestPulledData_noDiff_withoutCondition) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); -// metric.set_use_diff(false); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); -// -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 30, 10)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 30); -// -// // Bucket should have been completed. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs}); -//} -// -// TEST(ValueMetricProducerTest, TestPulledData_noDiff_withMultipleConditionChanges) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// metric.set_use_diff(false); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // condition becomes true -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back( -// ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs + 30, 10)); -// return true; -// })) -// // condition becomes false -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back( -// ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs + 50, 20)); -// return true; -// })); -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// valueProducer->mCondition = ConditionState::kFalse; -// -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); -// valueProducer->onConditionChanged(false, bucketStartTimeNs + 50); -// // has one slice -// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); -// ValueMetricProducer::Interval curInterval = -// valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// ValueMetricProducer::BaseInfo curBaseInfo = -// valueProducer->mCurrentBaseInfo.begin()->second[0]; EXPECT_EQ(false, curBaseInfo.hasBase); -// EXPECT_EQ(true, curInterval.hasValue); -// EXPECT_EQ(20, curInterval.value.long_value); -// -// // Now the alarm is delivered. Condition is off though. -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 30, 110)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {50 - 8}); -// curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; -// EXPECT_EQ(false, curBaseInfo.hasBase); -// EXPECT_EQ(false, curInterval.hasValue); -//} -// -// TEST(ValueMetricProducerTest, TestPulledData_noDiff_bucketBoundaryTrue) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// metric.set_use_diff(false); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // condition becomes true -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back( -// ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs + 30, 10)); -// return true; -// })); -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// valueProducer->mCondition = ConditionState::kFalse; -// -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); -// -// // Now the alarm is delivered. Condition is off though. -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 30, 30)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs - 8}); -// ValueMetricProducer::Interval curInterval = -// valueProducer->mCurrentSlicedBucket.begin()->second[0]; -// ValueMetricProducer::BaseInfo curBaseInfo = -// valueProducer->mCurrentBaseInfo.begin()->second[0]; EXPECT_EQ(false, curBaseInfo.hasBase); -// EXPECT_EQ(false, curInterval.hasValue); -//} -// -// TEST(ValueMetricProducerTest, TestPulledData_noDiff_bucketBoundaryFalse) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// metric.set_use_diff(false); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// valueProducer->mCondition = ConditionState::kFalse; -// -// // Now the alarm is delivered. Condition is off though. -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 30, 30)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// // Condition was always false. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}); -//} -// -// TEST(ValueMetricProducerTest, TestPulledData_noDiff_withFailure) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// metric.set_use_diff(false); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // condition becomes true -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// data->push_back( -// ValueMetricProducerTestHelper::createEvent(bucketStartTimeNs + 30, 10)); -// return true; -// })) -// .WillOnce(Return(false)); -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// valueProducer->mCondition = ConditionState::kFalse; -// -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); -// valueProducer->onConditionChanged(false, bucketStartTimeNs + 50); -// -// // Now the alarm is delivered. Condition is off though. -// vector<shared_ptr<LogEvent>> allData; -// allData.push_back(ValueMetricProducerTestHelper::createEvent(bucket2StartTimeNs + 30, 30)); -// valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); -// -// // No buckets, we had a failure. -// assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}); -//} -// -///* -// * Test that DUMP_REPORT_REQUESTED dump reason is logged. -// * -// * For the bucket to be marked invalid during a dump report requested, -// * three things must be true: -// * - we want to include the current partial bucket -// * - we need a pull (metric is pulled and condition is true) -// * - the dump latency must be FAST -// */ -// -// TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenDumpReportRequested) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Condition change to true. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20); -// event->write("field1"); -// event->write(10); -// event->init(); -// data->push_back(event); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// // Condition change event. -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 20); -// -// // Check dump report. -// ProtoOutputStream output; -// std::set<string> strSet; -// valueProducer->onDumpReport(bucketStartTimeNs + 40, true /* include recent buckets */, true, -// FAST /* dumpLatency */, &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// EXPECT_TRUE(report.has_value_metrics()); -// EXPECT_EQ(0, report.value_metrics().data_size()); -// EXPECT_EQ(1, report.value_metrics().skipped_size()); -// -// EXPECT_EQ(NanoToMillis(bucketStartTimeNs), -// report.value_metrics().skipped(0).start_bucket_elapsed_millis()); -// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 40), -// report.value_metrics().skipped(0).end_bucket_elapsed_millis()); -// EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); -// -// auto dropEvent = report.value_metrics().skipped(0).drop_event(0); -// EXPECT_EQ(BucketDropReason::DUMP_REPORT_REQUESTED, dropEvent.drop_reason()); -// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 40), dropEvent.drop_time_millis()); -//} -// -///* -// * Test that EVENT_IN_WRONG_BUCKET dump reason is logged for a late condition -// * change event (i.e. the condition change occurs in the wrong bucket). -// */ -// TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenConditionEventWrongBucket) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Condition change to true. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 50); -// event->write("field1"); -// event->write(10); -// event->init(); -// data->push_back(event); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// // Condition change event. -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); -// -// // Bucket boundary pull. -// vector<shared_ptr<LogEvent>> allData; -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs); -// event->write("field1"); -// event->write(15); -// event->init(); -// allData.push_back(event); -// valueProducer->onDataPulled(allData, /** succeeds */ true, bucket2StartTimeNs + 1); -// -// // Late condition change event. -// valueProducer->onConditionChanged(false, bucket2StartTimeNs - 100); -// -// // Check dump report. -// ProtoOutputStream output; -// std::set<string> strSet; -// valueProducer->onDumpReport(bucket2StartTimeNs + 100, true /* include recent buckets */, true, -// NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// EXPECT_TRUE(report.has_value_metrics()); -// EXPECT_EQ(1, report.value_metrics().data_size()); -// EXPECT_EQ(1, report.value_metrics().skipped_size()); -// -// EXPECT_EQ(NanoToMillis(bucket2StartTimeNs), -// report.value_metrics().skipped(0).start_bucket_elapsed_millis()); -// EXPECT_EQ(NanoToMillis(bucket2StartTimeNs + 100), -// report.value_metrics().skipped(0).end_bucket_elapsed_millis()); -// EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); -// -// auto dropEvent = report.value_metrics().skipped(0).drop_event(0); -// EXPECT_EQ(BucketDropReason::EVENT_IN_WRONG_BUCKET, dropEvent.drop_reason()); -// EXPECT_EQ(NanoToMillis(bucket2StartTimeNs - 100), dropEvent.drop_time_millis()); -//} -// -///* -// * Test that EVENT_IN_WRONG_BUCKET dump reason is logged for a late accumulate -// * event (i.e. the accumulate events call occurs in the wrong bucket). -// */ -// TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenAccumulateEventWrongBucket) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Condition change to true. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 50); -// event->write("field1"); -// event->write(10); -// event->init(); -// data->push_back(event); -// return true; -// })) -// // Dump report requested. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + -// 100); event->write("field1"); event->write(15); event->init(); -// data->push_back(event); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// // Condition change event. -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); -// -// // Bucket boundary pull. -// vector<shared_ptr<LogEvent>> allData; -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs); -// event->write("field1"); -// event->write(15); -// event->init(); -// allData.push_back(event); -// valueProducer->onDataPulled(allData, /** succeeds */ true, bucket2StartTimeNs + 1); -// -// allData.clear(); -// event = make_shared<LogEvent>(tagId, bucket2StartTimeNs - 100); -// event->write("field1"); -// event->write(20); -// event->init(); -// allData.push_back(event); -// -// // Late accumulateEvents event. -// valueProducer->accumulateEvents(allData, bucket2StartTimeNs - 100, bucket2StartTimeNs - 100); -// -// // Check dump report. -// ProtoOutputStream output; -// std::set<string> strSet; -// valueProducer->onDumpReport(bucket2StartTimeNs + 100, true /* include recent buckets */, true, -// NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// EXPECT_TRUE(report.has_value_metrics()); -// EXPECT_EQ(1, report.value_metrics().data_size()); -// EXPECT_EQ(1, report.value_metrics().skipped_size()); -// -// EXPECT_EQ(NanoToMillis(bucket2StartTimeNs), -// report.value_metrics().skipped(0).start_bucket_elapsed_millis()); -// EXPECT_EQ(NanoToMillis(bucket2StartTimeNs + 100), -// report.value_metrics().skipped(0).end_bucket_elapsed_millis()); -// EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); -// -// auto dropEvent = report.value_metrics().skipped(0).drop_event(0); -// EXPECT_EQ(BucketDropReason::EVENT_IN_WRONG_BUCKET, dropEvent.drop_reason()); -// EXPECT_EQ(NanoToMillis(bucket2StartTimeNs - 100), dropEvent.drop_time_millis()); -//} -// -///* -// * Test that CONDITION_UNKNOWN dump reason is logged due to an unknown condition -// * when a metric is initialized. -// */ -// TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenConditionUnknown) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Condition change to true. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 50); -// event->write("field1"); -// event->write(10); -// event->init(); -// data->push_back(event); -// return true; -// })) -// // Dump report requested. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + -// 100); event->write("field1"); event->write(15); event->init(); -// data->push_back(event); -// return true; -// })); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithNoInitialCondition(pullerManager, -// metric); -// -// // Condition change event. -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); -// -// // Check dump report. -// ProtoOutputStream output; -// std::set<string> strSet; -// int64_t dumpReportTimeNs = bucketStartTimeNs + 10000; -// valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true, -// NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// EXPECT_TRUE(report.has_value_metrics()); -// EXPECT_EQ(0, report.value_metrics().data_size()); -// EXPECT_EQ(1, report.value_metrics().skipped_size()); -// -// EXPECT_EQ(NanoToMillis(bucketStartTimeNs), -// report.value_metrics().skipped(0).start_bucket_elapsed_millis()); -// EXPECT_EQ(NanoToMillis(dumpReportTimeNs), -// report.value_metrics().skipped(0).end_bucket_elapsed_millis()); -// EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); -// -// auto dropEvent = report.value_metrics().skipped(0).drop_event(0); -// EXPECT_EQ(BucketDropReason::CONDITION_UNKNOWN, dropEvent.drop_reason()); -// EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis()); -//} -// -///* -// * Test that PULL_FAILED dump reason is logged due to a pull failure in -// * #pullAndMatchEventsLocked. -// */ -// TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenPullFailed) { -// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); -// -// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); -// EXPECT_CALL(*pullerManager, Pull(tagId, _)) -// // Condition change to true. -// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { -// data->clear(); -// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 50); -// event->write("field1"); -// event->write(10); -// event->init(); -// data->push_back(event); -// return true; -// })) -// // Dump report requested, pull fails. -// .WillOnce(Return(false)); -// -// sp<ValueMetricProducer> valueProducer = -// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, -// metric); -// -// // Condition change event. -// valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); -// -// // Check dump report. -// ProtoOutputStream output; -// std::set<string> strSet; -// int64_t dumpReportTimeNs = bucketStartTimeNs + 10000; -// valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true, -// NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); -// -// StatsLogReport report = outputStreamToProto(&output); -// EXPECT_TRUE(report.has_value_metrics()); -// EXPECT_EQ(0, report.value_metrics().data_size()); -// EXPECT_EQ(1, report.value_metrics().skipped_size()); -// -// EXPECT_EQ(NanoToMillis(bucketStartTimeNs), -// report.value_metrics().skipped(0).start_bucket_elapsed_millis()); -// EXPECT_EQ(NanoToMillis(dumpReportTimeNs), -// report.value_metrics().skipped(0).end_bucket_elapsed_millis()); -// EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); -// -// auto dropEvent = report.value_metrics().skipped(0).drop_event(0); -// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason()); -// EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis()); -//} -// + +TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onConditionChanged) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // First onConditionChanged + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); + return true; + })) + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 10); + EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + ValueMetricProducer::Interval& curInterval = + valueProducer->mCurrentSlicedBucket.begin()->second[0]; + ValueMetricProducer::BaseInfo curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(true, curBaseInfo.hasBase); + EXPECT_EQ(false, curInterval.hasValue); + EXPECT_EQ(true, valueProducer->mHasGlobalBase); + + // Empty pull. + valueProducer->onConditionChanged(false, bucketStartTimeNs + 10); + EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; + curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(false, curBaseInfo.hasBase); + EXPECT_EQ(false, curInterval.hasValue); + EXPECT_EQ(false, valueProducer->mHasGlobalBase); +} + +TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onBucketBoundary) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // First onConditionChanged + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); + return true; + })) + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 2)); + return true; + })) + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 5)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 10); + valueProducer->onConditionChanged(false, bucketStartTimeNs + 11); + valueProducer->onConditionChanged(true, bucketStartTimeNs + 12); + EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + ValueMetricProducer::Interval& curInterval = + valueProducer->mCurrentSlicedBucket.begin()->second[0]; + ValueMetricProducer::BaseInfo curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(true, curBaseInfo.hasBase); + EXPECT_EQ(true, curInterval.hasValue); + EXPECT_EQ(true, valueProducer->mHasGlobalBase); + + // End of bucket + vector<shared_ptr<LogEvent>> allData; + allData.clear(); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; + curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + // Data is empty, base should be reset. + EXPECT_EQ(false, curBaseInfo.hasBase); + EXPECT_EQ(5, curBaseInfo.base.long_value); + EXPECT_EQ(false, curInterval.hasValue); + EXPECT_EQ(true, valueProducer->mHasGlobalBase); + + EXPECT_EQ(1UL, valueProducer->mPastBuckets.size()); + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {1}, {bucketSizeNs - 12 + 1}); +} + +TEST(ValueMetricProducerTest, TestPartialResetOnBucketBoundaries) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + metric.mutable_dimensions_in_what()->set_field(tagId); + metric.mutable_dimensions_in_what()->add_child()->set_field(1); + metric.set_condition(StringToId("SCREEN_ON")); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // First onConditionChanged + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 10); + EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + + // End of bucket + vector<shared_ptr<LogEvent>> allData; + allData.clear(); + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 2)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + // Key 1 should be reset since in not present in the most pull. + EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size()); + auto iterator = valueProducer->mCurrentSlicedBucket.begin(); + auto baseInfoIter = valueProducer->mCurrentBaseInfo.begin(); + EXPECT_EQ(true, baseInfoIter->second[0].hasBase); + EXPECT_EQ(2, baseInfoIter->second[0].base.long_value); + EXPECT_EQ(false, iterator->second[0].hasValue); + iterator++; + baseInfoIter++; + EXPECT_EQ(false, baseInfoIter->second[0].hasBase); + EXPECT_EQ(1, baseInfoIter->second[0].base.long_value); + EXPECT_EQ(false, iterator->second[0].hasValue); + + EXPECT_EQ(true, valueProducer->mHasGlobalBase); +} + +TEST(ValueMetricProducerTest, TestFullBucketResetWhenLastBucketInvalid) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Initialization. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); + return true; + })) + // notifyAppUpgrade. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent( + tagId, bucketStartTimeNs + bucketSizeNs / 2, 10)); + return true; + })); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); + ASSERT_EQ(0UL, valueProducer->mCurrentFullBucket.size()); + + valueProducer->notifyAppUpgrade(bucketStartTimeNs + bucketSizeNs / 2, "com.foo", 10000, 1); + ASSERT_EQ(1UL, valueProducer->mCurrentFullBucket.size()); + + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs + 1, 4)); + valueProducer->onDataPulled(allData, /** fails */ false, bucket3StartTimeNs + 1); + ASSERT_EQ(0UL, valueProducer->mCurrentFullBucket.size()); +} + +TEST(ValueMetricProducerTest, TestBucketBoundariesOnConditionChange) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Second onConditionChanged. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 10, 5)); + return true; + })) + // Third onConditionChanged. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs + 10, 7)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + valueProducer->mCondition = ConditionState::kUnknown; + + valueProducer->onConditionChanged(false, bucketStartTimeNs); + ASSERT_EQ(0UL, valueProducer->mCurrentSlicedBucket.size()); + + // End of first bucket + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 4)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 1); + ASSERT_EQ(0UL, valueProducer->mCurrentSlicedBucket.size()); + + valueProducer->onConditionChanged(true, bucket2StartTimeNs + 10); + ASSERT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + auto curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; + auto curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(true, curBaseInfo.hasBase); + EXPECT_EQ(5, curBaseInfo.base.long_value); + EXPECT_EQ(false, curInterval.hasValue); + + valueProducer->onConditionChanged(false, bucket3StartTimeNs + 10); + + // Bucket should have been completed. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {bucketSizeNs - 10}); +} + +TEST(ValueMetricProducerTest, TestLateOnDataPulledWithoutDiff) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + metric.set_use_diff(false); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); + + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucketStartTimeNs + 30); + + allData.clear(); + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 20)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + // Bucket should have been completed. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs}); +} + +TEST(ValueMetricProducerTest, TestLateOnDataPulledWithDiff) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Initialization. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); + + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucketStartTimeNs + 30); + + allData.clear(); + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 20)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + // Bucket should have been completed. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {19}, {bucketSizeNs}); +} + +TEST(ValueMetricProducerTest, TestBucketBoundariesOnAppUpgrade) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Initialization. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); + return true; + })) + // notifyAppUpgrade. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 2, 10)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); + + valueProducer->notifyAppUpgrade(bucket2StartTimeNs + 2, "com.foo", 10000, 1); + + // Bucket should have been completed. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {9}, {bucketSizeNs}); +} + +TEST(ValueMetricProducerTest, TestDataIsNotUpdatedWhenNoConditionChanged) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // First on condition changed. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); + return true; + })) + // Second on condition changed. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); + valueProducer->onConditionChanged(false, bucketStartTimeNs + 10); + valueProducer->onConditionChanged(false, bucketStartTimeNs + 10); + + EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + auto curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; + auto curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(true, curInterval.hasValue); + EXPECT_EQ(2, curInterval.value.long_value); + + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 10)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 1); + + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {2}, {2}); +} + +// TODO: b/145705635 fix or delete this test +TEST(ValueMetricProducerTest, TestBucketInvalidIfGlobalBaseIsNotSet) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // First condition change. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); + return true; + })) + // 2nd condition change. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 1)); + return true; + })) + // 3rd condition change. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 1)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + valueProducer->onConditionChanged(true, bucket2StartTimeNs + 10); + + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 3, 10)); + valueProducer->onDataPulled(allData, /** succeed */ false, bucketStartTimeNs + 3); + + allData.clear(); + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 20)); + valueProducer->onDataPulled(allData, /** succeed */ false, bucket2StartTimeNs); + + valueProducer->onConditionChanged(false, bucket2StartTimeNs + 8); + valueProducer->onConditionChanged(true, bucket2StartTimeNs + 10); + + allData.clear(); + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs, 30)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + // There was not global base available so all buckets are invalid. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}); +} + +TEST(ValueMetricProducerTest, TestPullNeededFastDump) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + + UidMap uidMap; + SimpleAtomMatcher atomMatcher; + atomMatcher.set_atom_id(tagId); + sp<EventMatcherWizard> eventMatcherWizard = + new EventMatcherWizard({new SimpleLogMatchingTracker( + atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); + sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); + EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); + + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Initial pull. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateThreeValueLogEvent(tagId, bucketStartTimeNs, tagId, 1, 1)); + return true; + })); + + ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex, + eventMatcherWizard, tagId, bucketStartTimeNs, + bucketStartTimeNs, pullerManager); + + ProtoOutputStream output; + std::set<string> strSet; + valueProducer.onDumpReport(bucketStartTimeNs + 10, true /* include recent buckets */, true, + FAST, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + // Bucket is invalid since we did not pull when dump report was called. + EXPECT_EQ(0, report.value_metrics().data_size()); +} + +TEST(ValueMetricProducerTest, TestFastDumpWithoutCurrentBucket) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + + UidMap uidMap; + SimpleAtomMatcher atomMatcher; + atomMatcher.set_atom_id(tagId); + sp<EventMatcherWizard> eventMatcherWizard = + new EventMatcherWizard({new SimpleLogMatchingTracker( + atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); + sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); + EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); + + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Initial pull. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateThreeValueLogEvent(tagId, bucketStartTimeNs, tagId, 1, 1)); + return true; + })); + + ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex, + eventMatcherWizard, tagId, bucketStartTimeNs, + bucketStartTimeNs, pullerManager); + + vector<shared_ptr<LogEvent>> allData; + allData.clear(); + allData.push_back(CreateThreeValueLogEvent(tagId, bucket2StartTimeNs + 1, tagId, 2, 2)); + valueProducer.onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + ProtoOutputStream output; + std::set<string> strSet; + valueProducer.onDumpReport(bucket4StartTimeNs, false /* include recent buckets */, true, FAST, + &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + // Previous bucket is part of the report. + EXPECT_EQ(1, report.value_metrics().data_size()); + EXPECT_EQ(0, report.value_metrics().data(0).bucket_info(0).bucket_num()); +} + +TEST(ValueMetricProducerTest, TestPullNeededNoTimeConstraints) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + + UidMap uidMap; + SimpleAtomMatcher atomMatcher; + atomMatcher.set_atom_id(tagId); + sp<EventMatcherWizard> eventMatcherWizard = + new EventMatcherWizard({new SimpleLogMatchingTracker( + atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); + sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>(); + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); + EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return()); + + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Initial pull. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateThreeValueLogEvent(tagId, bucketStartTimeNs, tagId, 1, 1)); + return true; + })) + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back( + CreateThreeValueLogEvent(tagId, bucketStartTimeNs + 10, tagId, 3, 3)); + return true; + })); + + ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, logEventMatcherIndex, + eventMatcherWizard, tagId, bucketStartTimeNs, + bucketStartTimeNs, pullerManager); + + ProtoOutputStream output; + std::set<string> strSet; + valueProducer.onDumpReport(bucketStartTimeNs + 10, true /* include recent buckets */, true, + NO_TIME_CONSTRAINTS, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_EQ(1, report.value_metrics().data_size()); + EXPECT_EQ(1, report.value_metrics().data(0).bucket_info_size()); + EXPECT_EQ(2, report.value_metrics().data(0).bucket_info(0).values(0).value_long()); +} + +TEST(ValueMetricProducerTest, TestPulledData_noDiff_withoutCondition) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); + metric.set_use_diff(false); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); + + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 10)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs + 30); + + // Bucket should have been completed. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {10}, {bucketSizeNs}); +} + +TEST(ValueMetricProducerTest, TestPulledData_noDiff_withMultipleConditionChanges) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + metric.set_use_diff(false); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // condition becomes true + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); + return true; + })) + // condition becomes false + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 20)); + return true; + })); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + valueProducer->mCondition = ConditionState::kFalse; + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); + valueProducer->onConditionChanged(false, bucketStartTimeNs + 50); + // has one slice + EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size()); + ValueMetricProducer::Interval curInterval = + valueProducer->mCurrentSlicedBucket.begin()->second[0]; + ValueMetricProducer::BaseInfo curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(false, curBaseInfo.hasBase); + EXPECT_EQ(true, curInterval.hasValue); + EXPECT_EQ(20, curInterval.value.long_value); + + // Now the alarm is delivered. Condition is off though. + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 110)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {20}, {50 - 8}); + curInterval = valueProducer->mCurrentSlicedBucket.begin()->second[0]; + curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(false, curBaseInfo.hasBase); + EXPECT_EQ(false, curInterval.hasValue); +} + +TEST(ValueMetricProducerTest, TestPulledData_noDiff_bucketBoundaryTrue) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + metric.set_use_diff(false); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // condition becomes true + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); + return true; + })); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + valueProducer->mCondition = ConditionState::kFalse; + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); + + // Now the alarm is delivered. Condition is off though. + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 30)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {30}, {bucketSizeNs - 8}); + ValueMetricProducer::Interval curInterval = + valueProducer->mCurrentSlicedBucket.begin()->second[0]; + ValueMetricProducer::BaseInfo curBaseInfo = valueProducer->mCurrentBaseInfo.begin()->second[0]; + EXPECT_EQ(false, curBaseInfo.hasBase); + EXPECT_EQ(false, curInterval.hasValue); +} + +TEST(ValueMetricProducerTest, TestPulledData_noDiff_bucketBoundaryFalse) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + metric.set_use_diff(false); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + valueProducer->mCondition = ConditionState::kFalse; + + // Now the alarm is delivered. Condition is off though. + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 30)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + // Condition was always false. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}); +} + +TEST(ValueMetricProducerTest, TestPulledData_noDiff_withFailure) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + metric.set_use_diff(false); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // condition becomes true + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); + return true; + })) + .WillOnce(Return(false)); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + valueProducer->mCondition = ConditionState::kFalse; + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 8); + valueProducer->onConditionChanged(false, bucketStartTimeNs + 50); + + // Now the alarm is delivered. Condition is off though. + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 30, 30)); + valueProducer->onDataPulled(allData, /** succeed */ true, bucket2StartTimeNs); + + // No buckets, we had a failure. + assertPastBucketValuesSingleKey(valueProducer->mPastBuckets, {}, {}); +} + +/* + * Test that DUMP_REPORT_REQUESTED dump reason is logged. + * + * For the bucket to be marked invalid during a dump report requested, + * three things must be true: + * - we want to include the current partial bucket + * - we need a pull (metric is pulled and condition is true) + * - the dump latency must be FAST + */ + +TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenDumpReportRequested) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Condition change to true. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 20, 10)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + // Condition change event. + valueProducer->onConditionChanged(true, bucketStartTimeNs + 20); + + // Check dump report. + ProtoOutputStream output; + std::set<string> strSet; + valueProducer->onDumpReport(bucketStartTimeNs + 40, true /* include recent buckets */, true, + FAST /* dumpLatency */, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_TRUE(report.has_value_metrics()); + EXPECT_EQ(0, report.value_metrics().data_size()); + EXPECT_EQ(1, report.value_metrics().skipped_size()); + + EXPECT_EQ(NanoToMillis(bucketStartTimeNs), + report.value_metrics().skipped(0).start_bucket_elapsed_millis()); + EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 40), + report.value_metrics().skipped(0).end_bucket_elapsed_millis()); + EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); + + auto dropEvent = report.value_metrics().skipped(0).drop_event(0); + EXPECT_EQ(BucketDropReason::DUMP_REPORT_REQUESTED, dropEvent.drop_reason()); + EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 40), dropEvent.drop_time_millis()); +} + +/* + * Test that EVENT_IN_WRONG_BUCKET dump reason is logged for a late condition + * change event (i.e. the condition change occurs in the wrong bucket). + */ +TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenConditionEventWrongBucket) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Condition change to true. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + // Condition change event. + valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); + + // Bucket boundary pull. + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 15)); + valueProducer->onDataPulled(allData, /** succeeds */ true, bucket2StartTimeNs + 1); + + // Late condition change event. + valueProducer->onConditionChanged(false, bucket2StartTimeNs - 100); + + // Check dump report. + ProtoOutputStream output; + std::set<string> strSet; + valueProducer->onDumpReport(bucket2StartTimeNs + 100, true /* include recent buckets */, true, + NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_TRUE(report.has_value_metrics()); + EXPECT_EQ(1, report.value_metrics().data_size()); + EXPECT_EQ(1, report.value_metrics().skipped_size()); + + EXPECT_EQ(NanoToMillis(bucket2StartTimeNs), + report.value_metrics().skipped(0).start_bucket_elapsed_millis()); + EXPECT_EQ(NanoToMillis(bucket2StartTimeNs + 100), + report.value_metrics().skipped(0).end_bucket_elapsed_millis()); + EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); + + auto dropEvent = report.value_metrics().skipped(0).drop_event(0); + EXPECT_EQ(BucketDropReason::EVENT_IN_WRONG_BUCKET, dropEvent.drop_reason()); + EXPECT_EQ(NanoToMillis(bucket2StartTimeNs - 100), dropEvent.drop_time_millis()); +} + +/* + * Test that EVENT_IN_WRONG_BUCKET dump reason is logged for a late accumulate + * event (i.e. the accumulate events call occurs in the wrong bucket). + */ +TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenAccumulateEventWrongBucket) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Condition change to true. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); + return true; + })) + // Dump report requested. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 100, 15)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + // Condition change event. + valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); + + // Bucket boundary pull. + vector<shared_ptr<LogEvent>> allData; + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 15)); + valueProducer->onDataPulled(allData, /** succeeds */ true, bucket2StartTimeNs + 1); + + allData.clear(); + allData.push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs - 100, 20)); + + // Late accumulateEvents event. + valueProducer->accumulateEvents(allData, bucket2StartTimeNs - 100, bucket2StartTimeNs - 100); + + // Check dump report. + ProtoOutputStream output; + std::set<string> strSet; + valueProducer->onDumpReport(bucket2StartTimeNs + 100, true /* include recent buckets */, true, + NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_TRUE(report.has_value_metrics()); + EXPECT_EQ(1, report.value_metrics().data_size()); + EXPECT_EQ(1, report.value_metrics().skipped_size()); + + EXPECT_EQ(NanoToMillis(bucket2StartTimeNs), + report.value_metrics().skipped(0).start_bucket_elapsed_millis()); + EXPECT_EQ(NanoToMillis(bucket2StartTimeNs + 100), + report.value_metrics().skipped(0).end_bucket_elapsed_millis()); + EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); + + auto dropEvent = report.value_metrics().skipped(0).drop_event(0); + EXPECT_EQ(BucketDropReason::EVENT_IN_WRONG_BUCKET, dropEvent.drop_reason()); + EXPECT_EQ(NanoToMillis(bucket2StartTimeNs - 100), dropEvent.drop_time_millis()); +} + +/* + * Test that CONDITION_UNKNOWN dump reason is logged due to an unknown condition + * when a metric is initialized. + */ +TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenConditionUnknown) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Condition change to true. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); + return true; + })) + // Dump report requested. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 100, 15)); + return true; + })); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithNoInitialCondition(pullerManager, + metric); + + // Condition change event. + valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); + + // Check dump report. + ProtoOutputStream output; + std::set<string> strSet; + int64_t dumpReportTimeNs = bucketStartTimeNs + 10000; + valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true, + NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_TRUE(report.has_value_metrics()); + EXPECT_EQ(0, report.value_metrics().data_size()); + EXPECT_EQ(1, report.value_metrics().skipped_size()); + + EXPECT_EQ(NanoToMillis(bucketStartTimeNs), + report.value_metrics().skipped(0).start_bucket_elapsed_millis()); + EXPECT_EQ(NanoToMillis(dumpReportTimeNs), + report.value_metrics().skipped(0).end_bucket_elapsed_millis()); + EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); + + auto dropEvent = report.value_metrics().skipped(0).drop_event(0); + EXPECT_EQ(BucketDropReason::CONDITION_UNKNOWN, dropEvent.drop_reason()); + EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis()); +} + +/* + * Test that PULL_FAILED dump reason is logged due to a pull failure in + * #pullAndMatchEventsLocked. + */ +TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenPullFailed) { + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, _)) + // Condition change to true. + .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); + return true; + })) + // Dump report requested, pull fails. + .WillOnce(Return(false)); + + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric); + + // Condition change event. + valueProducer->onConditionChanged(true, bucketStartTimeNs + 50); + + // Check dump report. + ProtoOutputStream output; + std::set<string> strSet; + int64_t dumpReportTimeNs = bucketStartTimeNs + 10000; + valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true, + NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output); + + StatsLogReport report = outputStreamToProto(&output); + EXPECT_TRUE(report.has_value_metrics()); + EXPECT_EQ(0, report.value_metrics().data_size()); + EXPECT_EQ(1, report.value_metrics().skipped_size()); + + EXPECT_EQ(NanoToMillis(bucketStartTimeNs), + report.value_metrics().skipped(0).start_bucket_elapsed_millis()); + EXPECT_EQ(NanoToMillis(dumpReportTimeNs), + report.value_metrics().skipped(0).end_bucket_elapsed_millis()); + EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size()); + + auto dropEvent = report.value_metrics().skipped(0).drop_event(0); + EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason()); + EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis()); +} + ///* // * Test that MULTIPLE_BUCKETS_SKIPPED dump reason is logged when a log event // * skips over more than one bucket. diff --git a/config/hiddenapi-greylist-max-q.txt b/config/hiddenapi-greylist-max-q.txt index a895a44f4023..4832dd184ec5 100644 --- a/config/hiddenapi-greylist-max-q.txt +++ b/config/hiddenapi-greylist-max-q.txt @@ -406,7 +406,6 @@ Lcom/android/internal/R$string;->cancel:I Lcom/android/internal/R$string;->enable_explore_by_touch_warning_title:I Lcom/android/internal/R$string;->gigabyteShort:I Lcom/android/internal/R$string;->kilobyteShort:I -Lcom/android/internal/R$string;->map:I Lcom/android/internal/R$string;->megabyteShort:I Lcom/android/internal/R$string;->notification_title:I Lcom/android/internal/R$string;->no_matches:I diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index 81671c349cbd..9f5dee98acb7 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -250,28 +250,6 @@ public class ResourcesManager { return dm; } - private static void applyNonDefaultDisplayMetricsToConfiguration( - @NonNull DisplayMetrics dm, @NonNull Configuration config) { - config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH; - config.densityDpi = dm.densityDpi; - config.screenWidthDp = (int) (dm.widthPixels / dm.density); - config.screenHeightDp = (int) (dm.heightPixels / dm.density); - int sl = Configuration.resetScreenLayout(config.screenLayout); - if (dm.widthPixels > dm.heightPixels) { - config.orientation = Configuration.ORIENTATION_LANDSCAPE; - config.screenLayout = Configuration.reduceScreenLayout(sl, - config.screenWidthDp, config.screenHeightDp); - } else { - config.orientation = Configuration.ORIENTATION_PORTRAIT; - config.screenLayout = Configuration.reduceScreenLayout(sl, - config.screenHeightDp, config.screenWidthDp); - } - config.smallestScreenWidthDp = Math.min(config.screenWidthDp, config.screenHeightDp); - config.compatScreenWidthDp = config.screenWidthDp; - config.compatScreenHeightDp = config.screenHeightDp; - config.compatSmallestScreenWidthDp = config.smallestScreenWidthDp; - } - public boolean applyCompatConfigurationLocked(int displayDensity, @NonNull Configuration compatConfiguration) { if (mResCompatibilityInfo != null && !mResCompatibilityInfo.supportsScreen()) { @@ -519,17 +497,11 @@ public class ResourcesManager { private Configuration generateConfig(@NonNull ResourcesKey key, @NonNull DisplayMetrics dm) { Configuration config; - final boolean isDefaultDisplay = (key.mDisplayId == Display.DEFAULT_DISPLAY); final boolean hasOverrideConfig = key.hasOverrideConfiguration(); - if (!isDefaultDisplay || hasOverrideConfig) { + if (hasOverrideConfig) { config = new Configuration(getConfiguration()); - if (!isDefaultDisplay) { - applyNonDefaultDisplayMetricsToConfiguration(dm, config); - } - if (hasOverrideConfig) { - config.updateFrom(key.mOverrideConfiguration); - if (DEBUG) Slog.v(TAG, "Applied overrideConfig=" + key.mOverrideConfiguration); - } + config.updateFrom(key.mOverrideConfiguration); + if (DEBUG) Slog.v(TAG, "Applied overrideConfig=" + key.mOverrideConfiguration); } else { config = getConfiguration(); } @@ -1110,8 +1082,6 @@ public class ResourcesManager { + resourcesImpl + " config to: " + config); } int displayId = key.mDisplayId; - final boolean hasOverrideConfiguration = key.hasOverrideConfiguration(); - tmpConfig.setTo(config); // Get new DisplayMetrics based on the DisplayAdjustments given to the ResourcesImpl. Update // a copy if the CompatibilityInfo changed, because the ResourcesImpl object will handle the @@ -1121,15 +1091,12 @@ public class ResourcesManager { daj = new DisplayAdjustments(daj); daj.setCompatibilityInfo(compat); } - daj.setConfiguration(config); - DisplayMetrics dm = getDisplayMetrics(displayId, daj); - if (displayId != Display.DEFAULT_DISPLAY) { - applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig); - } - - if (hasOverrideConfiguration) { + tmpConfig.setTo(config); + if (key.hasOverrideConfiguration()) { tmpConfig.updateFrom(key.mOverrideConfiguration); } + daj.setConfiguration(tmpConfig); + DisplayMetrics dm = getDisplayMetrics(displayId, daj); resourcesImpl.updateConfiguration(tmpConfig, dm, compat); } diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java index d4b5b1aab532..4bd7b059dfaa 100644 --- a/core/java/android/companion/CompanionDeviceManager.java +++ b/core/java/android/companion/CompanionDeviceManager.java @@ -257,11 +257,22 @@ public final class CompanionDeviceManager { /** * Check if a given package was {@link #associate associated} with a device with given - * mac address by given user. + * Wi-Fi MAC address for a given user. * - * @param packageName the package to check for - * @param macAddress the mac address or BSSID of the device to check for - * @param user the user to check for + * <p>This is a system API protected by the + * {@link andrioid.Manifest.permission#MANAGE_COMPANION_DEVICES} permission, that’s currently + * called by the Android Wi-Fi stack to determine whether user consent is required to connect + * to a Wi-Fi network. Devices that have been pre-registered as companion devices will not + * require user consent to connect.</p> + * + * <p>Note if the caller has the + * {@link android.Manifest.permission#COMPANION_APPROVE_WIFI_CONNECTIONS} permission, this + * method will return true by default.</p> + * + * @param packageName the name of the package that has the association with the companion device + * @param macAddress the Wi-Fi MAC address or BSSID of the companion device to check for + * @param user the user handle that currently hosts the package being queried for a companion + * device association * @return whether a corresponding association record exists * * @hide diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl index 8a89840876d9..27c9cfcdd05b 100644 --- a/core/java/android/content/pm/ILauncherApps.aidl +++ b/core/java/android/content/pm/ILauncherApps.aidl @@ -103,4 +103,7 @@ interface ILauncherApps { in UserHandle user); void uncacheShortcuts(String callingPackage, String packageName, in List<String> shortcutIds, in UserHandle user); + + String getShortcutIconUri(String callingPackage, String packageName, String shortcutId, + int userId); } diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 22516f069e83..e73fd03e34b6 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -51,6 +51,7 @@ import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -67,8 +68,10 @@ import android.util.DisplayMetrics; import android.util.Log; import android.util.Pair; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.function.pooled.PooledLambda; +import java.io.FileNotFoundException; import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1198,6 +1201,35 @@ public class LauncherApps { } /** + * @hide internal/unit tests only + */ + @VisibleForTesting + public ParcelFileDescriptor getUriShortcutIconFd(@NonNull ShortcutInfo shortcut) { + return getUriShortcutIconFd(shortcut.getPackage(), shortcut.getId(), shortcut.getUserId()); + } + + private ParcelFileDescriptor getUriShortcutIconFd(@NonNull String packageName, + @NonNull String shortcutId, int userId) { + String uri = null; + try { + uri = mService.getShortcutIconUri(mContext.getPackageName(), packageName, shortcutId, + userId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + + if (uri == null) { + return null; + } + try { + return mContext.getContentResolver().openFileDescriptor(Uri.parse(uri), "r"); + } catch (FileNotFoundException e) { + Log.e(TAG, "Icon file not found: " + uri); + return null; + } + } + + /** * Returns the icon for this shortcut, without any badging for the profile. * * <p>The calling launcher application must be allowed to access the shortcut information, @@ -1217,26 +1249,10 @@ public class LauncherApps { public Drawable getShortcutIconDrawable(@NonNull ShortcutInfo shortcut, int density) { if (shortcut.hasIconFile()) { final ParcelFileDescriptor pfd = getShortcutIconFd(shortcut); - if (pfd == null) { - return null; - } - try { - final Bitmap bmp = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor()); - if (bmp != null) { - BitmapDrawable dr = new BitmapDrawable(mContext.getResources(), bmp); - if (shortcut.hasAdaptiveBitmap()) { - return new AdaptiveIconDrawable(null, dr); - } else { - return dr; - } - } - return null; - } finally { - try { - pfd.close(); - } catch (IOException ignore) { - } - } + return loadDrawableFromFileDescriptor(pfd, shortcut.hasAdaptiveBitmap()); + } else if (shortcut.hasIconUri()) { + final ParcelFileDescriptor pfd = getUriShortcutIconFd(shortcut); + return loadDrawableFromFileDescriptor(pfd, shortcut.hasAdaptiveBitmap()); } else if (shortcut.hasIconResource()) { return loadDrawableResourceFromPackage(shortcut.getPackage(), shortcut.getIconResourceId(), shortcut.getUserHandle(), density); @@ -1260,6 +1276,29 @@ public class LauncherApps { } } + private Drawable loadDrawableFromFileDescriptor(ParcelFileDescriptor pfd, boolean adaptive) { + if (pfd == null) { + return null; + } + try { + final Bitmap bmp = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor()); + if (bmp != null) { + BitmapDrawable dr = new BitmapDrawable(mContext.getResources(), bmp); + if (adaptive) { + return new AdaptiveIconDrawable(null, dr); + } else { + return dr; + } + } + return null; + } finally { + try { + pfd.close(); + } catch (IOException ignore) { + } + } + } + private Drawable loadDrawableResourceFromPackage(String packageName, int resId, UserHandle user, int density) { try { diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java index af875787bba6..8d8776f1bc23 100644 --- a/core/java/android/content/pm/ShortcutInfo.java +++ b/core/java/android/content/pm/ShortcutInfo.java @@ -123,6 +123,9 @@ public final class ShortcutInfo implements Parcelable { public static final int FLAG_CACHED = 1 << 14; /** @hide */ + public static final int FLAG_HAS_ICON_URI = 1 << 15; + + /** @hide */ @IntDef(flag = true, prefix = { "FLAG_" }, value = { FLAG_DYNAMIC, FLAG_PINNED, @@ -139,6 +142,7 @@ public final class ShortcutInfo implements Parcelable { FLAG_SHADOW, FLAG_LONG_LIVED, FLAG_CACHED, + FLAG_HAS_ICON_URI, }) @Retention(RetentionPolicy.SOURCE) public @interface ShortcutFlags {} @@ -401,6 +405,9 @@ public final class ShortcutInfo implements Parcelable { private String mIconResName; // Internal use only. + private String mIconUri; + + // Internal use only. @Nullable private String mBitmapPath; @@ -554,6 +561,7 @@ public final class ShortcutInfo implements Parcelable { if ((cloneFlags & CLONE_REMOVE_ICON) == 0) { mIcon = source.mIcon; mBitmapPath = source.mBitmapPath; + mIconUri = source.mIconUri; } mTitle = source.mTitle; @@ -856,6 +864,7 @@ public final class ShortcutInfo implements Parcelable { mIconResId = 0; mIconResName = null; mBitmapPath = null; + mIconUri = null; } if (source.mTitle != null) { mTitle = source.mTitle; @@ -916,6 +925,8 @@ public final class ShortcutInfo implements Parcelable { case Icon.TYPE_RESOURCE: case Icon.TYPE_BITMAP: case Icon.TYPE_ADAPTIVE_BITMAP: + case Icon.TYPE_URI: + case Icon.TYPE_URI_ADAPTIVE_BITMAP: break; // OK default: throw getInvalidIconException(); @@ -1792,6 +1803,15 @@ public final class ShortcutInfo implements Parcelable { return hasFlags(FLAG_HAS_ICON_RES); } + /** + * Return whether a shortcut's icon is provided via a URI. + * + * @hide internal/unit tests only + */ + public boolean hasIconUri() { + return hasFlags(FLAG_HAS_ICON_URI); + } + /** @hide */ public boolean hasStringResources() { return (mTitleResId != 0) || (mTextResId != 0) || (mDisabledMessageResId != 0); @@ -1911,6 +1931,19 @@ public final class ShortcutInfo implements Parcelable { return mIconResId; } + /** @hide */ + public void setIconUri(String iconUri) { + mIconUri = iconUri; + } + + /** + * Get the Uri for the icon, valid only when {@link #hasIconUri()} } is true. + * @hide internal / tests only. + */ + public String getIconUri() { + return mIconUri; + } + /** * Bitmap path. Note this will be null even if {@link #hasIconFile()} is set when the save * is pending. Use {@link #isIconPendingSave()} to check it. @@ -2062,6 +2095,7 @@ public final class ShortcutInfo implements Parcelable { mPersons = source.readParcelableArray(cl, Person.class); mLocusId = source.readParcelable(cl); + mIconUri = source.readString(); } @Override @@ -2112,6 +2146,7 @@ public final class ShortcutInfo implements Parcelable { dest.writeParcelableArray(mPersons, flags); dest.writeParcelable(mLocusId, flags); + dest.writeString(mIconUri); } public static final @android.annotation.NonNull Creator<ShortcutInfo> CREATOR = @@ -2203,6 +2238,12 @@ public final class ShortcutInfo implements Parcelable { if (hasIconResource()) { sb.append("Ic-r"); } + if (hasIconUri()) { + sb.append("Ic-u"); + } + if (hasAdaptiveBitmap()) { + sb.append("Ic-a"); + } if (hasKeyFieldsOnly()) { sb.append("Key"); } @@ -2325,6 +2366,9 @@ public final class ShortcutInfo implements Parcelable { sb.append(", bitmapPath="); sb.append(mBitmapPath); + + sb.append(", iconUri="); + sb.append(mIconUri); } if (mLocusId != null) { @@ -2343,8 +2387,8 @@ public final class ShortcutInfo implements Parcelable { CharSequence disabledMessage, int disabledMessageResId, String disabledMessageResName, Set<String> categories, Intent[] intentsWithExtras, int rank, PersistableBundle extras, long lastChangedTimestamp, - int flags, int iconResId, String iconResName, String bitmapPath, int disabledReason, - Person[] persons, LocusId locusId) { + int flags, int iconResId, String iconResName, String bitmapPath, String iconUri, + int disabledReason, Person[] persons, LocusId locusId) { mUserId = userId; mId = id; mPackageName = packageName; @@ -2369,6 +2413,7 @@ public final class ShortcutInfo implements Parcelable { mIconResId = iconResId; mIconResName = iconResName; mBitmapPath = bitmapPath; + mIconUri = iconUri; mDisabledReason = disabledReason; mPersons = persons; mLocusId = locusId; diff --git a/core/java/android/content/pm/ShortcutServiceInternal.java b/core/java/android/content/pm/ShortcutServiceInternal.java index a50ce92a70bf..435c70ae999b 100644 --- a/core/java/android/content/pm/ShortcutServiceInternal.java +++ b/core/java/android/content/pm/ShortcutServiceInternal.java @@ -103,4 +103,10 @@ public abstract class ShortcutServiceInternal { */ public abstract List<ShortcutManager.ShareShortcutInfo> getShareTargets( @NonNull String callingPackage, @NonNull IntentFilter intentFilter, int userId); + + /** + * Returns the icon Uri of the shortcut, and grants Uri read permission to the caller. + */ + public abstract String getShortcutIconUri(int launcherUserId, @NonNull String launcherPackage, + @NonNull String packageName, @NonNull String shortcutId, int userId); } diff --git a/core/java/android/net/NattKeepalivePacketData.java b/core/java/android/net/NattKeepalivePacketData.java index bd39c13ba092..29da4952daa5 100644 --- a/core/java/android/net/NattKeepalivePacketData.java +++ b/core/java/android/net/NattKeepalivePacketData.java @@ -20,6 +20,7 @@ import static android.net.InvalidPacketException.ERROR_INVALID_IP_ADDRESS; import static android.net.InvalidPacketException.ERROR_INVALID_PORT; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.net.util.IpUtils; import android.os.Parcel; @@ -30,6 +31,7 @@ import java.net.Inet4Address; import java.net.InetAddress; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.Objects; /** @hide */ @SystemApi @@ -121,4 +123,19 @@ public final class NattKeepalivePacketData extends KeepalivePacketData implement return new NattKeepalivePacketData[size]; } }; + + @Override + public boolean equals(@Nullable final Object o) { + if (!(o instanceof NattKeepalivePacketData)) return false; + final NattKeepalivePacketData other = (NattKeepalivePacketData) o; + return this.srcAddress.equals(other.srcAddress) + && this.dstAddress.equals(other.dstAddress) + && this.srcPort == other.srcPort + && this.dstPort == other.dstPort; + } + + @Override + public int hashCode() { + return Objects.hash(srcAddress, dstAddress, srcPort, dstPort); + } } diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index d320f61a3657..c61f10f50c93 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -245,13 +245,25 @@ public final class NfcAdapter { /** * Mandatory String extra field in {@link #ACTION_PREFERRED_PAYMENT_CHANGED} - * Indicates the condition when trigger this event. + * Indicates the condition when trigger this event. Possible values are: + * {@link #PREFERRED_PAYMENT_LOADED}, + * {@link #PREFERRED_PAYMENT_CHANGED}, + * {@link #PREFERRED_PAYMENT_UPDATED}, */ public static final String EXTRA_PREFERRED_PAYMENT_CHANGED_REASON = "android.nfc.extra.PREFERRED_PAYMENT_CHANGED_REASON"; - + /** + * Nfc is enabled and the preferred payment aids are registered. + */ public static final int PREFERRED_PAYMENT_LOADED = 1; + /** + * User selected another payment application as the preferred payment. + */ public static final int PREFERRED_PAYMENT_CHANGED = 2; + /** + * Current preferred payment has issued an update (registered/unregistered new aids or has been + * updated itself). + */ public static final int PREFERRED_PAYMENT_UPDATED = 3; public static final int STATE_OFF = 1; diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index f1c74a6331c4..7bf82e84927f 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -672,7 +672,7 @@ public final class CardEmulation { recoverService(); if (sService == null) { Log.e(TAG, "Failed to recover CardEmulationService."); - return null; + throw e.rethrowFromSystemServer(); } try { ApduServiceInfo serviceInfo = @@ -680,7 +680,7 @@ public final class CardEmulation { return (serviceInfo != null ? serviceInfo.getAids() : null); } catch (RemoteException ee) { Log.e(TAG, "Failed to recover CardEmulationService."); - return null; + throw e.rethrowFromSystemServer(); } } } @@ -690,9 +690,16 @@ public final class CardEmulation { * * @return The route destination secure element name of the preferred payment service. * HCE payment: "Host" - * OffHost payment: prefix SIM or prefix eSE string. - * "OffHost" if the payment service does not specify secure element - * name. + * OffHost payment: 1. String with prefix SIM or prefix eSE string. + * Ref: GSMA TS.26 - NFC Handset Requirements + * TS26_NFC_REQ_069: For UICC, Secure Element Name SHALL be + * SIM[smartcard slot] + * (e.g. SIM/SIM1, SIM2… SIMn). + * TS26_NFC_REQ_070: For embedded SE, Secure Element Name SHALL be + * eSE[number] + * (e.g. eSE/eSE1, eSE2, etc.). + * 2. "OffHost" if the payment service does not specify secure element + * name. */ @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) @Nullable @@ -711,7 +718,7 @@ public final class CardEmulation { recoverService(); if (sService == null) { Log.e(TAG, "Failed to recover CardEmulationService."); - return null; + throw e.rethrowFromSystemServer(); } try { ApduServiceInfo serviceInfo = @@ -727,7 +734,7 @@ public final class CardEmulation { } catch (RemoteException ee) { Log.e(TAG, "Failed to recover CardEmulationService."); - return null; + throw e.rethrowFromSystemServer(); } } } @@ -739,7 +746,7 @@ public final class CardEmulation { */ @RequiresPermission(android.Manifest.permission.NFC_PREFERRED_PAYMENT_INFO) @Nullable - public String getDescriptionForPreferredPaymentService() { + public CharSequence getDescriptionForPreferredPaymentService() { try { ApduServiceInfo serviceInfo = sService.getPreferredPaymentService(mContext.getUserId()); return (serviceInfo != null ? serviceInfo.getDescription() : null); @@ -747,7 +754,7 @@ public final class CardEmulation { recoverService(); if (sService == null) { Log.e(TAG, "Failed to recover CardEmulationService."); - return null; + throw e.rethrowFromSystemServer(); } try { ApduServiceInfo serviceInfo = @@ -755,7 +762,7 @@ public final class CardEmulation { return (serviceInfo != null ? serviceInfo.getDescription() : null); } catch (RemoteException ee) { Log.e(TAG, "Failed to recover CardEmulationService."); - return null; + throw e.rethrowFromSystemServer(); } } } diff --git a/core/java/android/os/ConfigUpdate.java b/core/java/android/os/ConfigUpdate.java index 590fbb36a0e8..a28f5fbaba0b 100644 --- a/core/java/android/os/ConfigUpdate.java +++ b/core/java/android/os/ConfigUpdate.java @@ -17,6 +17,8 @@ package android.os; import android.annotation.RequiresPermission; +import android.annotation.SdkConstant; +import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; /** @@ -125,6 +127,7 @@ public final class ConfigUpdate { */ @SystemApi @RequiresPermission(android.Manifest.permission.UPDATE_CONFIG) + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_UPDATE_EMERGENCY_NUMBER_DB = "android.os.action.UPDATE_EMERGENCY_NUMBER_DB"; diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java index f43a2523b5b3..e05991b33796 100644 --- a/core/java/android/os/storage/StorageManagerInternal.java +++ b/core/java/android/os/storage/StorageManagerInternal.java @@ -144,4 +144,10 @@ public abstract class StorageManagerInternal { * @param uid the uid of the package */ public abstract void prepareAppDataAfterInstall(@NonNull String packageName, int uid); + + + /** + * Return true if uid is external storage service. + */ + public abstract boolean isExternalStorageService(int uid); } diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index e7b360da47b8..17e3748f15d8 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -1391,7 +1391,6 @@ public final class Telephony { * Base column for the table that contain Carrier Public key. * @hide */ - @SystemApi public interface CarrierColumns extends BaseColumns { /** @@ -4704,7 +4703,6 @@ public final class Telephony { * Contains mappings between matching rules with carrier id for all carriers. * @hide */ - @SystemApi public static final class All implements BaseColumns { /** diff --git a/core/java/android/se/omapi/Reader.java b/core/java/android/se/omapi/Reader.java index 7f68d9188650..90c934d189fa 100644 --- a/core/java/android/se/omapi/Reader.java +++ b/core/java/android/se/omapi/Reader.java @@ -160,7 +160,7 @@ public final class Reader { * @hide */ @SystemApi - @RequiresPermission(android.Manifest.permission.SECURE_ELEMENT_PRIVILEGED) + @RequiresPermission(android.Manifest.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION) public boolean reset() { if (!mService.isConnected()) { Log.e(TAG, "service is not connected"); diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index cfbe393bfcc8..4dafc0df2013 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -67,9 +67,9 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put("settings_controller_loading_enhancement", "false"); DEFAULT_FLAGS.put("settings_conditionals", "false"); DEFAULT_FLAGS.put(NOTIF_CONVO_BYPASS_SHORTCUT_REQ, "true"); - // Disabled by default until b/148278926 is resolved. This flags guards a feature - // introduced in R and will be removed in the next release (b/148367230). - DEFAULT_FLAGS.put(SETTINGS_DO_NOT_RESTORE_PRESERVED, "false"); + // This flags guards a feature introduced in R and will be removed in the next release + // (b/148367230). + DEFAULT_FLAGS.put(SETTINGS_DO_NOT_RESTORE_PRESERVED, "true"); DEFAULT_FLAGS.put("settings_tether_all_in_one", "false"); DEFAULT_FLAGS.put(SETTINGS_SCHEDULES_FLAG, "false"); diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 0dcb9cc5256e..dffcafe1de0e 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -1307,6 +1307,15 @@ public final class Display { } /** + * Returns true if the display is in active state such as {@link #STATE_ON} + * or {@link #STATE_VR}. + * @hide + */ + public static boolean isActiveState(int state) { + return state == STATE_ON || state == STATE_VR; + } + + /** * A mode supported by a given display. * * @see Display#getSupportedModes() diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index baee4123ef47..d2e603649655 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -200,6 +200,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll } setInsetsAndAlpha(shown ? mShownInsets : mHiddenInsets, 1f /* alpha */, 1f /* fraction */); mFinished = true; + mListener.onFinished(this); mShownOnFinish = shown; } @@ -216,11 +217,17 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll return; } mCancelled = true; - mListener.onCancelled(); + mListener.onCancelled(this); releaseLeashes(); } + @Override + public boolean isFinished() { + return mFinished; + } + + @Override public boolean isCancelled() { return mCancelled; } diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 123b9db75804..96f73409ae0b 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -213,7 +213,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } @Override - public void onCancelled() { + public void onFinished(WindowInsetsAnimationController controller) { + } + + @Override + public void onCancelled(WindowInsetsAnimationController controller) { // Animator can be null when it is cancelled before onReady() completes. if (mAnimator != null) { mAnimator.cancel(); @@ -583,7 +587,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation boolean fromIme, long durationMs, @Nullable Interpolator interpolator, @AnimationType int animationType) { if (!checkDisplayFramesForControlling()) { - listener.onCancelled(); + listener.onCancelled(null); return; } controlAnimationUnchecked(types, cancellationSignal, listener, mFrame, fromIme, durationMs, @@ -608,7 +612,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation boolean useInsetsAnimationThread) { if (types == 0) { // nothing to animate. - listener.onCancelled(); + listener.onCancelled(null); return; } cancelExistingControllers(types); @@ -641,7 +645,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } if (typesReady == 0) { - listener.onCancelled(); + listener.onCancelled(null); return; } @@ -756,7 +760,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private void abortPendingImeControlRequest() { if (mPendingImeControlRequest != null) { - mPendingImeControlRequest.listener.onCancelled(); + mPendingImeControlRequest.listener.onCancelled(null); mPendingImeControlRequest = null; mHandler.removeCallbacks(mPendingControlTimeout); } diff --git a/core/java/android/view/PendingInsetsController.java b/core/java/android/view/PendingInsetsController.java index e8d9bb50c290..229ee03521bc 100644 --- a/core/java/android/view/PendingInsetsController.java +++ b/core/java/android/view/PendingInsetsController.java @@ -172,7 +172,7 @@ public class PendingInsetsController implements WindowInsetsController { mReplayedInsetsController.controlWindowInsetsAnimation(types, durationMillis, interpolator, cancellationSignal, listener); } else { - listener.onCancelled(); + listener.onCancelled(null); } } diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index 41a384797521..b587fbe24767 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -52,7 +52,7 @@ public class SurfaceControlViewHost { * a SurfaceView by calling {@link SurfaceView#setChildSurfacePackage}. */ public static final class SurfacePackage implements Parcelable { - private final SurfaceControl mSurfaceControl; + private SurfaceControl mSurfaceControl; private final IAccessibilityEmbeddedConnection mAccessibilityEmbeddedConnection; SurfacePackage(SurfaceControl sc, IAccessibilityEmbeddedConnection connection) { @@ -97,6 +97,16 @@ public class SurfaceControlViewHost { out.writeStrongBinder(mAccessibilityEmbeddedConnection.asBinder()); } + /** + * Release the SurfaceControl associated with the SurfacePackage. + */ + public void release() { + if (mSurfaceControl != null) { + mSurfaceControl.release(); + } + mSurfaceControl = null; + } + public static final @NonNull Creator<SurfacePackage> CREATOR = new Creator<SurfacePackage>() { public SurfacePackage createFromParcel(Parcel in) { diff --git a/core/java/android/view/WindowInsetsAnimationControlListener.java b/core/java/android/view/WindowInsetsAnimationControlListener.java index faaf9203af32..b61fa36f0e2a 100644 --- a/core/java/android/view/WindowInsetsAnimationControlListener.java +++ b/core/java/android/view/WindowInsetsAnimationControlListener.java @@ -17,21 +17,31 @@ package android.view; import android.annotation.NonNull; +import android.annotation.Nullable; import android.view.WindowInsets.Type.InsetsType; import android.view.inputmethod.EditorInfo; /** - * Interface that informs the client about {@link WindowInsetsAnimationController} state changes. + * Listener that encapsulates a request to + * {@link WindowInsetsController#controlWindowInsetsAnimation}. + * + * <p> + * Insets can be controlled with the supplied {@link WindowInsetsAnimationController} from + * {@link #onReady} until either {@link #onFinished} or {@link #onCancelled}. + * + * <p> + * Once the control over insets is finished or cancelled, it will not be regained until a new + * request to {@link WindowInsetsController#controlWindowInsetsAnimation} is made. + * + * <p> + * The request to control insets can fail immediately. In that case {@link #onCancelled} will be + * invoked without a preceding {@link #onReady}. + * + * @see WindowInsetsController#controlWindowInsetsAnimation */ public interface WindowInsetsAnimationControlListener { /** - * @hide - */ - default void onPrepare(int types) { - } - - /** * Called when the animation is ready to be controlled. This may be delayed when the IME needs * to redraw because of an {@link EditorInfo} change, or when the window is starting up. * @@ -41,14 +51,40 @@ public interface WindowInsetsAnimationControlListener { * {@link WindowInsetsController#controlWindowInsetsAnimation} in case the window * wasn't able to gain the controls because it wasn't the IME target or not * currently the window that's controlling the system bars. + * @see WindowInsetsAnimationController#isReady */ void onReady(@NonNull WindowInsetsAnimationController controller, @InsetsType int types); /** - * Called when the window no longer has control over the requested types. If it loses control - * over one type, the whole control will be cancelled. If none of the requested types were - * available when requesting the control, the animation control will be cancelled immediately - * without {@link #onReady} being called. + * Called when the request for control over the insets has + * {@link WindowInsetsAnimationController#finish finished}. + * + * Once this callback is invoked, the supplied {@link WindowInsetsAnimationController} + * is no longer {@link WindowInsetsAnimationController#isReady() ready}. + * + * Control will not be regained until a new request + * to {@link WindowInsetsController#controlWindowInsetsAnimation} is made. + * + * @param controller the controller which has finished. + * @see WindowInsetsAnimationController#isFinished + */ + void onFinished(@NonNull WindowInsetsAnimationController controller); + + /** + * Called when the request for control over the insets has been cancelled, either + * because the {@link android.os.CancellationSignal} associated with the + * {@link WindowInsetsController#controlWindowInsetsAnimation request} has been invoked, or + * the window has lost control over the insets (e.g. because it lost focus). + * + * Once this callback is invoked, the supplied {@link WindowInsetsAnimationController} + * is no longer {@link WindowInsetsAnimationController#isReady() ready}. + * + * Control will not be regained until a new request + * to {@link WindowInsetsController#controlWindowInsetsAnimation} is made. + * + * @param controller the controller which has been cancelled, or null if the request + * was cancelled before {@link #onReady} was invoked. + * @see WindowInsetsAnimationController#isCancelled */ - void onCancelled(); + void onCancelled(@Nullable WindowInsetsAnimationController controller); } diff --git a/core/java/android/view/WindowInsetsAnimationController.java b/core/java/android/view/WindowInsetsAnimationController.java index 2c7880b09785..c191a54283fb 100644 --- a/core/java/android/view/WindowInsetsAnimationController.java +++ b/core/java/android/view/WindowInsetsAnimationController.java @@ -139,10 +139,43 @@ public interface WindowInsetsAnimationController { @FloatRange(from = 0f, to = 1f) float fraction); /** - * Finishes the animation, and leaves the windows shown or hidden. After invoking - * {@link #finish(boolean)}, this instance is no longer valid. + * Finishes the animation, and leaves the windows shown or hidden. + * <p> + * After invoking {@link #finish(boolean)}, this instance is no longer {@link #isReady ready}. + * * @param shown if {@code true}, the windows will be shown after finishing the * animation. Otherwise they will be hidden. */ void finish(boolean shown); + + /** + * Returns whether this instance is ready to be used to control window insets. + * <p> + * Instances are ready when passed in {@link WindowInsetsAnimationControlListener#onReady} + * and stop being ready when it is either {@link #isFinished() finished} or + * {@link #isCancelled() cancelled}. + * + * @return {@code true} if the instance is ready, {@code false} otherwise. + */ + default boolean isReady() { + return !isFinished() && !isCancelled(); + } + + /** + * Returns whether this instance has been finished by a call to {@link #finish}. + * + * @see WindowInsetsAnimationControlListener#onFinished + * @return {@code true} if the instance is finished, {@code false} otherwise. + */ + boolean isFinished(); + + /** + * Returns whether this instance has been cancelled by the system, or by invoking the + * {@link android.os.CancellationSignal} passed into + * {@link WindowInsetsController#controlWindowInsetsAnimation}. + * + * @see WindowInsetsAnimationControlListener#onCancelled + * @return {@code true} if the instance is cancelled, {@code false} otherwise. + */ + boolean isCancelled(); } diff --git a/core/java/android/view/textclassifier/TextClassificationContext.java b/core/java/android/view/textclassifier/TextClassificationContext.java index f2323c625d15..5d5683f7110e 100644 --- a/core/java/android/view/textclassifier/TextClassificationContext.java +++ b/core/java/android/view/textclassifier/TextClassificationContext.java @@ -31,7 +31,6 @@ import java.util.Objects; */ public final class TextClassificationContext implements Parcelable { - // NOTE: Modify packageName only in the constructor or in setSystemTextClassifierMetadata() private String mPackageName; private final String mWidgetType; @Nullable private final String mWidgetVersion; @@ -47,7 +46,7 @@ public final class TextClassificationContext implements Parcelable { } /** - * Returns the package name for the calling package. + * Returns the package name of the app that this context originated in. */ @NonNull public String getPackageName() { @@ -57,14 +56,10 @@ public final class TextClassificationContext implements Parcelable { /** * Sets the information about the {@link SystemTextClassifier} that sent this request. * - * <p><b>NOTE: </b>This will override the value returned in {@link getPackageName()}. * @hide */ void setSystemTextClassifierMetadata(@Nullable SystemTextClassifierMetadata systemTcMetadata) { mSystemTcMetadata = systemTcMetadata; - if (mSystemTcMetadata != null) { - mPackageName = mSystemTcMetadata.getCallingPackageName(); - } } /** diff --git a/core/java/com/android/internal/os/KernelCpuThreadReader.java b/core/java/com/android/internal/os/KernelCpuThreadReader.java index d92f725bb4df..34076700cd95 100644 --- a/core/java/com/android/internal/os/KernelCpuThreadReader.java +++ b/core/java/com/android/internal/os/KernelCpuThreadReader.java @@ -25,6 +25,7 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; import java.io.IOException; +import java.nio.file.DirectoryIteratorException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; @@ -276,7 +277,7 @@ public class KernelCpuThreadReader { } threadCpuUsages.add(threadCpuUsage); } - } catch (IOException e) { + } catch (IOException | DirectoryIteratorException e) { // Expected when a process finishes return null; } diff --git a/core/java/com/android/internal/os/KernelCpuThreadReaderDiff.java b/core/java/com/android/internal/os/KernelCpuThreadReaderDiff.java index ffdc33c64f69..c11b939098c4 100644 --- a/core/java/com/android/internal/os/KernelCpuThreadReaderDiff.java +++ b/core/java/com/android/internal/os/KernelCpuThreadReaderDiff.java @@ -16,6 +16,8 @@ package com.android.internal.os; +import static com.android.internal.util.Preconditions.checkNotNull; + import android.annotation.Nullable; import android.util.ArrayMap; import android.util.Slog; @@ -99,7 +101,7 @@ public class KernelCpuThreadReaderDiff { @VisibleForTesting public KernelCpuThreadReaderDiff(KernelCpuThreadReader reader, int minimumTotalCpuUsageMillis) { - mReader = reader; + mReader = checkNotNull(reader); mMinimumTotalCpuUsageMillis = minimumTotalCpuUsageMillis; mPreviousCpuUsage = null; } diff --git a/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java b/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java index fdcc8a8c9cbf..c908b8cb7264 100644 --- a/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java +++ b/core/java/com/android/internal/os/KernelCpuThreadReaderSettingsObserver.java @@ -95,8 +95,10 @@ public class KernelCpuThreadReaderSettingsObserver extends ContentObserver { KernelCpuThreadReader.create( NUM_BUCKETS_DEFAULT, UidPredicate.fromString(COLLECTED_UIDS_DEFAULT)); mKernelCpuThreadReaderDiff = - new KernelCpuThreadReaderDiff( - mKernelCpuThreadReader, MINIMUM_TOTAL_CPU_USAGE_MILLIS_DEFAULT); + mKernelCpuThreadReader == null + ? null + : new KernelCpuThreadReaderDiff( + mKernelCpuThreadReader, MINIMUM_TOTAL_CPU_USAGE_MILLIS_DEFAULT); } @Override diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 1f45c31f6340..f7400bd79a92 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1845,7 +1845,7 @@ and bypass OMAPI AccessControlEnforcer. <p>Not for use by third-party applications. @hide --> - <permission android:name="android.permission.SECURE_ELEMENT_PRIVILEGED" + <permission android:name="android.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION" android:protectionLevel="signature|privileged" /> <!-- @deprecated This permission used to allow too broad access to sensitive methods and all its diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 6060d9aa459a..4993aafe337f 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2978,6 +2978,10 @@ <!-- Whether to use voip audio mode for ims call --> <bool name="config_use_voip_mode_for_ims">false</bool> + <!-- Boolean indicating USSD over IMS is allowed. + If it is not supported due to modem limitations, USSD send over the CS pipe instead.--> + <bool name="config_allow_ussd_over_ims">false</bool> + <!-- String array containing numbers that shouldn't be logged. Country-specific. --> <string-array name="unloggable_phone_numbers" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index ff49c45b965b..26024ed34bc3 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2985,72 +2985,6 @@ <!-- Title for EditText context menu [CHAR LIMIT=20] --> <string name="editTextMenuTitle">Text actions</string> - <!-- Label for item in the text selection menu to trigger an Email app. Should be a verb. [CHAR LIMIT=30] --> - <string name="email">Email</string> - - <!-- Accessibility description for an item in the text selection menu to trigger an Email app [CHAR LIMIT=NONE] --> - <string name="email_desc">Email selected address</string> - - <!-- Label for item in the text selection menu to trigger a Dialer app. Should be a verb. [CHAR LIMIT=30] --> - <string name="dial">Call</string> - - <!-- Accessibility description for an item in the text selection menu to call a phone number [CHAR LIMIT=NONE] --> - <string name="dial_desc">Call selected phone number</string> - - <!-- Label for item in the text selection menu to trigger a Map app. Should be a verb. [CHAR LIMIT=30] --> - <string name="map">Map</string> - - <!-- Accessibility description for an item in the text selection menu to open maps for an address [CHAR LIMIT=NONE] --> - <string name="map_desc">Locate selected address</string> - - <!-- Label for item in the text selection menu to trigger a Browser app. Should be a verb. [CHAR LIMIT=30] --> - <string name="browse">Open</string> - - <!-- Accessibility description for an item in the text selection menu to open a URL in a browser [CHAR LIMIT=NONE] --> - <string name="browse_desc">Open selected URL</string> - - <!-- Label for item in the text selection menu to trigger an SMS app. Should be a verb. [CHAR LIMIT=30] --> - <string name="sms">Message</string> - - <!-- Accessibility description for an item in the text selection menu to send an SMS to a phone number [CHAR LIMIT=NONE] --> - <string name="sms_desc">Message selected phone number</string> - - <!-- Label for item in the text selection menu to trigger adding a contact. Should be a verb. [CHAR LIMIT=30] --> - <string name="add_contact">Add</string> - - <!-- Accessibility description for an item in the text selection menu to add the selected detail to contacts [CHAR LIMIT=NONE] --> - <string name="add_contact_desc">Add to contacts</string> - - <!-- Label for item in the text selection menu to view the calendar for the selected time/date. Should be a verb. [CHAR LIMIT=30] --> - <string name="view_calendar">View</string> - - <!-- Accessibility description for an item in the text selection menu to view the calendar for a date [CHAR LIMIT=NONE]--> - <string name="view_calendar_desc">View selected time in calendar</string> - - <!-- Label for item in the text selection menu to create a calendar event at the selected time/date. Should be a verb. [CHAR LIMIT=30] --> - <string name="add_calendar_event">Schedule</string> - - <!-- Accessibility description for an item in the text selection menu to schedule an event for a date [CHAR LIMIT=NONE] --> - <string name="add_calendar_event_desc">Schedule event for selected time</string> - - <!-- Label for item in the text selection menu to track a selected flight number. Should be a verb. [CHAR LIMIT=30] --> - <string name="view_flight">Track</string> - - <!-- Accessibility description for an item in the text selection menu to track a flight [CHAR LIMIT=NONE] --> - <string name="view_flight_desc">Track selected flight</string> - - <!-- Label for item in the text selection menu to translate selected text with a translation app. Should be a verb. [CHAR LIMIT=30] --> - <string name="translate">Translate</string> - - <!-- Accessibility description for an item in the text selection menu to translate selected text with a translation app. [CHAR LIMIT=NONE] --> - <string name="translate_desc">Translate selected text</string> - - <!-- Label for item in the text selection menu to define selected text with a dictionary app. Should be a verb. [CHAR LIMIT=30] --> - <string name="define">Define</string> - - <!-- Accessibility description for an item in the text selection menu to define selected text with a dictionary app. Should be a verb. [CHAR LIMIT=NONE] --> - <string name="define_desc">Define selected text</string> - <!-- If the device is getting low on internal storage, a notification is shown to the user. This is the title of that notification. --> <string name="low_internal_storage_view_title">Storage space running out</string> <!-- If the device is getting low on internal storage, a notification is shown to the user. This is the message of that notification. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 9c64a70f25dd..8919c028a011 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -551,28 +551,6 @@ <java-symbol type="string" name="replace" /> <java-symbol type="string" name="undo" /> <java-symbol type="string" name="redo" /> - <java-symbol type="string" name="email" /> - <java-symbol type="string" name="email_desc" /> - <java-symbol type="string" name="dial" /> - <java-symbol type="string" name="dial_desc" /> - <java-symbol type="string" name="map" /> - <java-symbol type="string" name="map_desc" /> - <java-symbol type="string" name="browse" /> - <java-symbol type="string" name="browse_desc" /> - <java-symbol type="string" name="sms" /> - <java-symbol type="string" name="sms_desc" /> - <java-symbol type="string" name="add_contact" /> - <java-symbol type="string" name="add_contact_desc" /> - <java-symbol type="string" name="view_calendar" /> - <java-symbol type="string" name="view_calendar_desc" /> - <java-symbol type="string" name="add_calendar_event" /> - <java-symbol type="string" name="add_calendar_event_desc" /> - <java-symbol type="string" name="view_flight" /> - <java-symbol type="string" name="view_flight_desc" /> - <java-symbol type="string" name="translate" /> - <java-symbol type="string" name="translate_desc" /> - <java-symbol type="string" name="define" /> - <java-symbol type="string" name="define_desc" /> <java-symbol type="string" name="textSelectionCABTitle" /> <java-symbol type="string" name="BaMmi" /> <java-symbol type="string" name="CLIRDefaultOffNextCallOff" /> @@ -2553,6 +2531,7 @@ <java-symbol type="bool" name="config_device_wfc_ims_available" /> <java-symbol type="bool" name="config_carrier_wfc_ims_available" /> <java-symbol type="bool" name="config_use_voip_mode_for_ims" /> + <java-symbol type="bool" name="config_allow_ussd_over_ims" /> <java-symbol type="attr" name="touchscreenBlocksFocus" /> <java-symbol type="layout" name="resolver_list_with_default" /> <java-symbol type="string" name="activity_resolver_set_always" /> diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index c328d720426d..90d8bab84258 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -40,7 +40,10 @@ import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StopActivityItem; import android.content.Intent; import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Rect; import android.os.IBinder; +import android.util.DisplayMetrics; import android.util.MergedConfiguration; import android.view.Display; import android.view.View; @@ -307,6 +310,58 @@ public class ActivityThreadTest { } @Test + public void testHandleConfigurationChangedDoesntOverrideActivityConfig() { + final TestActivity activity = mActivityTestRule.launchActivity(new Intent()); + + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + final Configuration oldActivityConfig = + new Configuration(activity.getResources().getConfiguration()); + final DisplayMetrics oldActivityMetrics = new DisplayMetrics(); + activity.getDisplay().getMetrics(oldActivityMetrics); + final Resources oldAppResources = activity.getApplication().getResources(); + final Configuration oldAppConfig = + new Configuration(oldAppResources.getConfiguration()); + final DisplayMetrics oldApplicationMetrics = new DisplayMetrics(); + oldApplicationMetrics.setTo(oldAppResources.getDisplayMetrics()); + assertEquals("Process config must match the top activity config by default", + 0, oldActivityConfig.diffPublicOnly(oldAppConfig)); + assertEquals("Process config must match the top activity config by default", + oldActivityMetrics, oldApplicationMetrics); + + // Update the application configuration separately from activity config + final Configuration newAppConfig = new Configuration(oldAppConfig); + newAppConfig.densityDpi += 100; + newAppConfig.screenHeightDp += 100; + final Rect newBounds = new Rect(newAppConfig.windowConfiguration.getAppBounds()); + newBounds.bottom += 100; + newAppConfig.windowConfiguration.setAppBounds(newBounds); + newAppConfig.windowConfiguration.setBounds(newBounds); + newAppConfig.seq++; + + final ActivityThread activityThread = activity.getActivityThread(); + activityThread.handleConfigurationChanged(newAppConfig); + + // Verify that application config update was applied, but didn't change activity config. + assertEquals("Activity config must not change if the process config changes", + oldActivityConfig, activity.getResources().getConfiguration()); + + final DisplayMetrics newActivityMetrics = new DisplayMetrics(); + activity.getDisplay().getMetrics(newActivityMetrics); + assertEquals("Activity display size must not change if the process config changes", + oldActivityMetrics, newActivityMetrics); + final Resources newAppResources = activity.getApplication().getResources(); + assertEquals("Application config must be updated", + newAppConfig, newAppResources.getConfiguration()); + final DisplayMetrics newApplicationMetrics = new DisplayMetrics(); + newApplicationMetrics.setTo(newAppResources.getDisplayMetrics()); + assertNotEquals("Application display size must be updated after config update", + oldApplicationMetrics, newApplicationMetrics); + assertNotEquals("Application display size must be updated after config update", + newActivityMetrics, newApplicationMetrics); + }); + } + + @Test public void testResumeAfterNewIntent() { final Activity activity = mActivityTestRule.launchActivity(new Intent()); final ActivityThread activityThread = activity.getActivityThread(); diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java index fe25e79df44e..22b4e45f068a 100644 --- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java @@ -188,7 +188,7 @@ public class InsetsAnimationControlImplTest { fail("Expected exception to be thrown"); } catch (IllegalStateException ignored) { } - verify(mMockListener).onCancelled(); + verify(mMockListener).onCancelled(mController); mController.finish(true /* shown */); } diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java index 42ab2e791641..90a62e7a8751 100644 --- a/core/tests/coretests/src/android/view/InsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -204,7 +204,7 @@ public class InsetsControllerTest { mViewRoot.getView().getViewTreeObserver().dispatchOnPreDraw(); verify(mockListener).onReady(any(), anyInt()); mController.onControlsChanged(new InsetsSourceControl[0]); - verify(mockListener).onCancelled(); + verify(mockListener).onCancelled(notNull()); }); } @@ -221,7 +221,7 @@ public class InsetsControllerTest { new CancellationSignal(), controlListener); mController.addOnControllableInsetsChangedListener( (controller, typeMask) -> assertEquals(0, typeMask)); - verify(controlListener).onCancelled(); + verify(controlListener).onCancelled(null); verify(controlListener, never()).onReady(any(), anyInt()); } @@ -533,7 +533,7 @@ public class InsetsControllerTest { verify(mockListener).onReady(any(), anyInt()); cancellationSignal.cancel(); - verify(mockListener).onCancelled(); + verify(mockListener).onCancelled(notNull()); }); waitUntilNextFrame(); InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { @@ -584,7 +584,7 @@ public class InsetsControllerTest { // Pretend that we are losing control mController.onControlsChanged(new InsetsSourceControl[0]); - verify(listener).onCancelled(); + verify(listener).onCancelled(null); }); } @@ -606,7 +606,7 @@ public class InsetsControllerTest { mTestClock.fastForward(2500); mTestHandler.timeAdvance(); - verify(listener).onCancelled(); + verify(listener).onCancelled(null); }); } @@ -621,7 +621,7 @@ public class InsetsControllerTest { cancellationSignal, listener); cancellationSignal.cancel(); - verify(listener).onCancelled(); + verify(listener).onCancelled(null); // Ready gets deferred until next predraw mViewRoot.getView().getViewTreeObserver().dispatchOnPreDraw(); diff --git a/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java b/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java index 33f859ef6663..03c8b1bcb475 100644 --- a/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/PendingInsetsControllerTest.java @@ -99,7 +99,7 @@ public class PendingInsetsControllerTest { CancellationSignal cancellationSignal = new CancellationSignal(); mPendingInsetsController.controlWindowInsetsAnimation( systemBars(), 0, new LinearInterpolator(), cancellationSignal, listener); - verify(listener).onCancelled(); + verify(listener).onCancelled(null); assertFalse(cancellationSignal.isCanceled()); } diff --git a/location/java/android/location/GnssMeasurement.java b/location/java/android/location/GnssMeasurement.java index 83a8995bee13..5e3b8aa629b4 100644 --- a/location/java/android/location/GnssMeasurement.java +++ b/location/java/android/location/GnssMeasurement.java @@ -21,8 +21,8 @@ import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasuremen import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_CARRIER_FREQUENCY; import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_CARRIER_PHASE; import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_CARRIER_PHASE_UNCERTAINTY; -import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_RECEIVER_ISB; -import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_RECEIVER_ISB_UNCERTAINTY; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_FULL_ISB; +import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_FULL_ISB_UNCERTAINTY; import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_SATELLITE_ISB; import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_SATELLITE_ISB_UNCERTAINTY; import static android.hardware.gnss.V2_1.IGnssMeasurementCallback.GnssMeasurementFlags.HAS_SNR; @@ -63,8 +63,8 @@ public final class GnssMeasurement implements Parcelable { private double mSnrInDb; private double mAutomaticGainControlLevelInDb; @NonNull private String mCodeType; - private double mReceiverInterSignalBiasNanos; - private double mReceiverInterSignalBiasUncertaintyNanos; + private double mFullInterSignalBiasNanos; + private double mFullInterSignalBiasUncertaintyNanos; private double mSatelliteInterSignalBiasNanos; private double mSatelliteInterSignalBiasUncertaintyNanos; @@ -268,9 +268,9 @@ public final class GnssMeasurement implements Parcelable { mSnrInDb = measurement.mSnrInDb; mAutomaticGainControlLevelInDb = measurement.mAutomaticGainControlLevelInDb; mCodeType = measurement.mCodeType; - mReceiverInterSignalBiasNanos = measurement.mReceiverInterSignalBiasNanos; - mReceiverInterSignalBiasUncertaintyNanos = - measurement.mReceiverInterSignalBiasUncertaintyNanos; + mFullInterSignalBiasNanos = measurement.mFullInterSignalBiasNanos; + mFullInterSignalBiasUncertaintyNanos = + measurement.mFullInterSignalBiasUncertaintyNanos; mSatelliteInterSignalBiasNanos = measurement.mSatelliteInterSignalBiasNanos; mSatelliteInterSignalBiasUncertaintyNanos = measurement.mSatelliteInterSignalBiasUncertaintyNanos; @@ -1435,99 +1435,110 @@ public final class GnssMeasurement implements Parcelable { } /** - * Returns {@code true} if {@link #getReceiverInterSignalBiasNanos()} is available, + * Returns {@code true} if {@link #getFullInterSignalBiasNanos()} is available, * {@code false} otherwise. */ - public boolean hasReceiverInterSignalBiasNanos() { - return isFlagSet(HAS_RECEIVER_ISB); + public boolean hasFullInterSignalBiasNanos() { + return isFlagSet(HAS_FULL_ISB); } /** - * Gets the GNSS measurement's receiver inter-signal bias in nanoseconds with sub-nanosecond - * accuracy. + * Gets the GNSS measurement's inter-signal bias in nanoseconds with sub-nanosecond accuracy. * - * <p>This value is the estimated receiver-side inter-system (different from the - * constellation in {@link GnssClock#getReferenceConstellationTypeForIsb()} bias and - * inter-frequency (different from the carrier frequency in - * {@link GnssClock#getReferenceCarrierFrequencyHzForIsb()}) bias. The reported receiver - * inter-signal bias must include signal delays caused by: + * <p>This value is the sum of the estimated receiver-side and the space-segment-side + * inter-system bias, inter-frequency bias and inter-code bias, including: * * <ul> - * <li>Receiver inter-constellation bias</li> - * <li>Receiver inter-frequency bias</li> - * <li>Receiver inter-code bias</li> + * <li>Receiver inter-constellation bias (with respect to the constellation in + * {@link GnssClock#getReferenceConstellationTypeForIsb())</li> + * <li>Receiver inter-frequency bias (with respect to the carrier frequency in + * {@link GnssClock#getReferenceConstellationTypeForIsb())</li> + * <li>Receiver inter-code bias (with respect to the code type in + * {@link GnssClock#getReferenceConstellationTypeForIsb())</li> + * <li>Master clock bias (e.g., GPS-GAL Time Offset (GGTO), GPS-UTC Time Offset (TauGps), + * BDS-GLO Time Offset (BGTO))(with respect to the constellation in + * {@link GnssClock#getReferenceConstellationTypeForIsb())</li> + * <li>Group delay (e.g., Total Group Delay (TGD))</li> + * <li>Satellite inter-frequency bias (GLO only) (with respect to the carrier frequency in + * {@link GnssClock#getReferenceConstellationTypeForIsb())</li> + * <li>Satellite inter-code bias (e.g., Differential Code Bias (DCB)) (with respect to the code + * type in {@link GnssClock#getReferenceConstellationTypeForIsb())</li> * </ul> * + * <p>If a component of the above is already compensated in the provided + * {@link GnssMeasurement#getReceivedSvTimeNanos()}, then it must not be included in the + * reported full ISB. + * * <p>The value does not include the inter-frequency Ionospheric bias. * - * <p>The value is only available if {@link #hasReceiverInterSignalBiasNanos()} is {@code true}. + * <p>The value is only available if {@link #hasFullInterSignalBiasNanos()} is {@code true}. */ - public double getReceiverInterSignalBiasNanos() { - return mReceiverInterSignalBiasNanos; + public double getFullInterSignalBiasNanos() { + return mFullInterSignalBiasNanos; } /** - * Sets the GNSS measurement's receiver inter-signal bias in nanoseconds. + * Sets the GNSS measurement's inter-signal bias in nanoseconds. * * @hide */ @TestApi - public void setReceiverInterSignalBiasNanos(double receiverInterSignalBiasNanos) { - setFlag(HAS_RECEIVER_ISB); - mReceiverInterSignalBiasNanos = receiverInterSignalBiasNanos; + public void setFullInterSignalBiasNanos(double fullInterSignalBiasNanos) { + setFlag(HAS_FULL_ISB); + mFullInterSignalBiasNanos = fullInterSignalBiasNanos; } /** - * Resets the GNSS measurement's receiver inter-signal bias in nanoseconds. + * Resets the GNSS measurement's inter-signal bias in nanoseconds. * * @hide */ @TestApi - public void resetReceiverInterSignalBiasNanos() { - resetFlag(HAS_RECEIVER_ISB); + public void resetFullInterSignalBiasNanos() { + resetFlag(HAS_FULL_ISB); } /** - * Returns {@code true} if {@link #getReceiverInterSignalBiasUncertaintyNanos()} is available, + * Returns {@code true} if {@link #getFullInterSignalBiasUncertaintyNanos()} is available, * {@code false} otherwise. */ - public boolean hasReceiverInterSignalBiasUncertaintyNanos() { - return isFlagSet(HAS_RECEIVER_ISB_UNCERTAINTY); + public boolean hasFullInterSignalBiasUncertaintyNanos() { + return isFlagSet(HAS_FULL_ISB_UNCERTAINTY); } /** - * Gets the GNSS measurement's receiver inter-signal bias uncertainty (1 sigma) in + * Gets the GNSS measurement's inter-signal bias uncertainty (1 sigma) in * nanoseconds with sub-nanosecond accuracy. * - * <p>The value is only available if {@link #hasReceiverInterSignalBiasUncertaintyNanos()} is + * <p>The value is only available if {@link #hasFullInterSignalBiasUncertaintyNanos()} is * {@code true}. */ @FloatRange(from = 0.0) - public double getReceiverInterSignalBiasUncertaintyNanos() { - return mReceiverInterSignalBiasUncertaintyNanos; + public double getFullInterSignalBiasUncertaintyNanos() { + return mFullInterSignalBiasUncertaintyNanos; } /** - * Sets the GNSS measurement's receiver inter-signal bias uncertainty (1 sigma) in nanoseconds. + * Sets the GNSS measurement's inter-signal bias uncertainty (1 sigma) in nanoseconds. * * @hide */ @TestApi - public void setReceiverInterSignalBiasUncertaintyNanos(@FloatRange(from = 0.0) - double receiverInterSignalBiasUncertaintyNanos) { - setFlag(HAS_RECEIVER_ISB_UNCERTAINTY); - mReceiverInterSignalBiasUncertaintyNanos = receiverInterSignalBiasUncertaintyNanos; + public void setFullInterSignalBiasUncertaintyNanos(@FloatRange(from = 0.0) + double fullInterSignalBiasUncertaintyNanos) { + setFlag(HAS_FULL_ISB_UNCERTAINTY); + mFullInterSignalBiasUncertaintyNanos = fullInterSignalBiasUncertaintyNanos; } /** - * Resets the GNSS measurement's receiver inter-signal bias uncertainty (1 sigma) in + * Resets the GNSS measurement's inter-signal bias uncertainty (1 sigma) in * nanoseconds. * * @hide */ @TestApi - public void resetReceiverInterSignalBiasUncertaintyNanos() { - resetFlag(HAS_RECEIVER_ISB_UNCERTAINTY); + public void resetFullInterSignalBiasUncertaintyNanos() { + resetFlag(HAS_FULL_ISB_UNCERTAINTY); } /** @@ -1542,17 +1553,18 @@ public final class GnssMeasurement implements Parcelable { * Gets the GNSS measurement's satellite inter-signal bias in nanoseconds with sub-nanosecond * accuracy. * - * <p>This value is the satellite-and-control-segment-side inter-system (different from the - * constellation in {@link GnssClock#getReferenceConstellationTypeForIsb()}) bias and - * inter-frequency (different from the carrier frequency in - * {@link GnssClock#getReferenceCarrierFrequencyHzForIsb()}) bias, including: + * <p>This value is the space-segment-side inter-system bias, inter-frequency bias and + * inter-code bias, including: * * <ul> - * <li>Master clock bias (e.g., GPS-GAL Time Offset (GGTO), GPT-UTC Time Offset (TauGps), - * BDS-GLO Time Offset (BGTO))</li> + * <li>Master clock bias (e.g., GPS-GAL Time Offset (GGTO), GPS-UTC Time Offset (TauGps), + * BDS-GLO Time Offset (BGTO))(with respect to the constellation in + * {@link GnssClock#getReferenceConstellationTypeForIsb())</li> * <li>Group delay (e.g., Total Group Delay (TGD))</li> - * <li>Satellite inter-signal bias, which includes satellite inter-frequency bias (GLO only), - * and satellite inter-code bias (e.g., Differential Code Bias (DCB)).</li> + * <li>Satellite inter-frequency bias (GLO only) (with respect to the carrier frequency in + * {@link GnssClock#getReferenceConstellationTypeForIsb())</li> + * <li>Satellite inter-code bias (e.g., Differential Code Bias (DCB)) (with respect to the code + * type in {@link GnssClock#getReferenceConstellationTypeForIsb())</li> * </ul> * * <p>The value is only available if {@link #hasSatelliteInterSignalBiasNanos()} is {@code @@ -1654,8 +1666,8 @@ public final class GnssMeasurement implements Parcelable { gnssMeasurement.mAutomaticGainControlLevelInDb = parcel.readDouble(); gnssMeasurement.mCodeType = parcel.readString(); gnssMeasurement.mBasebandCn0DbHz = parcel.readDouble(); - gnssMeasurement.mReceiverInterSignalBiasNanos = parcel.readDouble(); - gnssMeasurement.mReceiverInterSignalBiasUncertaintyNanos = parcel.readDouble(); + gnssMeasurement.mFullInterSignalBiasNanos = parcel.readDouble(); + gnssMeasurement.mFullInterSignalBiasUncertaintyNanos = parcel.readDouble(); gnssMeasurement.mSatelliteInterSignalBiasNanos = parcel.readDouble(); gnssMeasurement.mSatelliteInterSignalBiasUncertaintyNanos = parcel.readDouble(); @@ -1692,8 +1704,8 @@ public final class GnssMeasurement implements Parcelable { parcel.writeDouble(mAutomaticGainControlLevelInDb); parcel.writeString(mCodeType); parcel.writeDouble(mBasebandCn0DbHz); - parcel.writeDouble(mReceiverInterSignalBiasNanos); - parcel.writeDouble(mReceiverInterSignalBiasUncertaintyNanos); + parcel.writeDouble(mFullInterSignalBiasNanos); + parcel.writeDouble(mFullInterSignalBiasUncertaintyNanos); parcel.writeDouble(mSatelliteInterSignalBiasNanos); parcel.writeDouble(mSatelliteInterSignalBiasUncertaintyNanos); } @@ -1778,14 +1790,14 @@ public final class GnssMeasurement implements Parcelable { builder.append(String.format(format, "CodeType", mCodeType)); } - if (hasReceiverInterSignalBiasNanos() || hasReceiverInterSignalBiasUncertaintyNanos()) { + if (hasFullInterSignalBiasNanos() || hasFullInterSignalBiasUncertaintyNanos()) { builder.append(String.format( formatWithUncertainty, - "ReceiverInterSignalBiasNs", - hasReceiverInterSignalBiasNanos() ? mReceiverInterSignalBiasNanos : null, - "ReceiverInterSignalBiasUncertaintyNs", - hasReceiverInterSignalBiasUncertaintyNanos() - ? mReceiverInterSignalBiasUncertaintyNanos : null)); + "InterSignalBiasNs", + hasFullInterSignalBiasNanos() ? mFullInterSignalBiasNanos : null, + "InterSignalBiasUncertaintyNs", + hasFullInterSignalBiasUncertaintyNanos() + ? mFullInterSignalBiasUncertaintyNanos : null)); } if (hasSatelliteInterSignalBiasNanos() || hasSatelliteInterSignalBiasUncertaintyNanos()) { @@ -1824,8 +1836,8 @@ public final class GnssMeasurement implements Parcelable { resetAutomaticGainControlLevel(); resetCodeType(); resetBasebandCn0DbHz(); - resetReceiverInterSignalBiasNanos(); - resetReceiverInterSignalBiasUncertaintyNanos(); + resetFullInterSignalBiasNanos(); + resetFullInterSignalBiasUncertaintyNanos(); resetSatelliteInterSignalBiasNanos(); resetSatelliteInterSignalBiasUncertaintyNanos(); } diff --git a/media/java/android/media/audiofx/Visualizer.java b/media/java/android/media/audiofx/Visualizer.java index 392e8fe7543f..a5da648cf14a 100644 --- a/media/java/android/media/audiofx/Visualizer.java +++ b/media/java/android/media/audiofx/Visualizer.java @@ -20,9 +20,10 @@ import android.app.ActivityThread; import android.compat.annotation.UnsupportedAppUsage; import android.os.Handler; import android.os.Looper; -import android.os.Message; import android.util.Log; +import com.android.internal.annotations.GuardedBy; + import java.lang.ref.WeakReference; /** @@ -158,6 +159,7 @@ public class Visualizer { /** * Indicates the state of the Visualizer instance */ + @GuardedBy("mStateLock") private int mState = STATE_UNINITIALIZED; /** * Lock to synchronize access to mState @@ -166,6 +168,7 @@ public class Visualizer { /** * System wide unique Identifier of the visualizer engine used by this Visualizer instance */ + @GuardedBy("mStateLock") @UnsupportedAppUsage private int mId; @@ -176,19 +179,24 @@ public class Visualizer { /** * Handler for events coming from the native code */ - private NativeEventHandler mNativeEventHandler = null; + @GuardedBy("mListenerLock") + private Handler mNativeEventHandler = null; /** * PCM and FFT capture listener registered by client */ + @GuardedBy("mListenerLock") private OnDataCaptureListener mCaptureListener = null; /** * Server Died listener registered by client */ + @GuardedBy("mListenerLock") private OnServerDiedListener mServerDiedListener = null; // accessed by native methods - private long mNativeVisualizer; - private long mJniData; + private long mNativeVisualizer; // guarded by a static lock in native code + private long mJniData; // set in native_setup, _release; + // get in native_release, _setEnabled, _setPeriodicCapture + // thus, effectively guarded by mStateLock //-------------------------------------------------------------------------- // Constructor, Finalize @@ -244,7 +252,9 @@ public class Visualizer { @Override protected void finalize() { - native_finalize(); + synchronized (mStateLock) { + native_finalize(); + } } /** @@ -601,25 +611,28 @@ public class Visualizer { */ public int setDataCaptureListener(OnDataCaptureListener listener, int rate, boolean waveform, boolean fft) { - synchronized (mListenerLock) { - mCaptureListener = listener; - } if (listener == null) { // make sure capture callback is stopped in native code waveform = false; fft = false; } - int status = native_setPeriodicCapture(rate, waveform, fft); + int status; + synchronized (mStateLock) { + status = native_setPeriodicCapture(rate, waveform, fft); + } if (status == SUCCESS) { - if ((listener != null) && (mNativeEventHandler == null)) { - Looper looper; - if ((looper = Looper.myLooper()) != null) { - mNativeEventHandler = new NativeEventHandler(this, looper); - } else if ((looper = Looper.getMainLooper()) != null) { - mNativeEventHandler = new NativeEventHandler(this, looper); - } else { - mNativeEventHandler = null; - status = ERROR_NO_INIT; + synchronized (mListenerLock) { + mCaptureListener = listener; + if ((listener != null) && (mNativeEventHandler == null)) { + Looper looper; + if ((looper = Looper.myLooper()) != null) { + mNativeEventHandler = new Handler(looper); + } else if ((looper = Looper.getMainLooper()) != null) { + mNativeEventHandler = new Handler(looper); + } else { + mNativeEventHandler = null; + status = ERROR_NO_INIT; + } } } } @@ -663,112 +676,61 @@ public class Visualizer { return SUCCESS; } - /** - * Helper class to handle the forwarding of native events to the appropriate listeners - */ - private class NativeEventHandler extends Handler - { - private Visualizer mVisualizer; - - public NativeEventHandler(Visualizer v, Looper looper) { - super(looper); - mVisualizer = v; - } - - private void handleCaptureMessage(Message msg) { - OnDataCaptureListener l = null; - synchronized (mListenerLock) { - l = mVisualizer.mCaptureListener; - } - - if (l != null) { - byte[] data = (byte[])msg.obj; - int samplingRate = msg.arg1; - - switch(msg.what) { - case NATIVE_EVENT_PCM_CAPTURE: - l.onWaveFormDataCapture(mVisualizer, data, samplingRate); - break; - case NATIVE_EVENT_FFT_CAPTURE: - l.onFftDataCapture(mVisualizer, data, samplingRate); - break; - default: - Log.e(TAG,"Unknown native event in handleCaptureMessge: "+msg.what); - break; - } - } - } - - private void handleServerDiedMessage(Message msg) { - OnServerDiedListener l = null; - synchronized (mListenerLock) { - l = mVisualizer.mServerDiedListener; - } - - if (l != null) - l.onServerDied(); - } - - @Override - public void handleMessage(Message msg) { - if (mVisualizer == null) { - return; - } - - switch(msg.what) { - case NATIVE_EVENT_PCM_CAPTURE: - case NATIVE_EVENT_FFT_CAPTURE: - handleCaptureMessage(msg); - break; - case NATIVE_EVENT_SERVER_DIED: - handleServerDiedMessage(msg); - break; - default: - Log.e(TAG,"Unknown native event: "+msg.what); - break; - } - } - } - //--------------------------------------------------------- // Interface definitions //-------------------- private static native final void native_init(); + @GuardedBy("mStateLock") private native final int native_setup(Object audioeffect_this, int audioSession, int[] id, String opPackageName); + @GuardedBy("mStateLock") private native final void native_finalize(); + @GuardedBy("mStateLock") private native final void native_release(); + @GuardedBy("mStateLock") private native final int native_setEnabled(boolean enabled); + @GuardedBy("mStateLock") private native final boolean native_getEnabled(); + @GuardedBy("mStateLock") private native final int native_setCaptureSize(int size); + @GuardedBy("mStateLock") private native final int native_getCaptureSize(); + @GuardedBy("mStateLock") private native final int native_setScalingMode(int mode); + @GuardedBy("mStateLock") private native final int native_getScalingMode(); + @GuardedBy("mStateLock") private native final int native_setMeasurementMode(int mode); + @GuardedBy("mStateLock") private native final int native_getMeasurementMode(); + @GuardedBy("mStateLock") private native final int native_getSamplingRate(); + @GuardedBy("mStateLock") private native final int native_getWaveForm(byte[] waveform); + @GuardedBy("mStateLock") private native final int native_getFft(byte[] fft); + @GuardedBy("mStateLock") private native final int native_getPeakRms(MeasurementPeakRms measurement); + @GuardedBy("mStateLock") private native final int native_setPeriodicCapture(int rate, boolean waveForm, boolean fft); //--------------------------------------------------------- @@ -776,17 +738,47 @@ public class Visualizer { //-------------------- @SuppressWarnings("unused") private static void postEventFromNative(Object effect_ref, - int what, int arg1, int arg2, Object obj) { - Visualizer visu = (Visualizer)((WeakReference)effect_ref).get(); - if (visu == null) { - return; - } + int what, int samplingRate, byte[] data) { + final Visualizer visualizer = (Visualizer) ((WeakReference) effect_ref).get(); + if (visualizer == null) return; - if (visu.mNativeEventHandler != null) { - Message m = visu.mNativeEventHandler.obtainMessage(what, arg1, arg2, obj); - visu.mNativeEventHandler.sendMessage(m); + final Handler handler; + synchronized (visualizer.mListenerLock) { + handler = visualizer.mNativeEventHandler; } + if (handler == null) return; + switch (what) { + case NATIVE_EVENT_PCM_CAPTURE: + case NATIVE_EVENT_FFT_CAPTURE: + handler.post(() -> { + final OnDataCaptureListener l; + synchronized (visualizer.mListenerLock) { + l = visualizer.mCaptureListener; + } + if (l != null) { + if (what == NATIVE_EVENT_PCM_CAPTURE) { + l.onWaveFormDataCapture(visualizer, data, samplingRate); + } else { // what == NATIVE_EVENT_FFT_CAPTURE + l.onFftDataCapture(visualizer, data, samplingRate); + } + } + }); + break; + case NATIVE_EVENT_SERVER_DIED: + handler.post(() -> { + final OnServerDiedListener l; + synchronized (visualizer.mListenerLock) { + l = visualizer.mServerDiedListener; + } + if (l != null) { + l.onServerDied(); + } + }); + break; + default: + Log.e(TAG, "Unknown native event in postEventFromNative: " + what); + break; + } } } - diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 21e11b523d6a..d24d75260395 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -43,6 +43,7 @@ import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType; import android.media.tv.tuner.frontend.OnTuneEventListener; import android.media.tv.tuner.frontend.ScanCallback; import android.media.tv.tunerresourcemanager.ResourceClientProfile; +import android.media.tv.tunerresourcemanager.TunerFrontendRequest; import android.media.tv.tunerresourcemanager.TunerLnbRequest; import android.media.tv.tunerresourcemanager.TunerResourceManager; import android.os.Handler; @@ -195,15 +196,15 @@ public class Tuner implements AutoCloseable { private final TunerResourceManager mTunerResourceManager; private final int mClientId; - private List<Integer> mFrontendIds; private Frontend mFrontend; private EventHandler mHandler; @Nullable private FrontendInfo mFrontendInfo; + private Integer mFrontendHandle; + private int mFrontendType = FrontendSettings.TYPE_UNDEFINED; - private List<Integer> mLnbIds; private Lnb mLnb; - private Integer mLnbId; + private Integer mLnbHandle; @Nullable private OnTuneEventListener mOnTuneEventListener; @Nullable @@ -327,7 +328,7 @@ public class Tuner implements AutoCloseable { /** * Native method to open frontend of the given ID. */ - private native Frontend nativeOpenFrontendById(int id); + private native Frontend nativeOpenFrontendByHandle(int handle); private native int nativeTune(int type, FrontendSettings settings); private native int nativeStopTune(); private native int nativeScan(int settingsType, FrontendSettings settings, int scanType); @@ -344,7 +345,7 @@ public class Tuner implements AutoCloseable { private native TimeFilter nativeOpenTimeFilter(); private native List<Integer> nativeGetLnbIds(); - private native Lnb nativeOpenLnbById(int id); + private native Lnb nativeOpenLnbByHandle(int handle); private native Lnb nativeOpenLnbByName(String name); private native Descrambler nativeOpenDescrambler(); @@ -476,7 +477,8 @@ public class Tuner implements AutoCloseable { @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int tune(@NonNull FrontendSettings settings) { - TunerUtils.checkTunerPermission(mContext); + mFrontendType = settings.getType(); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); mFrontendInfo = null; return nativeTune(settings.getType(), settings); } @@ -511,12 +513,13 @@ public class Tuner implements AutoCloseable { @Result public int scan(@NonNull FrontendSettings settings, @ScanType int scanType, @NonNull @CallbackExecutor Executor executor, @NonNull ScanCallback scanCallback) { - TunerUtils.checkTunerPermission(mContext); if (mScanCallback != null || mScanCallbackExecutor != null) { throw new IllegalStateException( "Scan already in progress. stopScan must be called before a new scan can be " + "started."); } + mFrontendType = settings.getType(); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); mScanCallback = scanCallback; mScanCallbackExecutor = executor; mFrontendInfo = null; @@ -544,6 +547,16 @@ public class Tuner implements AutoCloseable { return retVal; } + private boolean requestFrontend() { + int[] feId = new int[1]; + TunerFrontendRequest request = new TunerFrontendRequest(mClientId, mFrontendType); + boolean granted = mTunerResourceManager.requestFrontend(request, feId); + if (granted) { + mFrontendHandle = feId[0]; + } + return granted; + } + /** * Sets Low-Noise Block downconverter (LNB) for satellite frontend. * @@ -677,22 +690,6 @@ public class Tuner implements AutoCloseable { return nativeGetDemuxCapabilities(); } - private List<Integer> getFrontendIds() { - mFrontendIds = nativeGetFrontendIds(); - return mFrontendIds; - } - - private Frontend openFrontendById(int id) { - if (mFrontendIds == null) { - mFrontendIds = getFrontendIds(); - } - if (!mFrontendIds.contains(id)) { - return null; - } - mFrontend = nativeOpenFrontendById(id); - return mFrontend; - } - private void onFrontendEvent(int eventType) { if (mOnTunerEventExecutor != null && mOnTuneEventListener != null) { mOnTunerEventExecutor.execute(() -> mOnTuneEventListener.onTuneEvent(eventType)); @@ -829,11 +826,9 @@ public class Tuner implements AutoCloseable { public Lnb openLnb(@CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); - TunerUtils.checkTunerPermission(mContext); - if (mLnbId == null && !requestLnb()) { - return null; - } - return nativeOpenLnbById(mLnbId); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB); + // TODO: update JNI code for LNB handle, + return nativeOpenLnbByHandle(mLnbHandle); } /** @@ -861,7 +856,7 @@ public class Tuner implements AutoCloseable { TunerLnbRequest request = new TunerLnbRequest(mClientId); boolean granted = mTunerResourceManager.requestLnb(request, lnbId); if (granted) { - mLnbId = lnbId[0]; + mLnbHandle = lnbId[0]; } return granted; } @@ -876,22 +871,6 @@ public class Tuner implements AutoCloseable { return nativeOpenTimeFilter(); } - private List<Integer> getLnbIds() { - mLnbIds = nativeGetLnbIds(); - return mLnbIds; - } - - private Lnb openLnbById(int id) { - if (mLnbIds == null) { - mLnbIds = getLnbIds(); - } - if (!mLnbIds.contains(id)) { - return null; - } - mLnb = nativeOpenLnbById(id); - return mLnb; - } - private void onLnbEvent(int eventType) { if (mHandler != null) { mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0)); @@ -955,4 +934,23 @@ public class Tuner implements AutoCloseable { DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize); return dvr; } + + private boolean checkResource(int resourceType) { + // TODO: demux and descrambler + switch (resourceType) { + case TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND: { + if (mFrontendHandle == null && !requestFrontend()) { + return false; + } + break; + } + case TunerResourceManager.TUNER_RESOURCE_TYPE_LNB: { + if (mLnbHandle == null && !requestLnb()) { + return false; + } + break; + } + } + return true; + } } diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java index 9dddcd4eaa3b..63a71e272e53 100644 --- a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java +++ b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java @@ -17,6 +17,7 @@ package android.media.tv.tunerresourcemanager; import android.annotation.CallbackExecutor; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresFeature; @@ -27,6 +28,8 @@ import android.os.Binder; import android.os.RemoteException; import android.util.Log; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.concurrent.Executor; /** @@ -61,6 +64,24 @@ public class TunerResourceManager { private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final int INVALID_RESOURCE_HANDLE = -1; + /** + * Tuner resource type to help generate resource handle + */ + @IntDef({ + TUNER_RESOURCE_TYPE_FRONTEND, + TUNER_RESOURCE_TYPE_DEMUX, + TUNER_RESOURCE_TYPE_DESCRAMBLER, + TUNER_RESOURCE_TYPE_LNB, + TUNER_RESOURCE_TYPE_CAS_SESSION, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface TunerResourceType {} + + public static final int TUNER_RESOURCE_TYPE_FRONTEND = 0; + public static final int TUNER_RESOURCE_TYPE_DEMUX = 1; + public static final int TUNER_RESOURCE_TYPE_DESCRAMBLER = 2; + public static final int TUNER_RESOURCE_TYPE_LNB = 3; + public static final int TUNER_RESOURCE_TYPE_CAS_SESSION = 4; private final ITunerResourceManager mService; private final int mUserId; diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index a37c9e52f5dd..bbeb45179c78 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1410,6 +1410,10 @@ static sp<IDescrambler> getDescrambler(JNIEnv *env, jobject descrambler) { return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext); } +static uint32_t getResourceIdFromHandle(jint handle) { + return (handle & 0x00ff0000) >> 16; +} + static DemuxPid getDemuxPid(int pidType, int pid) { DemuxPid demuxPid; if ((int)pidType == 1) { @@ -1968,8 +1972,10 @@ static jobject android_media_tv_Tuner_get_frontend_ids(JNIEnv *env, jobject thiz return tuner->getFrontendIds(); } -static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject thiz, jint id) { +static jobject android_media_tv_Tuner_open_frontend_by_handle( + JNIEnv *env, jobject thiz, jint handle) { sp<JTuner> tuner = getTuner(env, thiz); + uint32_t id = getResourceIdFromHandle(handle); return tuner->openFrontendById(id); } @@ -2045,8 +2051,9 @@ static jobject android_media_tv_Tuner_get_lnb_ids(JNIEnv *env, jobject thiz) { return tuner->getLnbIds(); } -static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz, jint id) { +static jobject android_media_tv_Tuner_open_lnb_by_handle(JNIEnv *env, jobject thiz, jint handle) { sp<JTuner> tuner = getTuner(env, thiz); + uint32_t id = getResourceIdFromHandle(handle); return tuner->openLnbById(id); } @@ -2924,8 +2931,8 @@ static const JNINativeMethod gTunerMethods[] = { { "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup }, { "nativeGetFrontendIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_frontend_ids }, - { "nativeOpenFrontendById", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", - (void *)android_media_tv_Tuner_open_frontend_by_id }, + { "nativeOpenFrontendByHandle", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", + (void *)android_media_tv_Tuner_open_frontend_by_handle }, { "nativeTune", "(ILandroid/media/tv/tuner/frontend/FrontendSettings;)I", (void *)android_media_tv_Tuner_tune }, { "nativeStopTune", "()I", (void *)android_media_tv_Tuner_stop_tune }, @@ -2950,8 +2957,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_open_time_filter }, { "nativeGetLnbIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_lnb_ids }, - { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Lnb;", - (void *)android_media_tv_Tuner_open_lnb_by_id }, + { "nativeOpenLnbByHandle", "(I)Landroid/media/tv/tuner/Lnb;", + (void *)android_media_tv_Tuner_open_lnb_by_handle }, { "nativeOpenLnbByName", "(Ljava/lang/String;)Landroid/media/tv/tuner/Lnb;", (void *)android_media_tv_Tuner_open_lnb_by_name }, { "nativeOpenDescrambler", "()Landroid/media/tv/tuner/Descrambler;", diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index 1362433bb26e..f9a77f474c50 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -196,7 +196,6 @@ static void captureCallback(void* user, callbackInfo->visualizer_ref, NATIVE_EVENT_PCM_CAPTURE, samplingrate, - 0, jArray); } } @@ -217,7 +216,6 @@ static void captureCallback(void* user, callbackInfo->visualizer_ref, NATIVE_EVENT_FFT_CAPTURE, samplingrate, - 0, jArray); } } @@ -286,7 +284,7 @@ android_media_visualizer_native_init(JNIEnv *env) // Get the postEvent method fields.midPostNativeEvent = env->GetStaticMethodID( fields.clazzEffect, - "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V"); + "postEventFromNative", "(Ljava/lang/Object;II[B)V"); if (fields.midPostNativeEvent == NULL) { ALOGE("Can't find Visualizer.%s", "postEventFromNative"); return; @@ -343,7 +341,7 @@ static void android_media_visualizer_effect_callback(int32_t event, fields.midPostNativeEvent, callbackInfo->visualizer_ref, NATIVE_EVENT_SERVER_DIED, - 0, 0, NULL); + 0, NULL); } } diff --git a/packages/CarSystemUI/proguard.flags b/packages/CarSystemUI/proguard.flags index a81c7e08e357..66cbf2650429 100644 --- a/packages/CarSystemUI/proguard.flags +++ b/packages/CarSystemUI/proguard.flags @@ -1,3 +1,4 @@ -keep class com.android.systemui.CarSystemUIFactory +-keep class com.android.car.notification.headsup.animationhelper.** -include ../SystemUI/proguard.flags diff --git a/packages/CarSystemUI/res/drawable/headsup_scrim_bottom.xml b/packages/CarSystemUI/res/drawable/headsup_scrim_bottom.xml new file mode 100644 index 000000000000..1724ef008269 --- /dev/null +++ b/packages/CarSystemUI/res/drawable/headsup_scrim_bottom.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<shape + xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <gradient + android:startColor="@android:color/black" + android:endColor="@android:color/transparent" + android:angle="90" /> +</shape> diff --git a/packages/CarSystemUI/res/layout/headsup_container_bottom.xml b/packages/CarSystemUI/res/layout/headsup_container_bottom.xml new file mode 100644 index 000000000000..caf1677234d0 --- /dev/null +++ b/packages/CarSystemUI/res/layout/headsup_container_bottom.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<androidx.constraintlayout.widget.ConstraintLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/notification_headsup" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/gradient_edge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_begin="@dimen/headsup_scrim_height"/> + + <View + android:id="@+id/scrim" + android:layout_width="match_parent" + android:layout_height="0dp" + android:background="@drawable/headsup_scrim_bottom" + app:layout_constraintBottom_toBottomOf="@+id/gradient_edge" + app:layout_constraintTop_toTopOf="parent"/> + + <FrameLayout + android:id="@+id/headsup_content" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/headsup_notification_top_margin" + app:layout_constraintEnd_toStartOf="parent" + app:layout_constraintStart_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + /> + +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml index aaa65de2fa1d..2077e7707f59 100644 --- a/packages/CarSystemUI/res/values/config.xml +++ b/packages/CarSystemUI/res/values/config.xml @@ -34,6 +34,13 @@ <!-- Whether heads-up notifications should be shown when shade is open. --> <bool name="config_enableHeadsUpNotificationWhenNotificationShadeOpen">true</bool> + <!-- Whether heads-up notifications should be shown on the bottom. If false, heads-up + notifications will be shown pushed to the top of their parent container. If true, they will + be shown pushed to the bottom of their parent container. If true, then should override + config_headsUpNotificationAnimationHelper to use a different AnimationHelper, such as + com.android.car.notification.headsup.animationhelper. + CarHeadsUpNotificationBottomAnimationHelper. --> + <bool name="config_showHeadsUpNotificationOnBottom">false</bool> <bool name="config_hideNavWhenKeyguardBouncerShown">true</bool> <bool name="config_enablePersistentDockedActivity">false</bool> diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java index 689d2d537bd6..53e5d9fe91ec 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java @@ -60,6 +60,8 @@ public class CarHeadsUpNotificationSystemContainer implements CarHeadsUpNotifica mCarDeviceProvisionedController = deviceProvisionedController; mCarStatusBarLazy = carStatusBarLazy; + boolean showOnBottom = resources.getBoolean(R.bool.config_showHeadsUpNotificationOnBottom); + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, @@ -68,11 +70,13 @@ public class CarHeadsUpNotificationSystemContainer implements CarHeadsUpNotifica | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); - lp.gravity = Gravity.TOP; + lp.gravity = showOnBottom ? Gravity.BOTTOM : Gravity.TOP; lp.setTitle("HeadsUpNotification"); - mWindow = (ViewGroup) LayoutInflater.from(context) - .inflate(R.layout.headsup_container, null, false); + int layoutId = showOnBottom + ? R.layout.headsup_container_bottom + : R.layout.headsup_container; + mWindow = (ViewGroup) LayoutInflater.from(context).inflate(layoutId, null, false); windowManager.addView(mWindow, lp); mWindow.setVisibility(View.INVISIBLE); mHeadsUpContentFrame = mWindow.findViewById(R.id.headsup_content); diff --git a/packages/SettingsLib/res/drawable/ic_media_group_device.xml b/packages/SettingsLib/res/drawable/ic_media_group_device.xml new file mode 100644 index 000000000000..ba5e65119ead --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_media_group_device.xml @@ -0,0 +1,32 @@ +<!-- + Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License + --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="?android:attr/colorControlNormal"> + <path + android:pathData="M18.2,1L9.8,1C8.81,1 8,1.81 8,2.8v14.4c0,0.99 0.81,1.79 1.8,1.79l8.4,0.01c0.99,0 1.8,-0.81 1.8,-1.8L20,2.8c0,-0.99 -0.81,-1.8 -1.8,-1.8zM14,3c1.1,0 2,0.89 2,2s-0.9,2 -2,2 -2,-0.89 -2,-2 0.9,-2 2,-2zM14,16.5c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z" + android:fillColor="#000000"/> + <path + android:pathData="M14,12.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0" + android:fillColor="#000000"/> + <path + android:pathData="M6,5H4v16c0,1.1 0.89,2 2,2h10v-2H6V5z" + android:fillColor="#000000"/> +</vector>
\ No newline at end of file diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 00f6bcb6c548..a7970668124b 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1039,7 +1039,7 @@ <!-- Title for the accessibility preference to configure display color space correction. [CHAR LIMIT=NONE] --> <string name="accessibility_display_daltonizer_preference_title">Color correction</string> <!-- Subtitle for the accessibility preference to configure display color space correction. [CHAR LIMIT=NONE] --> - <string name="accessibility_display_daltonizer_preference_subtitle">Color correction helps the device display more accurate colors. Color correction may be helpful for people with colorblindness.</string> + <string name="accessibility_display_daltonizer_preference_subtitle"><![CDATA[Color correction allows you to adjust how colors are displayed on your device]]></string> <!-- Summary shown for color space correction preference when its value is overridden by another preference [CHAR LIMIT=35] --> <string name="daltonizer_type_overridden">Overridden by <xliff:g id="title" example="Simulate color space">%1$s</xliff:g></string> diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java index b725ba5b8748..85fa988a866e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java @@ -15,11 +15,17 @@ */ package com.android.settingslib.media; +import static android.media.MediaRoute2Info.TYPE_GROUP; +import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_REMOTE_TV; + import android.content.Context; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; +import androidx.annotation.VisibleForTesting; + import com.android.settingslib.R; import com.android.settingslib.bluetooth.BluetoothUtils; @@ -51,7 +57,23 @@ public class InfoMediaDevice extends MediaDevice { public Drawable getIcon() { //TODO(b/120669861): Return remote device icon uri once api is ready. return BluetoothUtils.buildBtRainbowDrawable(mContext, - mContext.getDrawable(R.drawable.ic_media_device), getId().hashCode()); + mContext.getDrawable(getDrawableResId()), getId().hashCode()); + } + + @VisibleForTesting + int getDrawableResId() { + int resId; + switch (mRouteInfo.getType()) { + case TYPE_GROUP: + resId = R.drawable.ic_media_group_device; + break; + case TYPE_REMOTE_TV: + case TYPE_REMOTE_SPEAKER: + default: + resId = R.drawable.ic_media_device; + break; + } + return resId; } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index 166fbaa2a337..af88723c6249 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -15,11 +15,17 @@ */ package com.android.settingslib.media; +import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; +import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; + import android.content.Context; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; +import androidx.annotation.VisibleForTesting; + import com.android.settingslib.R; import com.android.settingslib.bluetooth.BluetoothUtils; @@ -43,7 +49,18 @@ public class PhoneMediaDevice extends MediaDevice { @Override public String getName() { - return mContext.getString(R.string.media_transfer_this_device_name); + CharSequence name; + switch (mRouteInfo.getType()) { + case TYPE_WIRED_HEADSET: + case TYPE_WIRED_HEADPHONES: + name = mRouteInfo.getName(); + break; + case TYPE_BUILTIN_SPEAKER: + default: + name = mContext.getString(R.string.media_transfer_this_device_name); + break; + } + return name.toString(); } @Override @@ -54,7 +71,23 @@ public class PhoneMediaDevice extends MediaDevice { @Override public Drawable getIcon() { return BluetoothUtils.buildBtRainbowDrawable(mContext, - mContext.getDrawable(R.drawable.ic_smartphone), getId().hashCode()); + mContext.getDrawable(getDrawableResId()), getId().hashCode()); + } + + @VisibleForTesting + int getDrawableResId() { + int resId; + switch (mRouteInfo.getType()) { + case TYPE_WIRED_HEADSET: + case TYPE_WIRED_HEADPHONES: + resId = com.android.internal.R.drawable.ic_bt_headphones_a2dp; + break; + case TYPE_BUILTIN_SPEAKER: + default: + resId = R.drawable.ic_smartphone; + break; + } + return resId; } @Override diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java index 77a67c286989..685c834ff328 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaDeviceTest.java @@ -16,6 +16,10 @@ package com.android.settingslib.media; +import static android.media.MediaRoute2Info.TYPE_GROUP; +import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_REMOTE_TV; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; @@ -86,4 +90,19 @@ public class InfoMediaDeviceTest { assertThat(mInfoMediaDevice.getId()).isEqualTo(TEST_ID); } + + @Test + public void getDrawableResId_returnCorrectResId() { + when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_TV); + + assertThat(mInfoMediaDevice.getDrawableResId()).isEqualTo(R.drawable.ic_media_device); + + when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_SPEAKER); + + assertThat(mInfoMediaDevice.getDrawableResId()).isEqualTo(R.drawable.ic_media_device); + + when(mRouteInfo.getType()).thenReturn(TYPE_GROUP); + + assertThat(mInfoMediaDevice.getDrawableResId()).isEqualTo(R.drawable.ic_media_group_device); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java index db984fb8dc26..4c5cd9682b0f 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java @@ -16,15 +16,23 @@ package com.android.settingslib.media; +import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; +import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + import android.content.Context; +import android.media.MediaRoute2Info; import com.android.settingslib.R; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @@ -32,6 +40,9 @@ import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) public class PhoneMediaDeviceTest { + @Mock + private MediaRoute2Info mInfo; + private Context mContext; private PhoneMediaDevice mPhoneMediaDevice; @@ -41,7 +52,7 @@ public class PhoneMediaDeviceTest { mContext = RuntimeEnvironment.application; mPhoneMediaDevice = - new PhoneMediaDevice(mContext, null, null, null); + new PhoneMediaDevice(mContext, null, mInfo, null); } @Test @@ -58,4 +69,42 @@ public class PhoneMediaDeviceTest { assertThat(mPhoneMediaDevice.getSummary()).isEmpty(); } + + @Test + public void getDrawableResId_returnCorrectResId() { + when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADPHONES); + + assertThat(mPhoneMediaDevice.getDrawableResId()) + .isEqualTo(com.android.internal.R.drawable.ic_bt_headphones_a2dp); + + when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADSET); + + assertThat(mPhoneMediaDevice.getDrawableResId()) + .isEqualTo(com.android.internal.R.drawable.ic_bt_headphones_a2dp); + + when(mInfo.getType()).thenReturn(TYPE_BUILTIN_SPEAKER); + + assertThat(mPhoneMediaDevice.getDrawableResId()).isEqualTo(R.drawable.ic_smartphone); + } + + @Test + public void getName_returnCorrectName() { + final String deviceName = "test_name"; + + when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADPHONES); + when(mInfo.getName()).thenReturn(deviceName); + + assertThat(mPhoneMediaDevice.getName()) + .isEqualTo(deviceName); + + when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADSET); + + assertThat(mPhoneMediaDevice.getName()) + .isEqualTo(deviceName); + + when(mInfo.getType()).thenReturn(TYPE_BUILTIN_SPEAKER); + + assertThat(mPhoneMediaDevice.getName()) + .isEqualTo(mContext.getString(R.string.media_transfer_this_device_name)); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index d422dd7f4175..11b625f41737 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -436,6 +436,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { + // Handle padding of QuickStatusBarHeader + setPadding(mRoundedCornerPadding, getPaddingTop(), mRoundedCornerPadding, + getPaddingBottom()); + // Handle padding of SystemIconsView DisplayCutout cutout = insets.getDisplayCutout(); Pair<Integer, Integer> cornerCutoutPadding = StatusBarWindowView.cornerCutoutMargins( @@ -450,8 +454,11 @@ public class QuickStatusBarHeader extends RelativeLayout implements int statusBarPaddingRight = isLayoutRtl() ? getResources().getDimensionPixelSize(R.dimen.status_bar_padding_start) : getResources().getDimensionPixelSize(R.dimen.status_bar_padding_end); - mSystemIconsView.setPadding(padding.first + statusBarPaddingLeft, waterfallTopInset, - padding.second + statusBarPaddingRight, 0); + mSystemIconsView.setPadding( + Math.max(padding.first + statusBarPaddingLeft - mRoundedCornerPadding, 0), + waterfallTopInset, + Math.max(padding.second + statusBarPaddingRight - mRoundedCornerPadding, 0), + 0); return super.onApplyWindowInsets(insets); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java index c282cb8a5cb5..0b747f94e935 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java @@ -114,8 +114,9 @@ public class HeadsUpTouchHelper implements Gefingerpoken { mInitialTouchY = y; int startHeight = (int) (mPickedChild.getActualHeight() + mPickedChild.getTranslationY()); - mPanel.setPanelScrimMinFraction((float) startHeight - / mPanel.getMaxPanelHeight()); + float maxPanelHeight = mPanel.getMaxPanelHeight(); + mPanel.setPanelScrimMinFraction(maxPanelHeight > 0f + ? (float) startHeight / maxPanelHeight : 0f); mPanel.startExpandMotion(x, y, true /* startTracking */, startHeight); mPanel.startExpandingFromPeek(); // This call needs to be after the expansion start otherwise we will get a diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index c61d7bbf67c5..f9726d2d77f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1844,7 +1844,14 @@ public class NotificationPanelViewController extends PanelViewController { } else { maxHeight = calculatePanelHeightShade(); } - maxHeight = Math.max(maxHeight, min); + maxHeight = Math.max(min, maxHeight); + if (maxHeight == 0) { + Log.wtf(TAG, "maxPanelHeight is 0. getOverExpansionAmount(): " + + getOverExpansionAmount() + ", calculatePanelHeightQsExpanded: " + + calculatePanelHeightQsExpanded() + ", calculatePanelHeightShade: " + + calculatePanelHeightShade() + ", mStatusBarMinHeight = " + + mStatusBarMinHeight + ", mQsMinExpansionHeight = " + mQsMinExpansionHeight); + } return maxHeight; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index 8d8c8da62b4c..c1065189f716 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static java.lang.Float.isNaN; + import android.content.Context; import android.os.Bundle; import android.os.Parcelable; @@ -161,6 +163,9 @@ public abstract class PanelBar extends FrameLayout { * fraction as the panel also might be expanded if the fraction is 0 */ public void panelExpansionChanged(float frac, boolean expanded) { + if (isNaN(frac)) { + throw new IllegalArgumentException("frac cannot be NaN"); + } boolean fullyClosed = true; boolean fullyOpened = false; if (SPEW) LOG("panelExpansionChanged: start state=%d", mState); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index e25c14c86fd5..1c1e7c4eaa4a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -18,6 +18,8 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection; +import static java.lang.Float.isNaN; + import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; @@ -254,6 +256,9 @@ public class PhoneStatusBarView extends PanelBar { @Override public void panelScrimMinFractionChanged(float minFraction) { + if (isNaN(minFraction)) { + throw new IllegalArgumentException("minFraction cannot be NaN"); + } if (mMinFraction != minFraction) { mMinFraction = minFraction; updateScrimFraction(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java index 7d532a88caac..38c165b661b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java @@ -65,7 +65,6 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof new TetheringManager.TetheringEventCallback() { @Override public void onTetheringSupported(boolean supported) { - super.onTetheringSupported(supported); if (mIsTetheringSupported != supported) { mIsTetheringSupported = supported; fireHotspotAvailabilityChanged(); @@ -75,7 +74,6 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof @Override public void onTetherableInterfaceRegexpsChanged( TetheringManager.TetheringInterfaceRegexps reg) { - super.onTetherableInterfaceRegexpsChanged(reg); final boolean newValue = reg.getTetherableWifiRegexs().size() != 0; if (mHasTetherableWifiRegexs != newValue) { mHasTetherableWifiRegexs = newValue; diff --git a/packages/Tethering/common/TetheringLib/api/current.txt b/packages/Tethering/common/TetheringLib/api/current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/packages/Tethering/common/TetheringLib/api/current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/packages/Tethering/common/TetheringLib/api/module-lib-current.txt b/packages/Tethering/common/TetheringLib/api/module-lib-current.txt new file mode 100644 index 000000000000..e25d77dfc9a8 --- /dev/null +++ b/packages/Tethering/common/TetheringLib/api/module-lib-current.txt @@ -0,0 +1,126 @@ +// Signature format: 2.0 +package android.net { + + public final class TetheredClient implements android.os.Parcelable { + ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int); + method public int describeContents(); + method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses(); + method @NonNull public android.net.MacAddress getMacAddress(); + method public int getTetheringType(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR; + } + + public static final class TetheredClient.AddressInfo implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.net.LinkAddress getAddress(); + method @Nullable public String getHostname(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR; + } + + public final class TetheringConstants { + field public static final String EXTRA_ADD_TETHER_TYPE = "extraAddTetherType"; + field public static final String EXTRA_PROVISION_CALLBACK = "extraProvisionCallback"; + field public static final String EXTRA_REM_TETHER_TYPE = "extraRemTetherType"; + field public static final String EXTRA_RUN_PROVISION = "extraRunProvision"; + field public static final String EXTRA_SET_ALARM = "extraSetAlarm"; + } + + public class TetheringManager { + ctor public TetheringManager(@NonNull android.content.Context, @NonNull java.util.function.Supplier<android.os.IBinder>); + method public int getLastTetherError(@NonNull String); + method @NonNull public String[] getTetherableBluetoothRegexs(); + method @NonNull public String[] getTetherableIfaces(); + method @NonNull public String[] getTetherableUsbRegexs(); + method @NonNull public String[] getTetherableWifiRegexs(); + method @NonNull public String[] getTetheredIfaces(); + method @NonNull public String[] getTetheringErroredIfaces(); + method public boolean isTetheringSupported(); + method public boolean isTetheringSupported(@NonNull String); + method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener); + method public void requestLatestTetheringEntitlementResult(int, @NonNull android.os.ResultReceiver, boolean); + method @Deprecated public int setUsbTethering(boolean); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(int, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering(); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int); + method @Deprecated public int tether(@NonNull String); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback); + method @Deprecated public int untether(@NonNull String); + field public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; + field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY"; + field public static final String EXTRA_ACTIVE_TETHER = "tetherArray"; + field public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; + field public static final String EXTRA_ERRORED_TETHER = "erroredArray"; + field public static final int TETHERING_BLUETOOTH = 2; // 0x2 + field public static final int TETHERING_ETHERNET = 5; // 0x5 + field public static final int TETHERING_INVALID = -1; // 0xffffffff + field public static final int TETHERING_NCM = 4; // 0x4 + field public static final int TETHERING_USB = 1; // 0x1 + field public static final int TETHERING_WIFI = 0; // 0x0 + field public static final int TETHERING_WIFI_P2P = 3; // 0x3 + field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc + field public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9; // 0x9 + field public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8; // 0x8 + field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd + field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa + field public static final int TETHER_ERROR_MASTER_ERROR = 5; // 0x5 + field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf + field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe + field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0 + field public static final int TETHER_ERROR_PROVISION_FAILED = 11; // 0xb + field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2 + field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6 + field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4 + field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1 + field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3 + field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7 + field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2 + field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1 + field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0 + } + + public static interface TetheringManager.OnTetheringEntitlementResultListener { + method public void onTetheringEntitlementResult(int); + } + + public abstract static class TetheringManager.StartTetheringCallback { + ctor public TetheringManager.StartTetheringCallback(); + method public void onTetheringFailed(int); + method public void onTetheringStarted(); + } + + public abstract static class TetheringManager.TetheringEventCallback { + ctor public TetheringManager.TetheringEventCallback(); + method public void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>); + method public void onError(@NonNull String, int); + method public void onOffloadStatusChanged(int); + method @Deprecated public void onTetherableInterfaceRegexpsChanged(@NonNull android.net.TetheringManager.TetheringInterfaceRegexps); + method public void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>); + method public void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>); + method public void onTetheringSupported(boolean); + method public void onUpstreamChanged(@Nullable android.net.Network); + } + + @Deprecated public static class TetheringManager.TetheringInterfaceRegexps { + ctor @Deprecated public TetheringManager.TetheringInterfaceRegexps(@NonNull String[], @NonNull String[], @NonNull String[]); + method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableBluetoothRegexs(); + method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableUsbRegexs(); + method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableWifiRegexs(); + } + + public static class TetheringManager.TetheringRequest { + } + + public static class TetheringManager.TetheringRequest.Builder { + ctor public TetheringManager.TetheringRequest.Builder(int); + method @NonNull public android.net.TetheringManager.TetheringRequest build(); + method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean); + method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setSilentProvisioning(boolean); + method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder useStaticIpv4Addresses(@NonNull android.net.LinkAddress); + } + +} + diff --git a/packages/Tethering/common/TetheringLib/api/module-lib-removed.txt b/packages/Tethering/common/TetheringLib/api/module-lib-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/packages/Tethering/common/TetheringLib/api/module-lib-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/packages/Tethering/common/TetheringLib/api/removed.txt b/packages/Tethering/common/TetheringLib/api/removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/packages/Tethering/common/TetheringLib/api/removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/packages/Tethering/common/TetheringLib/api/system-current.txt b/packages/Tethering/common/TetheringLib/api/system-current.txt new file mode 100644 index 000000000000..d6fcb625bdae --- /dev/null +++ b/packages/Tethering/common/TetheringLib/api/system-current.txt @@ -0,0 +1,104 @@ +// Signature format: 2.0 +package android.net { + + public final class TetheredClient implements android.os.Parcelable { + ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int); + method public int describeContents(); + method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses(); + method @NonNull public android.net.MacAddress getMacAddress(); + method public int getTetheringType(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR; + } + + public static final class TetheredClient.AddressInfo implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.net.LinkAddress getAddress(); + method @Nullable public String getHostname(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR; + } + + public class TetheringManager { + method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(int, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering(); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback); + field public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; + field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY"; + field public static final String EXTRA_ACTIVE_TETHER = "tetherArray"; + field public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; + field public static final String EXTRA_ERRORED_TETHER = "erroredArray"; + field public static final int TETHERING_BLUETOOTH = 2; // 0x2 + field public static final int TETHERING_ETHERNET = 5; // 0x5 + field public static final int TETHERING_INVALID = -1; // 0xffffffff + field public static final int TETHERING_NCM = 4; // 0x4 + field public static final int TETHERING_USB = 1; // 0x1 + field public static final int TETHERING_WIFI = 0; // 0x0 + field public static final int TETHERING_WIFI_P2P = 3; // 0x3 + field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc + field public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9; // 0x9 + field public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8; // 0x8 + field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd + field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa + field public static final int TETHER_ERROR_MASTER_ERROR = 5; // 0x5 + field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf + field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe + field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0 + field public static final int TETHER_ERROR_PROVISION_FAILED = 11; // 0xb + field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2 + field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6 + field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4 + field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1 + field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3 + field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7 + field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2 + field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1 + field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0 + } + + public static interface TetheringManager.OnTetheringEntitlementResultListener { + method public void onTetheringEntitlementResult(int); + } + + public abstract static class TetheringManager.StartTetheringCallback { + ctor public TetheringManager.StartTetheringCallback(); + method public void onTetheringFailed(int); + method public void onTetheringStarted(); + } + + public abstract static class TetheringManager.TetheringEventCallback { + ctor public TetheringManager.TetheringEventCallback(); + method public void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>); + method public void onError(@NonNull String, int); + method public void onOffloadStatusChanged(int); + method @Deprecated public void onTetherableInterfaceRegexpsChanged(@NonNull android.net.TetheringManager.TetheringInterfaceRegexps); + method public void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>); + method public void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>); + method public void onTetheringSupported(boolean); + method public void onUpstreamChanged(@Nullable android.net.Network); + } + + @Deprecated public static class TetheringManager.TetheringInterfaceRegexps { + ctor @Deprecated public TetheringManager.TetheringInterfaceRegexps(@NonNull String[], @NonNull String[], @NonNull String[]); + method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableBluetoothRegexs(); + method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableUsbRegexs(); + method @Deprecated @NonNull public java.util.List<java.lang.String> getTetherableWifiRegexs(); + } + + public static class TetheringManager.TetheringRequest { + } + + public static class TetheringManager.TetheringRequest.Builder { + ctor public TetheringManager.TetheringRequest.Builder(int); + method @NonNull public android.net.TetheringManager.TetheringRequest build(); + method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean); + method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setSilentProvisioning(boolean); + method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder useStaticIpv4Addresses(@NonNull android.net.LinkAddress); + } + +} + diff --git a/packages/Tethering/common/TetheringLib/api/system-removed.txt b/packages/Tethering/common/TetheringLib/api/system-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/packages/Tethering/common/TetheringLib/api/system-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 6247a635233a..69154b49c96f 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -157,7 +157,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Queue; import java.util.Random; @@ -174,29 +173,47 @@ public class UserBackupManagerService { public static class BackupWakeLock { private final PowerManager.WakeLock mPowerManagerWakeLock; private boolean mHasQuit = false; + private int mUserId; - public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock) { + public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock, int userId) { mPowerManagerWakeLock = powerManagerWakeLock; + mUserId = userId; } /** Acquires the {@link PowerManager.WakeLock} if hasn't been quit. */ public synchronized void acquire() { if (mHasQuit) { - Slog.v(TAG, "Ignore wakelock acquire after quit: " + mPowerManagerWakeLock.getTag()); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "Ignore wakelock acquire after quit: " + + mPowerManagerWakeLock.getTag())); return; } mPowerManagerWakeLock.acquire(); - Slog.v(TAG, "Acquired wakelock:" + mPowerManagerWakeLock.getTag()); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Acquired wakelock:" + mPowerManagerWakeLock.getTag())); } /** Releases the {@link PowerManager.WakeLock} if hasn't been quit. */ public synchronized void release() { if (mHasQuit) { - Slog.v(TAG, "Ignore wakelock release after quit: " + mPowerManagerWakeLock.getTag()); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "Ignore wakelock release after quit: " + + mPowerManagerWakeLock.getTag())); return; } mPowerManagerWakeLock.release(); - Slog.v(TAG, "Released wakelock:" + mPowerManagerWakeLock.getTag()); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Released wakelock:" + mPowerManagerWakeLock.getTag())); } /** @@ -209,7 +226,10 @@ public class UserBackupManagerService { /** Release the {@link PowerManager.WakeLock} till it isn't held. */ public synchronized void quit() { while (mPowerManagerWakeLock.isHeld()) { - Slog.v(TAG, "Releasing wakelock: " + mPowerManagerWakeLock.getTag()); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Releasing wakelock: " + mPowerManagerWakeLock.getTag())); mPowerManagerWakeLock.release(); } mHasQuit = true; @@ -439,7 +459,9 @@ public class UserBackupManagerService { } if (DEBUG) { - Slog.v(TAG, "Starting with transport " + currentTransport); + Slog.v( + TAG, + addUserIdToLogMessage(userId, "Starting with transport " + currentTransport)); } TransportManager transportManager = new TransportManager(userId, context, transportWhitelist, currentTransport); @@ -451,7 +473,9 @@ public class UserBackupManagerService { new HandlerThread("backup-" + userId, Process.THREAD_PRIORITY_BACKGROUND); userBackupThread.start(); if (DEBUG) { - Slog.d(TAG, "Started thread " + userBackupThread.getName() + " for user " + userId); + Slog.d( + TAG, + addUserIdToLogMessage(userId, "Started thread " + userBackupThread.getName())); } return createAndInitializeService( @@ -556,7 +580,10 @@ public class UserBackupManagerService { if (userId == UserHandle.USER_SYSTEM) { mBaseStateDir.mkdirs(); if (!SELinux.restorecon(mBaseStateDir)) { - Slog.w(TAG, "SELinux restorecon failed on " + mBaseStateDir); + Slog.w( + TAG, + addUserIdToLogMessage( + userId, "SELinux restorecon failed on " + mBaseStateDir)); } } @@ -604,7 +631,8 @@ public class UserBackupManagerService { addPackageParticipantsLocked(null); } - mTransportManager = Objects.requireNonNull(transportManager, "transportManager cannot be null"); + mTransportManager = + Objects.requireNonNull(transportManager, "transportManager cannot be null"); mTransportManager.setOnTransportRegisteredListener(this::onTransportRegistered); mRegisterTransportsRequestedTime = SystemClock.elapsedRealtime(); mBackupHandler.postDelayed( @@ -620,7 +648,7 @@ public class UserBackupManagerService { mWakelock = new BackupWakeLock( mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, - "*backup*-" + userId + "-" + userBackupThread.getThreadId())); + "*backup*-" + userId + "-" + userBackupThread.getThreadId()), userId); // Set up the various sorts of package tracking we do mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule"); @@ -869,7 +897,7 @@ public class UserBackupManagerService { } private void initPackageTracking() { - if (MORE_DEBUG) Slog.v(TAG, "` tracking"); + if (MORE_DEBUG) Slog.v(TAG, addUserIdToLogMessage(mUserId, "` tracking")); // Remember our ancestral dataset mTokenFile = new File(mBaseStateDir, "ancestral"); @@ -891,9 +919,9 @@ public class UserBackupManagerService { } } catch (FileNotFoundException fnf) { // Probably innocuous - Slog.v(TAG, "No ancestral data"); + Slog.v(TAG, addUserIdToLogMessage(mUserId, "No ancestral data")); } catch (IOException e) { - Slog.w(TAG, "Unable to read token file", e); + Slog.w(TAG, addUserIdToLogMessage(mUserId, "Unable to read token file"), e); } mProcessedPackagesJournal = new ProcessedPackagesJournal(mBaseStateDir); @@ -941,7 +969,10 @@ public class UserBackupManagerService { DataInputStream in = new DataInputStream(bufStream)) { int version = in.readInt(); if (version != SCHEDULE_FILE_VERSION) { - Slog.e(TAG, "Unknown backup schedule version " + version); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, "Unknown backup schedule version " + version)); return null; } @@ -966,14 +997,14 @@ public class UserBackupManagerService { schedule.add(new FullBackupEntry(pkgName, lastBackup)); } else { if (DEBUG) { - Slog.i(TAG, "Package " + pkgName - + " no longer eligible for full backup"); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Package " + pkgName + + " no longer eligible for full backup")); } } } catch (NameNotFoundException e) { if (DEBUG) { - Slog.i(TAG, "Package " + pkgName - + " not installed; dropping from full backup"); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Package " + pkgName + + " not installed; dropping from full backup")); } } } @@ -986,7 +1017,13 @@ public class UserBackupManagerService { mUserId)) { if (!foundApps.contains(app.packageName)) { if (MORE_DEBUG) { - Slog.i(TAG, "New full backup app " + app.packageName + " found"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "New full backup app " + + app.packageName + + " found")); } schedule.add(new FullBackupEntry(app.packageName, 0)); changed = true; @@ -996,7 +1033,7 @@ public class UserBackupManagerService { Collections.sort(schedule); } catch (Exception e) { - Slog.e(TAG, "Unable to read backup schedule", e); + Slog.e(TAG, addUserIdToLogMessage(mUserId, "Unable to read backup schedule"), e); mFullBackupScheduleFile.delete(); schedule = null; } @@ -1052,7 +1089,11 @@ public class UserBackupManagerService { out.write(bufStream.toByteArray()); af.finishWrite(out); } catch (Exception e) { - Slog.e(TAG, "Unable to write backup schedule!", e); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, "Unable to write backup schedule!"), + e); } } } @@ -1069,12 +1110,17 @@ public class UserBackupManagerService { if (!journal.equals(mJournal)) { try { journal.forEach(packageName -> { - Slog.i(TAG, "Found stale backup journal, scheduling"); - if (MORE_DEBUG) Slog.i(TAG, " " + packageName); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Found stale backup journal, scheduling")); + if (MORE_DEBUG) { + Slog.i(TAG, addUserIdToLogMessage(mUserId, " " + packageName)); + } dataChangedImpl(packageName); }); } catch (IOException e) { - Slog.e(TAG, "Can't read " + journal, e); + Slog.e(TAG, addUserIdToLogMessage(mUserId, "Can't read " + journal), e); } } } @@ -1114,7 +1160,14 @@ public class UserBackupManagerService { boolean isPending, String transportName, String transportDirName) { synchronized (mQueueLock) { if (MORE_DEBUG) { - Slog.i(TAG, "recordInitPending(" + isPending + ") on transport " + transportName); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "recordInitPending(" + + isPending + + ") on transport " + + transportName)); } File stateDir = new File(mBaseStateDir, transportDirName); @@ -1175,8 +1228,17 @@ public class UserBackupManagerService { private void onTransportRegistered(String transportName, String transportDirName) { if (DEBUG) { long timeMs = SystemClock.elapsedRealtime() - mRegisterTransportsRequestedTime; - Slog.d(TAG, "Transport " + transportName + " registered " + timeMs - + "ms after first request (delay = " + INITIALIZATION_DELAY_MILLIS + "ms)"); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, + "Transport " + + transportName + + " registered " + + timeMs + + "ms after first request (delay = " + + INITIALIZATION_DELAY_MILLIS + + "ms)")); } File stateDir = new File(mBaseStateDir, transportDirName); @@ -1202,7 +1264,7 @@ public class UserBackupManagerService { private BroadcastReceiver mPackageTrackingReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (MORE_DEBUG) { - Slog.d(TAG, "Received broadcast " + intent); + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Received broadcast " + intent)); } String action = intent.getAction(); @@ -1222,24 +1284,33 @@ public class UserBackupManagerService { String packageName = uri.getSchemeSpecificPart(); if (packageName != null) { - packageList = new String[]{packageName}; + packageList = new String[] {packageName}; } changed = Intent.ACTION_PACKAGE_CHANGED.equals(action); if (changed) { // Look at new transport states for package changed events. String[] components = - intent.getStringArrayExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST); + intent.getStringArrayExtra( + Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST); if (MORE_DEBUG) { - Slog.i(TAG, "Package " + packageName + " changed"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Package " + packageName + " changed")); for (int i = 0; i < components.length; i++) { - Slog.i(TAG, " * " + components[i]); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, " * " + components[i])); } } mBackupHandler.post( - () -> mTransportManager.onPackageChanged(packageName, components)); + () -> + mTransportManager.onPackageChanged( + packageName, components)); return; } @@ -1261,7 +1332,8 @@ public class UserBackupManagerService { if (added) { synchronized (mBackupParticipants) { if (replacing) { - // Remove the entry under the old uid and fall through to re-add. If an app + // Remove the entry under the old uid and fall through to re-add. If + // an app // just opted into key/value backup, add it as a known participant. removePackageParticipantsLocked(packageList, uid); } @@ -1275,13 +1347,15 @@ public class UserBackupManagerService { mPackageManager.getPackageInfoAsUser( packageName, /* flags */ 0, mUserId); if (AppBackupUtils.appGetsFullBackup(app) - && AppBackupUtils.appIsEligibleForBackup(app.applicationInfo, - mUserId)) { + && AppBackupUtils.appIsEligibleForBackup( + app.applicationInfo, mUserId)) { enqueueFullBackup(packageName, now); scheduleNextFullBackupJob(0); } else { - // The app might have just transitioned out of full-data into doing - // key/value backups, or might have just disabled backups entirely. Make + // The app might have just transitioned out of full-data into + // doing + // key/value backups, or might have just disabled backups + // entirely. Make // sure it is no longer in the full-data queue. synchronized (mQueueLock) { dequeueFullBackupLocked(packageName); @@ -1293,17 +1367,23 @@ public class UserBackupManagerService { () -> mTransportManager.onPackageAdded(packageName)); } catch (NameNotFoundException e) { if (DEBUG) { - Slog.w(TAG, "Can't resolve new app " + packageName); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Can't resolve new app " + packageName)); } } } - // Whenever a package is added or updated we need to update the package metadata + // Whenever a package is added or updated we need to update the package + // metadata // bookkeeping. dataChangedImpl(PACKAGE_MANAGER_SENTINEL); } else { if (!replacing) { - // Outright removal. In the full-data case, the app will be dropped from the + // Outright removal. In the full-data case, the app will be dropped from + // the // queue when its (now obsolete) name comes up again for backup. synchronized (mBackupParticipants) { removePackageParticipantsLocked(packageList, uid); @@ -1324,12 +1404,19 @@ public class UserBackupManagerService { // Look for apps that define the android:backupAgent attribute List<PackageInfo> targetApps = allAgentPackages(); if (packageNames != null) { - if (MORE_DEBUG) Slog.v(TAG, "addPackageParticipantsLocked: #" + packageNames.length); + if (MORE_DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "addPackageParticipantsLocked: #" + packageNames.length)); + } for (String packageName : packageNames) { addPackageParticipantsLockedInner(packageName, targetApps); } } else { - if (MORE_DEBUG) Slog.v(TAG, "addPackageParticipantsLocked: all"); + if (MORE_DEBUG) { + Slog.v(TAG, addUserIdToLogMessage(mUserId, "addPackageParticipantsLocked: all")); + } addPackageParticipantsLockedInner(null, targetApps); } } @@ -1337,7 +1424,10 @@ public class UserBackupManagerService { private void addPackageParticipantsLockedInner(String packageName, List<PackageInfo> targetPkgs) { if (MORE_DEBUG) { - Slog.v(TAG, "Examining " + packageName + " for backup agent"); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Examining " + packageName + " for backup agent")); } for (PackageInfo pkg : targetPkgs) { @@ -1349,10 +1439,15 @@ public class UserBackupManagerService { mBackupParticipants.put(uid, set); } set.add(pkg.packageName); - if (MORE_DEBUG) Slog.v(TAG, "Agent found; added"); + if (MORE_DEBUG) Slog.v(TAG, addUserIdToLogMessage(mUserId, "Agent found; added")); // Schedule a backup for it on general principles - if (MORE_DEBUG) Slog.i(TAG, "Scheduling backup for new app " + pkg.packageName); + if (MORE_DEBUG) { + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Scheduling backup for new app " + pkg.packageName)); + } Message msg = mBackupHandler .obtainMessage(MSG_SCHEDULE_BACKUP_PACKAGE, pkg.packageName); mBackupHandler.sendMessage(msg); @@ -1363,13 +1458,19 @@ public class UserBackupManagerService { // Remove the given packages' entries from our known active set. private void removePackageParticipantsLocked(String[] packageNames, int oldUid) { if (packageNames == null) { - Slog.w(TAG, "removePackageParticipants with null list"); + Slog.w(TAG, addUserIdToLogMessage(mUserId, "removePackageParticipants with null list")); return; } if (MORE_DEBUG) { - Slog.v(TAG, "removePackageParticipantsLocked: uid=" + oldUid - + " #" + packageNames.length); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "removePackageParticipantsLocked: uid=" + + oldUid + + " #" + + packageNames.length)); } for (String pkg : packageNames) { // Known previous UID, so we know which package set to check @@ -1377,7 +1478,12 @@ public class UserBackupManagerService { if (set != null && set.contains(pkg)) { removePackageFromSetLocked(set, pkg); if (set.isEmpty()) { - if (MORE_DEBUG) Slog.v(TAG, " last one of this uid; purging set"); + if (MORE_DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, " last one of this uid; purging set")); + } mBackupParticipants.remove(oldUid); } } @@ -1393,7 +1499,11 @@ public class UserBackupManagerService { // Note that we deliberately leave it 'known' in the "ever backed up" // bookkeeping so that its current-dataset data will be retrieved // if the app is subsequently reinstalled - if (MORE_DEBUG) Slog.v(TAG, " removing participant " + packageName); + if (MORE_DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage(mUserId, " removing participant " + packageName)); + } set.remove(packageName); mPendingBackups.remove(packageName); } @@ -1467,14 +1577,19 @@ public class UserBackupManagerService { af.writeInt(-1); } else { af.writeInt(mAncestralPackages.size()); - if (DEBUG) Slog.v(TAG, "Ancestral packages: " + mAncestralPackages.size()); + if (DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Ancestral packages: " + mAncestralPackages.size())); + } for (String pkgName : mAncestralPackages) { af.writeUTF(pkgName); - if (MORE_DEBUG) Slog.v(TAG, " " + pkgName); + if (MORE_DEBUG) Slog.v(TAG, addUserIdToLogMessage(mUserId, " " + pkgName)); } } } catch (IOException e) { - Slog.w(TAG, "Unable to write token file:", e); + Slog.w(TAG, addUserIdToLogMessage(mUserId, "Unable to write token file:"), e); } } @@ -1487,7 +1602,7 @@ public class UserBackupManagerService { mConnectedAgent = null; try { if (mActivityManager.bindBackupAgent(app.packageName, mode, mUserId)) { - Slog.d(TAG, "awaiting agent for " + app); + Slog.d(TAG, addUserIdToLogMessage(mUserId, "awaiting agent for " + app)); // success; wait for the agent to arrive // only wait 10 seconds for the bind to happen @@ -1498,7 +1613,7 @@ public class UserBackupManagerService { mAgentConnectLock.wait(5000); } catch (InterruptedException e) { // just bail - Slog.w(TAG, "Interrupted: " + e); + Slog.w(TAG, addUserIdToLogMessage(mUserId, "Interrupted: " + e)); mConnecting = false; mConnectedAgent = null; } @@ -1506,10 +1621,14 @@ public class UserBackupManagerService { // if we timed out with no connect, abort and move on if (mConnecting) { - Slog.w(TAG, "Timeout waiting for agent " + app); + Slog.w( + TAG, + addUserIdToLogMessage(mUserId, "Timeout waiting for agent " + app)); mConnectedAgent = null; } - if (DEBUG) Slog.i(TAG, "got agent " + mConnectedAgent); + if (DEBUG) { + Slog.i(TAG, addUserIdToLogMessage(mUserId, "got agent " + mConnectedAgent)); + } agent = mConnectedAgent; } } catch (RemoteException e) { @@ -1575,13 +1694,20 @@ public class UserBackupManagerService { if (!shouldClearData) { if (MORE_DEBUG) { - Slog.i(TAG, "Clearing app data is not allowed so not wiping " - + packageName); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Clearing app data is not allowed so not wiping " + + packageName)); } return; } } catch (NameNotFoundException e) { - Slog.w(TAG, "Tried to clear data for " + packageName + " but not found"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Tried to clear data for " + packageName + " but not found")); return; } @@ -1604,13 +1730,22 @@ public class UserBackupManagerService { } catch (InterruptedException e) { // won't happen, but still. mClearingData = false; - Slog.w(TAG, "Interrupted while waiting for " + packageName - + " data to be cleared", e); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Interrupted while waiting for " + + packageName + + " data to be cleared"), + e); } } if (mClearingData) { - Slog.w(TAG, "Clearing app data for " + packageName + " timed out"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Clearing app data for " + packageName + " timed out")); } } } @@ -1627,12 +1762,17 @@ public class UserBackupManagerService { synchronized (mQueueLock) { if (mCurrentToken != 0 && mProcessedPackagesJournal.hasBeenProcessed(packageName)) { if (MORE_DEBUG) { - Slog.i(TAG, "App in ever-stored, so using current token"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "App in ever-stored, so using current token")); } token = mCurrentToken; } } - if (MORE_DEBUG) Slog.i(TAG, "getAvailableRestoreToken() == " + token); + if (MORE_DEBUG) { + Slog.i(TAG, addUserIdToLogMessage(mUserId, "getAvailableRestoreToken() == " + token)); + } return token; } @@ -1654,7 +1794,7 @@ public class UserBackupManagerService { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup"); if (packages == null || packages.length < 1) { - Slog.e(TAG, "No packages named for backup request"); + Slog.e(TAG, addUserIdToLogMessage(mUserId, "No packages named for backup request")); BackupObserverUtils.sendBackupFinished(observer, BackupManager.ERROR_TRANSPORT_ABORTED); monitor = BackupManagerMonitorUtils.monitorEvent(monitor, BackupManagerMonitor.LOG_EVENT_ID_NO_PACKAGES, @@ -1665,10 +1805,10 @@ public class UserBackupManagerService { if (!mEnabled || !mSetupComplete) { Slog.i( TAG, - "Backup requested but enabled=" + addUserIdToLogMessage(mUserId, "Backup requested but enabled=" + mEnabled + " setupComplete=" - + mSetupComplete); + + mSetupComplete)); BackupObserverUtils.sendBackupFinished(observer, BackupManager.ERROR_BACKUP_NOT_ALLOWED); final int logTag = mSetupComplete @@ -1726,9 +1866,17 @@ public class UserBackupManagerService { EventLog.writeEvent(EventLogTags.BACKUP_REQUESTED, packages.length, kvBackupList.size(), fullBackupList.size()); if (MORE_DEBUG) { - Slog.i(TAG, "Backup requested for " + packages.length + " packages, of them: " - + fullBackupList.size() + " full backups, " + kvBackupList.size() - + " k/v backups"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Backup requested for " + + packages.length + + " packages, of them: " + + fullBackupList.size() + + " full backups, " + + kvBackupList.size() + + " k/v backups")); } boolean nonIncrementalBackup = (flags & BackupManager.FLAG_NON_INCREMENTAL_BACKUP) != 0; @@ -1744,7 +1892,7 @@ public class UserBackupManagerService { public void cancelBackups() { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "cancelBackups"); if (MORE_DEBUG) { - Slog.i(TAG, "cancelBackups() called."); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "cancelBackups() called.")); } final long oldToken = Binder.clearCallingIdentity(); try { @@ -1774,13 +1922,27 @@ public class UserBackupManagerService { public void prepareOperationTimeout(int token, long interval, BackupRestoreTask callback, int operationType) { if (operationType != OP_TYPE_BACKUP_WAIT && operationType != OP_TYPE_RESTORE_WAIT) { - Slog.wtf(TAG, "prepareOperationTimeout() doesn't support operation " - + Integer.toHexString(token) + " of type " + operationType); + Slog.wtf( + TAG, + addUserIdToLogMessage( + mUserId, + "prepareOperationTimeout() doesn't support operation " + + Integer.toHexString(token) + + " of type " + + operationType)); return; } if (MORE_DEBUG) { - Slog.v(TAG, "starting timeout: token=" + Integer.toHexString(token) - + " interval=" + interval + " callback=" + callback); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "starting timeout: token=" + + Integer.toHexString(token) + + " interval=" + + interval + + " callback=" + + callback)); } synchronized (mCurrentOpLock) { @@ -1798,8 +1960,12 @@ public class UserBackupManagerService { case OP_TYPE_RESTORE_WAIT: return MSG_RESTORE_OPERATION_TIMEOUT; default: - Slog.wtf(TAG, "getMessageIdForOperationType called on invalid operation type: " - + operationType); + Slog.wtf( + TAG, + addUserIdToLogMessage( + mUserId, + "getMessageIdForOperationType called on invalid operation type: " + + operationType)); return -1; } } @@ -1810,8 +1976,14 @@ public class UserBackupManagerService { */ public void putOperation(int token, Operation operation) { if (MORE_DEBUG) { - Slog.d(TAG, "Adding operation token=" + Integer.toHexString(token) + ", operation type=" - + operation.type); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, + "Adding operation token=" + + Integer.toHexString(token) + + ", operation type=" + + operation.type)); } synchronized (mCurrentOpLock) { mCurrentOperations.put(token, operation); @@ -1824,12 +1996,15 @@ public class UserBackupManagerService { */ public void removeOperation(int token) { if (MORE_DEBUG) { - Slog.d(TAG, "Removing operation token=" + Integer.toHexString(token)); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "Removing operation token=" + Integer.toHexString(token))); } synchronized (mCurrentOpLock) { if (mCurrentOperations.get(token) == null) { - Slog.w(TAG, "Duplicate remove for operation. token=" - + Integer.toHexString(token)); + Slog.w(TAG, addUserIdToLogMessage(mUserId, "Duplicate remove for operation. token=" + + Integer.toHexString(token))); } mCurrentOperations.remove(token); } @@ -1838,8 +2013,8 @@ public class UserBackupManagerService { /** Block until we received an operation complete message (from the agent or cancellation). */ public boolean waitUntilOperationComplete(int token) { if (MORE_DEBUG) { - Slog.i(TAG, "Blocking until operation complete for " - + Integer.toHexString(token)); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Blocking until operation complete for " + + Integer.toHexString(token))); } int finalState = OP_PENDING; Operation op = null; @@ -1858,8 +2033,12 @@ public class UserBackupManagerService { // When the wait is notified we loop around and recheck the current state } else { if (MORE_DEBUG) { - Slog.d(TAG, "Unblocked waiting for operation token=" - + Integer.toHexString(token)); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, + "Unblocked waiting for operation token=" + + Integer.toHexString(token))); } // No longer pending; we're done finalState = op.state; @@ -1874,8 +2053,8 @@ public class UserBackupManagerService { mBackupHandler.removeMessages(getMessageIdForOperationType(op.type)); } if (MORE_DEBUG) { - Slog.v(TAG, "operation " + Integer.toHexString(token) - + " complete: finalState=" + finalState); + Slog.v(TAG, addUserIdToLogMessage(mUserId, "operation " + Integer.toHexString(token) + + " complete: finalState=" + finalState)); } return finalState == OP_ACKNOWLEDGED; } @@ -1888,21 +2067,31 @@ public class UserBackupManagerService { op = mCurrentOperations.get(token); if (MORE_DEBUG) { if (op == null) { - Slog.w(TAG, "Cancel of token " + Integer.toHexString(token) - + " but no op found"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Cancel of token " + + Integer.toHexString(token) + + " but no op found")); } } int state = (op != null) ? op.state : OP_TIMEOUT; if (state == OP_ACKNOWLEDGED) { // The operation finished cleanly, so we have nothing more to do. if (DEBUG) { - Slog.w(TAG, "Operation already got an ack." - + "Should have been removed from mCurrentOperations."); + Slog.w(TAG, addUserIdToLogMessage(mUserId, "Operation already got an ack." + + "Should have been removed from mCurrentOperations.")); } op = null; mCurrentOperations.delete(token); } else if (state == OP_PENDING) { - if (DEBUG) Slog.v(TAG, "Cancel: token=" + Integer.toHexString(token)); + if (DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Cancel: token=" + Integer.toHexString(token))); + } op.state = OP_TIMEOUT; // Can't delete op from mCurrentOperations here. waitUntilOperationComplete may be // called after we receive cancel here. We need this op's state there. @@ -1920,7 +2109,7 @@ public class UserBackupManagerService { // If there's a TimeoutHandler for this event, call it if (op != null && op.callback != null) { if (MORE_DEBUG) { - Slog.v(TAG, " Invoking cancel on " + op.callback); + Slog.v(TAG, addUserIdToLogMessage(mUserId, " Invoking cancel on " + op.callback)); } op.callback.handleCancel(cancelAll); } @@ -1955,13 +2144,20 @@ public class UserBackupManagerService { // manifest flag! TODO something less direct. if (!UserHandle.isCore(app.uid) && !app.packageName.equals("com.android.backupconfirm")) { - if (MORE_DEBUG) Slog.d(TAG, "Killing agent host process"); + if (MORE_DEBUG) { + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Killing agent host process")); + } mActivityManager.killApplicationProcess(app.processName, app.uid); } else { - if (MORE_DEBUG) Slog.d(TAG, "Not killing after operation: " + app.processName); + if (MORE_DEBUG) { + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "Not killing after operation: " + app.processName)); + } } } catch (RemoteException e) { - Slog.d(TAG, "Lost app trying to shut down"); + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Lost app trying to shut down")); } } @@ -1975,7 +2171,12 @@ public class UserBackupManagerService { } catch (Exception e) { // If we can't talk to the storagemanager service we have a serious problem; fail // "secure" i.e. assuming that the device is encrypted. - Slog.e(TAG, "Unable to communicate with storagemanager service: " + e.getMessage()); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "Unable to communicate with storagemanager service: " + + e.getMessage())); return true; } } @@ -1999,7 +2200,10 @@ public class UserBackupManagerService { FullBackupJob.schedule(mUserId, mContext, latency, mConstants); } else { if (DEBUG_SCHEDULING) { - Slog.i(TAG, "Full backup queue empty; not scheduling"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Full backup queue empty; not scheduling")); } } } @@ -2054,7 +2258,10 @@ public class UserBackupManagerService { private boolean fullBackupAllowable(String transportName) { if (!mTransportManager.isTransportRegistered(transportName)) { - Slog.w(TAG, "Transport not registered; full data backup not performed"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Transport not registered; full data backup not performed")); return false; } @@ -2066,12 +2273,19 @@ public class UserBackupManagerService { File pmState = new File(stateDir, PACKAGE_MANAGER_SENTINEL); if (pmState.length() <= 0) { if (DEBUG) { - Slog.i(TAG, "Full backup requested but dataset not yet initialized"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Full backup requested but dataset not yet initialized")); } return false; } } catch (Exception e) { - Slog.w(TAG, "Unable to get transport name: " + e.getMessage()); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Unable to get transport name: " + e.getMessage())); return false; } @@ -2104,8 +2318,8 @@ public class UserBackupManagerService { // the job driving automatic backups; that job will be scheduled again when // the user enables backup. if (MORE_DEBUG) { - Slog.i(TAG, "beginFullBackup but enabled=" + mEnabled - + " setupComplete=" + mSetupComplete + "; ignoring"); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "beginFullBackup but enabled=" + mEnabled + + " setupComplete=" + mSetupComplete + "; ignoring")); } return false; } @@ -2115,19 +2329,29 @@ public class UserBackupManagerService { final PowerSaveState result = mPowerManager.getPowerSaveState(ServiceType.FULL_BACKUP); if (result.batterySaverEnabled) { - if (DEBUG) Slog.i(TAG, "Deferring scheduled full backups in battery saver mode"); + if (DEBUG) { + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Deferring scheduled full backups in battery saver mode")); + } FullBackupJob.schedule(mUserId, mContext, keyValueBackupInterval, mConstants); return false; } if (DEBUG_SCHEDULING) { - Slog.i(TAG, "Beginning scheduled full backup operation"); + Slog.i( + TAG, + addUserIdToLogMessage(mUserId, "Beginning scheduled full backup operation")); } // Great; we're able to run full backup jobs now. See if we have any work to do. synchronized (mQueueLock) { if (mRunningFullBackupTask != null) { - Slog.e(TAG, "Backup triggered but one already/still running!"); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, "Backup triggered but one already/still running!")); return false; } @@ -2143,7 +2367,10 @@ public class UserBackupManagerService { if (mFullBackupQueue.size() == 0) { // no work to do so just bow out if (DEBUG) { - Slog.i(TAG, "Backup queue empty; doing nothing"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Backup queue empty; doing nothing")); } runBackup = false; break; @@ -2154,7 +2381,10 @@ public class UserBackupManagerService { String transportName = mTransportManager.getCurrentTransportName(); if (!fullBackupAllowable(transportName)) { if (MORE_DEBUG) { - Slog.i(TAG, "Preconditions not met; not running full backup"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Preconditions not met; not running full backup")); } runBackup = false; // Typically this means we haven't run a key/value backup yet. Back off @@ -2170,7 +2400,11 @@ public class UserBackupManagerService { if (!runBackup) { // It's too early to back up the next thing in the queue, so bow out if (MORE_DEBUG) { - Slog.i(TAG, "Device ready but too early to back up next app"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Device ready but too early to back up next app")); } // Wait until the next app in the queue falls due for a full data backup latency = fullBackupInterval - timeSinceRun; @@ -2185,8 +2419,14 @@ public class UserBackupManagerService { // so we cull it and force a loop around to consider the new head // app. if (MORE_DEBUG) { - Slog.i(TAG, "Culling package " + entry.packageName - + " in full-backup queue but not eligible"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Culling package " + + entry.packageName + + " in full-backup queue but not" + + " eligible")); } mFullBackupQueue.remove(0); headBusy = true; // force the while() condition @@ -2204,9 +2444,14 @@ public class UserBackupManagerService { + mTokenGenerator.nextInt(BUSY_BACKOFF_FUZZ); if (DEBUG_SCHEDULING) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - Slog.i(TAG, "Full backup time but " + entry.packageName - + " is busy; deferring to " - + sdf.format(new Date(nextEligible))); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Full backup time but " + + entry.packageName + + " is busy; deferring to " + + sdf.format(new Date(nextEligible)))); } // This relocates the app's entry from the head of the queue to // its order-appropriate position further down, so upon looping @@ -2225,7 +2470,11 @@ public class UserBackupManagerService { if (!runBackup) { if (DEBUG_SCHEDULING) { - Slog.i(TAG, "Nothing pending full backup; rescheduling +" + latency); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Nothing pending full backup; rescheduling +" + latency)); } final long deferTime = latency; // pin for the closure FullBackupJob.schedule(mUserId, mContext, deferTime, mConstants); @@ -2273,7 +2522,10 @@ public class UserBackupManagerService { } if (pftbt != null) { if (DEBUG_SCHEDULING) { - Slog.i(TAG, "Telling running backup to stop"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Telling running backup to stop")); } pftbt.handleCancel(true); } @@ -2286,7 +2538,7 @@ public class UserBackupManagerService { public void restoreWidgetData(String packageName, byte[] widgetData) { // Apply the restored widget state and generate the ID update for the app if (MORE_DEBUG) { - Slog.i(TAG, "Incorporating restored widget data"); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Incorporating restored widget data")); } AppWidgetBackupBridge.restoreWidgetState(packageName, widgetData, mUserId); } @@ -2306,8 +2558,15 @@ public class UserBackupManagerService { // may share a uid, we need to note all candidates within that uid and schedule // a backup pass for each of them. if (targets == null) { - Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'" - + " uid=" + Binder.getCallingUid()); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "dataChanged but no participant pkg='" + + packageName + + "'" + + " uid=" + + Binder.getCallingUid())); return; } @@ -2318,7 +2577,12 @@ public class UserBackupManagerService { // one already there, then overwrite it, but no harm done. BackupRequest req = new BackupRequest(packageName); if (mPendingBackups.put(packageName, req) == null) { - if (MORE_DEBUG) Slog.d(TAG, "Now staging backup of " + packageName); + if (MORE_DEBUG) { + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "Now staging backup of " + packageName)); + } // Journal this request in case of crash. The put() // operation returned null when this package was not already @@ -2358,7 +2622,10 @@ public class UserBackupManagerService { if (mJournal == null) mJournal = DataChangedJournal.newJournal(mJournalDir); mJournal.addPackage(str); } catch (IOException e) { - Slog.e(TAG, "Can't write " + str + " to backup journal", e); + Slog.e( + TAG, + addUserIdToLogMessage(mUserId, "Can't write " + str + " to backup journal"), + e); mJournal = null; } } @@ -2369,8 +2636,15 @@ public class UserBackupManagerService { public void dataChanged(final String packageName) { final HashSet<String> targets = dataChangedTargets(packageName); if (targets == null) { - Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'" - + " uid=" + Binder.getCallingUid()); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "dataChanged but no participant pkg='" + + packageName + + "'" + + " uid=" + + Binder.getCallingUid())); return; } @@ -2385,7 +2659,10 @@ public class UserBackupManagerService { public void initializeTransports(String[] transportNames, IBackupObserver observer) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "initializeTransport"); - Slog.v(TAG, "initializeTransport(): " + Arrays.asList(transportNames)); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "initializeTransport(): " + Arrays.asList(transportNames))); final long oldId = Binder.clearCallingIdentity(); try { @@ -2404,11 +2681,18 @@ public class UserBackupManagerService { public void setAncestralSerialNumber(long ancestralSerialNumber) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "setAncestralSerialNumber"); - Slog.v(TAG, "Setting ancestral work profile id to " + ancestralSerialNumber); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Setting ancestral work profile id to " + ancestralSerialNumber)); try (RandomAccessFile af = getAncestralSerialNumberFile()) { af.writeLong(ancestralSerialNumber); } catch (IOException e) { - Slog.w(TAG, "Unable to write to work profile serial mapping file:", e); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Unable to write to work profile serial mapping file:"), + e); } } @@ -2420,7 +2704,11 @@ public class UserBackupManagerService { try (RandomAccessFile af = getAncestralSerialNumberFile()) { return af.readLong(); } catch (IOException e) { - Slog.w(TAG, "Unable to write to work profile serial number file:", e); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Unable to write to work profile serial number file:"), + e); return -1; } } @@ -2443,13 +2731,24 @@ public class UserBackupManagerService { /** Clear the given package's backup data from the current transport. */ public void clearBackupData(String transportName, String packageName) { - if (DEBUG) Slog.v(TAG, "clearBackupData() of " + packageName + " on " + transportName); + if (DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "clearBackupData() of " + packageName + " on " + transportName)); + } + PackageInfo info; try { info = mPackageManager.getPackageInfoAsUser(packageName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId); } catch (NameNotFoundException e) { - Slog.d(TAG, "No such package '" + packageName + "' - not clearing backup data"); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, + "No such package '" + packageName + "' - not clearing backup data")); return; } @@ -2462,13 +2761,22 @@ public class UserBackupManagerService { } else { // a caller with full permission can ask to back up any participating app // !!! TODO: allow data-clear of ANY app? - if (MORE_DEBUG) Slog.v(TAG, "Privileged caller, allowing clear of other apps"); + if (MORE_DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Privileged caller, allowing clear of other apps")); + } apps = mProcessedPackagesJournal.getPackagesCopy(); } if (apps.contains(packageName)) { // found it; fire off the clear request - if (MORE_DEBUG) Slog.v(TAG, "Found the app - running clear process"); + if (MORE_DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage(mUserId, "Found the app - running clear process")); + } mBackupHandler.removeMessages(MSG_RETRY_CLEAR); synchronized (mQueueLock) { TransportClient transportClient = @@ -2507,24 +2815,36 @@ public class UserBackupManagerService { final PowerSaveState result = mPowerManager.getPowerSaveState(ServiceType.KEYVALUE_BACKUP); if (result.batterySaverEnabled) { - if (DEBUG) Slog.v(TAG, "Not running backup while in battery save mode"); + if (DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Not running backup while in battery save mode")); + } // Try again in several hours. KeyValueBackupJob.schedule(mUserId, mContext, mConstants); } else { - if (DEBUG) Slog.v(TAG, "Scheduling immediate backup pass"); + if (DEBUG) { + Slog.v(TAG, addUserIdToLogMessage(mUserId, "Scheduling immediate backup pass")); + } synchronized (getQueueLock()) { if (getPendingInits().size() > 0) { // If there are pending init operations, we process those and then settle // into the usual periodic backup schedule. if (MORE_DEBUG) { - Slog.v(TAG, "Init pending at scheduled backup"); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Init pending at scheduled backup")); } try { getAlarmManager().cancel(mRunInitIntent); mRunInitIntent.send(); } catch (PendingIntent.CanceledException ce) { - Slog.w(TAG, "Run init intent cancelled"); + Slog.w( + TAG, + addUserIdToLogMessage(mUserId, "Run init intent cancelled")); } return; } @@ -2534,8 +2854,8 @@ public class UserBackupManagerService { if (!isEnabled() || !isSetupComplete()) { Slog.w( TAG, - "Backup pass but enabled=" + isEnabled() - + " setupComplete=" + isSetupComplete()); + addUserIdToLogMessage(mUserId, "Backup pass but enabled=" + isEnabled() + + " setupComplete=" + isSetupComplete())); return; } @@ -2582,16 +2902,31 @@ public class UserBackupManagerService { long oldId = Binder.clearCallingIdentity(); try { if (!mSetupComplete) { - Slog.i(TAG, "Backup not supported before setup"); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Backup not supported before setup")); return; } if (DEBUG) { - Slog.v(TAG, "Requesting backup: apks=" + includeApks + " obb=" + includeObbs - + " shared=" + includeShared + " all=" + doAllApps + " system=" - + includeSystem + " includekeyvalue=" + doKeyValue + " pkgs=" + pkgList); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "Requesting backup: apks=" + + includeApks + + " obb=" + + includeObbs + + " shared=" + + includeShared + + " all=" + + doAllApps + + " system=" + + includeSystem + + " includekeyvalue=" + + doKeyValue + + " pkgs=" + + pkgList)); } - Slog.i(TAG, "Beginning adb backup..."); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Beginning adb backup...")); AdbBackupParams params = new AdbBackupParams(fd, includeApks, includeObbs, includeShared, doWidgets, doAllApps, includeSystem, compress, doKeyValue, @@ -2602,9 +2937,16 @@ public class UserBackupManagerService { } // start up the confirmation UI - if (DEBUG) Slog.d(TAG, "Starting backup confirmation UI, token=" + token); + if (DEBUG) { + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "Starting backup confirmation UI, token=" + token)); + } if (!startConfirmationUi(token, FullBackup.FULL_BACKUP_INTENT_ACTION)) { - Slog.e(TAG, "Unable to launch backup confirmation UI"); + Slog.e( + TAG, + addUserIdToLogMessage(mUserId, "Unable to launch backup confirmation UI")); mAdbBackupRestoreConfirmations.delete(token); return; } @@ -2618,16 +2960,22 @@ public class UserBackupManagerService { startConfirmationTimeout(token, params); // wait for the backup to be performed - if (DEBUG) Slog.d(TAG, "Waiting for backup completion..."); + if (DEBUG) { + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Waiting for backup completion...")); + } waitForCompletion(params); } finally { try { fd.close(); } catch (IOException e) { - Slog.e(TAG, "IO error closing output for adb backup: " + e.getMessage()); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "IO error closing output for adb backup: " + e.getMessage())); } Binder.restoreCallingIdentity(oldId); - Slog.d(TAG, "Adb backup processing complete."); + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Adb backup processing complete.")); } } @@ -2644,10 +2992,14 @@ public class UserBackupManagerService { String transportName = mTransportManager.getCurrentTransportName(); if (!fullBackupAllowable(transportName)) { - Slog.i(TAG, "Full backup not currently possible -- key/value backup not yet run?"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Full backup not currently possible -- key/value backup not yet run?")); } else { if (DEBUG) { - Slog.d(TAG, "fullTransportBackup()"); + Slog.d(TAG, addUserIdToLogMessage(mUserId, "fullTransportBackup()")); } final long oldId = Binder.clearCallingIdentity(); @@ -2687,7 +3039,7 @@ public class UserBackupManagerService { } if (DEBUG) { - Slog.d(TAG, "Done with full transport backup."); + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Done with full transport backup.")); } } @@ -2707,11 +3059,13 @@ public class UserBackupManagerService { try { if (!mSetupComplete) { - Slog.i(TAG, "Full restore not permitted before setup"); + Slog.i( + TAG, + addUserIdToLogMessage(mUserId, "Full restore not permitted before setup")); return; } - Slog.i(TAG, "Beginning restore..."); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Beginning restore...")); AdbRestoreParams params = new AdbRestoreParams(fd); final int token = generateRandomIntegerToken(); @@ -2720,9 +3074,16 @@ public class UserBackupManagerService { } // start up the confirmation UI - if (DEBUG) Slog.d(TAG, "Starting restore confirmation UI, token=" + token); + if (DEBUG) { + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "Starting restore confirmation UI, token=" + token)); + } if (!startConfirmationUi(token, FullBackup.FULL_RESTORE_INTENT_ACTION)) { - Slog.e(TAG, "Unable to launch restore confirmation"); + Slog.e( + TAG, + addUserIdToLogMessage(mUserId, "Unable to launch restore confirmation")); mAdbBackupRestoreConfirmations.delete(token); return; } @@ -2736,16 +3097,21 @@ public class UserBackupManagerService { startConfirmationTimeout(token, params); // wait for the restore to be performed - if (DEBUG) Slog.d(TAG, "Waiting for restore completion..."); + if (DEBUG) { + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Waiting for restore completion...")); + } waitForCompletion(params); } finally { try { fd.close(); } catch (IOException e) { - Slog.w(TAG, "Error trying to close fd after adb restore: " + e); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Error trying to close fd after adb restore: " + e)); } Binder.restoreCallingIdentity(oldId); - Slog.i(TAG, "adb restore processing complete."); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "adb restore processing complete.")); } } @@ -2773,8 +3139,8 @@ public class UserBackupManagerService { private void startConfirmationTimeout(int token, AdbParams params) { if (MORE_DEBUG) { - Slog.d(TAG, "Posting conf timeout msg after " - + TIMEOUT_FULL_CONFIRMATION + " millis"); + Slog.d(TAG, addUserIdToLogMessage(mUserId, "Posting conf timeout msg after " + + TIMEOUT_FULL_CONFIRMATION + " millis")); } Message msg = mBackupHandler.obtainMessage(MSG_FULL_CONFIRMATION_TIMEOUT, token, 0, params); @@ -2806,8 +3172,11 @@ public class UserBackupManagerService { public void acknowledgeAdbBackupOrRestore(int token, boolean allow, String curPassword, String encPpassword, IFullBackupRestoreObserver observer) { if (DEBUG) { - Slog.d(TAG, "acknowledgeAdbBackupOrRestore : token=" + token - + " allow=" + allow); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, + "acknowledgeAdbBackupOrRestore : token=" + token + " allow=" + allow)); } // TODO: possibly require not just this signature-only permission, but even @@ -2835,17 +3204,29 @@ public class UserBackupManagerService { params.encryptPassword = encPpassword; - if (MORE_DEBUG) Slog.d(TAG, "Sending conf message with verb " + verb); + if (MORE_DEBUG) { + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "Sending conf message with verb " + verb)); + } mWakelock.acquire(); Message msg = mBackupHandler.obtainMessage(verb, params); mBackupHandler.sendMessage(msg); } else { - Slog.w(TAG, "User rejected full backup/restore operation"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "User rejected full backup/restore operation")); // indicate completion without having actually transferred any data signalAdbBackupRestoreCompletion(params); } } else { - Slog.w(TAG, "Attempted to ack full backup/restore with invalid token"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Attempted to ack full backup/restore with invalid token")); } } } finally { @@ -2858,7 +3239,7 @@ public class UserBackupManagerService { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setBackupEnabled"); - Slog.i(TAG, "Backup enabled => " + enable); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Backup enabled => " + enable)); long oldId = Binder.clearCallingIdentity(); try { @@ -2875,7 +3256,9 @@ public class UserBackupManagerService { scheduleNextFullBackupJob(0); } else if (!enable) { // No longer enabled, so stop running backups - if (MORE_DEBUG) Slog.i(TAG, "Opting out of backup"); + if (MORE_DEBUG) { + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Opting out of backup")); + } KeyValueBackupJob.cancel(mUserId, mContext); @@ -2891,12 +3274,15 @@ public class UserBackupManagerService { name -> { final String dirName; try { - dirName = - mTransportManager - .getTransportDirName(name); + dirName = mTransportManager.getTransportDirName(name); } catch (TransportNotRegisteredException e) { // Should never happen - Slog.e(TAG, "Unexpected unregistered transport", e); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "Unexpected unregistered transport"), + e); return; } transportNames.add(name); @@ -2925,7 +3311,7 @@ public class UserBackupManagerService { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setAutoRestore"); - Slog.i(TAG, "Auto restore => " + doAutoRestore); + Slog.i(TAG, addUserIdToLogMessage(mUserId, "Auto restore => " + doAutoRestore)); final long oldId = Binder.clearCallingIdentity(); try { @@ -2951,7 +3337,12 @@ public class UserBackupManagerService { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "getCurrentTransport"); String currentTransport = mTransportManager.getCurrentTransportName(); - if (MORE_DEBUG) Slog.v(TAG, "... getCurrentTransport() returning " + currentTransport); + if (MORE_DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "... getCurrentTransport() returning " + currentTransport)); + } return currentTransport; } @@ -3090,8 +3481,14 @@ public class UserBackupManagerService { try { String previousTransportName = mTransportManager.selectTransport(transportName); updateStateForTransport(transportName); - Slog.v(TAG, "selectBackupTransport(transport = " + transportName - + "): previous transport = " + previousTransportName); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "selectBackupTransport(transport = " + + transportName + + "): previous transport = " + + previousTransportName)); return previousTransportName; } finally { Binder.restoreCallingIdentity(oldId); @@ -3110,7 +3507,11 @@ public class UserBackupManagerService { final long oldId = Binder.clearCallingIdentity(); try { String transportString = transportComponent.flattenToShortString(); - Slog.v(TAG, "selectBackupTransportAsync(transport = " + transportString + ")"); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "selectBackupTransportAsync(transport = " + transportString + ")")); mBackupHandler.post( () -> { String transportName = null; @@ -3122,7 +3523,10 @@ public class UserBackupManagerService { mTransportManager.getTransportName(transportComponent); updateStateForTransport(transportName); } catch (TransportNotRegisteredException e) { - Slog.e(TAG, "Transport got unregistered"); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, "Transport got unregistered")); result = BackupManager.ERROR_TRANSPORT_UNAVAILABLE; } } @@ -3134,7 +3538,12 @@ public class UserBackupManagerService { listener.onFailure(result); } } catch (RemoteException e) { - Slog.e(TAG, "ISelectBackupTransportCallback listener not available"); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "ISelectBackupTransportCallback listener not" + + " available")); } }); } finally { @@ -3159,11 +3568,23 @@ public class UserBackupManagerService { // Oops. We can't know the current dataset token, so reset and figure it out // when we do the next k/v backup operation on this transport. mCurrentToken = 0; - Slog.w(TAG, "Transport " + newTransportName + " not available: current token = 0"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Transport " + + newTransportName + + " not available: current token = 0")); } mTransportManager.disposeOfTransportClient(transportClient, callerLogString); } else { - Slog.w(TAG, "Transport " + newTransportName + " not registered: current token = 0"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Transport " + + newTransportName + + " not registered: current token = 0")); // The named transport isn't registered, so we can't know what its current dataset token // is. Reset as above. mCurrentToken = 0; @@ -3181,11 +3602,19 @@ public class UserBackupManagerService { try { Intent intent = mTransportManager.getTransportConfigurationIntent(transportName); if (MORE_DEBUG) { - Slog.d(TAG, "getConfigurationIntent() returning intent " + intent); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "getConfigurationIntent() returning intent " + intent)); } return intent; } catch (TransportNotRegisteredException e) { - Slog.e(TAG, "Unable to get configuration intent from transport: " + e.getMessage()); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "Unable to get configuration intent from transport: " + + e.getMessage())); return null; } } @@ -3206,11 +3635,18 @@ public class UserBackupManagerService { try { String string = mTransportManager.getTransportCurrentDestinationString(transportName); if (MORE_DEBUG) { - Slog.d(TAG, "getDestinationString() returning " + string); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "getDestinationString() returning " + string)); } return string; } catch (TransportNotRegisteredException e) { - Slog.e(TAG, "Unable to get destination string from transport: " + e.getMessage()); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "Unable to get destination string from transport: " + e.getMessage())); return null; } } @@ -3223,11 +3659,18 @@ public class UserBackupManagerService { try { Intent intent = mTransportManager.getTransportDataManagementIntent(transportName); if (MORE_DEBUG) { - Slog.d(TAG, "getDataManagementIntent() returning intent " + intent); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "getDataManagementIntent() returning intent " + intent)); } return intent; } catch (TransportNotRegisteredException e) { - Slog.e(TAG, "Unable to get management intent from transport: " + e.getMessage()); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "Unable to get management intent from transport: " + e.getMessage())); return null; } } @@ -3243,11 +3686,18 @@ public class UserBackupManagerService { try { CharSequence label = mTransportManager.getTransportDataManagementLabel(transportName); if (MORE_DEBUG) { - Slog.d(TAG, "getDataManagementLabel() returning " + label); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, "getDataManagementLabel() returning " + label)); } return label; } catch (TransportNotRegisteredException e) { - Slog.e(TAG, "Unable to get management label from transport: " + e.getMessage()); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, + "Unable to get management label from transport: " + e.getMessage())); return null; } } @@ -3259,12 +3709,21 @@ public class UserBackupManagerService { public void agentConnected(String packageName, IBinder agentBinder) { synchronized (mAgentConnectLock) { if (Binder.getCallingUid() == Process.SYSTEM_UID) { - Slog.d(TAG, "agentConnected pkg=" + packageName + " agent=" + agentBinder); + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, + "agentConnected pkg=" + packageName + " agent=" + agentBinder)); mConnectedAgent = IBackupAgent.Stub.asInterface(agentBinder); mConnecting = false; } else { - Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid() - + " claiming agent connected"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Non-system process uid=" + + Binder.getCallingUid() + + " claiming agent connected")); } mAgentConnectLock.notifyAll(); } @@ -3282,8 +3741,13 @@ public class UserBackupManagerService { mConnectedAgent = null; mConnecting = false; } else { - Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid() - + " claiming agent disconnected"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Non-system process uid=" + + Binder.getCallingUid() + + " claiming agent disconnected")); } mAgentConnectLock.notifyAll(); } @@ -3295,8 +3759,13 @@ public class UserBackupManagerService { */ public void restoreAtInstall(String packageName, int token) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { - Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid() - + " attemping install-time restore"); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Non-system process uid=" + + Binder.getCallingUid() + + " attemping install-time restore")); return; } @@ -3304,25 +3773,35 @@ public class UserBackupManagerService { long restoreSet = getAvailableRestoreToken(packageName); if (DEBUG) { - Slog.v(TAG, "restoreAtInstall pkg=" + packageName - + " token=" + Integer.toHexString(token) - + " restoreSet=" + Long.toHexString(restoreSet)); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "restoreAtInstall pkg=" + + packageName + + " token=" + + Integer.toHexString(token) + + " restoreSet=" + + Long.toHexString(restoreSet))); } if (restoreSet == 0) { - if (MORE_DEBUG) Slog.i(TAG, "No restore set"); + if (MORE_DEBUG) Slog.i(TAG, addUserIdToLogMessage(mUserId, "No restore set")); skip = true; } TransportClient transportClient = mTransportManager.getCurrentTransportClient("BMS.restoreAtInstall()"); if (transportClient == null) { - if (DEBUG) Slog.w(TAG, "No transport client"); + if (DEBUG) Slog.w(TAG, addUserIdToLogMessage(mUserId, "No transport client")); skip = true; } if (!mAutoRestore) { if (DEBUG) { - Slog.w(TAG, "Non-restorable state: auto=" + mAutoRestore); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Non-restorable state: auto=" + mAutoRestore)); } skip = true; } @@ -3341,7 +3820,9 @@ public class UserBackupManagerService { }; if (MORE_DEBUG) { - Slog.d(TAG, "Restore at install of " + packageName); + Slog.d( + TAG, + addUserIdToLogMessage(mUserId, "Restore at install of " + packageName)); } Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE); msg.obj = @@ -3356,7 +3837,10 @@ public class UserBackupManagerService { mBackupHandler.sendMessage(msg); } catch (Exception e) { // Calling into the transport broke; back off and proceed with the installation. - Slog.e(TAG, "Unable to contact transport: " + e.getMessage()); + Slog.e( + TAG, + addUserIdToLogMessage( + mUserId, "Unable to contact transport: " + e.getMessage())); skip = true; } } @@ -3370,7 +3854,7 @@ public class UserBackupManagerService { } // Tell the PackageManager to proceed with the post-install handling for this package. - if (DEBUG) Slog.v(TAG, "Finishing install immediately"); + if (DEBUG) Slog.v(TAG, addUserIdToLogMessage(mUserId, "Finishing install immediately")); try { mPackageManagerBinder.finishPackageInstall(token, false); } catch (RemoteException e) { /* can't happen */ } @@ -3380,8 +3864,11 @@ public class UserBackupManagerService { /** Hand off a restore session. */ public IRestoreSession beginRestoreSession(String packageName, String transport) { if (DEBUG) { - Slog.v(TAG, "beginRestoreSession: pkg=" + packageName - + " transport=" + transport); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "beginRestoreSession: pkg=" + packageName + " transport=" + transport)); } boolean needPermission = true; @@ -3393,7 +3880,10 @@ public class UserBackupManagerService { try { app = mPackageManager.getPackageInfoAsUser(packageName, 0, mUserId); } catch (NameNotFoundException nnf) { - Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Asked to restore nonexistent pkg " + packageName)); throw new IllegalArgumentException("Package " + packageName + " not found"); } @@ -3407,19 +3897,32 @@ public class UserBackupManagerService { } if (needPermission) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, - "beginRestoreSession"); + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.BACKUP, "beginRestoreSession"); } else { - if (DEBUG) Slog.d(TAG, "restoring self on current transport; no permission needed"); + if (DEBUG) { + Slog.d( + TAG, + addUserIdToLogMessage( + mUserId, + "restoring self on current transport; no permission needed")); + } } synchronized (this) { if (mActiveRestoreSession != null) { - Slog.i(TAG, "Restore session requested but one already active"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, "Restore session requested but one already active")); return null; } if (mBackupRunning) { - Slog.i(TAG, "Restore session requested but currently running backups"); + Slog.i( + TAG, + addUserIdToLogMessage( + mUserId, + "Restore session requested but currently running backups")); return null; } mActiveRestoreSession = new ActiveRestoreSession(this, packageName, transport); @@ -3433,9 +3936,14 @@ public class UserBackupManagerService { public void clearRestoreSession(ActiveRestoreSession currentSession) { synchronized (this) { if (currentSession != mActiveRestoreSession) { - Slog.e(TAG, "ending non-current restore session"); + Slog.e(TAG, addUserIdToLogMessage(mUserId, "ending non-current restore session")); } else { - if (DEBUG) Slog.v(TAG, "Clearing restore session and halting timeout"); + if (DEBUG) { + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, "Clearing restore session and halting timeout")); + } mActiveRestoreSession = null; mBackupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT); } @@ -3448,7 +3956,11 @@ public class UserBackupManagerService { */ public void opComplete(int token, long result) { if (MORE_DEBUG) { - Slog.v(TAG, "opComplete: " + Integer.toHexString(token) + " result=" + result); + Slog.v( + TAG, + addUserIdToLogMessage( + mUserId, + "opComplete: " + Integer.toHexString(token) + " result=" + result)); } Operation op = null; synchronized (mCurrentOpLock) { @@ -3461,8 +3973,12 @@ public class UserBackupManagerService { mCurrentOperations.delete(token); } else if (op.state == OP_ACKNOWLEDGED) { if (DEBUG) { - Slog.w(TAG, "Received duplicate ack for token=" - + Integer.toHexString(token)); + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, + "Received duplicate ack for token=" + + Integer.toHexString(token))); } op = null; mCurrentOperations.remove(token); @@ -3606,7 +4122,7 @@ public class UserBackupManagerService { " " + f.getName() + " - " + f.length() + " state bytes"); } } catch (Exception e) { - Slog.e(TAG, "Error in transport", e); + Slog.e(TAG, addUserIdToLogMessage(mUserId, "Error in transport"), e); pw.println(" Error: " + e); } } @@ -3665,6 +4181,10 @@ public class UserBackupManagerService { } } + private static String addUserIdToLogMessage(int userId, String message) { + return "[UserID:" + userId + "] " + message; + } + public IBackupManager getBackupManagerBinder() { return mBackupManagerBinder; diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index 52a1b5a62941..41a104c5d4dc 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -161,6 +161,9 @@ public class PackageWatchdog { private final Runnable mSaveToFile = this::saveToFile; private final SystemClock mSystemClock; private final BootThreshold mBootThreshold; + // The set of packages that have been synced with the ExplicitHealthCheckController + @GuardedBy("mLock") + private Set<String> mRequestedHealthCheckPackages = new ArraySet<>(); @GuardedBy("mLock") private boolean mIsPackagesReady; // Flag to control whether explicit health checks are supported or not @@ -174,6 +177,9 @@ public class PackageWatchdog { // 0 if no prune is scheduled. @GuardedBy("mLock") private long mUptimeAtLastStateSync; + // If true, sync explicit health check packages with the ExplicitHealthCheckController. + @GuardedBy("mLock") + private boolean mSyncRequired = false; @FunctionalInterface @VisibleForTesting @@ -249,6 +255,7 @@ public class PackageWatchdog { */ public void registerHealthObserver(PackageHealthObserver observer) { synchronized (mLock) { + mSyncRequired = true; ObserverInternal internalObserver = mAllObservers.get(observer.getName()); if (internalObserver != null) { internalObserver.registeredObserver = observer; @@ -628,17 +635,23 @@ public class PackageWatchdog { * @see #syncRequestsAsync */ private void syncRequests() { - Set<String> packages = null; + boolean syncRequired = false; synchronized (mLock) { if (mIsPackagesReady) { - packages = getPackagesPendingHealthChecksLocked(); + Set<String> packages = getPackagesPendingHealthChecksLocked(); + if (!packages.equals(mRequestedHealthCheckPackages) || mSyncRequired) { + syncRequired = true; + mRequestedHealthCheckPackages = packages; + } } // else, we will sync requests when packages become ready } // Call outside lock to avoid holding lock when calling into the controller. - if (packages != null) { - Slog.i(TAG, "Syncing health check requests for packages: " + packages); - mHealthCheckController.syncRequests(packages); + if (syncRequired) { + Slog.i(TAG, "Syncing health check requests for packages: " + + mRequestedHealthCheckPackages); + mHealthCheckController.syncRequests(mRequestedHealthCheckPackages); + mSyncRequired = false; } } diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 2c220d3f8861..5a056d35f87a 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -4076,7 +4076,7 @@ class StorageManagerService extends IStorageManager.Stub return Zygote.MOUNT_EXTERNAL_NONE; } - if (mIsFuseEnabled && mMediaStoreAuthorityAppId == UserHandle.getAppId(uid)) { + if (mIsFuseEnabled && mStorageManagerInternal.isExternalStorageService(uid)) { // Determine if caller requires pass_through mount; note that we do this for // all processes that share a UID with MediaProvider; but this is fine, since // those processes anyway share the same rights as MediaProvider. @@ -4422,14 +4422,16 @@ class StorageManagerService extends IStorageManager.Stub String.format("/storage/emulated/%d/Android/data/%s/", userId, pkg); + int appUid = + UserHandle.getUid(userId, mPmInternal.getPackage(pkg).getUid()); // Create package obb and data dir if it doesn't exist. File file = new File(packageObbDir); if (!file.exists()) { - vold.setupAppDir(packageObbDir, mPmInternal.getPackage(pkg).getUid()); + vold.setupAppDir(packageObbDir, appUid); } file = new File(packageDataDir); if (!file.exists()) { - vold.setupAppDir(packageDataDir, mPmInternal.getPackage(pkg).getUid()); + vold.setupAppDir(packageDataDir, appUid); } } } catch (ServiceManager.ServiceNotFoundException | RemoteException e) { @@ -4524,6 +4526,11 @@ class StorageManagerService extends IStorageManager.Stub } } + @Override + public boolean isExternalStorageService(int uid) { + return mMediaStoreAuthorityAppId == UserHandle.getAppId(uid); + } + public boolean hasExternalStorage(int uid, String packageName) { // No need to check for system uid. This avoids a deadlock between // PackageManagerService and AppOpsService. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 1c225d9d64b2..ebca1f7e97a4 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19842,6 +19842,7 @@ public class ActivityManagerService extends IActivityManager.Stub void setPermissions(@Nullable String[] permissions) { mPermissions = permissions; + PackageManager.invalidatePackageInfoCache(); } @Override diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 57bd42bfd05e..16a7c6b4998e 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2192,11 +2192,12 @@ public final class ProcessList { app.setHasForegroundActivities(true); } + StorageManagerInternal storageManagerInternal = LocalServices.getService( + StorageManagerInternal.class); final Map<String, Pair<String, Long>> pkgDataInfoMap; boolean bindMountAppStorageDirs = false; if (shouldIsolateAppData(app)) { - bindMountAppStorageDirs = mVoldAppDataIsolationEnabled; // Get all packages belongs to the same shared uid. sharedPackages is empty array // if it doesn't have shared uid. final PackageManagerInternal pmInt = mService.getPackageManagerInternalLocked(); @@ -2206,9 +2207,9 @@ public final class ProcessList { ? new String[]{app.info.packageName} : sharedPackages, uid); int userId = UserHandle.getUserId(uid); - if (mVoldAppDataIsolationEnabled) { - StorageManagerInternal storageManagerInternal = LocalServices.getService( - StorageManagerInternal.class); + if (mVoldAppDataIsolationEnabled && UserHandle.isApp(app.uid) && + !storageManagerInternal.isExternalStorageService(uid)) { + bindMountAppStorageDirs = true; if (!storageManagerInternal.prepareStorageDirs(userId, pkgDataInfoMap.keySet(), app.processName)) { // Cannot prepare Android/app and Android/obb directory, diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index 265b9ad10561..28f838044907 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -85,7 +85,9 @@ class BluetoothRouteProvider { mListener = listener; mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); buildBluetoothRoutes(); + } + public void start() { mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.A2DP); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.HEARING_AID); diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index 5c97e90a3ba3..c7d14e0afe7b 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -103,25 +103,20 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { publishProviderState(); boolean sessionInfoChanged; - synchronized (mLock) { - sessionInfoChanged = updateSessionInfosIfNeededLocked(); - } + sessionInfoChanged = updateSessionInfosIfNeeded(); if (sessionInfoChanged) { notifySessionInfoUpdated(); } }); - - mHandler.post(() -> notifyProviderState()); - - //TODO: clean up this - // This is required because it is not instantiated in the main thread and - // BluetoothRoutesUpdatedListener can be called before here - synchronized (mLock) { - updateSessionInfosIfNeededLocked(); - } + updateSessionInfosIfNeeded(); mContext.registerReceiver(new VolumeChangeReceiver(), new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION)); + + mHandler.post(() -> { + mBtRouteProvider.start(); + notifyProviderState(); + }); } @Override @@ -220,35 +215,38 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { /** * Updates the mSessionInfo. Returns true if the session info is changed. */ - boolean updateSessionInfosIfNeededLocked() { - // Prevent to execute this method before mBtRouteProvider is created. - if (mBtRouteProvider == null) return false; - RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get(0); - - RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder( - SYSTEM_SESSION_ID, "" /* clientPackageName */) - .setSystemSession(true); - - MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute(); - if (selectedRoute == null) { - selectedRoute = mDefaultRoute; - } else { - builder.addTransferableRoute(mDefaultRoute.getId()); - } - mSelectedRouteId = selectedRoute.getId(); - builder.addSelectedRoute(mSelectedRouteId); + boolean updateSessionInfosIfNeeded() { + synchronized (mLock) { + // Prevent to execute this method before mBtRouteProvider is created. + if (mBtRouteProvider == null) return false; + RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get( + 0); + + RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder( + SYSTEM_SESSION_ID, "" /* clientPackageName */) + .setSystemSession(true); + + MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute(); + if (selectedRoute == null) { + selectedRoute = mDefaultRoute; + } else { + builder.addTransferableRoute(mDefaultRoute.getId()); + } + mSelectedRouteId = selectedRoute.getId(); + builder.addSelectedRoute(mSelectedRouteId); - for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) { - builder.addTransferableRoute(route.getId()); - } + for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) { + builder.addTransferableRoute(route.getId()); + } - RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build(); - if (Objects.equals(oldSessionInfo, newSessionInfo)) { - return false; - } else { - mSessionInfos.clear(); - mSessionInfos.add(newSessionInfo); - return true; + RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build(); + if (Objects.equals(oldSessionInfo, newSessionInfo)) { + return false; + } else { + mSessionInfos.clear(); + mSessionInfos.add(newSessionInfo); + return true; + } } } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 8031eaa62084..1b271a739777 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -819,6 +819,18 @@ public class LauncherAppsService extends SystemService { } @Override + public String getShortcutIconUri(String callingPackage, String packageName, + String shortcutId, int userId) { + ensureShortcutPermission(callingPackage); + if (!canAccessProfile(userId, "Cannot access shortcuts")) { + return null; + } + + return mShortcutServiceInternal.getShortcutIconUri(getCallingUserId(), callingPackage, + packageName, shortcutId, userId); + } + + @Override public boolean hasShortcutHostPermission(String callingPackage) { verifyCallingPackage(callingPackage); return mShortcutServiceInternal.hasShortcutHostPermission(getCallingUserId(), diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index cdc37364ca79..2ff3d2a3a938 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -47,7 +47,6 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.Binder; import android.os.Build; -import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.HandlerThread; @@ -1038,80 +1037,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } - static void sendPendingStreaming(Context context, IntentSender target, int sessionId, - Throwable cause) { - final Intent intent = new Intent(); - intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); - intent.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_STREAMING); - if (cause != null && !TextUtils.isEmpty(cause.getMessage())) { - intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, - "Staging Image Not Ready [" + cause.getMessage() + "]"); - } else { - intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, "Staging Image Not Ready"); - } - try { - target.sendIntent(context, 0, intent, null, null); - } catch (SendIntentException ignored) { - } - } - - static void sendOnUserActionRequired(Context context, IntentSender target, int sessionId, - Intent intent) { - final Intent fillIn = new Intent(); - fillIn.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); - fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_USER_ACTION); - fillIn.putExtra(Intent.EXTRA_INTENT, intent); - try { - target.sendIntent(context, 0, fillIn, null, null); - } catch (SendIntentException ignored) { - } - } - - static void sendOnPackageInstalled(Context context, IntentSender target, int sessionId, - boolean showNotification, int userId, String basePackageName, int returnCode, - String msg, Bundle extras) { - if (PackageManager.INSTALL_SUCCEEDED == returnCode && showNotification) { - boolean update = (extras != null) && extras.getBoolean(Intent.EXTRA_REPLACING); - Notification notification = buildSuccessNotification(context, - context.getResources() - .getString(update ? R.string.package_updated_device_owner : - R.string.package_installed_device_owner), - basePackageName, - userId); - if (notification != null) { - NotificationManager notificationManager = (NotificationManager) - context.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(basePackageName, - SystemMessage.NOTE_PACKAGE_STATE, - notification); - } - } - final Intent fillIn = new Intent(); - fillIn.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, basePackageName); - fillIn.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); - fillIn.putExtra(PackageInstaller.EXTRA_STATUS, - PackageManager.installStatusToPublicStatus(returnCode)); - fillIn.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, - PackageManager.installStatusToString(returnCode, msg)); - fillIn.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, returnCode); - if (extras != null) { - final String existing = extras.getString( - PackageManager.EXTRA_FAILURE_EXISTING_PACKAGE); - if (!TextUtils.isEmpty(existing)) { - fillIn.putExtra(PackageInstaller.EXTRA_OTHER_PACKAGE_NAME, existing); - } - } - try { - target.sendIntent(context, 0, fillIn, null, null); - } catch (SendIntentException ignored) { - } - } - /** * Build a notification for package installation / deletion by device owners that is shown if * the operation succeeds. */ - private static Notification buildSuccessNotification(Context context, String contentText, + static Notification buildSuccessNotification(Context context, String contentText, String basePackageName, int userId) { PackageInfo packageInfo = null; try { diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 28d7c13d5b13..45a25a04e971 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -51,6 +51,8 @@ import static com.android.server.pm.PackageInstallerService.prepareStageDir; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.Notification; +import android.app.NotificationManager; import android.app.admin.DevicePolicyEventLogger; import android.app.admin.DevicePolicyManagerInternal; import android.content.ComponentName; @@ -119,9 +121,11 @@ import android.util.Slog; import android.util.SparseIntArray; import android.util.apk.ApkSignatureVerifier; +import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.content.NativeLibraryHelper; import com.android.internal.content.PackageHelper; +import com.android.internal.messages.nano.SystemMessageProto; import com.android.internal.os.SomeArgs; import com.android.internal.util.ArrayUtils; import com.android.internal.util.IndentingPrintWriter; @@ -440,8 +444,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final int returnCode = args.argi1; args.recycle(); - PackageInstallerService.sendOnPackageInstalled(mContext, - statusReceiver, sessionId, + sendOnPackageInstalled(mContext, statusReceiver, sessionId, isInstallerDeviceOwnerOrAffiliatedProfileOwnerLocked(), userId, packageName, returnCode, message, extras); @@ -1636,8 +1639,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } if (!success) { - PackageInstallerService.sendOnPackageInstalled(mContext, - mRemoteStatusReceiver, sessionId, + sendOnPackageInstalled(mContext, mRemoteStatusReceiver, sessionId, isInstallerDeviceOwnerOrAffiliatedProfileOwnerLocked(), userId, null, failure.error, failure.getLocalizedMessage(), null); return; @@ -1684,8 +1686,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { intent.setPackage(mPm.getPackageInstallerPackageName()); intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); - PackageInstallerService.sendOnUserActionRequired(mContext, - mRemoteStatusReceiver, sessionId, intent); + sendOnUserActionRequired(mContext, mRemoteStatusReceiver, sessionId, intent); // Commit was keeping session marked as active until now; release // that extra refcount so session appears idle. @@ -2620,9 +2621,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } catch (RemoteException e) { // In case of streaming failure we don't want to fail or commit the session. // Just return from this method and allow caller to commit again. - PackageInstallerService.sendPendingStreaming(mContext, - mRemoteStatusReceiver, - sessionId, new StreamingException(e)); + sendPendingStreaming(mContext, mRemoteStatusReceiver, sessionId, + new StreamingException(e)); } } }; @@ -2924,6 +2924,75 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { pw.decreaseIndent(); } + private static void sendOnUserActionRequired(Context context, IntentSender target, + int sessionId, Intent intent) { + final Intent fillIn = new Intent(); + fillIn.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); + fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_USER_ACTION); + fillIn.putExtra(Intent.EXTRA_INTENT, intent); + try { + target.sendIntent(context, 0, fillIn, null, null); + } catch (IntentSender.SendIntentException ignored) { + } + } + + private static void sendOnPackageInstalled(Context context, IntentSender target, int sessionId, + boolean showNotification, int userId, String basePackageName, int returnCode, + String msg, Bundle extras) { + if (PackageManager.INSTALL_SUCCEEDED == returnCode && showNotification) { + boolean update = (extras != null) && extras.getBoolean(Intent.EXTRA_REPLACING); + Notification notification = PackageInstallerService.buildSuccessNotification(context, + context.getResources() + .getString(update ? R.string.package_updated_device_owner : + R.string.package_installed_device_owner), + basePackageName, + userId); + if (notification != null) { + NotificationManager notificationManager = (NotificationManager) + context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(basePackageName, + SystemMessageProto.SystemMessage.NOTE_PACKAGE_STATE, + notification); + } + } + final Intent fillIn = new Intent(); + fillIn.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, basePackageName); + fillIn.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); + fillIn.putExtra(PackageInstaller.EXTRA_STATUS, + PackageManager.installStatusToPublicStatus(returnCode)); + fillIn.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, + PackageManager.installStatusToString(returnCode, msg)); + fillIn.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, returnCode); + if (extras != null) { + final String existing = extras.getString( + PackageManager.EXTRA_FAILURE_EXISTING_PACKAGE); + if (!TextUtils.isEmpty(existing)) { + fillIn.putExtra(PackageInstaller.EXTRA_OTHER_PACKAGE_NAME, existing); + } + } + try { + target.sendIntent(context, 0, fillIn, null, null); + } catch (IntentSender.SendIntentException ignored) { + } + } + + private static void sendPendingStreaming(Context context, IntentSender target, int sessionId, + Throwable cause) { + final Intent intent = new Intent(); + intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); + intent.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_STREAMING); + if (cause != null && !TextUtils.isEmpty(cause.getMessage())) { + intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, + "Staging Image Not Ready [" + cause.getMessage() + "]"); + } else { + intent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, "Staging Image Not Ready"); + } + try { + target.sendIntent(context, 0, intent, null, null); + } catch (IntentSender.SendIntentException ignored) { + } + } + private static void writeGrantedRuntimePermissionsLocked(XmlSerializer out, String[] grantedRuntimePermissions) throws IOException { if (grantedRuntimePermissions != null) { diff --git a/services/core/java/com/android/server/pm/ShortcutBitmapSaver.java b/services/core/java/com/android/server/pm/ShortcutBitmapSaver.java index dc534a702946..1c5f0a7fc0f3 100644 --- a/services/core/java/com/android/server/pm/ShortcutBitmapSaver.java +++ b/services/core/java/com/android/server/pm/ShortcutBitmapSaver.java @@ -28,7 +28,6 @@ import android.util.Log; import android.util.Slog; import com.android.internal.annotations.GuardedBy; -import com.android.internal.util.Preconditions; import com.android.server.pm.ShortcutService.FileOutputStreamWithPath; import libcore.io.IoUtils; @@ -150,9 +149,10 @@ public class ShortcutBitmapSaver { shortcut.setIconResourceId(0); shortcut.setIconResName(null); shortcut.setBitmapPath(null); + shortcut.setIconUri(null); shortcut.clearFlags(ShortcutInfo.FLAG_HAS_ICON_FILE | ShortcutInfo.FLAG_ADAPTIVE_BITMAP | ShortcutInfo.FLAG_HAS_ICON_RES | - ShortcutInfo.FLAG_ICON_FILE_PENDING_SAVE); + ShortcutInfo.FLAG_ICON_FILE_PENDING_SAVE | ShortcutInfo.FLAG_HAS_ICON_URI); } public void saveBitmapLocked(ShortcutInfo shortcut, diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index c8df5c731845..1fc0a38e1ed3 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -102,6 +102,7 @@ class ShortcutPackage extends ShortcutPackageItem { private static final String ATTR_ICON_RES_ID = "icon-res"; private static final String ATTR_ICON_RES_NAME = "icon-resname"; private static final String ATTR_BITMAP_PATH = "bitmap-path"; + private static final String ATTR_ICON_URI = "icon-uri"; private static final String ATTR_LOCUS_ID = "locus-id"; private static final String ATTR_PERSON_NAME = "name"; @@ -1628,7 +1629,8 @@ class ShortcutPackage extends ShortcutPackageItem { int flags = si.getFlags() & ~(ShortcutInfo.FLAG_HAS_ICON_FILE | ShortcutInfo.FLAG_HAS_ICON_RES | ShortcutInfo.FLAG_ICON_FILE_PENDING_SAVE - | ShortcutInfo.FLAG_DYNAMIC); + | ShortcutInfo.FLAG_DYNAMIC + | ShortcutInfo.FLAG_HAS_ICON_URI | ShortcutInfo.FLAG_ADAPTIVE_BITMAP); ShortcutService.writeAttr(out, ATTR_FLAGS, flags); // Set the publisher version code at every backup. @@ -1646,6 +1648,7 @@ class ShortcutPackage extends ShortcutPackageItem { ShortcutService.writeAttr(out, ATTR_ICON_RES_ID, si.getIconResourceId()); ShortcutService.writeAttr(out, ATTR_ICON_RES_NAME, si.getIconResName()); ShortcutService.writeAttr(out, ATTR_BITMAP_PATH, si.getBitmapPath()); + ShortcutService.writeAttr(out, ATTR_ICON_URI, si.getIconUri()); } if (shouldBackupDetails) { @@ -1764,6 +1767,7 @@ class ShortcutPackage extends ShortcutPackageItem { int iconResId; String iconResName; String bitmapPath; + String iconUri; final String locusIdString; int backupVersionCode; ArraySet<String> categories = null; @@ -1791,6 +1795,7 @@ class ShortcutPackage extends ShortcutPackageItem { iconResId = (int) ShortcutService.parseLongAttribute(parser, ATTR_ICON_RES_ID); iconResName = ShortcutService.parseStringAttribute(parser, ATTR_ICON_RES_NAME); bitmapPath = ShortcutService.parseStringAttribute(parser, ATTR_BITMAP_PATH); + iconUri = ShortcutService.parseStringAttribute(parser, ATTR_ICON_URI); locusIdString = ShortcutService.parseStringAttribute(parser, ATTR_LOCUS_ID); final int outerDepth = parser.getDepth(); @@ -1866,8 +1871,8 @@ class ShortcutPackage extends ShortcutPackageItem { categories, intents.toArray(new Intent[intents.size()]), rank, extras, lastChangedTimestamp, flags, - iconResId, iconResName, bitmapPath, disabledReason, - persons.toArray(new Person[persons.size()]), locusId); + iconResId, iconResName, bitmapPath, iconUri, + disabledReason, persons.toArray(new Person[persons.size()]), locusId); } private static Intent parseIntent(XmlPullParser parser) @@ -1991,16 +1996,26 @@ class ShortcutPackage extends ShortcutPackageItem { Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " still has an icon"); } - if (si.hasAdaptiveBitmap() && !si.hasIconFile()) { + if (si.hasAdaptiveBitmap() && !(si.hasIconFile() || si.hasIconUri())) { failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() - + " has adaptive bitmap but was not saved to a file."); + + " has adaptive bitmap but was not saved to a file nor has icon uri."); } if (si.hasIconFile() && si.hasIconResource()) { failed = true; Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + " has both resource and bitmap icons"); } + if (si.hasIconFile() && si.hasIconUri()) { + failed = true; + Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + + " has both url and bitmap icons"); + } + if (si.hasIconUri() && si.hasIconResource()) { + failed = true; + Log.e(TAG_VERIFY, "Package " + getPackageName() + ": shortcut " + si.getId() + + " has both url and resource icons"); + } if (si.isEnabled() != (si.getDisabledReason() == ShortcutInfo.DISABLED_REASON_NOT_DISABLED)) { failed = true; diff --git a/services/core/java/com/android/server/pm/ShortcutParser.java b/services/core/java/com/android/server/pm/ShortcutParser.java index f9c0db0e9a1d..d3aace19672a 100644 --- a/services/core/java/com/android/server/pm/ShortcutParser.java +++ b/services/core/java/com/android/server/pm/ShortcutParser.java @@ -449,6 +449,7 @@ public class ShortcutParser { iconResId, null, // icon res name null, // bitmap path + null, // icon Url disabledReason, null /* persons */, null /* locusId */); diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 66f3574d83a0..8768ab0a683b 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -24,6 +24,8 @@ import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppGlobals; import android.app.IUidObserver; +import android.app.IUriGrantsManager; +import android.app.UriGrantsManager; import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetProviderInfo; import android.content.BroadcastReceiver; @@ -65,6 +67,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.FileUtils; import android.os.Handler; +import android.os.IBinder; import android.os.LocaleList; import android.os.Looper; import android.os.ParcelFileDescriptor; @@ -106,6 +109,7 @@ import com.android.internal.util.StatLogger; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.pm.ShortcutUser.PackageWithUser; +import com.android.server.uri.UriGrantsManagerInternal; import libcore.io.IoUtils; @@ -327,6 +331,9 @@ public class ShortcutService extends IShortcutService.Stub { private final UserManagerInternal mUserManagerInternal; private final UsageStatsManagerInternal mUsageStatsManagerInternal; private final ActivityManagerInternal mActivityManagerInternal; + private final IUriGrantsManager mUriGrantsManager; + private final UriGrantsManagerInternal mUriGrantsManagerInternal; + private final IBinder mUriPermissionOwner; private final ShortcutRequestPinProcessor mShortcutRequestPinProcessor; private final ShortcutBitmapSaver mShortcutBitmapSaver; @@ -449,6 +456,11 @@ public class ShortcutService extends IShortcutService.Stub { mActivityManagerInternal = Objects.requireNonNull( LocalServices.getService(ActivityManagerInternal.class)); + mUriGrantsManager = UriGrantsManager.getService(); + mUriGrantsManagerInternal = Objects.requireNonNull( + LocalServices.getService(UriGrantsManagerInternal.class)); + mUriPermissionOwner = mUriGrantsManagerInternal.newUriPermissionOwner(TAG); + mShortcutRequestPinProcessor = new ShortcutRequestPinProcessor(this, mLock); mShortcutBitmapSaver = new ShortcutBitmapSaver(this); mShortcutDumpFiles = new ShortcutDumpFiles(this); @@ -1414,7 +1426,7 @@ public class ShortcutService extends IShortcutService.Stub { } void saveIconAndFixUpShortcutLocked(ShortcutInfo shortcut) { - if (shortcut.hasIconFile() || shortcut.hasIconResource()) { + if (shortcut.hasIconFile() || shortcut.hasIconResource() || shortcut.hasIconUri()) { return; } @@ -1438,6 +1450,15 @@ public class ShortcutService extends IShortcutService.Stub { shortcut.addFlags(ShortcutInfo.FLAG_HAS_ICON_RES); return; } + case Icon.TYPE_URI: + shortcut.setIconUri(icon.getUriString()); + shortcut.addFlags(ShortcutInfo.FLAG_HAS_ICON_URI); + return; + case Icon.TYPE_URI_ADAPTIVE_BITMAP: + shortcut.setIconUri(icon.getUriString()); + shortcut.addFlags(ShortcutInfo.FLAG_HAS_ICON_URI + | ShortcutInfo.FLAG_ADAPTIVE_BITMAP); + return; case Icon.TYPE_BITMAP: bitmap = icon.getBitmap(); // Don't recycle in this case. break; @@ -3129,6 +3150,59 @@ public class ShortcutService extends IShortcutService.Stub { } @Override + public String getShortcutIconUri(int launcherUserId, @NonNull String launcherPackage, + @NonNull String packageName, @NonNull String shortcutId, int userId) { + Objects.requireNonNull(launcherPackage, "launcherPackage"); + Objects.requireNonNull(packageName, "packageName"); + Objects.requireNonNull(shortcutId, "shortcutId"); + + synchronized (mLock) { + throwIfUserLockedL(userId); + throwIfUserLockedL(launcherUserId); + + getLauncherShortcutsLocked(launcherPackage, userId, launcherUserId) + .attemptToRestoreIfNeededAndSave(); + + final ShortcutPackage p = getUserShortcutsLocked(userId) + .getPackageShortcutsIfExists(packageName); + if (p == null) { + return null; + } + + final ShortcutInfo shortcutInfo = p.findShortcutById(shortcutId); + if (shortcutInfo == null || !shortcutInfo.hasIconUri()) { + return null; + } + String uri = shortcutInfo.getIconUri(); + if (uri == null) { + Slog.w(TAG, "null uri detected in getShortcutIconUri()"); + return null; + } + + final long token = Binder.clearCallingIdentity(); + try { + int packageUid = mPackageManagerInternal.getPackageUidInternal(packageName, + PackageManager.MATCH_DIRECT_BOOT_AUTO, userId); + // Grant read uri permission to the caller on behalf of the shortcut owner. All + // granted permissions are revoked when the default launcher changes, or when + // device is rebooted. + // b/151572645 is tracking a bug where Uri permissions are persisted across + // reboots, even when Intent#FLAG_GRANT_PERSISTABLE_URI_PERMISSION is not used. + mUriGrantsManager.grantUriPermissionFromOwner(mUriPermissionOwner, packageUid, + launcherPackage, Uri.parse(uri), Intent.FLAG_GRANT_READ_URI_PERMISSION, + userId, launcherUserId); + } catch (Exception e) { + Slog.e(TAG, "Failed to grant uri access to " + launcherPackage + " for " + uri, + e); + uri = null; + } finally { + Binder.restoreCallingIdentity(token); + } + return uri; + } + } + + @Override public boolean hasShortcutHostPermission(int launcherUserId, @NonNull String callingPackage, int callingPid, int callingUid) { return ShortcutService.this.hasShortcutHostPermission(callingPackage, launcherUserId, @@ -3241,7 +3315,14 @@ public class ShortcutService extends IShortcutService.Stub { user.clearLauncher(); } if (Intent.ACTION_PREFERRED_ACTIVITY_CHANGED.equals(action)) { - // Nothing farther to do. + final ShortcutUser user = getUserShortcutsLocked(userId); + final ComponentName lastLauncher = user.getLastKnownLauncher(); + final ComponentName currentLauncher = getDefaultLauncher(userId); + if (currentLauncher == null || !currentLauncher.equals(lastLauncher)) { + // Default launcher is removed or changed, revoke all URI permissions. + mUriGrantsManagerInternal.revokeUriPermissionFromOwner(mUriPermissionOwner, + null, ~0, 0); + } return; } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 294deba459fe..3257b63843ec 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -18,6 +18,8 @@ package com.android.server.power; import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL; import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_DEFAULT; +import static android.os.PowerManagerInternal.MODE_DEVICE_IDLE; +import static android.os.PowerManagerInternal.MODE_DISPLAY_INACTIVE; import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; @@ -42,8 +44,6 @@ import android.hardware.SystemSensorManager; import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.DisplayManagerInternal; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; -import android.hardware.power.Boost; -import android.hardware.power.Mode; import android.hardware.power.V1_0.PowerHint; import android.net.Uri; import android.os.BatteryManager; @@ -2975,6 +2975,8 @@ public final class PowerManagerService extends SystemService synchronized (mLock) { if (mDisplayState != state) { mDisplayState = state; + setPowerModeInternal(MODE_DISPLAY_INACTIVE, + !Display.isActiveState(state)); if (state == Display.STATE_OFF) { if (!mDecoupleHalInteractiveModeFromDisplayConfig) { setHalInteractiveModeLocked(false); @@ -3297,6 +3299,7 @@ public final class PowerManagerService extends SystemService } mDeviceIdleMode = enabled; updateWakeLockDisabledStatesLocked(); + setPowerModeInternal(MODE_DEVICE_IDLE, mDeviceIdleMode || mLightDeviceIdleMode); } if (enabled) { EventLogTags.writeDeviceIdleOnPhase("power"); @@ -3310,6 +3313,7 @@ public final class PowerManagerService extends SystemService synchronized (mLock) { if (mLightDeviceIdleMode != enabled) { mLightDeviceIdleMode = enabled; + setPowerModeInternal(MODE_DEVICE_IDLE, mDeviceIdleMode || mLightDeviceIdleMode); return true; } return false; diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java index 74a6383bc01c..0d16fccc81fd 100644 --- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java +++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java @@ -234,7 +234,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi handleRequest( event.getSystemTextClassifierMetadata(), - /* verifyCallingPackage= */ false, + /* verifyCallingPackage= */ true, /* attemptToBind= */ false, service -> service.onSelectionEvent(sessionId, event), "onSelectionEvent", @@ -253,7 +253,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi handleRequest( systemTcMetadata, - /* verifyCallingPackage= */ false, + /* verifyCallingPackage= */ true, /* attemptToBind= */ false, service -> service.onTextClassifierEvent(sessionId, event), "onTextClassifierEvent", diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java index bd63b2daad83..25585b3ae794 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -16,7 +16,6 @@ package com.android.server.tv.tunerresourcemanager; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -41,8 +40,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.SystemService; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -79,25 +76,6 @@ public class TunerResourceManagerService extends SystemService { // Used to synchronize the access to the service. private final Object mLock = new Object(); - /** - * Tuner resource type to help generate resource handle - */ - @IntDef({ - TUNER_RESOURCE_TYPE_FRONTEND, - TUNER_RESOURCE_TYPE_DEMUX, - TUNER_RESOURCE_TYPE_DESCRAMBLER, - TUNER_RESOURCE_TYPE_LNB, - TUNER_RESOURCE_TYPE_CAS_SESSION, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface TunerResourceType {} - - public static final int TUNER_RESOURCE_TYPE_FRONTEND = 0; - public static final int TUNER_RESOURCE_TYPE_DEMUX = 1; - public static final int TUNER_RESOURCE_TYPE_DESCRAMBLER = 2; - public static final int TUNER_RESOURCE_TYPE_LNB = 3; - public static final int TUNER_RESOURCE_TYPE_CAS_SESSION = 4; - public TunerResourceManagerService(@Nullable Context context) { super(context); } @@ -465,7 +443,7 @@ public class TunerResourceManagerService extends SystemService { // Grant frontend when there is unused resource. if (grantingFrontendId > -1) { frontendHandle[0] = generateResourceHandle( - TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId); + TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId); updateFrontendClientMappingOnNewGrant(grantingFrontendId, request.getClientId()); return true; } @@ -474,7 +452,7 @@ public class TunerResourceManagerService extends SystemService { // request client has higher priority. if (inUseLowestPriorityFrId > -1 && (requestClient.getPriority() > currentLowestPriority)) { frontendHandle[0] = generateResourceHandle( - TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId); + TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId); reclaimFrontendResource(getFrontendResource( inUseLowestPriorityFrId).getOwnerClientId()); updateFrontendClientMappingOnNewGrant(inUseLowestPriorityFrId, request.getClientId()); @@ -489,7 +467,7 @@ public class TunerResourceManagerService extends SystemService { if (DEBUG) { Slog.d(TAG, "requestDemux(request=" + request + ")"); } - demuxHandle[0] = generateResourceHandle(TUNER_RESOURCE_TYPE_DEMUX, 0); + demuxHandle[0] = generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX, 0); return true; } @@ -498,7 +476,8 @@ public class TunerResourceManagerService extends SystemService { if (DEBUG) { Slog.d(TAG, "requestDescrambler(request=" + request + ")"); } - descramblerHandle[0] = generateResourceHandle(TUNER_RESOURCE_TYPE_DESCRAMBLER, 0); + descramblerHandle[0] = + generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER, 0); return true; } @@ -664,7 +643,8 @@ public class TunerResourceManagerService extends SystemService { return mClientProfiles.keySet().contains(clientId); } - private int generateResourceHandle(@TunerResourceType int resourceType, int resourceId) { + private int generateResourceHandle( + @TunerResourceManager.TunerResourceType int resourceType, int resourceId) { return (resourceType & 0x000000ff) << 24 | (resourceId << 16) | (mResourceRequestCount++ & 0xffff); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index c4545fa23cc8..00c6f3a65d09 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5936,7 +5936,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (win == null) { return; } - final Rect frame = win.getFrameLw(); + final Rect frame = win.getRelativeFrameLw(); final int thumbnailDrawableRes = task.mUserId == mWmService.mCurrentUserId ? R.drawable.ic_account_circle : R.drawable.ic_corp_badge; @@ -5946,12 +5946,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (thumbnail == null) { return; } - final Transaction transaction = getAnimatingContainer().getPendingTransaction(); + final Transaction transaction = getPendingTransaction(); mThumbnail = new WindowContainerThumbnail(mWmService.mSurfaceFactory, - transaction, getAnimatingContainer(), thumbnail); + transaction, getTask(), thumbnail); final Animation animation = getDisplayContent().mAppTransition.createCrossProfileAppsThumbnailAnimationLocked( - win.getFrameLw()); + frame); mThumbnail.startAnimation(transaction, animation, new Point(frame.left, frame.top)); } diff --git a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java index 90e3be74c743..a27a11259772 100644 --- a/services/core/java/com/android/server/wm/WindowContainerThumbnail.java +++ b/services/core/java/com/android/server/wm/WindowContainerThumbnail.java @@ -97,7 +97,7 @@ class WindowContainerThumbnail implements Animatable { // TODO: This should be attached as a child to the app token, once the thumbnail animations // use relative coordinates. Once we start animating task we can also consider attaching // this to the task. - mSurfaceControl = mWindowContainer.makeSurface() + mSurfaceControl = mWindowContainer.makeChildSurface(mWindowContainer.getTopChild()) .setName("thumbnail anim: " + mWindowContainer.toString()) .setBufferSize(mWidth, mHeight) .setFormat(PixelFormat.TRANSLUCENT) @@ -209,7 +209,7 @@ class WindowContainerThumbnail implements Animatable { @Override public Builder makeAnimationLeash() { - return mWindowContainer.makeSurface(); + return mWindowContainer.makeChildSurface(mWindowContainer.getTopChild()); } @Override diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 7400d17b21ce..eb186786db1a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -881,7 +881,13 @@ public class WindowManagerService extends IWindowManager.Stub FEATURE_FREEFORM_WINDOW_MANAGEMENT) || Settings.Global.getInt( resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0; - mAtmService.mSupportsFreeformWindowManagement = freeformWindowManagement; + if (mAtmService.mSupportsFreeformWindowManagement != freeformWindowManagement) { + mAtmService.mSupportsFreeformWindowManagement = freeformWindowManagement; + synchronized (mGlobalLock) { + // Notify the root window container that the display settings value may change. + mRoot.onSettingsRetrieved(); + } + } } void updateForceResizableTasks() { diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 336934e5fb03..822f3835cc07 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -1448,13 +1448,13 @@ void GnssMeasurementCallback::translateSingleGnssMeasurement SET(BasebandCn0DbHz, measurement_V2_1->basebandCN0DbHz); - if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_RECEIVER_ISB) { - SET(ReceiverInterSignalBiasNanos, measurement_V2_1->receiverInterSignalBiasNs); + if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_FULL_ISB) { + SET(FullInterSignalBiasNanos, measurement_V2_1->fullInterSignalBiasNs); } - if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_RECEIVER_ISB_UNCERTAINTY) { - SET(ReceiverInterSignalBiasUncertaintyNanos, - measurement_V2_1->receiverInterSignalBiasUncertaintyNs); + if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_FULL_ISB_UNCERTAINTY) { + SET(FullInterSignalBiasUncertaintyNanos, + measurement_V2_1->fullInterSignalBiasUncertaintyNs); } if (measurement_V2_1->flags & GnssMeasurementFlags::HAS_SATELLITE_ISB) { diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 727593664895..4da0091af0db 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1090,7 +1090,9 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs, base::unique_fd(::dup(ifs.control.pendingReads))); fsControlParcel.incremental->log.reset(base::unique_fd(::dup(ifs.control.logs))); sp<IncrementalDataLoaderListener> listener = - new IncrementalDataLoaderListener(*this, *externalListener); + new IncrementalDataLoaderListener(*this, + externalListener ? *externalListener + : DataLoaderStatusListener()); bool created = false; auto status = mDataLoaderManager->initializeDataLoader(ifs.mountId, *dlp, fsControlParcel, listener, &created); @@ -1230,8 +1232,8 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange std::unique_lock l(incrementalService.mLock); const auto& ifs = incrementalService.getIfsLocked(mountId); if (!ifs) { - LOG(WARNING) << "Received data loader status " << int(newStatus) << " for unknown mount " - << mountId; + LOG(WARNING) << "Received data loader status " << int(newStatus) + << " for unknown mount " << mountId; return binder::Status::ok(); } ifs->dataLoaderStatus = newStatus; diff --git a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java index 84421ef178c9..77b5b61b8f01 100644 --- a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java +++ b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java @@ -166,7 +166,7 @@ public class BackupManagerServiceTestUtils { PowerManager powerManager = (PowerManager) application.getSystemService(Context.POWER_SERVICE); return new UserBackupManagerService.BackupWakeLock( - powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*")); + powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"), 0); } /** diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 6c769485f6ad..6a882985d305 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -94,6 +94,8 @@ import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.pm.LauncherAppsService.LauncherAppsImpl; import com.android.server.pm.ShortcutUser.PackageWithUser; +import com.android.server.uri.UriGrantsManagerInternal; +import com.android.server.uri.UriPermissionOwner; import com.android.server.wm.ActivityTaskManagerInternal; import org.junit.Assert; @@ -630,6 +632,9 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { protected UsageStatsManagerInternal mMockUsageStatsManagerInternal; protected ActivityManagerInternal mMockActivityManagerInternal; protected ActivityTaskManagerInternal mMockActivityTaskManagerInternal; + protected UriGrantsManagerInternal mMockUriGrantsManagerInternal; + + protected UriPermissionOwner mUriPermissionOwner; protected static final String CALLING_PACKAGE_1 = "com.android.test.1"; protected static final int CALLING_UID_1 = 10001; @@ -771,6 +776,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { mMockUsageStatsManagerInternal = mock(UsageStatsManagerInternal.class); mMockActivityManagerInternal = mock(ActivityManagerInternal.class); mMockActivityTaskManagerInternal = mock(ActivityTaskManagerInternal.class); + mMockUriGrantsManagerInternal = mock(UriGrantsManagerInternal.class); LocalServices.removeServiceForTest(PackageManagerInternal.class); LocalServices.addService(PackageManagerInternal.class, mMockPackageManagerInternal); @@ -782,6 +788,10 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { LocalServices.addService(ActivityTaskManagerInternal.class, mMockActivityTaskManagerInternal); LocalServices.removeServiceForTest(UserManagerInternal.class); LocalServices.addService(UserManagerInternal.class, mMockUserManagerInternal); + LocalServices.removeServiceForTest(UriGrantsManagerInternal.class); + LocalServices.addService(UriGrantsManagerInternal.class, mMockUriGrantsManagerInternal); + + mUriPermissionOwner = new UriPermissionOwner(mMockUriGrantsManagerInternal, TAG); // Prepare injection values. @@ -2193,6 +2203,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { for (ShortcutInfo s : actualShortcuts) { assertTrue("ID " + s.getId() + " not have icon res ID", s.hasIconResource()); assertFalse("ID " + s.getId() + " shouldn't have icon FD", s.hasIconFile()); + assertFalse("ID " + s.getId() + " shouldn't have icon URI", s.hasIconUri()); } return actualShortcuts; } @@ -2202,6 +2213,17 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { for (ShortcutInfo s : actualShortcuts) { assertFalse("ID " + s.getId() + " shouldn't have icon res ID", s.hasIconResource()); assertTrue("ID " + s.getId() + " not have icon FD", s.hasIconFile()); + assertFalse("ID " + s.getId() + " shouldn't have icon URI", s.hasIconUri()); + } + return actualShortcuts; + } + + public static List<ShortcutInfo> assertAllHaveIconUri( + List<ShortcutInfo> actualShortcuts) { + for (ShortcutInfo s : actualShortcuts) { + assertFalse("ID " + s.getId() + " shouldn't have icon res ID", s.hasIconResource()); + assertFalse("ID " + s.getId() + " shouldn't have have icon FD", s.hasIconFile()); + assertTrue("ID " + s.getId() + " not have icon URI", s.hasIconUri()); } return actualShortcuts; } diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 56460fb6f0a0..2cbb6d5c5bd6 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -114,8 +114,11 @@ import org.xmlpull.v1.XmlSerializer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -133,6 +136,16 @@ import java.util.function.BiConsumer; */ @SmallTest public class ShortcutManagerTest1 extends BaseShortcutManagerTest { + + @Override + protected void tearDown() throws Exception { + deleteUriFile("file32x32.jpg"); + deleteUriFile("file64x64.jpg"); + deleteUriFile("file512x512.jpg"); + + super.tearDown(); + } + /** * Test for the first launch path, no settings file available. */ @@ -724,6 +737,17 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { final Icon bmp512x512 = Icon.createWithBitmap(BitmapFactory.decodeResource( getTestContext().getResources(), R.drawable.black_512x512)); + // The corresponding files will be deleted in tearDown() + final Icon uri32x32 = Icon.createWithContentUri( + getFileUriFromResource("file32x32.jpg", R.drawable.black_32x32)); + final Icon uri64x64_maskable = Icon.createWithAdaptiveBitmapContentUri( + getFileUriFromResource("file64x64.jpg", R.drawable.black_64x64)); + final Icon uri512x512 = Icon.createWithContentUri( + getFileUriFromResource("file512x512.jpg", R.drawable.black_512x512)); + + doReturn(mUriPermissionOwner.getExternalToken()) + .when(mMockUriGrantsManagerInternal).newUriPermissionOwner(anyString()); + // Set from package 1 setCaller(CALLING_PACKAGE_1); assertTrue(mManager.setDynamicShortcuts(list( @@ -732,6 +756,9 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { makeShortcutWithIcon("bmp32x32", bmp32x32), makeShortcutWithIcon("bmp64x64", bmp64x64_maskable), makeShortcutWithIcon("bmp512x512", bmp512x512), + makeShortcutWithIcon("uri32x32", uri32x32), + makeShortcutWithIcon("uri64x64", uri64x64_maskable), + makeShortcutWithIcon("uri512x512", uri512x512), makeShortcut("none") ))); @@ -742,6 +769,9 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { "bmp32x32", "bmp64x64", "bmp512x512", + "uri32x32", + "uri64x64", + "uri512x512", "none"); // Call from another caller with the same ID, just to make sure storage is per-package. @@ -749,11 +779,15 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertTrue(mManager.setDynamicShortcuts(list( makeShortcutWithIcon("res32x32", res512x512), makeShortcutWithIcon("res64x64", res512x512), + makeShortcutWithIcon("uri32x32", uri512x512), + makeShortcutWithIcon("uri64x64", uri512x512), makeShortcutWithIcon("none", res512x512) ))); assertShortcutIds(assertAllNotHaveIcon(mManager.getDynamicShortcuts()), "res32x32", "res64x64", + "uri32x32", + "uri64x64", "none"); // Different profile. Note the names and the contents don't match. @@ -795,6 +829,18 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "bmp512x512", USER_0))), "bmp512x512"); + assertShortcutIds(assertAllHaveIconUri( + list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "uri32x32", USER_0))), + "uri32x32"); + + assertShortcutIds(assertAllHaveIconUri( + list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "uri64x64", USER_0))), + "uri64x64"); + + assertShortcutIds(assertAllHaveIconUri( + list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "uri512x512", USER_0))), + "uri512x512"); + assertShortcutIds(assertAllHaveIconResId( list(getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "res32x32", USER_P0))), "res32x32"); @@ -860,15 +906,37 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { bmp = pfdToBitmap( mLauncherApps.getShortcutIconFd(CALLING_PACKAGE_1, "bmp32x32", HANDLE_USER_P0)); assertBitmapSize(128, 128, bmp); +/* + bmp = pfdToBitmap(mLauncherApps.getUriShortcutIconFd( + getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "uri32x32", USER_0))); + assertBitmapSize(32, 32, bmp); + + bmp = pfdToBitmap(mLauncherApps.getUriShortcutIconFd( + getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "uri64x64", USER_0))); + assertBitmapSize(64, 64, bmp); + + bmp = pfdToBitmap(mLauncherApps.getUriShortcutIconFd( + getShortcutInfoAsLauncher(CALLING_PACKAGE_1, "uri512x512", USER_0))); + assertBitmapSize(512, 512, bmp); +*/ - Drawable dr = mLauncherApps.getShortcutIconDrawable( + Drawable dr_bmp = mLauncherApps.getShortcutIconDrawable( makeShortcutWithIcon("bmp64x64", bmp64x64_maskable), 0); - assertTrue(dr instanceof AdaptiveIconDrawable); + assertTrue(dr_bmp instanceof AdaptiveIconDrawable); float viewportPercentage = 1 / (1 + 2 * AdaptiveIconDrawable.getExtraInsetFraction()); assertEquals((int) (bmp64x64_maskable.getBitmap().getWidth() * viewportPercentage), - dr.getIntrinsicWidth()); + dr_bmp.getIntrinsicWidth()); + assertEquals((int) (bmp64x64_maskable.getBitmap().getHeight() * viewportPercentage), + dr_bmp.getIntrinsicHeight()); +/* + Drawable dr_uri = mLauncherApps.getShortcutIconDrawable( + makeShortcutWithIcon("uri64x64", uri64x64_maskable), 0); + assertTrue(dr_uri instanceof AdaptiveIconDrawable); + assertEquals((int) (bmp64x64_maskable.getBitmap().getWidth() * viewportPercentage), + dr_uri.getIntrinsicWidth()); assertEquals((int) (bmp64x64_maskable.getBitmap().getHeight() * viewportPercentage), - dr.getIntrinsicHeight()); + dr_uri.getIntrinsicHeight()); +*/ } public void testCleanupDanglingBitmaps() throws Exception { @@ -1274,6 +1342,18 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { makeShortcut("s1") ))); + // Set uri icon + assertTrue(mManager.updateShortcuts(list( + new ShortcutInfo.Builder(mClientContext, "s1") + .setIcon(Icon.createWithContentUri("test_uri")) + .build() + ))); + mService.waitForBitmapSavesForTest(); + assertWith(getCallerShortcuts()) + .forShortcutWithId("s1", si -> { + assertTrue(si.hasIconUri()); + assertEquals("test_uri", si.getIconUri()); + }); // Set resource icon assertTrue(mManager.updateShortcuts(list( new ShortcutInfo.Builder(mClientContext, "s1") @@ -1287,6 +1367,9 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(R.drawable.black_32x32, si.getIconResourceId()); }); mService.waitForBitmapSavesForTest(); + + mInjectedCurrentTimeMillis += INTERVAL; // reset throttling + // Set bitmap icon assertTrue(mManager.updateShortcuts(list( new ShortcutInfo.Builder(mClientContext, "s1") @@ -1300,9 +1383,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertTrue(si.hasIconFile()); }); - mInjectedCurrentTimeMillis += INTERVAL; // reset throttling - - // Do it again, with the reverse order (bitmap -> icon) + // Do it again, with the reverse order (bitmap -> resource -> uri) assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s1") ))); @@ -1320,6 +1401,8 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertTrue(si.hasIconFile()); }); + mInjectedCurrentTimeMillis += INTERVAL; // reset throttling + // Set resource icon assertTrue(mManager.updateShortcuts(list( new ShortcutInfo.Builder(mClientContext, "s1") @@ -1332,6 +1415,18 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertTrue(si.hasIconResource()); assertEquals(R.drawable.black_32x32, si.getIconResourceId()); }); + // Set uri icon + assertTrue(mManager.updateShortcuts(list( + new ShortcutInfo.Builder(mClientContext, "s1") + .setIcon(Icon.createWithContentUri("test_uri")) + .build() + ))); + mService.waitForBitmapSavesForTest(); + assertWith(getCallerShortcuts()) + .forShortcutWithId("s1", si -> { + assertTrue(si.hasIconUri()); + assertEquals("test_uri", si.getIconUri()); + }); }); } @@ -8499,4 +8594,26 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } } } + + private Uri getFileUriFromResource(String fileName, int resId) throws IOException { + File file = new File(getTestContext().getFilesDir(), fileName); + // Make sure we are not leaving phantom files behind. + assertFalse(file.exists()); + try (InputStream source = getTestContext().getResources().openRawResource(resId); + OutputStream target = new FileOutputStream(file)) { + byte[] buffer = new byte[1024]; + for (int len = source.read(buffer); len >= 0; len = source.read(buffer)) { + target.write(buffer, 0, len); + } + } + assertTrue(file.exists()); + return Uri.fromFile(file); + } + + private void deleteUriFile(String fileName) { + File file = new File(getTestContext().getFilesDir(), fileName); + if (file.exists()) { + file.delete(); + } + } } diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java index 7b101c728d0f..ca7704950b51 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java @@ -257,6 +257,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { si.addFlags(ShortcutInfo.FLAG_PINNED); si.setBitmapPath("abc"); si.setIconResourceId(456); + si.setIconUri("test_uri"); si = parceled(si); @@ -279,6 +280,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags()); assertEquals("abc", si.getBitmapPath()); assertEquals(456, si.getIconResourceId()); + assertEquals("test_uri", si.getIconUri()); assertEquals(0, si.getTitleResId()); assertEquals(null, si.getTitleResName()); @@ -310,6 +312,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { si.addFlags(ShortcutInfo.FLAG_PINNED); si.setBitmapPath("abc"); si.setIconResourceId(456); + si.setIconUri("test_uri"); lookupAndFillInResourceNames(si); @@ -335,6 +338,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals("abc", si.getBitmapPath()); assertEquals(456, si.getIconResourceId()); assertEquals("string/r456", si.getIconResName()); + assertEquals("test_uri", si.getIconUri()); } public void testShortcutInfoClone() { @@ -359,6 +363,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { sorig.addFlags(ShortcutInfo.FLAG_PINNED); sorig.setBitmapPath("abc"); sorig.setIconResourceId(456); + sorig.setIconUri("test_uri"); lookupAndFillInResourceNames(sorig); @@ -386,6 +391,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals("abc", si.getBitmapPath()); assertEquals(456, si.getIconResourceId()); assertEquals("string/r456", si.getIconResName()); + assertEquals("test_uri", si.getIconUri()); si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR); @@ -407,6 +413,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(456, si.getIconResourceId()); assertEquals(null, si.getIconResName()); @@ -428,6 +435,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(456, si.getIconResourceId()); assertEquals(null, si.getIconResName()); @@ -450,6 +458,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(456, si.getIconResourceId()); assertEquals(null, si.getIconResName()); @@ -474,6 +483,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_LONG_LIVED, si.getFlags()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(456, si.getIconResourceId()); assertEquals(null, si.getIconResName()); @@ -499,6 +509,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { sorig.addFlags(ShortcutInfo.FLAG_PINNED); sorig.setBitmapPath("abc"); sorig.setIconResourceId(456); + sorig.setIconUri("test_uri"); lookupAndFillInResourceNames(sorig); @@ -526,6 +537,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals("abc", si.getBitmapPath()); assertEquals(456, si.getIconResourceId()); assertEquals("string/r456", si.getIconResName()); + assertEquals("test_uri", si.getIconUri()); si = sorig.clone(ShortcutInfo.CLONE_REMOVE_FOR_CREATOR); @@ -547,6 +559,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(456, si.getIconResourceId()); assertEquals(null, si.getIconResName()); @@ -570,6 +583,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED, si.getFlags()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(456, si.getIconResourceId()); assertEquals(null, si.getIconResName()); @@ -593,6 +607,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_KEY_FIELDS_ONLY, si.getFlags()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(456, si.getIconResourceId()); assertEquals(null, si.getIconResName()); @@ -657,6 +672,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { sorig.addFlags(ShortcutInfo.FLAG_PINNED); sorig.setBitmapPath("abc"); sorig.setIconResourceId(456); + sorig.setIconUri("test_uri"); lookupAndFillInResourceNames(sorig); @@ -677,6 +693,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(0, si.getIconResourceId()); assertEquals(null, si.getIconResName()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); si = sorig.clone(/* flags=*/ 0); si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id") @@ -787,6 +804,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { sorig.addFlags(ShortcutInfo.FLAG_PINNED); sorig.setBitmapPath("abc"); sorig.setIconResourceId(456); + sorig.setIconUri("test_uri"); ShortcutInfo si; @@ -804,6 +822,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(0, si.getIconResourceId()); assertEquals(null, si.getIconResName()); assertEquals(null, si.getBitmapPath()); + assertNull(si.getIconUri()); si = sorig.clone(/* flags=*/ 0); si.copyNonNullFieldsFrom(new ShortcutInfo.Builder(getTestContext()).setId("id") @@ -977,6 +996,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags()); assertNotNull(si.getBitmapPath()); // Something should be set. assertEquals(0, si.getIconResourceId()); + assertNull(si.getIconUri()); assertTrue(si.getLastChangedTimestamp() < now); // Make sure ranks are saved too. Because of the auto-adjusting, we need two shortcuts @@ -1053,6 +1073,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { si.getFlags()); assertNotNull(si.getBitmapPath()); // Something should be set. assertEquals(0, si.getIconResourceId()); + assertNull(si.getIconUri()); assertTrue(si.getLastChangedTimestamp() < now); dumpUserFile(USER_10); @@ -1125,6 +1146,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_RES | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags()); assertNull(si.getBitmapPath()); + assertNull(si.getIconUri()); assertEquals(R.drawable.black_32x32, si.getIconResourceId()); assertTrue(si.getLastChangedTimestamp() < now); @@ -1134,6 +1156,94 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertEquals(1, si.getRank()); } + public void testShortcutInfoSaveAndLoad_uri() throws InterruptedException { + mRunningUsers.put(USER_10, true); + + setCaller(CALLING_PACKAGE_1, USER_10); + + final Icon uriIcon = Icon.createWithContentUri("test_uri"); + + PersistableBundle pb = new PersistableBundle(); + pb.putInt("k", 1); + ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext) + .setId("id") + .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class)) + .setIcon(uriIcon) + .setTitleResId(10) + .setTextResId(11) + .setDisabledMessageResId(12) + .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) + .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) + .setRank(123) + .setExtras(pb) + .build(); + sorig.setTimestamp(mInjectedCurrentTimeMillis); + + final Icon uriMaskableIcon = Icon.createWithAdaptiveBitmapContentUri("uri_maskable"); + + ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext) + .setId("id2") + .setTitle("x") + .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class)) + .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) + .setRank(456) + .setIcon(uriMaskableIcon) + .build(); + sorig2.setTimestamp(mInjectedCurrentTimeMillis); + + mManager.addDynamicShortcuts(list(sorig, sorig2)); + + mInjectedCurrentTimeMillis += 1; + final long now = mInjectedCurrentTimeMillis; + mInjectedCurrentTimeMillis += 1; + + // Save and load. + mService.saveDirtyInfo(); + initService(); + mService.handleUnlockUser(USER_10); + + ShortcutInfo si; + si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_10); + + assertEquals(USER_10, si.getUserId()); + assertEquals(HANDLE_USER_10, si.getUserHandle()); + assertEquals(CALLING_PACKAGE_1, si.getPackage()); + assertEquals("id", si.getId()); + assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName()); + assertEquals(null, si.getIcon()); + assertEquals(10, si.getTitleResId()); + assertEquals("r10", si.getTitleResName()); + assertEquals(11, si.getTextResId()); + assertEquals("r11", si.getTextResName()); + assertEquals(12, si.getDisabledMessageResourceId()); + assertEquals("r12", si.getDisabledMessageResName()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals("action", si.getIntent().getAction()); + assertEquals("val", si.getIntent().getStringExtra("key")); + assertEquals(0, si.getRank()); + assertEquals(1, si.getExtras().getInt("k")); + + assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_URI + | ShortcutInfo.FLAG_STRINGS_RESOLVED, si.getFlags()); + assertNull(si.getBitmapPath()); + assertNull(si.getIconResName()); + assertEquals(0, si.getIconResourceId()); + assertEquals("test_uri", si.getIconUri()); + assertTrue(si.getLastChangedTimestamp() < now); + + // Make sure ranks are saved too. Because of the auto-adjusting, we need two shortcuts + // to test it. + si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_10); + assertEquals(1, si.getRank()); + assertEquals(ShortcutInfo.FLAG_DYNAMIC | ShortcutInfo.FLAG_HAS_ICON_URI + | ShortcutInfo.FLAG_STRINGS_RESOLVED | ShortcutInfo.FLAG_ADAPTIVE_BITMAP, + si.getFlags()); + assertNull(si.getBitmapPath()); + assertNull(si.getIconResName()); + assertEquals(0, si.getIconResourceId()); + assertEquals("uri_maskable", si.getIconUri()); + } + public void testShortcutInfoSaveAndLoad_forBackup() { setCaller(CALLING_PACKAGE_1, USER_0); @@ -1196,6 +1306,7 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { | ShortcutInfo.FLAG_SHADOW , si.getFlags()); assertNull(si.getBitmapPath()); // No icon. assertEquals(0, si.getIconResourceId()); + assertNull(si.getIconUri()); // Note when restored from backup, it's no longer dynamic, so shouldn't have a rank. si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_0); @@ -1265,6 +1376,77 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { assertNull(si.getBitmapPath()); // No icon. assertEquals(0, si.getIconResourceId()); assertEquals(null, si.getIconResName()); + assertNull(si.getIconUri()); + + // Note when restored from backup, it's no longer dynamic, so shouldn't have a rank. + si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_0); + assertEquals(0, si.getRank()); + } + + public void testShortcutInfoSaveAndLoad_forBackup_uri() { + setCaller(CALLING_PACKAGE_1, USER_0); + + final Icon uriIcon = Icon.createWithContentUri("test_uri"); + + PersistableBundle pb = new PersistableBundle(); + pb.putInt("k", 1); + ShortcutInfo sorig = new ShortcutInfo.Builder(mClientContext) + .setId("id") + .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class)) + .setIcon(uriIcon) + .setTitleResId(10) + .setTextResId(11) + .setDisabledMessageResId(12) + .setCategories(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz")) + .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) + .setRank(123) + .setExtras(pb) + .build(); + + ShortcutInfo sorig2 = new ShortcutInfo.Builder(mClientContext) + .setId("id2") + .setTitle("x") + .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class)) + .setIntent(makeIntent("action", ShortcutActivity.class, "key", "val")) + .setRank(456) + .build(); + + mManager.addDynamicShortcuts(list(sorig, sorig2)); + + // Dynamic shortcuts won't be backed up, so we need to pin it. + setCaller(LAUNCHER_1, USER_0); + mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("id", "id2"), HANDLE_USER_0); + + // Do backup & restore. + backupAndRestore(); + + mService.handleUnlockUser(USER_0); // Load user-0. + + ShortcutInfo si; + si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id", USER_0); + + assertEquals(CALLING_PACKAGE_1, si.getPackage()); + assertEquals("id", si.getId()); + assertEquals(ShortcutActivity2.class.getName(), si.getActivity().getClassName()); + assertEquals(null, si.getIcon()); + assertEquals(10, si.getTitleResId()); + assertEquals("r10", si.getTitleResName()); + assertEquals(11, si.getTextResId()); + assertEquals("r11", si.getTextResName()); + assertEquals(12, si.getDisabledMessageResourceId()); + assertEquals("r12", si.getDisabledMessageResName()); + assertEquals(set(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION, "xyz"), si.getCategories()); + assertEquals("action", si.getIntent().getAction()); + assertEquals("val", si.getIntent().getStringExtra("key")); + assertEquals(0, si.getRank()); + assertEquals(1, si.getExtras().getInt("k")); + + assertEquals(ShortcutInfo.FLAG_PINNED | ShortcutInfo.FLAG_STRINGS_RESOLVED + | ShortcutInfo.FLAG_SHADOW , si.getFlags()); + assertNull(si.getBitmapPath()); // No icon. + assertEquals(0, si.getIconResourceId()); + assertEquals(null, si.getIconResName()); + assertNull(si.getIconUri()); // Note when restored from backup, it's no longer dynamic, so shouldn't have a rank. si = mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "id2", USER_0); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java index 8e7804786b38..010f8ac334a7 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java @@ -390,7 +390,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { "title", 0, "titleResName", "text", 0, "textResName", "disabledMessage", 0, "disabledMessageResName", null, null, 0, null, 0, 0, - 0, "iconResName", "bitmapPath", 0, + 0, "iconResName", "bitmapPath", null, 0, null, null); return si; } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java index ce6efdfbffc6..926bd8c9846a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java @@ -24,6 +24,9 @@ import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIV import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import android.content.ContentResolver; import android.net.Uri; @@ -60,11 +63,35 @@ public class WindowManagerSettingsTests extends WindowTestsBase { public void testFreeformWindow() { try (SettingsSession freeformWindowSession = new SettingsSession(DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT)) { - final boolean freeformWindow = !freeformWindowSession.getSetting(); - final Uri freeformWindowUri = freeformWindowSession.setSetting(freeformWindow); + final boolean curFreeformWindow = freeformWindowSession.getSetting(); + final boolean newFreeformWindow = !curFreeformWindow; + final Uri freeformWindowUri = freeformWindowSession.setSetting(newFreeformWindow); + mWm.mAtmService.mSupportsFreeformWindowManagement = curFreeformWindow; mWm.mSettingsObserver.onChange(false, freeformWindowUri); - assertEquals(mWm.mAtmService.mSupportsFreeformWindowManagement, freeformWindow); + assertEquals(mWm.mAtmService.mSupportsFreeformWindowManagement, newFreeformWindow); + } + } + + @Test + public void testFreeformWindow_valueChanged_updatesDisplaySettings() { + try (SettingsSession freeformWindowSession = new + SettingsSession(DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT)) { + final boolean curFreeformWindow = freeformWindowSession.getSetting(); + final boolean newFreeformWindow = !curFreeformWindow; + final Uri freeformWindowUri = freeformWindowSession.setSetting(newFreeformWindow); + mWm.mAtmService.mSupportsFreeformWindowManagement = curFreeformWindow; + clearInvocations(mWm.mRoot); + mWm.mSettingsObserver.onChange(false, freeformWindowUri); + + // Changed value should update display settings. + verify(mWm.mRoot).onSettingsRetrieved(); + + clearInvocations(mWm.mRoot); + mWm.mSettingsObserver.onChange(false, freeformWindowUri); + + // Unchanged value should not update display settings. + verify(mWm.mRoot, never()).onSettingsRetrieved(); } } @@ -73,7 +100,8 @@ public class WindowManagerSettingsTests extends WindowTestsBase { try (SettingsSession forceResizableSession = new SettingsSession(DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES)) { final boolean forceResizableMode = !forceResizableSession.getSetting(); - final Uri forceResizableUri = forceResizableSession.setSetting(forceResizableMode); + final Uri forceResizableUri = forceResizableSession.setSetting(forceResizableMode); + mWm.mSettingsObserver.onChange(false, forceResizableUri); assertEquals(mWm.mAtmService.mForceResizableActivities, forceResizableMode); diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 8e85bb23b5c7..747c8d9d0890 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -445,7 +445,6 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser abstract static class UsbHandler extends Handler { // current USB state - private boolean mConnected; private boolean mHostConnected; private boolean mSourcePower; private boolean mSinkPower; @@ -473,6 +472,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser private final UsbPermissionManager mPermissionManager; private NotificationManager mNotificationManager; + protected boolean mConnected; protected long mScreenUnlockedFunctions; protected boolean mBootCompleted; protected boolean mCurrentFunctionsApplied; @@ -1794,7 +1794,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser case MSG_SET_FUNCTIONS_TIMEOUT: Slog.e(TAG, "Set functions timed out! no reply from usb hal"); if (msg.arg1 != 1) { - setEnabledFunctions(UsbManager.FUNCTION_NONE, false); + // Set this since default function may be selected from Developer options + setEnabledFunctions(mScreenUnlockedFunctions, false); } break; case MSG_GET_CURRENT_USB_FUNCTIONS: @@ -1816,7 +1817,8 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser * Dont force to default when the configuration is already set to default. */ if (msg.arg1 != 1) { - setEnabledFunctions(UsbManager.FUNCTION_NONE, !isAdbEnabled()); + // Set this since default function may be selected from Developer options + setEnabledFunctions(mScreenUnlockedFunctions, false); } break; case MSG_GADGET_HAL_REGISTERED: @@ -1936,8 +1938,11 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser SET_FUNCTIONS_TIMEOUT_MS - SET_FUNCTIONS_LEEWAY_MS); sendMessageDelayed(MSG_SET_FUNCTIONS_TIMEOUT, chargingFunctions, SET_FUNCTIONS_TIMEOUT_MS); - sendMessageDelayed(MSG_FUNCTION_SWITCH_TIMEOUT, chargingFunctions, - SET_FUNCTIONS_TIMEOUT_MS + ENUMERATION_TIME_OUT_MS); + if (mConnected) { + // Only queue timeout of enumeration when the USB is connected + sendMessageDelayed(MSG_FUNCTION_SWITCH_TIMEOUT, chargingFunctions, + SET_FUNCTIONS_TIMEOUT_MS + ENUMERATION_TIME_OUT_MS); + } if (DEBUG) Slog.d(TAG, "timeout message queued"); } catch (RemoteException e) { Slog.e(TAG, "Remoteexception while calling setCurrentUsbFunctions", e); diff --git a/telephony/api/system-current.txt b/telephony/api/system-current.txt new file mode 100644 index 000000000000..a49d3d539a7a --- /dev/null +++ b/telephony/api/system-current.txt @@ -0,0 +1,2151 @@ +// Signature format: 2.0 +package android.telephony { + + public final class AccessNetworkConstants { + field public static final int TRANSPORT_TYPE_INVALID = -1; // 0xffffffff + } + + public static final class AccessNetworkConstants.NgranBands { + method public static int getFrequencyRangeGroup(int); + field public static final int FREQUENCY_RANGE_GROUP_1 = 1; // 0x1 + field public static final int FREQUENCY_RANGE_GROUP_2 = 2; // 0x2 + field public static final int FREQUENCY_RANGE_GROUP_UNKNOWN = 0; // 0x0 + } + + public final class BarringInfo implements android.os.Parcelable { + ctor public BarringInfo(); + method @NonNull public android.telephony.BarringInfo createLocationInfoSanitizedCopy(); + } + + public final class CallAttributes implements android.os.Parcelable { + ctor public CallAttributes(@NonNull android.telephony.PreciseCallState, int, @NonNull android.telephony.CallQuality); + method public int describeContents(); + method @NonNull public android.telephony.CallQuality getCallQuality(); + method public int getNetworkType(); + method @NonNull public android.telephony.PreciseCallState getPreciseCallState(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallAttributes> CREATOR; + } + + public final class CallQuality implements android.os.Parcelable { + ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int); + ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int, boolean, boolean, boolean); + method public int describeContents(); + method public int getAverageRelativeJitter(); + method public int getAverageRoundTripTime(); + method public int getCallDuration(); + method public int getCodecType(); + method public int getDownlinkCallQualityLevel(); + method public int getMaxRelativeJitter(); + method public int getNumRtpPacketsNotReceived(); + method public int getNumRtpPacketsReceived(); + method public int getNumRtpPacketsTransmitted(); + method public int getNumRtpPacketsTransmittedLost(); + method public int getUplinkCallQualityLevel(); + method public boolean isIncomingSilenceDetected(); + method public boolean isOutgoingSilenceDetected(); + method public boolean isRtpInactivityDetected(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CALL_QUALITY_BAD = 4; // 0x4 + field public static final int CALL_QUALITY_EXCELLENT = 0; // 0x0 + field public static final int CALL_QUALITY_FAIR = 2; // 0x2 + field public static final int CALL_QUALITY_GOOD = 1; // 0x1 + field public static final int CALL_QUALITY_NOT_AVAILABLE = 5; // 0x5 + field public static final int CALL_QUALITY_POOR = 3; // 0x3 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR; + } + + public class CarrierConfigManager { + method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDefaultCarrierServicePackageName(); + method @NonNull public static android.os.PersistableBundle getDefaultConfig(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void updateConfigForPhoneId(int, String); + field public static final String KEY_CARRIER_SETUP_APP_STRING = "carrier_setup_app_string"; + field public static final String KEY_SUPPORT_CDMA_1X_VOICE_CALLS_BOOL = "support_cdma_1x_voice_calls_bool"; + } + + public static final class CarrierConfigManager.Wifi { + field public static final String KEY_HOTSPOT_MAX_CLIENT_COUNT = "wifi.hotspot_maximum_client_count"; + field public static final String KEY_PREFIX = "wifi."; + } + + public final class CarrierRestrictionRules implements android.os.Parcelable { + method @NonNull public java.util.List<java.lang.Boolean> areCarrierIdentifiersAllowed(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>); + method public int describeContents(); + method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(); + method public int getDefaultCarrierRestriction(); + method @NonNull public java.util.List<android.service.carrier.CarrierIdentifier> getExcludedCarriers(); + method public int getMultiSimPolicy(); + method public boolean isAllCarriersAllowed(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CARRIER_RESTRICTION_DEFAULT_ALLOWED = 1; // 0x1 + field public static final int CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED = 0; // 0x0 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CarrierRestrictionRules> CREATOR; + field public static final int MULTISIM_POLICY_NONE = 0; // 0x0 + field public static final int MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT = 1; // 0x1 + } + + public static final class CarrierRestrictionRules.Builder { + ctor public CarrierRestrictionRules.Builder(); + method @NonNull public android.telephony.CarrierRestrictionRules build(); + method @NonNull public android.telephony.CarrierRestrictionRules.Builder setAllCarriersAllowed(); + method @NonNull public android.telephony.CarrierRestrictionRules.Builder setAllowedCarriers(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>); + method @NonNull public android.telephony.CarrierRestrictionRules.Builder setDefaultCarrierRestriction(int); + method @NonNull public android.telephony.CarrierRestrictionRules.Builder setExcludedCarriers(@NonNull java.util.List<android.service.carrier.CarrierIdentifier>); + method @NonNull public android.telephony.CarrierRestrictionRules.Builder setMultiSimPolicy(int); + } + + public class CbGeoUtils { + } + + public static class CbGeoUtils.Circle implements android.telephony.CbGeoUtils.Geometry { + ctor public CbGeoUtils.Circle(@NonNull android.telephony.CbGeoUtils.LatLng, double); + method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng); + method @NonNull public android.telephony.CbGeoUtils.LatLng getCenter(); + method public double getRadius(); + } + + public static interface CbGeoUtils.Geometry { + method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng); + } + + public static class CbGeoUtils.LatLng { + ctor public CbGeoUtils.LatLng(double, double); + method public double distance(@NonNull android.telephony.CbGeoUtils.LatLng); + method @NonNull public android.telephony.CbGeoUtils.LatLng subtract(@NonNull android.telephony.CbGeoUtils.LatLng); + field public final double lat; + field public final double lng; + } + + public static class CbGeoUtils.Polygon implements android.telephony.CbGeoUtils.Geometry { + ctor public CbGeoUtils.Polygon(@NonNull java.util.List<android.telephony.CbGeoUtils.LatLng>); + method public boolean contains(@NonNull android.telephony.CbGeoUtils.LatLng); + method @NonNull public java.util.List<android.telephony.CbGeoUtils.LatLng> getVertices(); + } + + public abstract class CellBroadcastService extends android.app.Service { + ctor public CellBroadcastService(); + method @NonNull @WorkerThread public abstract CharSequence getCellBroadcastAreaInfo(int); + method public android.os.IBinder onBind(@Nullable android.content.Intent); + method public abstract void onCdmaCellBroadcastSms(int, @NonNull byte[], int); + method public abstract void onCdmaScpMessage(int, @NonNull java.util.List<android.telephony.cdma.CdmaSmsCbProgramData>, @NonNull String, @NonNull java.util.function.Consumer<android.os.Bundle>); + method public abstract void onGsmCellBroadcastSms(int, @NonNull byte[]); + field public static final String CELL_BROADCAST_SERVICE_INTERFACE = "android.telephony.CellBroadcastService"; + } + + public abstract class CellIdentity implements android.os.Parcelable { + method @NonNull public abstract android.telephony.CellLocation asCellLocation(); + method @NonNull public abstract android.telephony.CellIdentity sanitizeLocationInfo(); + } + + public final class CellIdentityCdma extends android.telephony.CellIdentity { + method @NonNull public android.telephony.cdma.CdmaCellLocation asCellLocation(); + method @NonNull public android.telephony.CellIdentityCdma sanitizeLocationInfo(); + } + + public final class CellIdentityGsm extends android.telephony.CellIdentity { + method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation(); + method @NonNull public android.telephony.CellIdentityGsm sanitizeLocationInfo(); + } + + public final class CellIdentityLte extends android.telephony.CellIdentity { + method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation(); + method @NonNull public android.telephony.CellIdentityLte sanitizeLocationInfo(); + } + + public final class CellIdentityNr extends android.telephony.CellIdentity { + method @NonNull public android.telephony.CellLocation asCellLocation(); + method @NonNull public android.telephony.CellIdentityNr sanitizeLocationInfo(); + } + + public final class CellIdentityTdscdma extends android.telephony.CellIdentity { + method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation(); + method @NonNull public android.telephony.CellIdentityTdscdma sanitizeLocationInfo(); + } + + public final class CellIdentityWcdma extends android.telephony.CellIdentity { + method @NonNull public android.telephony.gsm.GsmCellLocation asCellLocation(); + method @NonNull public android.telephony.CellIdentityWcdma sanitizeLocationInfo(); + } + + public final class DataFailCause { + field @Deprecated public static final int VSNCP_APN_UNATHORIZED = 2238; // 0x8be + } + + public final class DataSpecificRegistrationInfo implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.telephony.LteVopsSupportInfo getLteVopsSupportInfo(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.DataSpecificRegistrationInfo> CREATOR; + } + + public final class DisconnectCause { + field public static final int ALREADY_DIALING = 72; // 0x48 + field public static final int ANSWERED_ELSEWHERE = 52; // 0x34 + field public static final int BUSY = 4; // 0x4 + field public static final int CALLING_DISABLED = 74; // 0x4a + field public static final int CALL_BARRED = 20; // 0x14 + field public static final int CALL_PULLED = 51; // 0x33 + field public static final int CANT_CALL_WHILE_RINGING = 73; // 0x49 + field public static final int CDMA_ACCESS_BLOCKED = 35; // 0x23 + field public static final int CDMA_ACCESS_FAILURE = 32; // 0x20 + field public static final int CDMA_ALREADY_ACTIVATED = 49; // 0x31 + field public static final int CDMA_DROP = 27; // 0x1b + field public static final int CDMA_INTERCEPT = 28; // 0x1c + field public static final int CDMA_LOCKED_UNTIL_POWER_CYCLE = 26; // 0x1a + field public static final int CDMA_NOT_EMERGENCY = 34; // 0x22 + field public static final int CDMA_PREEMPTED = 33; // 0x21 + field public static final int CDMA_REORDER = 29; // 0x1d + field public static final int CDMA_RETRY_ORDER = 31; // 0x1f + field public static final int CDMA_SO_REJECT = 30; // 0x1e + field public static final int CONGESTION = 5; // 0x5 + field public static final int CS_RESTRICTED = 22; // 0x16 + field public static final int CS_RESTRICTED_EMERGENCY = 24; // 0x18 + field public static final int CS_RESTRICTED_NORMAL = 23; // 0x17 + field public static final int DATA_DISABLED = 54; // 0x36 + field public static final int DATA_LIMIT_REACHED = 55; // 0x37 + field public static final int DIALED_CALL_FORWARDING_WHILE_ROAMING = 57; // 0x39 + field public static final int DIALED_MMI = 39; // 0x27 + field public static final int DIAL_LOW_BATTERY = 62; // 0x3e + field public static final int DIAL_MODIFIED_TO_DIAL = 48; // 0x30 + field public static final int DIAL_MODIFIED_TO_DIAL_VIDEO = 66; // 0x42 + field public static final int DIAL_MODIFIED_TO_SS = 47; // 0x2f + field public static final int DIAL_MODIFIED_TO_USSD = 46; // 0x2e + field public static final int DIAL_VIDEO_MODIFIED_TO_DIAL = 69; // 0x45 + field public static final int DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO = 70; // 0x46 + field public static final int DIAL_VIDEO_MODIFIED_TO_SS = 67; // 0x43 + field public static final int DIAL_VIDEO_MODIFIED_TO_USSD = 68; // 0x44 + field public static final int EMERGENCY_PERM_FAILURE = 64; // 0x40 + field public static final int EMERGENCY_TEMP_FAILURE = 63; // 0x3f + field public static final int ERROR_UNSPECIFIED = 36; // 0x24 + field public static final int FDN_BLOCKED = 21; // 0x15 + field public static final int ICC_ERROR = 19; // 0x13 + field public static final int IMEI_NOT_ACCEPTED = 58; // 0x3a + field public static final int IMS_ACCESS_BLOCKED = 60; // 0x3c + field public static final int IMS_MERGED_SUCCESSFULLY = 45; // 0x2d + field public static final int IMS_SIP_ALTERNATE_EMERGENCY_CALL = 71; // 0x47 + field public static final int INCOMING_AUTO_REJECTED = 81; // 0x51 + field public static final int INCOMING_MISSED = 1; // 0x1 + field public static final int INCOMING_REJECTED = 16; // 0x10 + field public static final int INVALID_CREDENTIALS = 10; // 0xa + field public static final int INVALID_NUMBER = 7; // 0x7 + field public static final int LIMIT_EXCEEDED = 15; // 0xf + field public static final int LOCAL = 3; // 0x3 + field public static final int LOST_SIGNAL = 14; // 0xe + field public static final int LOW_BATTERY = 61; // 0x3d + field public static final int MAXIMUM_NUMBER_OF_CALLS_REACHED = 53; // 0x35 + field public static final int MMI = 6; // 0x6 + field public static final int NORMAL = 2; // 0x2 + field public static final int NORMAL_UNSPECIFIED = 65; // 0x41 + field public static final int NOT_DISCONNECTED = 0; // 0x0 + field public static final int NOT_VALID = -1; // 0xffffffff + field public static final int NO_PHONE_NUMBER_SUPPLIED = 38; // 0x26 + field public static final int NUMBER_UNREACHABLE = 8; // 0x8 + field public static final int OTASP_PROVISIONING_IN_PROCESS = 76; // 0x4c + field public static final int OUTGOING_CANCELED = 44; // 0x2c + field public static final int OUTGOING_EMERGENCY_CALL_PLACED = 80; // 0x50 + field public static final int OUTGOING_FAILURE = 43; // 0x2b + field public static final int OUT_OF_NETWORK = 11; // 0xb + field public static final int OUT_OF_SERVICE = 18; // 0x12 + field public static final int POWER_OFF = 17; // 0x11 + field public static final int SERVER_ERROR = 12; // 0xc + field public static final int SERVER_UNREACHABLE = 9; // 0x9 + field public static final int TIMED_OUT = 13; // 0xd + field public static final int TOO_MANY_ONGOING_CALLS = 75; // 0x4b + field public static final int UNOBTAINABLE_NUMBER = 25; // 0x19 + field public static final int VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED = 50; // 0x32 + field public static final int VOICEMAIL_NUMBER_MISSING = 40; // 0x28 + field public static final int WIFI_LOST = 59; // 0x3b + } + + public final class ImsiEncryptionInfo implements android.os.Parcelable { + method public int describeContents(); + method @Nullable public String getKeyIdentifier(); + method @Nullable public java.security.PublicKey getPublicKey(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ImsiEncryptionInfo> CREATOR; + } + + public final class LteVopsSupportInfo implements android.os.Parcelable { + ctor public LteVopsSupportInfo(int, int); + method public int describeContents(); + method public int getEmcBearerSupport(); + method public int getVopsSupport(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.LteVopsSupportInfo> CREATOR; + field public static final int LTE_STATUS_NOT_AVAILABLE = 1; // 0x1 + field public static final int LTE_STATUS_NOT_SUPPORTED = 3; // 0x3 + field public static final int LTE_STATUS_SUPPORTED = 2; // 0x2 + } + + public class MbmsDownloadSession implements java.lang.AutoCloseable { + field public static final String MBMS_DOWNLOAD_SERVICE_ACTION = "android.telephony.action.EmbmsDownload"; + } + + public class MbmsGroupCallSession implements java.lang.AutoCloseable { + field public static final String MBMS_GROUP_CALL_SERVICE_ACTION = "android.telephony.action.EmbmsGroupCall"; + } + + public class MbmsStreamingSession implements java.lang.AutoCloseable { + field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming"; + } + + public final class ModemActivityInfo implements android.os.Parcelable { + ctor public ModemActivityInfo(long, int, int, @NonNull int[], int); + method public int describeContents(); + method public int getIdleTimeMillis(); + method public int getReceiveTimeMillis(); + method public int getSleepTimeMillis(); + method public long getTimestamp(); + method @NonNull public java.util.List<android.telephony.ModemActivityInfo.TransmitPower> getTransmitPowerInfo(); + method public boolean isValid(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR; + field public static final int TX_POWER_LEVELS = 5; // 0x5 + field public static final int TX_POWER_LEVEL_0 = 0; // 0x0 + field public static final int TX_POWER_LEVEL_1 = 1; // 0x1 + field public static final int TX_POWER_LEVEL_2 = 2; // 0x2 + field public static final int TX_POWER_LEVEL_3 = 3; // 0x3 + field public static final int TX_POWER_LEVEL_4 = 4; // 0x4 + } + + public class ModemActivityInfo.TransmitPower { + method @NonNull public android.util.Range<java.lang.Integer> getPowerRangeInDbm(); + method public int getTimeInMillis(); + } + + public final class NetworkRegistrationInfo implements android.os.Parcelable { + method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo(); + method public int getRegistrationState(); + method public int getRejectCause(); + method public int getRoamingType(); + method public boolean isEmergencyEnabled(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int REGISTRATION_STATE_DENIED = 3; // 0x3 + field public static final int REGISTRATION_STATE_HOME = 1; // 0x1 + field public static final int REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING = 0; // 0x0 + field public static final int REGISTRATION_STATE_NOT_REGISTERED_SEARCHING = 2; // 0x2 + field public static final int REGISTRATION_STATE_ROAMING = 5; // 0x5 + field public static final int REGISTRATION_STATE_UNKNOWN = 4; // 0x4 + } + + public static final class NetworkRegistrationInfo.Builder { + ctor public NetworkRegistrationInfo.Builder(); + method @NonNull public android.telephony.NetworkRegistrationInfo build(); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAccessNetworkTechnology(int); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAvailableServices(@NonNull java.util.List<java.lang.Integer>); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setCellIdentity(@Nullable android.telephony.CellIdentity); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setDomain(int); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setEmergencyOnly(boolean); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegisteredPlmn(@Nullable String); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegistrationState(int); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRejectCause(int); + method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setTransportType(int); + } + + public abstract class NetworkService extends android.app.Service { + ctor public NetworkService(); + method public android.os.IBinder onBind(android.content.Intent); + method @Nullable public abstract android.telephony.NetworkService.NetworkServiceProvider onCreateNetworkServiceProvider(int); + field public static final String SERVICE_INTERFACE = "android.telephony.NetworkService"; + } + + public abstract class NetworkService.NetworkServiceProvider implements java.lang.AutoCloseable { + ctor public NetworkService.NetworkServiceProvider(int); + method public abstract void close(); + method public final int getSlotIndex(); + method public final void notifyNetworkRegistrationInfoChanged(); + method public void requestNetworkRegistrationInfo(int, @NonNull android.telephony.NetworkServiceCallback); + } + + public class NetworkServiceCallback { + method public void onRequestNetworkRegistrationInfoComplete(int, @Nullable android.telephony.NetworkRegistrationInfo); + field public static final int RESULT_ERROR_BUSY = 3; // 0x3 + field public static final int RESULT_ERROR_FAILED = 5; // 0x5 + field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4 + field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2 + field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1 + field public static final int RESULT_SUCCESS = 0; // 0x0 + } + + public interface NumberVerificationCallback { + method public default void onCallReceived(@NonNull String); + method public default void onVerificationFailed(int); + field public static final int REASON_CONCURRENT_REQUESTS = 4; // 0x4 + field public static final int REASON_IN_ECBM = 5; // 0x5 + field public static final int REASON_IN_EMERGENCY_CALL = 6; // 0x6 + field public static final int REASON_NETWORK_NOT_AVAILABLE = 2; // 0x2 + field public static final int REASON_TIMED_OUT = 1; // 0x1 + field public static final int REASON_TOO_MANY_CALLS = 3; // 0x3 + field public static final int REASON_UNSPECIFIED = 0; // 0x0 + } + + public final class PhoneNumberRange implements android.os.Parcelable { + ctor public PhoneNumberRange(@NonNull String, @NonNull String, @NonNull String, @NonNull String); + method public int describeContents(); + method public boolean matches(@NonNull String); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhoneNumberRange> CREATOR; + } + + public class PhoneNumberUtils { + method @NonNull public static String getUsernameFromUriNumber(@NonNull String); + method public static boolean isUriNumber(@Nullable String); + method public static boolean isVoiceMailNumber(@NonNull android.content.Context, int, @Nullable String); + } + + public final class PreciseCallState implements android.os.Parcelable { + ctor public PreciseCallState(int, int, int, int, int); + method public int describeContents(); + method public int getBackgroundCallState(); + method public int getForegroundCallState(); + method public int getRingingCallState(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PreciseCallState> CREATOR; + field public static final int PRECISE_CALL_STATE_ACTIVE = 1; // 0x1 + field public static final int PRECISE_CALL_STATE_ALERTING = 4; // 0x4 + field public static final int PRECISE_CALL_STATE_DIALING = 3; // 0x3 + field public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; // 0x7 + field public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; // 0x8 + field public static final int PRECISE_CALL_STATE_HOLDING = 2; // 0x2 + field public static final int PRECISE_CALL_STATE_IDLE = 0; // 0x0 + field public static final int PRECISE_CALL_STATE_INCOMING = 5; // 0x5 + field public static final int PRECISE_CALL_STATE_NOT_VALID = -1; // 0xffffffff + field public static final int PRECISE_CALL_STATE_WAITING = 6; // 0x6 + } + + public final class PreciseDataConnectionState implements android.os.Parcelable { + method @Deprecated @NonNull public String getDataConnectionApn(); + method @Deprecated public int getDataConnectionApnTypeBitMask(); + method @Deprecated public int getDataConnectionFailCause(); + method @Deprecated @Nullable public android.net.LinkProperties getDataConnectionLinkProperties(); + method @Deprecated public int getDataConnectionNetworkType(); + method @Deprecated public int getDataConnectionState(); + } + + public final class PreciseDisconnectCause { + field public static final int ACCESS_CLASS_BLOCKED = 260; // 0x104 + field public static final int ACCESS_INFORMATION_DISCARDED = 43; // 0x2b + field public static final int ACM_LIMIT_EXCEEDED = 68; // 0x44 + field public static final int BEARER_CAPABILITY_NOT_AUTHORIZED = 57; // 0x39 + field public static final int BEARER_NOT_AVAIL = 58; // 0x3a + field public static final int BEARER_SERVICE_NOT_IMPLEMENTED = 65; // 0x41 + field public static final int BUSY = 17; // 0x11 + field public static final int CALL_BARRED = 240; // 0xf0 + field public static final int CALL_REJECTED = 21; // 0x15 + field public static final int CDMA_ACCESS_BLOCKED = 1009; // 0x3f1 + field public static final int CDMA_ACCESS_FAILURE = 1006; // 0x3ee + field public static final int CDMA_DROP = 1001; // 0x3e9 + field public static final int CDMA_INTERCEPT = 1002; // 0x3ea + field public static final int CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000; // 0x3e8 + field public static final int CDMA_NOT_EMERGENCY = 1008; // 0x3f0 + field public static final int CDMA_PREEMPTED = 1007; // 0x3ef + field public static final int CDMA_REORDER = 1003; // 0x3eb + field public static final int CDMA_RETRY_ORDER = 1005; // 0x3ed + field public static final int CDMA_SO_REJECT = 1004; // 0x3ec + field public static final int CHANNEL_NOT_AVAIL = 44; // 0x2c + field public static final int CHANNEL_UNACCEPTABLE = 6; // 0x6 + field public static final int CONDITIONAL_IE_ERROR = 100; // 0x64 + field public static final int DESTINATION_OUT_OF_ORDER = 27; // 0x1b + field public static final int ERROR_UNSPECIFIED = 65535; // 0xffff + field public static final int FACILITY_REJECTED = 29; // 0x1d + field public static final int FDN_BLOCKED = 241; // 0xf1 + field public static final int IMEI_NOT_ACCEPTED = 243; // 0xf3 + field public static final int IMSI_UNKNOWN_IN_VLR = 242; // 0xf2 + field public static final int INCOMING_CALLS_BARRED_WITHIN_CUG = 55; // 0x37 + field public static final int INCOMPATIBLE_DESTINATION = 88; // 0x58 + field public static final int INFORMATION_ELEMENT_NON_EXISTENT = 99; // 0x63 + field public static final int INTERWORKING_UNSPECIFIED = 127; // 0x7f + field public static final int INVALID_MANDATORY_INFORMATION = 96; // 0x60 + field public static final int INVALID_NUMBER_FORMAT = 28; // 0x1c + field public static final int INVALID_TRANSACTION_IDENTIFIER = 81; // 0x51 + field public static final int MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 101; // 0x65 + field public static final int MESSAGE_TYPE_NON_IMPLEMENTED = 97; // 0x61 + field public static final int MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 98; // 0x62 + field public static final int NETWORK_DETACH = 261; // 0x105 + field public static final int NETWORK_OUT_OF_ORDER = 38; // 0x26 + field public static final int NETWORK_REJECT = 252; // 0xfc + field public static final int NETWORK_RESP_TIMEOUT = 251; // 0xfb + field public static final int NORMAL = 16; // 0x10 + field public static final int NORMAL_UNSPECIFIED = 31; // 0x1f + field public static final int NOT_VALID = -1; // 0xffffffff + field public static final int NO_ANSWER_FROM_USER = 19; // 0x13 + field public static final int NO_CIRCUIT_AVAIL = 34; // 0x22 + field public static final int NO_DISCONNECT_CAUSE_AVAILABLE = 0; // 0x0 + field public static final int NO_ROUTE_TO_DESTINATION = 3; // 0x3 + field public static final int NO_USER_RESPONDING = 18; // 0x12 + field public static final int NO_VALID_SIM = 249; // 0xf9 + field public static final int NUMBER_CHANGED = 22; // 0x16 + field public static final int OEM_CAUSE_1 = 61441; // 0xf001 + field public static final int OEM_CAUSE_10 = 61450; // 0xf00a + field public static final int OEM_CAUSE_11 = 61451; // 0xf00b + field public static final int OEM_CAUSE_12 = 61452; // 0xf00c + field public static final int OEM_CAUSE_13 = 61453; // 0xf00d + field public static final int OEM_CAUSE_14 = 61454; // 0xf00e + field public static final int OEM_CAUSE_15 = 61455; // 0xf00f + field public static final int OEM_CAUSE_2 = 61442; // 0xf002 + field public static final int OEM_CAUSE_3 = 61443; // 0xf003 + field public static final int OEM_CAUSE_4 = 61444; // 0xf004 + field public static final int OEM_CAUSE_5 = 61445; // 0xf005 + field public static final int OEM_CAUSE_6 = 61446; // 0xf006 + field public static final int OEM_CAUSE_7 = 61447; // 0xf007 + field public static final int OEM_CAUSE_8 = 61448; // 0xf008 + field public static final int OEM_CAUSE_9 = 61449; // 0xf009 + field public static final int ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE = 70; // 0x46 + field public static final int OPERATOR_DETERMINED_BARRING = 8; // 0x8 + field public static final int OUT_OF_SRV = 248; // 0xf8 + field public static final int PREEMPTION = 25; // 0x19 + field public static final int PROTOCOL_ERROR_UNSPECIFIED = 111; // 0x6f + field public static final int QOS_NOT_AVAIL = 49; // 0x31 + field public static final int RADIO_ACCESS_FAILURE = 253; // 0xfd + field public static final int RADIO_INTERNAL_ERROR = 250; // 0xfa + field public static final int RADIO_LINK_FAILURE = 254; // 0xfe + field public static final int RADIO_LINK_LOST = 255; // 0xff + field public static final int RADIO_OFF = 247; // 0xf7 + field public static final int RADIO_RELEASE_ABNORMAL = 259; // 0x103 + field public static final int RADIO_RELEASE_NORMAL = 258; // 0x102 + field public static final int RADIO_SETUP_FAILURE = 257; // 0x101 + field public static final int RADIO_UPLINK_FAILURE = 256; // 0x100 + field public static final int RECOVERY_ON_TIMER_EXPIRED = 102; // 0x66 + field public static final int REQUESTED_FACILITY_NOT_IMPLEMENTED = 69; // 0x45 + field public static final int REQUESTED_FACILITY_NOT_SUBSCRIBED = 50; // 0x32 + field public static final int RESOURCES_UNAVAILABLE_OR_UNSPECIFIED = 47; // 0x2f + field public static final int SEMANTICALLY_INCORRECT_MESSAGE = 95; // 0x5f + field public static final int SERVICE_OPTION_NOT_AVAILABLE = 63; // 0x3f + field public static final int SERVICE_OR_OPTION_NOT_IMPLEMENTED = 79; // 0x4f + field public static final int STATUS_ENQUIRY = 30; // 0x1e + field public static final int SWITCHING_CONGESTION = 42; // 0x2a + field public static final int TEMPORARY_FAILURE = 41; // 0x29 + field public static final int UNOBTAINABLE_NUMBER = 1; // 0x1 + field public static final int USER_NOT_MEMBER_OF_CUG = 87; // 0x57 + } + + public class ServiceState implements android.os.Parcelable { + method public void fillInNotifierBundle(@NonNull android.os.Bundle); + method @Nullable public android.telephony.NetworkRegistrationInfo getNetworkRegistrationInfo(int, int); + method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForDomain(int); + method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForTransportType(int); + method @NonNull public static android.telephony.ServiceState newFromBundle(@NonNull android.os.Bundle); + field public static final int ROAMING_TYPE_DOMESTIC = 2; // 0x2 + field public static final int ROAMING_TYPE_INTERNATIONAL = 3; // 0x3 + field public static final int ROAMING_TYPE_NOT_ROAMING = 0; // 0x0 + field public static final int ROAMING_TYPE_UNKNOWN = 1; // 0x1 + } + + public class SignalStrength implements android.os.Parcelable { + ctor public SignalStrength(@NonNull android.telephony.SignalStrength); + } + + public final class SmsCbCmasInfo implements android.os.Parcelable { + ctor public SmsCbCmasInfo(int, int, int, int, int, int); + method public int describeContents(); + method public int getCategory(); + method public int getCertainty(); + method public int getMessageClass(); + method public int getResponseType(); + method public int getSeverity(); + method public int getUrgency(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CMAS_CATEGORY_CBRNE = 10; // 0xa + field public static final int CMAS_CATEGORY_ENV = 7; // 0x7 + field public static final int CMAS_CATEGORY_FIRE = 5; // 0x5 + field public static final int CMAS_CATEGORY_GEO = 0; // 0x0 + field public static final int CMAS_CATEGORY_HEALTH = 6; // 0x6 + field public static final int CMAS_CATEGORY_INFRA = 9; // 0x9 + field public static final int CMAS_CATEGORY_MET = 1; // 0x1 + field public static final int CMAS_CATEGORY_OTHER = 11; // 0xb + field public static final int CMAS_CATEGORY_RESCUE = 4; // 0x4 + field public static final int CMAS_CATEGORY_SAFETY = 2; // 0x2 + field public static final int CMAS_CATEGORY_SECURITY = 3; // 0x3 + field public static final int CMAS_CATEGORY_TRANSPORT = 8; // 0x8 + field public static final int CMAS_CATEGORY_UNKNOWN = -1; // 0xffffffff + field public static final int CMAS_CERTAINTY_LIKELY = 1; // 0x1 + field public static final int CMAS_CERTAINTY_OBSERVED = 0; // 0x0 + field public static final int CMAS_CERTAINTY_UNKNOWN = -1; // 0xffffffff + field public static final int CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY = 3; // 0x3 + field public static final int CMAS_CLASS_CMAS_EXERCISE = 5; // 0x5 + field public static final int CMAS_CLASS_EXTREME_THREAT = 1; // 0x1 + field public static final int CMAS_CLASS_OPERATOR_DEFINED_USE = 6; // 0x6 + field public static final int CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT = 0; // 0x0 + field public static final int CMAS_CLASS_REQUIRED_MONTHLY_TEST = 4; // 0x4 + field public static final int CMAS_CLASS_SEVERE_THREAT = 2; // 0x2 + field public static final int CMAS_CLASS_UNKNOWN = -1; // 0xffffffff + field public static final int CMAS_RESPONSE_TYPE_ASSESS = 6; // 0x6 + field public static final int CMAS_RESPONSE_TYPE_AVOID = 5; // 0x5 + field public static final int CMAS_RESPONSE_TYPE_EVACUATE = 1; // 0x1 + field public static final int CMAS_RESPONSE_TYPE_EXECUTE = 3; // 0x3 + field public static final int CMAS_RESPONSE_TYPE_MONITOR = 4; // 0x4 + field public static final int CMAS_RESPONSE_TYPE_NONE = 7; // 0x7 + field public static final int CMAS_RESPONSE_TYPE_PREPARE = 2; // 0x2 + field public static final int CMAS_RESPONSE_TYPE_SHELTER = 0; // 0x0 + field public static final int CMAS_RESPONSE_TYPE_UNKNOWN = -1; // 0xffffffff + field public static final int CMAS_SEVERITY_EXTREME = 0; // 0x0 + field public static final int CMAS_SEVERITY_SEVERE = 1; // 0x1 + field public static final int CMAS_SEVERITY_UNKNOWN = -1; // 0xffffffff + field public static final int CMAS_URGENCY_EXPECTED = 1; // 0x1 + field public static final int CMAS_URGENCY_IMMEDIATE = 0; // 0x0 + field public static final int CMAS_URGENCY_UNKNOWN = -1; // 0xffffffff + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbCmasInfo> CREATOR; + } + + public final class SmsCbEtwsInfo implements android.os.Parcelable { + ctor public SmsCbEtwsInfo(int, boolean, boolean, boolean, @Nullable byte[]); + method public int describeContents(); + method @Nullable public byte[] getPrimaryNotificationSignature(); + method public long getPrimaryNotificationTimestamp(); + method public int getWarningType(); + method public boolean isEmergencyUserAlert(); + method public boolean isPopupAlert(); + method public boolean isPrimary(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbEtwsInfo> CREATOR; + field public static final int ETWS_WARNING_TYPE_EARTHQUAKE = 0; // 0x0 + field public static final int ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI = 2; // 0x2 + field public static final int ETWS_WARNING_TYPE_OTHER_EMERGENCY = 4; // 0x4 + field public static final int ETWS_WARNING_TYPE_TEST_MESSAGE = 3; // 0x3 + field public static final int ETWS_WARNING_TYPE_TSUNAMI = 1; // 0x1 + field public static final int ETWS_WARNING_TYPE_UNKNOWN = -1; // 0xffffffff + } + + public final class SmsCbLocation implements android.os.Parcelable { + ctor public SmsCbLocation(@NonNull String, int, int); + method public int describeContents(); + method public int getCid(); + method public int getLac(); + method @NonNull public String getPlmn(); + method public boolean isInLocationArea(@NonNull android.telephony.SmsCbLocation); + method public boolean isInLocationArea(@Nullable String, int, int); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbLocation> CREATOR; + } + + public final class SmsCbMessage implements android.os.Parcelable { + ctor public SmsCbMessage(int, int, int, @NonNull android.telephony.SmsCbLocation, int, @Nullable String, int, @Nullable String, int, @Nullable android.telephony.SmsCbEtwsInfo, @Nullable android.telephony.SmsCbCmasInfo, int, @Nullable java.util.List<android.telephony.CbGeoUtils.Geometry>, long, int, int); + method @NonNull public static android.telephony.SmsCbMessage createFromCursor(@NonNull android.database.Cursor); + method public int describeContents(); + method @Nullable public android.telephony.SmsCbCmasInfo getCmasWarningInfo(); + method @NonNull public android.content.ContentValues getContentValues(); + method public int getDataCodingScheme(); + method @Nullable public android.telephony.SmsCbEtwsInfo getEtwsWarningInfo(); + method public int getGeographicalScope(); + method @NonNull public java.util.List<android.telephony.CbGeoUtils.Geometry> getGeometries(); + method @Nullable public String getLanguageCode(); + method @NonNull public android.telephony.SmsCbLocation getLocation(); + method public int getMaximumWaitingDuration(); + method @Nullable public String getMessageBody(); + method public int getMessageFormat(); + method public int getMessagePriority(); + method public long getReceivedTime(); + method public int getSerialNumber(); + method public int getServiceCategory(); + method public int getSlotIndex(); + method public int getSubscriptionId(); + method public boolean isCmasMessage(); + method public boolean isEmergencyMessage(); + method public boolean isEtwsMessage(); + method public boolean needGeoFencingCheck(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbMessage> CREATOR; + field public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE = 3; // 0x3 + field public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE = 0; // 0x0 + field public static final int GEOGRAPHICAL_SCOPE_LOCATION_AREA_WIDE = 2; // 0x2 + field public static final int GEOGRAPHICAL_SCOPE_PLMN_WIDE = 1; // 0x1 + field public static final int MAXIMUM_WAIT_TIME_NOT_SET = 255; // 0xff + field public static final int MESSAGE_FORMAT_3GPP = 1; // 0x1 + field public static final int MESSAGE_FORMAT_3GPP2 = 2; // 0x2 + field public static final int MESSAGE_PRIORITY_EMERGENCY = 3; // 0x3 + field public static final int MESSAGE_PRIORITY_INTERACTIVE = 1; // 0x1 + field public static final int MESSAGE_PRIORITY_NORMAL = 0; // 0x0 + field public static final int MESSAGE_PRIORITY_URGENT = 2; // 0x2 + } + + public final class SmsManager { + method @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public boolean copyMessageToIcc(@Nullable byte[], @NonNull byte[], int); + method @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public boolean deleteMessageFromIcc(int); + method public boolean disableCellBroadcastRange(int, int, int); + method public boolean enableCellBroadcastRange(int, int, int); + method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public java.util.List<android.telephony.SmsMessage> getMessagesFromIcc(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPremiumSmsConsent(@NonNull String); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSmsCapacityOnIcc(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPremiumSmsConsent(@NonNull String, int); + field public static final int PREMIUM_SMS_CONSENT_ALWAYS_ALLOW = 3; // 0x3 + field public static final int PREMIUM_SMS_CONSENT_ASK_USER = 1; // 0x1 + field public static final int PREMIUM_SMS_CONSENT_NEVER_ALLOW = 2; // 0x2 + field public static final int PREMIUM_SMS_CONSENT_UNKNOWN = 0; // 0x0 + } + + public class SmsMessage { + method @Nullable public static android.telephony.SmsMessage createFromNativeSmsSubmitPdu(@NonNull byte[], boolean); + method @Nullable public static android.telephony.SmsMessage.SubmitPdu getSmsPdu(int, int, @Nullable String, @NonNull String, @NonNull String, long); + method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static byte[] getSubmitPduEncodedMessage(boolean, @NonNull String, @NonNull String, int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0, to=255) int, @IntRange(from=1, to=255) int, @IntRange(from=1, to=255) int); + } + + public class SubscriptionInfo implements android.os.Parcelable { + method public boolean areUiccApplicationsEnabled(); + method @Nullable public java.util.List<android.telephony.UiccAccessRule> getAccessRules(); + method public int getProfileClass(); + method public boolean isGroupDisabled(); + } + + public class SubscriptionManager { + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean canDisablePhysicalSubscription(); + method public boolean canManageSubscription(@NonNull android.telephony.SubscriptionInfo, @NonNull String); + method @NonNull public int[] getActiveAndHiddenSubscriptionIdList(); + method @NonNull public int[] getActiveSubscriptionIdList(); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.SubscriptionInfo getActiveSubscriptionInfoForIcc(@NonNull String); + method public java.util.List<android.telephony.SubscriptionInfo> getAvailableSubscriptionInfoList(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEnabledSubscriptionId(int); + method @NonNull public static android.content.res.Resources getResourcesForSubId(@NonNull android.content.Context, int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSubscriptionEnabled(int); + method public void requestEmbeddedSubscriptionInfoListRefresh(); + method public void requestEmbeddedSubscriptionInfoListRefresh(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultDataSubId(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setDisplayName(@Nullable String, int, int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setIconTint(int, int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSubscriptionEnabled(int, boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUiccApplicationsEnabled(int, boolean); + field @RequiresPermission(android.Manifest.permission.MANAGE_SUBSCRIPTION_PLANS) public static final String ACTION_SUBSCRIPTION_PLANS_CHANGED = "android.telephony.action.SUBSCRIPTION_PLANS_CHANGED"; + 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 @NonNull public static final android.net.Uri VT_ENABLED_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_ENABLED_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_MODE_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI; + field @NonNull public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI; + } + + public class TelephonyFrameworkInitializer { + method public static void registerServiceWrappers(); + method public static void setTelephonyServiceManager(@NonNull android.os.TelephonyServiceManager); + } + + public final class TelephonyHistogram implements android.os.Parcelable { + ctor public TelephonyHistogram(int, int, int); + ctor public TelephonyHistogram(android.telephony.TelephonyHistogram); + ctor public TelephonyHistogram(android.os.Parcel); + method public void addTimeTaken(int); + method public int describeContents(); + method public int getAverageTime(); + method public int getBucketCount(); + method public int[] getBucketCounters(); + method public int[] getBucketEndPoints(); + method public int getCategory(); + method public int getId(); + method public int getMaxTime(); + method public int getMinTime(); + method public int getSampleCount(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.TelephonyHistogram> CREATOR; + field public static final int TELEPHONY_CATEGORY_RIL = 1; // 0x1 + } + + public class TelephonyManager { + method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String); + method public int checkCarrierPrivilegesForPackage(String); + method public int checkCarrierPrivilegesForPackageAnyPhone(String); + method public void dial(String); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean disableDataConnectivity(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableDataConnectivity(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean enableModemForSlot(int, boolean); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void enableVideoCalling(boolean); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getAidForAppType(int); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.service.carrier.CarrierIdentifier> getAllowedCarriers(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getAllowedNetworkTypes(); + method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getAndUpdateDefaultRespondViaMessageApplication(); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int); + method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent); + method public java.util.List<java.lang.String> getCarrierPackageNamesForIntentAndPhone(android.content.Intent, int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getCarrierPrivilegeStatus(int); + method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<java.lang.String> getCarrierPrivilegedPackagesForAllActiveSubscriptions(); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.CarrierRestrictionRules getCarrierRestrictionRules(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMdn(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMdn(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMin(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String getCdmaMin(int); + method public String getCdmaPrlVersion(); + method public int getCurrentPhoneType(); + method public int getCurrentPhoneType(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getDataActivationState(); + method @Deprecated public boolean getDataEnabled(); + method @Deprecated public boolean getDataEnabled(int); + method @Nullable @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.ComponentName getDefaultRespondViaMessageApplication(); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getDeviceSoftwareVersion(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion(); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain(); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst(); + method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Map<java.lang.Integer,java.lang.Integer> getLogicalToPhysicalSlotMapping(); + method public int getMaxNumberOfSimultaneouslyActiveSims(); + method public static long getMaxNumberVerificationTimeoutMillis(); + method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String[] getMergedImsisFromGroup(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getPreferredNetworkTypeBitmask(); + method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public int getRadioPowerState(); + method public int getSimApplicationState(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSimApplicationState(int); + method public int getSimCardState(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSimCardState(int); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Locale getSimLocale(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getSupportedRadioAccessFamily(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccSlotInfo[] getUiccSlotsInfo(); + method @Nullable public android.os.Bundle getVisualVoicemailSettings(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoiceActivationState(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmi(String); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmiForSubscriber(int, String); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean iccCloseLogicalChannelBySlot(int, int); + method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(int, @Nullable String, int); + method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduBasicChannelBySlot(int, int, int, int, int, int, @Nullable String); + method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelBySlot(int, int, int, int, int, int, int, @Nullable String); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAnyRadioPoweredOn(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApnMetered(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApplicationOnUicc(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataConnectionAllowed(); + method public boolean isDataConnectivityPossible(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataEnabledForApn(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isEmergencyAssistanceEnabled(); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isInEmergencySmsMode(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isLteCdmaEvdoGsmWcdmaEnabled(); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isOpportunisticNetworkEnabled(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isPotentialEmergencyNumber(@NonNull String); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRadioOn(); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isTetheringApnRequired(); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isVideoCallingEnabled(); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean matchesCurrentSimOperator(@NonNull String, int, @Nullable String); + method public boolean needsOtaServiceProvisioning(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyOtaEmergencyNumberDbInstalled(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyUserActivity(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean); + method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback); + method public void requestModemActivityInfo(@NonNull android.os.ResultReceiver); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestNumberVerification(@NonNull android.telephony.PhoneNumberRange, long, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.NumberVerificationCallback); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetAllCarrierActions(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetCarrierKeysForImsiEncryption(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void resetIms(int); + method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void resetOtaEmergencyNumberDbFilePath(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean resetRadioConfig(); + method @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) public void resetSettings(); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setAllowedCarriers(int, java.util.List<android.service.carrier.CarrierIdentifier>); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setAllowedNetworkTypes(long); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setAlwaysAllowMmsData(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setCarrierDataEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int setCarrierRestrictionRules(@NonNull android.telephony.CarrierRestrictionRules); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataActivationState(int); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMultiSimCarrierRestriction(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setOpportunisticNetworkState(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmask(long); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadio(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRadioEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>); + method @Deprecated public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoiceActivationState(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void shutdownAllRadios(); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPin(String); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPinReportResult(String); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPuk(String, String); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff(); + method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor); + method public void updateServiceLocation(); + field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED"; + field public static final String ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE = "com.android.internal.telephony.CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE"; + field public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE = "com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE"; + field public static final String ACTION_CARRIER_SIGNAL_REDIRECTED = "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED"; + field public static final String ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED = "com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED"; + field public static final String ACTION_CARRIER_SIGNAL_RESET = "com.android.internal.telephony.CARRIER_SIGNAL_RESET"; + field public static final String ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED"; + field public static final String ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED"; + field public static final String ACTION_EMERGENCY_ASSISTANCE = "android.telephony.action.EMERGENCY_ASSISTANCE"; + field public static final String ACTION_EMERGENCY_CALLBACK_MODE_CHANGED = "android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED"; + field public static final String ACTION_EMERGENCY_CALL_STATE_CHANGED = "android.intent.action.EMERGENCY_CALL_STATE_CHANGED"; + field public static final String ACTION_REQUEST_OMADM_CONFIGURATION_UPDATE = "com.android.omadm.service.CONFIGURATION_UPDATE"; + field public static final String ACTION_SERVICE_PROVIDERS_UPDATED = "android.telephony.action.SERVICE_PROVIDERS_UPDATED"; + field public static final String ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS = "android.telephony.action.SHOW_NOTICE_ECM_BLOCK_OTHERS"; + field public static final String ACTION_SIM_APPLICATION_STATE_CHANGED = "android.telephony.action.SIM_APPLICATION_STATE_CHANGED"; + field public static final String ACTION_SIM_CARD_STATE_CHANGED = "android.telephony.action.SIM_CARD_STATE_CHANGED"; + field public static final String ACTION_SIM_SLOT_STATUS_CHANGED = "android.telephony.action.SIM_SLOT_STATUS_CHANGED"; + field public static final int CARD_POWER_DOWN = 0; // 0x0 + field public static final int CARD_POWER_UP = 1; // 0x1 + field public static final int CARD_POWER_UP_PASS_THROUGH = 2; // 0x2 + field public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; // 0xfffffffe + field public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; // 0x1 + field public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; // 0x0 + field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff + field public static final String EXTRA_ANOMALY_DESCRIPTION = "android.telephony.extra.ANOMALY_DESCRIPTION"; + field public static final String EXTRA_ANOMALY_ID = "android.telephony.extra.ANOMALY_ID"; + field @Deprecated public static final String EXTRA_APN_PROTOCOL = "apnProto"; + field public static final String EXTRA_APN_PROTOCOL_INT = "apnProtoInt"; + field @Deprecated public static final String EXTRA_APN_TYPE = "apnType"; + field public static final String EXTRA_APN_TYPE_INT = "apnTypeInt"; + field public static final String EXTRA_DATA_SPN = "android.telephony.extra.DATA_SPN"; + field public static final String EXTRA_DEFAULT_NETWORK_AVAILABLE = "defaultNetworkAvailable"; + field public static final String EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE = "android.telephony.extra.DEFAULT_SUBSCRIPTION_SELECT_TYPE"; + field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL = 4; // 0x4 + field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA = 1; // 0x1 + field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_NONE = 0; // 0x0 + field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_SMS = 3; // 0x3 + field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_VOICE = 2; // 0x2 + field public static final String EXTRA_ERROR_CODE = "errorCode"; + field public static final String EXTRA_PCO_ID = "pcoId"; + field public static final String EXTRA_PCO_VALUE = "pcoValue"; + field public static final String EXTRA_PHONE_IN_ECM_STATE = "android.telephony.extra.PHONE_IN_ECM_STATE"; + field public static final String EXTRA_PHONE_IN_EMERGENCY_CALL = "android.telephony.extra.PHONE_IN_EMERGENCY_CALL"; + field public static final String EXTRA_PLMN = "android.telephony.extra.PLMN"; + field public static final String EXTRA_REDIRECTION_URL = "redirectionUrl"; + field public static final String EXTRA_SHOW_PLMN = "android.telephony.extra.SHOW_PLMN"; + field public static final String EXTRA_SHOW_SPN = "android.telephony.extra.SHOW_SPN"; + field public static final String EXTRA_SIM_COMBINATION_NAMES = "android.telephony.extra.SIM_COMBINATION_NAMES"; + field public static final String EXTRA_SIM_COMBINATION_WARNING_TYPE = "android.telephony.extra.SIM_COMBINATION_WARNING_TYPE"; + field public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA = 1; // 0x1 + field public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_NONE = 0; // 0x0 + field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE"; + field public static final String EXTRA_SPN = "android.telephony.extra.SPN"; + field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL"; + field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING"; + field public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; // 0xffffffff + field public static final int KEY_TYPE_EPDG = 1; // 0x1 + field public static final int KEY_TYPE_WLAN = 2; // 0x2 + field public static final String MODEM_ACTIVITY_RESULT_KEY = "controller_activity"; + field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L + field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L + field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L + field public static final long NETWORK_TYPE_BITMASK_EHRPD = 8192L; // 0x2000L + field public static final long NETWORK_TYPE_BITMASK_EVDO_0 = 16L; // 0x10L + field public static final long NETWORK_TYPE_BITMASK_EVDO_A = 32L; // 0x20L + field public static final long NETWORK_TYPE_BITMASK_EVDO_B = 2048L; // 0x800L + field public static final long NETWORK_TYPE_BITMASK_GPRS = 1L; // 0x1L + field public static final long NETWORK_TYPE_BITMASK_GSM = 32768L; // 0x8000L + field public static final long NETWORK_TYPE_BITMASK_HSDPA = 128L; // 0x80L + field public static final long NETWORK_TYPE_BITMASK_HSPA = 512L; // 0x200L + field public static final long NETWORK_TYPE_BITMASK_HSPAP = 16384L; // 0x4000L + field public static final long NETWORK_TYPE_BITMASK_HSUPA = 256L; // 0x100L + field public static final long NETWORK_TYPE_BITMASK_IWLAN = 131072L; // 0x20000L + field public static final long NETWORK_TYPE_BITMASK_LTE = 4096L; // 0x1000L + field public static final long NETWORK_TYPE_BITMASK_LTE_CA = 262144L; // 0x40000L + field public static final long NETWORK_TYPE_BITMASK_NR = 524288L; // 0x80000L + field public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = 65536L; // 0x10000L + field public static final long NETWORK_TYPE_BITMASK_UMTS = 4L; // 0x4L + field public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L; // 0x0L + field public static final int RADIO_POWER_OFF = 0; // 0x0 + field public static final int RADIO_POWER_ON = 1; // 0x1 + field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2 + field public static final int SET_CARRIER_RESTRICTION_ERROR = 2; // 0x2 + field public static final int SET_CARRIER_RESTRICTION_NOT_SUPPORTED = 1; // 0x1 + field public static final int SET_CARRIER_RESTRICTION_SUCCESS = 0; // 0x0 + field public static final int SIM_ACTIVATION_STATE_ACTIVATED = 2; // 0x2 + field public static final int SIM_ACTIVATION_STATE_ACTIVATING = 1; // 0x1 + field public static final int SIM_ACTIVATION_STATE_DEACTIVATED = 3; // 0x3 + field public static final int SIM_ACTIVATION_STATE_RESTRICTED = 4; // 0x4 + field public static final int SIM_ACTIVATION_STATE_UNKNOWN = 0; // 0x0 + field public static final int SIM_STATE_LOADED = 10; // 0xa + field public static final int SIM_STATE_PRESENT = 11; // 0xb + field public static final int SRVCC_STATE_HANDOVER_CANCELED = 3; // 0x3 + field public static final int SRVCC_STATE_HANDOVER_COMPLETED = 1; // 0x1 + field public static final int SRVCC_STATE_HANDOVER_FAILED = 2; // 0x2 + field public static final int SRVCC_STATE_HANDOVER_NONE = -1; // 0xffffffff + field public static final int SRVCC_STATE_HANDOVER_STARTED = 0; // 0x0 + } + + public final class UiccAccessRule implements android.os.Parcelable { + ctor public UiccAccessRule(byte[], @Nullable String, long); + method public int describeContents(); + method public int getCarrierPrivilegeStatus(android.content.pm.PackageInfo); + method public int getCarrierPrivilegeStatus(android.content.pm.Signature, String); + method public String getCertificateHexString(); + method @Nullable public String getPackageName(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccAccessRule> CREATOR; + } + + public class UiccSlotInfo implements android.os.Parcelable { + ctor @Deprecated public UiccSlotInfo(boolean, boolean, String, int, int, boolean); + method public int describeContents(); + method public String getCardId(); + method public int getCardStateInfo(); + method public boolean getIsActive(); + method public boolean getIsEuicc(); + method public boolean getIsExtendedApduSupported(); + method public int getLogicalSlotIdx(); + method public boolean isRemovable(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CARD_STATE_INFO_ABSENT = 1; // 0x1 + field public static final int CARD_STATE_INFO_ERROR = 3; // 0x3 + field public static final int CARD_STATE_INFO_PRESENT = 2; // 0x2 + field public static final int CARD_STATE_INFO_RESTRICTED = 4; // 0x4 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccSlotInfo> CREATOR; + } + + public abstract class VisualVoicemailService extends android.app.Service { + method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, String, short, String, android.app.PendingIntent); + method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings); + } + +} + +package android.telephony.cdma { + + public final class CdmaSmsCbProgramData implements android.os.Parcelable { + method public int describeContents(); + method public int getCategory(); + method public int getOperation(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY = 4099; // 0x1003 + field public static final int CATEGORY_CMAS_EXTREME_THREAT = 4097; // 0x1001 + field public static final int CATEGORY_CMAS_LAST_RESERVED_VALUE = 4351; // 0x10ff + field public static final int CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT = 4096; // 0x1000 + field public static final int CATEGORY_CMAS_SEVERE_THREAT = 4098; // 0x1002 + field public static final int CATEGORY_CMAS_TEST_MESSAGE = 4100; // 0x1004 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.cdma.CdmaSmsCbProgramData> CREATOR; + field public static final int OPERATION_ADD_CATEGORY = 1; // 0x1 + field public static final int OPERATION_CLEAR_CATEGORIES = 2; // 0x2 + field public static final int OPERATION_DELETE_CATEGORY = 0; // 0x0 + } + +} + +package android.telephony.data { + + public final class DataCallResponse implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public java.util.List<android.net.LinkAddress> getAddresses(); + method public int getCause(); + method @NonNull public java.util.List<java.net.InetAddress> getDnsAddresses(); + method @NonNull public java.util.List<java.net.InetAddress> getGatewayAddresses(); + method public int getId(); + method @NonNull public String getInterfaceName(); + method public int getLinkStatus(); + method @Deprecated public int getMtu(); + method public int getMtuV4(); + method public int getMtuV6(); + method @NonNull public java.util.List<java.net.InetAddress> getPcscfAddresses(); + method public int getProtocolType(); + method public int getSuggestedRetryTime(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR; + field public static final int LINK_STATUS_ACTIVE = 2; // 0x2 + field public static final int LINK_STATUS_DORMANT = 1; // 0x1 + field public static final int LINK_STATUS_INACTIVE = 0; // 0x0 + field public static final int LINK_STATUS_UNKNOWN = -1; // 0xffffffff + } + + public static final class DataCallResponse.Builder { + ctor public DataCallResponse.Builder(); + method @NonNull public android.telephony.data.DataCallResponse build(); + method @NonNull public android.telephony.data.DataCallResponse.Builder setAddresses(@NonNull java.util.List<android.net.LinkAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setCause(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setDnsAddresses(@NonNull java.util.List<java.net.InetAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setGatewayAddresses(@NonNull java.util.List<java.net.InetAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setId(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setInterfaceName(@NonNull String); + method @NonNull public android.telephony.data.DataCallResponse.Builder setLinkStatus(int); + method @Deprecated @NonNull public android.telephony.data.DataCallResponse.Builder setMtu(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setMtuV4(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setMtuV6(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setPcscfAddresses(@NonNull java.util.List<java.net.InetAddress>); + method @NonNull public android.telephony.data.DataCallResponse.Builder setProtocolType(int); + method @NonNull public android.telephony.data.DataCallResponse.Builder setSuggestedRetryTime(int); + } + + public final class DataProfile implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public String getApn(); + method public int getAuthType(); + method public int getBearerBitmask(); + method @Deprecated public int getMtu(); + method public int getMtuV4(); + method public int getMtuV6(); + method @Nullable public String getPassword(); + method public int getProfileId(); + method public int getProtocolType(); + method public int getRoamingProtocolType(); + method public int getSupportedApnTypesBitmask(); + method public int getType(); + method @Nullable public String getUserName(); + method public boolean isEnabled(); + method public boolean isPersistent(); + method public boolean isPreferred(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataProfile> CREATOR; + field public static final int TYPE_3GPP = 1; // 0x1 + field public static final int TYPE_3GPP2 = 2; // 0x2 + field public static final int TYPE_COMMON = 0; // 0x0 + } + + public static final class DataProfile.Builder { + ctor public DataProfile.Builder(); + method @NonNull public android.telephony.data.DataProfile build(); + method @NonNull public android.telephony.data.DataProfile.Builder enable(boolean); + method @NonNull public android.telephony.data.DataProfile.Builder setApn(@NonNull String); + method @NonNull public android.telephony.data.DataProfile.Builder setAuthType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setBearerBitmask(int); + method @Deprecated @NonNull public android.telephony.data.DataProfile.Builder setMtu(int); + method @NonNull public android.telephony.data.DataProfile.Builder setMtuV4(int); + method @NonNull public android.telephony.data.DataProfile.Builder setMtuV6(int); + method @NonNull public android.telephony.data.DataProfile.Builder setPassword(@NonNull String); + method @NonNull public android.telephony.data.DataProfile.Builder setPersistent(boolean); + method @NonNull public android.telephony.data.DataProfile.Builder setPreferred(boolean); + method @NonNull public android.telephony.data.DataProfile.Builder setProfileId(int); + method @NonNull public android.telephony.data.DataProfile.Builder setProtocolType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setRoamingProtocolType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setSupportedApnTypesBitmask(int); + method @NonNull public android.telephony.data.DataProfile.Builder setType(int); + method @NonNull public android.telephony.data.DataProfile.Builder setUserName(@NonNull String); + } + + public abstract class DataService extends android.app.Service { + ctor public DataService(); + method public android.os.IBinder onBind(android.content.Intent); + method @Nullable public abstract android.telephony.data.DataService.DataServiceProvider onCreateDataServiceProvider(int); + field public static final int REQUEST_REASON_HANDOVER = 3; // 0x3 + field public static final int REQUEST_REASON_NORMAL = 1; // 0x1 + field public static final int REQUEST_REASON_SHUTDOWN = 2; // 0x2 + field public static final int REQUEST_REASON_UNKNOWN = 0; // 0x0 + field public static final String SERVICE_INTERFACE = "android.telephony.data.DataService"; + } + + public abstract class DataService.DataServiceProvider implements java.lang.AutoCloseable { + ctor public DataService.DataServiceProvider(int); + method public abstract void close(); + method public void deactivateDataCall(int, int, @Nullable android.telephony.data.DataServiceCallback); + method public final int getSlotIndex(); + method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>); + method public void requestDataCallList(@NonNull android.telephony.data.DataServiceCallback); + method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @NonNull android.telephony.data.DataServiceCallback); + method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @NonNull android.telephony.data.DataServiceCallback); + method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @NonNull android.telephony.data.DataServiceCallback); + } + + public class DataServiceCallback { + method public void onDataCallListChanged(@NonNull java.util.List<android.telephony.data.DataCallResponse>); + method public void onDeactivateDataCallComplete(int); + method public void onRequestDataCallListComplete(int, @NonNull java.util.List<android.telephony.data.DataCallResponse>); + method public void onSetDataProfileComplete(int); + method public void onSetInitialAttachApnComplete(int); + method public void onSetupDataCallComplete(int, @Nullable android.telephony.data.DataCallResponse); + field public static final int RESULT_ERROR_BUSY = 3; // 0x3 + field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4 + field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2 + field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1 + field public static final int RESULT_SUCCESS = 0; // 0x0 + } + + public abstract class QualifiedNetworksService extends android.app.Service { + ctor public QualifiedNetworksService(); + method @NonNull public abstract android.telephony.data.QualifiedNetworksService.NetworkAvailabilityProvider onCreateNetworkAvailabilityProvider(int); + field public static final String QUALIFIED_NETWORKS_SERVICE_INTERFACE = "android.telephony.data.QualifiedNetworksService"; + } + + public abstract class QualifiedNetworksService.NetworkAvailabilityProvider implements java.lang.AutoCloseable { + ctor public QualifiedNetworksService.NetworkAvailabilityProvider(int); + method public abstract void close(); + method public final int getSlotIndex(); + method public final void updateQualifiedNetworkTypes(int, @NonNull java.util.List<java.lang.Integer>); + } + +} + +package android.telephony.euicc { + + public final class DownloadableSubscription implements android.os.Parcelable { + method public java.util.List<android.telephony.UiccAccessRule> getAccessRules(); + method @Nullable public String getCarrierName(); + } + + public static final class DownloadableSubscription.Builder { + ctor public DownloadableSubscription.Builder(); + ctor public DownloadableSubscription.Builder(android.telephony.euicc.DownloadableSubscription); + method public android.telephony.euicc.DownloadableSubscription build(); + method public android.telephony.euicc.DownloadableSubscription.Builder setAccessRules(java.util.List<android.telephony.UiccAccessRule>); + method public android.telephony.euicc.DownloadableSubscription.Builder setCarrierName(String); + method public android.telephony.euicc.DownloadableSubscription.Builder setConfirmationCode(String); + method public android.telephony.euicc.DownloadableSubscription.Builder setEncodedActivationCode(String); + } + + public class EuiccCardManager { + method public void authenticateServer(String, String, byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>); + method public void cancelSession(String, byte[], @android.telephony.euicc.EuiccCardManager.CancelReason int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>); + method public void deleteProfile(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>); + method public void disableProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>); + method public void listNotifications(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>); + method public void loadBoundProfilePackage(String, byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>); + method public void prepareDownload(String, @Nullable byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>); + method public void removeNotificationFromList(String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>); + method public void requestAllProfiles(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo[]>); + method public void requestDefaultSmdpAddress(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>); + method public void requestEuiccChallenge(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>); + method public void requestEuiccInfo1(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>); + method public void requestEuiccInfo2(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>); + method public void requestProfile(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>); + method public void requestRulesAuthTable(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccRulesAuthTable>); + method public void requestSmdsAddress(String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.String>); + method public void resetMemory(String, @android.telephony.euicc.EuiccCardManager.ResetOption int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>); + method public void retrieveNotification(String, int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification>); + method public void retrieveNotificationList(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>); + method public void setDefaultSmdpAddress(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>); + method public void setNickname(String, String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>); + method public void switchToProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>); + field public static final int CANCEL_REASON_END_USER_REJECTED = 0; // 0x0 + field public static final int CANCEL_REASON_POSTPONED = 1; // 0x1 + field public static final int CANCEL_REASON_PPR_NOT_ALLOWED = 3; // 0x3 + field public static final int CANCEL_REASON_TIMEOUT = 2; // 0x2 + field public static final int RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES = 2; // 0x2 + field public static final int RESET_OPTION_DELETE_OPERATIONAL_PROFILES = 1; // 0x1 + field public static final int RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS = 4; // 0x4 + field public static final int RESULT_CALLER_NOT_ALLOWED = -3; // 0xfffffffd + field public static final int RESULT_EUICC_NOT_FOUND = -2; // 0xfffffffe + field public static final int RESULT_OK = 0; // 0x0 + field public static final int RESULT_UNKNOWN_ERROR = -1; // 0xffffffff + } + + @IntDef(prefix={"CANCEL_REASON_"}, value={android.telephony.euicc.EuiccCardManager.CANCEL_REASON_END_USER_REJECTED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_POSTPONED, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_TIMEOUT, android.telephony.euicc.EuiccCardManager.CANCEL_REASON_PPR_NOT_ALLOWED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccCardManager.CancelReason { + } + + @IntDef(flag=true, prefix={"RESET_OPTION_"}, value={android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES, android.telephony.euicc.EuiccCardManager.RESET_OPTION_RESET_DEFAULT_SMDP_ADDRESS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccCardManager.ResetOption { + } + + public static interface EuiccCardManager.ResultCallback<T> { + method public void onComplete(int, T); + } + + public class EuiccManager { + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void continueOperation(android.content.Intent, android.os.Bundle); + method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void eraseSubscriptions(@NonNull android.app.PendingIntent); + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void eraseSubscriptions(@android.telephony.euicc.EuiccCardManager.ResetOption int, @NonNull android.app.PendingIntent); + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void getDefaultDownloadableSubscriptionList(android.app.PendingIntent); + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void getDownloadableSubscriptionMetadata(android.telephony.euicc.DownloadableSubscription, android.app.PendingIntent); + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public int getOtaStatus(); + method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public java.util.List<java.lang.String> getSupportedCountries(); + method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public java.util.List<java.lang.String> getUnsupportedCountries(); + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public boolean isSupportedCountry(@NonNull String); + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setSupportedCountries(@NonNull java.util.List<java.lang.String>); + method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setUnsupportedCountries(@NonNull java.util.List<java.lang.String>); + field public static final String ACTION_DELETE_SUBSCRIPTION_PRIVILEGED = "android.telephony.euicc.action.DELETE_SUBSCRIPTION_PRIVILEGED"; + field @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public static final String ACTION_OTA_STATUS_CHANGED = "android.telephony.euicc.action.OTA_STATUS_CHANGED"; + field public static final String ACTION_PROVISION_EMBEDDED_SUBSCRIPTION = "android.telephony.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION"; + field public static final String ACTION_RENAME_SUBSCRIPTION_PRIVILEGED = "android.telephony.euicc.action.RENAME_SUBSCRIPTION_PRIVILEGED"; + field public static final String ACTION_TOGGLE_SUBSCRIPTION_PRIVILEGED = "android.telephony.euicc.action.TOGGLE_SUBSCRIPTION_PRIVILEGED"; + field public static final int EUICC_ACTIVATION_TYPE_ACCOUNT_REQUIRED = 4; // 0x4 + field public static final int EUICC_ACTIVATION_TYPE_BACKUP = 2; // 0x2 + field public static final int EUICC_ACTIVATION_TYPE_DEFAULT = 1; // 0x1 + field public static final int EUICC_ACTIVATION_TYPE_TRANSFER = 3; // 0x3 + field public static final int EUICC_OTA_FAILED = 2; // 0x2 + field public static final int EUICC_OTA_IN_PROGRESS = 1; // 0x1 + field public static final int EUICC_OTA_NOT_NEEDED = 4; // 0x4 + field public static final int EUICC_OTA_STATUS_UNAVAILABLE = 5; // 0x5 + field public static final int EUICC_OTA_SUCCEEDED = 3; // 0x3 + field public static final String EXTRA_ACTIVATION_TYPE = "android.telephony.euicc.extra.ACTIVATION_TYPE"; + field public static final String EXTRA_EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS = "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_DOWNLOADABLE_SUBSCRIPTIONS"; + field public static final String EXTRA_ENABLE_SUBSCRIPTION = "android.telephony.euicc.extra.ENABLE_SUBSCRIPTION"; + field public static final String EXTRA_FORCE_PROVISION = "android.telephony.euicc.extra.FORCE_PROVISION"; + field public static final String EXTRA_FROM_SUBSCRIPTION_ID = "android.telephony.euicc.extra.FROM_SUBSCRIPTION_ID"; + field public static final String EXTRA_PHYSICAL_SLOT_ID = "android.telephony.euicc.extra.PHYSICAL_SLOT_ID"; + field public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.euicc.extra.SUBSCRIPTION_ID"; + field public static final String EXTRA_SUBSCRIPTION_NICKNAME = "android.telephony.euicc.extra.SUBSCRIPTION_NICKNAME"; + } + + @IntDef(prefix={"EUICC_OTA_"}, value={android.telephony.euicc.EuiccManager.EUICC_OTA_IN_PROGRESS, android.telephony.euicc.EuiccManager.EUICC_OTA_FAILED, android.telephony.euicc.EuiccManager.EUICC_OTA_SUCCEEDED, android.telephony.euicc.EuiccManager.EUICC_OTA_NOT_NEEDED, android.telephony.euicc.EuiccManager.EUICC_OTA_STATUS_UNAVAILABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccManager.OtaStatus { + } + + public final class EuiccNotification implements android.os.Parcelable { + ctor public EuiccNotification(int, String, @android.telephony.euicc.EuiccNotification.Event int, @Nullable byte[]); + method public int describeContents(); + method @Nullable public byte[] getData(); + method @android.telephony.euicc.EuiccNotification.Event public int getEvent(); + method public int getSeq(); + method public String getTargetAddr(); + method public void writeToParcel(android.os.Parcel, int); + field @android.telephony.euicc.EuiccNotification.Event public static final int ALL_EVENTS = 15; // 0xf + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.euicc.EuiccNotification> CREATOR; + field public static final int EVENT_DELETE = 8; // 0x8 + field public static final int EVENT_DISABLE = 4; // 0x4 + field public static final int EVENT_ENABLE = 2; // 0x2 + field public static final int EVENT_INSTALL = 1; // 0x1 + } + + @IntDef(flag=true, prefix={"EVENT_"}, value={android.telephony.euicc.EuiccNotification.EVENT_INSTALL, android.telephony.euicc.EuiccNotification.EVENT_ENABLE, android.telephony.euicc.EuiccNotification.EVENT_DISABLE, android.telephony.euicc.EuiccNotification.EVENT_DELETE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccNotification.Event { + } + + public final class EuiccRulesAuthTable implements android.os.Parcelable { + method public int describeContents(); + method public int findIndex(@android.service.euicc.EuiccProfileInfo.PolicyRule int, android.service.carrier.CarrierIdentifier); + method public boolean hasPolicyRuleFlag(int, @android.telephony.euicc.EuiccRulesAuthTable.PolicyRuleFlag int); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.euicc.EuiccRulesAuthTable> CREATOR; + field public static final int POLICY_RULE_FLAG_CONSENT_REQUIRED = 1; // 0x1 + } + + public static final class EuiccRulesAuthTable.Builder { + ctor public EuiccRulesAuthTable.Builder(int); + method public android.telephony.euicc.EuiccRulesAuthTable.Builder add(int, java.util.List<android.service.carrier.CarrierIdentifier>, int); + method public android.telephony.euicc.EuiccRulesAuthTable build(); + } + + @IntDef(flag=true, prefix={"POLICY_RULE_FLAG_"}, value={android.telephony.euicc.EuiccRulesAuthTable.POLICY_RULE_FLAG_CONSENT_REQUIRED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface EuiccRulesAuthTable.PolicyRuleFlag { + } + +} + +package android.telephony.ims { + + public final class ImsCallForwardInfo implements android.os.Parcelable { + ctor public ImsCallForwardInfo(int, int, int, int, @NonNull String, int); + method public int describeContents(); + method public int getCondition(); + method public String getNumber(); + method public int getServiceClass(); + method public int getStatus(); + method public int getTimeSeconds(); + method public int getToA(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CDIV_CF_REASON_ALL = 4; // 0x4 + field public static final int CDIV_CF_REASON_ALL_CONDITIONAL = 5; // 0x5 + field public static final int CDIV_CF_REASON_BUSY = 1; // 0x1 + field public static final int CDIV_CF_REASON_NOT_LOGGED_IN = 6; // 0x6 + field public static final int CDIV_CF_REASON_NOT_REACHABLE = 3; // 0x3 + field public static final int CDIV_CF_REASON_NO_REPLY = 2; // 0x2 + field public static final int CDIV_CF_REASON_UNCONDITIONAL = 0; // 0x0 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallForwardInfo> CREATOR; + field public static final int STATUS_ACTIVE = 1; // 0x1 + field public static final int STATUS_NOT_ACTIVE = 0; // 0x0 + field public static final int TYPE_OF_ADDRESS_INTERNATIONAL = 145; // 0x91 + field public static final int TYPE_OF_ADDRESS_UNKNOWN = 129; // 0x81 + } + + public final class ImsCallProfile implements android.os.Parcelable { + ctor public ImsCallProfile(); + ctor public ImsCallProfile(int, int); + ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); + method public int describeContents(); + method public String getCallExtra(String); + method public String getCallExtra(String, String); + method public boolean getCallExtraBoolean(String); + method public boolean getCallExtraBoolean(String, boolean); + method public int getCallExtraInt(String); + method public int getCallExtraInt(String, int); + method public android.os.Bundle getCallExtras(); + method public int getCallType(); + method public static int getCallTypeFromVideoState(int); + method public int getCallerNumberVerificationStatus(); + method public int getEmergencyCallRouting(); + method public int getEmergencyServiceCategories(); + method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); + method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); + method @NonNull public android.os.Bundle getProprietaryCallExtras(); + method public int getRestrictCause(); + method public int getServiceType(); + method public static int getVideoStateFromCallType(int); + method public static int getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile); + method public boolean hasKnownUserIntentEmergency(); + method public boolean isEmergencyCallTesting(); + method public boolean isVideoCall(); + method public boolean isVideoPaused(); + method public static int presentationToOir(int); + method public void setCallExtra(String, String); + method public void setCallExtraBoolean(String, boolean); + method public void setCallExtraInt(String, int); + method public void setCallRestrictCause(int); + method public void setCallerNumberVerificationStatus(int); + method public void setEmergencyCallRouting(int); + method public void setEmergencyCallTesting(boolean); + method public void setEmergencyServiceCategories(int); + method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); + method public void setHasKnownUserIntentEmergency(boolean); + method public void updateCallExtras(android.telephony.ims.ImsCallProfile); + method public void updateCallType(android.telephony.ims.ImsCallProfile); + method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CALL_RESTRICT_CAUSE_DISABLED = 2; // 0x2 + field public static final int CALL_RESTRICT_CAUSE_HD = 3; // 0x3 + field public static final int CALL_RESTRICT_CAUSE_NONE = 0; // 0x0 + field public static final int CALL_RESTRICT_CAUSE_RAT = 1; // 0x1 + field public static final int CALL_TYPE_VIDEO_N_VOICE = 3; // 0x3 + field public static final int CALL_TYPE_VOICE = 2; // 0x2 + field public static final int CALL_TYPE_VOICE_N_VIDEO = 1; // 0x1 + field public static final int CALL_TYPE_VS = 8; // 0x8 + field public static final int CALL_TYPE_VS_RX = 10; // 0xa + field public static final int CALL_TYPE_VS_TX = 9; // 0x9 + field public static final int CALL_TYPE_VT = 4; // 0x4 + field public static final int CALL_TYPE_VT_NODIR = 7; // 0x7 + field public static final int CALL_TYPE_VT_RX = 6; // 0x6 + field public static final int CALL_TYPE_VT_TX = 5; // 0x5 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallProfile> CREATOR; + field public static final int DIALSTRING_NORMAL = 0; // 0x0 + field public static final int DIALSTRING_SS_CONF = 1; // 0x1 + field public static final int DIALSTRING_USSD = 2; // 0x2 + field public static final String EXTRA_ADDITIONAL_CALL_INFO = "AdditionalCallInfo"; + field public static final String EXTRA_ADDITIONAL_SIP_INVITE_FIELDS = "android.telephony.ims.extra.ADDITIONAL_SIP_INVITE_FIELDS"; + field public static final String EXTRA_CALL_DISCONNECT_CAUSE = "android.telephony.ims.extra.CALL_DISCONNECT_CAUSE"; + field public static final String EXTRA_CALL_NETWORK_TYPE = "android.telephony.ims.extra.CALL_NETWORK_TYPE"; + field @Deprecated public static final String EXTRA_CALL_RAT_TYPE = "CallRadioTech"; + field public static final String EXTRA_CHILD_NUMBER = "ChildNum"; + field public static final String EXTRA_CNA = "cna"; + field public static final String EXTRA_CNAP = "cnap"; + field public static final String EXTRA_CODEC = "Codec"; + field public static final String EXTRA_DIALSTRING = "dialstring"; + field public static final String EXTRA_DISPLAY_TEXT = "DisplayText"; + field public static final String EXTRA_EMERGENCY_CALL = "e_call"; + field public static final String EXTRA_FORWARDED_NUMBER = "android.telephony.ims.extra.FORWARDED_NUMBER"; + field public static final String EXTRA_IS_CALL_PULL = "CallPull"; + field public static final String EXTRA_OI = "oi"; + field public static final String EXTRA_OIR = "oir"; + field public static final String EXTRA_REMOTE_URI = "remote_uri"; + field public static final String EXTRA_USSD = "ussd"; + field public static final int OIR_DEFAULT = 0; // 0x0 + field public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2; // 0x2 + field public static final int OIR_PRESENTATION_PAYPHONE = 4; // 0x4 + field public static final int OIR_PRESENTATION_RESTRICTED = 1; // 0x1 + field public static final int OIR_PRESENTATION_UNKNOWN = 3; // 0x3 + field public static final int SERVICE_TYPE_EMERGENCY = 2; // 0x2 + field public static final int SERVICE_TYPE_NONE = 0; // 0x0 + field public static final int SERVICE_TYPE_NORMAL = 1; // 0x1 + field public static final int VERIFICATION_STATUS_FAILED = 2; // 0x2 + field public static final int VERIFICATION_STATUS_NOT_VERIFIED = 0; // 0x0 + field public static final int VERIFICATION_STATUS_PASSED = 1; // 0x1 + } + + public class ImsCallSessionListener { + method public void callQualityChanged(@NonNull android.telephony.CallQuality); + method public void callSessionConferenceExtendFailed(android.telephony.ims.ImsReasonInfo); + method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); + method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); + method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); + method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); + method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); + method public void callSessionHeld(android.telephony.ims.ImsCallProfile); + method public void callSessionHoldFailed(android.telephony.ims.ImsReasonInfo); + method public void callSessionHoldReceived(android.telephony.ims.ImsCallProfile); + method public void callSessionInitiated(android.telephony.ims.ImsCallProfile); + method public void callSessionInitiatedFailed(android.telephony.ims.ImsReasonInfo); + method public void callSessionInviteParticipantsRequestDelivered(); + method public void callSessionInviteParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo); + method @Deprecated public void callSessionMayHandover(int, int); + method public void callSessionMergeComplete(android.telephony.ims.stub.ImsCallSessionImplBase); + method public void callSessionMergeFailed(android.telephony.ims.ImsReasonInfo); + method public void callSessionMergeStarted(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); + method public void callSessionMultipartyStateChanged(boolean); + method public void callSessionProgressing(android.telephony.ims.ImsStreamMediaProfile); + method public void callSessionRemoveParticipantsRequestDelivered(); + method public void callSessionRemoveParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo); + method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); + method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); + method public void callSessionResumed(android.telephony.ims.ImsCallProfile); + method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); + method public void callSessionRttMessageReceived(String); + method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); + method public void callSessionRttModifyResponseReceived(int); + method public void callSessionSuppServiceReceived(android.telephony.ims.ImsSuppServiceNotification); + method public void callSessionTerminated(android.telephony.ims.ImsReasonInfo); + method public void callSessionTtyModeReceived(int); + method public void callSessionUpdateFailed(android.telephony.ims.ImsReasonInfo); + method public void callSessionUpdateReceived(android.telephony.ims.ImsCallProfile); + method public void callSessionUpdated(android.telephony.ims.ImsCallProfile); + method public void callSessionUssdMessageReceived(int, String); + method public void onHandover(int, int, @Nullable android.telephony.ims.ImsReasonInfo); + method public void onHandoverFailed(int, int, @NonNull android.telephony.ims.ImsReasonInfo); + method public void onMayHandover(int, int); + } + + public final class ImsConferenceState implements android.os.Parcelable { + method public int describeContents(); + method public static int getConnectionStateForStatus(String); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsConferenceState> CREATOR; + field public static final String DISPLAY_TEXT = "display-text"; + field public static final String ENDPOINT = "endpoint"; + field public static final String SIP_STATUS_CODE = "sipstatuscode"; + field public static final String STATUS = "status"; + field public static final String STATUS_ALERTING = "alerting"; + field public static final String STATUS_CONNECTED = "connected"; + field public static final String STATUS_CONNECT_FAIL = "connect-fail"; + field public static final String STATUS_DIALING_IN = "dialing-in"; + field public static final String STATUS_DIALING_OUT = "dialing-out"; + field public static final String STATUS_DISCONNECTED = "disconnected"; + field public static final String STATUS_DISCONNECTING = "disconnecting"; + field public static final String STATUS_MUTED_VIA_FOCUS = "muted-via-focus"; + field public static final String STATUS_ON_HOLD = "on-hold"; + field public static final String STATUS_PENDING = "pending"; + field public static final String STATUS_SEND_ONLY = "sendonly"; + field public static final String STATUS_SEND_RECV = "sendrecv"; + field public static final String USER = "user"; + field public final java.util.HashMap<java.lang.String,android.os.Bundle> mParticipants; + } + + public final class ImsException extends java.lang.Exception { + ctor public ImsException(@Nullable String); + ctor public ImsException(@Nullable String, int); + ctor public ImsException(@Nullable String, int, @Nullable Throwable); + } + + public final class ImsExternalCallState implements android.os.Parcelable { + ctor public ImsExternalCallState(@NonNull String, @NonNull android.net.Uri, @Nullable android.net.Uri, boolean, int, int, boolean); + method public int describeContents(); + method @NonNull public android.net.Uri getAddress(); + method public int getCallId(); + method public int getCallState(); + method public int getCallType(); + method @Nullable public android.net.Uri getLocalAddress(); + method public boolean isCallHeld(); + method public boolean isCallPullable(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CALL_STATE_CONFIRMED = 1; // 0x1 + field public static final int CALL_STATE_TERMINATED = 2; // 0x2 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsExternalCallState> CREATOR; + } + + public class ImsMmTelManager implements android.telephony.ims.RegistrationManager { + method @Deprecated @NonNull @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException; + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoWiFiRoamingModeSetting(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(int, int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCapable(int, int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void isSupported(int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>) throws android.telephony.ims.ImsException; + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException; + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean, int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback); + } + + @Deprecated public static class ImsMmTelManager.RegistrationCallback extends android.telephony.ims.RegistrationManager.RegistrationCallback { + ctor @Deprecated public ImsMmTelManager.RegistrationCallback(); + } + + public final class ImsReasonInfo implements android.os.Parcelable { + field public static final String EXTRA_MSG_SERVICE_NOT_AUTHORIZED = "Forbidden. Not Authorized for Service"; + } + + public class ImsService extends android.app.Service { + ctor public ImsService(); + method public android.telephony.ims.feature.MmTelFeature createMmTelFeature(int); + method public android.telephony.ims.feature.RcsFeature createRcsFeature(int); + method public void disableIms(int); + method public void enableIms(int); + method public android.telephony.ims.stub.ImsConfigImplBase getConfig(int); + method public android.telephony.ims.stub.ImsRegistrationImplBase getRegistration(int); + method public final void onUpdateSupportedImsFeatures(android.telephony.ims.stub.ImsFeatureConfiguration) throws android.os.RemoteException; + method public android.telephony.ims.stub.ImsFeatureConfiguration querySupportedImsFeatures(); + method public void readyForFeatureCreation(); + } + + public final class ImsSsData implements android.os.Parcelable { + ctor public ImsSsData(int, int, int, int, int); + method public int describeContents(); + method @Nullable public java.util.List<android.telephony.ims.ImsCallForwardInfo> getCallForwardInfo(); + method public int getRequestType(); + method public int getResult(); + method public int getServiceClass(); + method public int getServiceType(); + method @NonNull public java.util.List<android.telephony.ims.ImsSsInfo> getSuppServiceInfo(); + method public int getTeleserviceType(); + method public boolean isTypeBarring(); + method public boolean isTypeCf(); + method public boolean isTypeClip(); + method public boolean isTypeClir(); + method public boolean isTypeColp(); + method public boolean isTypeColr(); + method public boolean isTypeCw(); + method public boolean isTypeIcb(); + method public boolean isTypeInterrogation(); + method public boolean isTypeUnConditional(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsData> CREATOR; + field public static final int RESULT_SUCCESS = 0; // 0x0 + field public static final int SERVICE_CLASS_DATA = 2; // 0x2 + field public static final int SERVICE_CLASS_DATA_CIRCUIT_ASYNC = 32; // 0x20 + field public static final int SERVICE_CLASS_DATA_CIRCUIT_SYNC = 16; // 0x10 + field public static final int SERVICE_CLASS_DATA_PACKET_ACCESS = 64; // 0x40 + field public static final int SERVICE_CLASS_DATA_PAD = 128; // 0x80 + field public static final int SERVICE_CLASS_FAX = 4; // 0x4 + field public static final int SERVICE_CLASS_NONE = 0; // 0x0 + field public static final int SERVICE_CLASS_SMS = 8; // 0x8 + field public static final int SERVICE_CLASS_VOICE = 1; // 0x1 + field public static final int SS_ACTIVATION = 0; // 0x0 + field public static final int SS_ALL_BARRING = 18; // 0x12 + field public static final int SS_ALL_DATA_TELESERVICES = 3; // 0x3 + field public static final int SS_ALL_TELESERVICES_EXCEPT_SMS = 5; // 0x5 + field public static final int SS_ALL_TELESEVICES = 1; // 0x1 + field public static final int SS_ALL_TELE_AND_BEARER_SERVICES = 0; // 0x0 + field public static final int SS_BAIC = 16; // 0x10 + field public static final int SS_BAIC_ROAMING = 17; // 0x11 + field public static final int SS_BAOC = 13; // 0xd + field public static final int SS_BAOIC = 14; // 0xe + field public static final int SS_BAOIC_EXC_HOME = 15; // 0xf + field public static final int SS_CFU = 0; // 0x0 + field public static final int SS_CFUT = 6; // 0x6 + field public static final int SS_CF_ALL = 4; // 0x4 + field public static final int SS_CF_ALL_CONDITIONAL = 5; // 0x5 + field public static final int SS_CF_BUSY = 1; // 0x1 + field public static final int SS_CF_NOT_REACHABLE = 3; // 0x3 + field public static final int SS_CF_NO_REPLY = 2; // 0x2 + field public static final int SS_CLIP = 7; // 0x7 + field public static final int SS_CLIR = 8; // 0x8 + field public static final int SS_CNAP = 11; // 0xb + field public static final int SS_COLP = 9; // 0x9 + field public static final int SS_COLR = 10; // 0xa + field public static final int SS_DEACTIVATION = 1; // 0x1 + field public static final int SS_ERASURE = 4; // 0x4 + field public static final int SS_INCOMING_BARRING = 20; // 0x14 + field public static final int SS_INCOMING_BARRING_ANONYMOUS = 22; // 0x16 + field public static final int SS_INCOMING_BARRING_DN = 21; // 0x15 + field public static final int SS_INTERROGATION = 2; // 0x2 + field public static final int SS_OUTGOING_BARRING = 19; // 0x13 + field public static final int SS_REGISTRATION = 3; // 0x3 + field public static final int SS_SMS_SERVICES = 4; // 0x4 + field public static final int SS_TELEPHONY = 2; // 0x2 + field public static final int SS_WAIT = 12; // 0xc + } + + public static final class ImsSsData.Builder { + ctor public ImsSsData.Builder(int, int, int, int, int); + method @NonNull public android.telephony.ims.ImsSsData build(); + method @NonNull public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(@NonNull java.util.List<android.telephony.ims.ImsCallForwardInfo>); + method @NonNull public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(@NonNull java.util.List<android.telephony.ims.ImsSsInfo>); + } + + public final class ImsSsInfo implements android.os.Parcelable { + ctor @Deprecated public ImsSsInfo(int, @Nullable String); + method public int describeContents(); + method public int getClirInterrogationStatus(); + method public int getClirOutgoingState(); + method @Deprecated public String getIcbNum(); + method @Nullable public String getIncomingCommunicationBarringNumber(); + method public int getProvisionStatus(); + method public int getStatus(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CLIR_OUTGOING_DEFAULT = 0; // 0x0 + field public static final int CLIR_OUTGOING_INVOCATION = 1; // 0x1 + field public static final int CLIR_OUTGOING_SUPPRESSION = 2; // 0x2 + field public static final int CLIR_STATUS_NOT_PROVISIONED = 0; // 0x0 + field public static final int CLIR_STATUS_PROVISIONED_PERMANENT = 1; // 0x1 + field public static final int CLIR_STATUS_TEMPORARILY_ALLOWED = 4; // 0x4 + field public static final int CLIR_STATUS_TEMPORARILY_RESTRICTED = 3; // 0x3 + field public static final int CLIR_STATUS_UNKNOWN = 2; // 0x2 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsInfo> CREATOR; + field public static final int DISABLED = 0; // 0x0 + field public static final int ENABLED = 1; // 0x1 + field public static final int NOT_REGISTERED = -1; // 0xffffffff + field public static final int SERVICE_NOT_PROVISIONED = 0; // 0x0 + field public static final int SERVICE_PROVISIONED = 1; // 0x1 + field public static final int SERVICE_PROVISIONING_UNKNOWN = -1; // 0xffffffff + } + + public static final class ImsSsInfo.Builder { + ctor public ImsSsInfo.Builder(int); + method @NonNull public android.telephony.ims.ImsSsInfo build(); + method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirInterrogationStatus(int); + method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirOutgoingState(int); + method @NonNull public android.telephony.ims.ImsSsInfo.Builder setIncomingCommunicationBarringNumber(@NonNull String); + method @NonNull public android.telephony.ims.ImsSsInfo.Builder setProvisionStatus(int); + } + + public final class ImsStreamMediaProfile implements android.os.Parcelable { + ctor public ImsStreamMediaProfile(int, int, int, int, int); + method public void copyFrom(android.telephony.ims.ImsStreamMediaProfile); + method public int describeContents(); + method public int getAudioDirection(); + method public int getAudioQuality(); + method public int getRttMode(); + method public int getVideoDirection(); + method public int getVideoQuality(); + method public boolean isReceivingRttAudio(); + method public boolean isRttCall(); + method public void setReceivingRttAudio(boolean); + method public void setRttMode(int); + method public void writeToParcel(android.os.Parcel, int); + field public static final int AUDIO_QUALITY_AMR = 1; // 0x1 + field public static final int AUDIO_QUALITY_AMR_WB = 2; // 0x2 + field public static final int AUDIO_QUALITY_EVRC = 4; // 0x4 + field public static final int AUDIO_QUALITY_EVRC_B = 5; // 0x5 + field public static final int AUDIO_QUALITY_EVRC_NW = 7; // 0x7 + field public static final int AUDIO_QUALITY_EVRC_WB = 6; // 0x6 + field public static final int AUDIO_QUALITY_EVS_FB = 20; // 0x14 + field public static final int AUDIO_QUALITY_EVS_NB = 17; // 0x11 + field public static final int AUDIO_QUALITY_EVS_SWB = 19; // 0x13 + field public static final int AUDIO_QUALITY_EVS_WB = 18; // 0x12 + field public static final int AUDIO_QUALITY_G711A = 13; // 0xd + field public static final int AUDIO_QUALITY_G711AB = 15; // 0xf + field public static final int AUDIO_QUALITY_G711U = 11; // 0xb + field public static final int AUDIO_QUALITY_G722 = 14; // 0xe + field public static final int AUDIO_QUALITY_G723 = 12; // 0xc + field public static final int AUDIO_QUALITY_G729 = 16; // 0x10 + field public static final int AUDIO_QUALITY_GSM_EFR = 8; // 0x8 + field public static final int AUDIO_QUALITY_GSM_FR = 9; // 0x9 + field public static final int AUDIO_QUALITY_GSM_HR = 10; // 0xa + field public static final int AUDIO_QUALITY_NONE = 0; // 0x0 + field public static final int AUDIO_QUALITY_QCELP13K = 3; // 0x3 + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsStreamMediaProfile> CREATOR; + field public static final int DIRECTION_INACTIVE = 0; // 0x0 + field public static final int DIRECTION_INVALID = -1; // 0xffffffff + field public static final int DIRECTION_RECEIVE = 1; // 0x1 + field public static final int DIRECTION_SEND = 2; // 0x2 + field public static final int DIRECTION_SEND_RECEIVE = 3; // 0x3 + field public static final int RTT_MODE_DISABLED = 0; // 0x0 + field public static final int RTT_MODE_FULL = 1; // 0x1 + field public static final int VIDEO_QUALITY_NONE = 0; // 0x0 + field public static final int VIDEO_QUALITY_QCIF = 1; // 0x1 + field public static final int VIDEO_QUALITY_QVGA_LANDSCAPE = 2; // 0x2 + field public static final int VIDEO_QUALITY_QVGA_PORTRAIT = 4; // 0x4 + field public static final int VIDEO_QUALITY_VGA_LANDSCAPE = 8; // 0x8 + field public static final int VIDEO_QUALITY_VGA_PORTRAIT = 16; // 0x10 + } + + public final class ImsSuppServiceNotification implements android.os.Parcelable { + ctor public ImsSuppServiceNotification(int, int, int, int, String, String[]); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSuppServiceNotification> CREATOR; + field public final int code; + field public final String[] history; + field public final int index; + field public final int notificationType; + field public final String number; + field public final int type; + } + + public class ImsUtListener { + method public void onLineIdentificationSupplementaryServiceResponse(int, @NonNull android.telephony.ims.ImsSsInfo); + method public void onSupplementaryServiceIndication(android.telephony.ims.ImsSsData); + method public void onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]); + method public void onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]); + method public void onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]); + method @Deprecated public void onUtConfigurationQueried(int, android.os.Bundle); + method public void onUtConfigurationQueryFailed(int, android.telephony.ims.ImsReasonInfo); + method public void onUtConfigurationUpdateFailed(int, android.telephony.ims.ImsReasonInfo); + method public void onUtConfigurationUpdated(int); + field @Deprecated public static final String BUNDLE_KEY_CLIR = "queryClir"; + field @Deprecated public static final String BUNDLE_KEY_SSINFO = "imsSsInfo"; + } + + public abstract class ImsVideoCallProvider { + ctor public ImsVideoCallProvider(); + method public void changeCallDataUsage(long); + method public void changeCameraCapabilities(android.telecom.VideoProfile.CameraCapabilities); + method public void changePeerDimensions(int, int); + method public void changeVideoQuality(int); + method public void handleCallSessionEvent(int); + method public abstract void onRequestCallDataUsage(); + method public abstract void onRequestCameraCapabilities(); + method public abstract void onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile); + method public abstract void onSendSessionModifyResponse(android.telecom.VideoProfile); + method public abstract void onSetCamera(String); + method public void onSetCamera(String, int); + method public abstract void onSetDeviceOrientation(int); + method public abstract void onSetDisplaySurface(android.view.Surface); + method public abstract void onSetPauseImage(android.net.Uri); + method public abstract void onSetPreviewSurface(android.view.Surface); + method public abstract void onSetZoom(float); + method public void receiveSessionModifyRequest(android.telecom.VideoProfile); + method public void receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile); + } + + public class ProvisioningManager { + method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public int getProvisioningIntValue(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(int, int); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public String getProvisioningStringValue(int); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException; + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback); + field public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; // 0x1b + field public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; // 0x1a + field public static final int PROVISIONING_VALUE_DISABLED = 0; // 0x0 + field public static final int PROVISIONING_VALUE_ENABLED = 1; // 0x1 + field public static final String STRING_QUERY_RESULT_ERROR_GENERIC = "STRING_QUERY_RESULT_ERROR_GENERIC"; + field public static final String STRING_QUERY_RESULT_ERROR_NOT_READY = "STRING_QUERY_RESULT_ERROR_NOT_READY"; + } + + public static class ProvisioningManager.Callback { + ctor public ProvisioningManager.Callback(); + method public void onProvisioningIntChanged(int, int); + method public void onProvisioningStringChanged(int, @NonNull String); + } + + public class RcsUceAdapter { + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; + } + +} + +package android.telephony.ims.feature { + + public final class CapabilityChangeRequest implements android.os.Parcelable { + method public void addCapabilitiesToDisableForTech(int, int); + method public void addCapabilitiesToEnableForTech(int, int); + method public int describeContents(); + method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToDisable(); + method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToEnable(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.feature.CapabilityChangeRequest> CREATOR; + } + + public static class CapabilityChangeRequest.CapabilityPair { + ctor public CapabilityChangeRequest.CapabilityPair(int, int); + method public int getCapability(); + method public int getRadioTech(); + } + + public abstract class ImsFeature { + ctor public ImsFeature(); + method public abstract void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); + method public int getFeatureState(); + method public final int getSlotIndex(); + method public abstract void onFeatureReady(); + method public abstract void onFeatureRemoved(); + method public final void setFeatureState(int); + field public static final int CAPABILITY_ERROR_GENERIC = -1; // 0xffffffff + field public static final int CAPABILITY_SUCCESS = 0; // 0x0 + field public static final int FEATURE_EMERGENCY_MMTEL = 0; // 0x0 + field public static final int FEATURE_MMTEL = 1; // 0x1 + field public static final int FEATURE_RCS = 2; // 0x2 + field public static final int STATE_INITIALIZING = 1; // 0x1 + field public static final int STATE_READY = 2; // 0x2 + field public static final int STATE_UNAVAILABLE = 0; // 0x0 + } + + @Deprecated public static class ImsFeature.Capabilities { + field @Deprecated protected int mCapabilities; + } + + protected static class ImsFeature.CapabilityCallbackProxy { + method public void onChangeCapabilityConfigurationError(int, int, int); + } + + public class MmTelFeature extends android.telephony.ims.feature.ImsFeature { + ctor public MmTelFeature(); + method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); + method @Nullable public android.telephony.ims.ImsCallProfile createCallProfile(int, int); + method @Nullable public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(@NonNull android.telephony.ims.ImsCallProfile); + method @NonNull public android.telephony.ims.stub.ImsEcbmImplBase getEcbm(); + method @NonNull public android.telephony.ims.stub.ImsMultiEndpointImplBase getMultiEndpoint(); + method @NonNull public android.telephony.ims.stub.ImsSmsImplBase getSmsImplementation(); + method @NonNull public android.telephony.ims.stub.ImsUtImplBase getUt(); + method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities); + method public final void notifyIncomingCall(@NonNull android.telephony.ims.stub.ImsCallSessionImplBase, @NonNull android.os.Bundle); + method public final void notifyRejectedCall(@NonNull android.telephony.ims.ImsCallProfile, @NonNull android.telephony.ims.ImsReasonInfo); + method public final void notifyVoiceMessageCountUpdate(int); + method public void onFeatureReady(); + method public void onFeatureRemoved(); + method public boolean queryCapabilityConfiguration(int, int); + method @NonNull public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus(); + method public void setUiTtyMode(int, @Nullable android.os.Message); + method public int shouldProcessCall(@NonNull String[]); + field public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL"; + field public static final String EXTRA_IS_USSD = "android.telephony.ims.feature.extra.IS_USSD"; + field public static final int PROCESS_CALL_CSFB = 1; // 0x1 + field public static final int PROCESS_CALL_IMS = 0; // 0x0 + } + + public static class MmTelFeature.MmTelCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities { + ctor public MmTelFeature.MmTelCapabilities(); + ctor @Deprecated public MmTelFeature.MmTelCapabilities(android.telephony.ims.feature.ImsFeature.Capabilities); + ctor public MmTelFeature.MmTelCapabilities(int); + method public final void addCapabilities(int); + method public final boolean isCapable(int); + method public final void removeCapabilities(int); + } + + public class RcsFeature extends android.telephony.ims.feature.ImsFeature { + ctor public RcsFeature(); + method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); + method public void onFeatureReady(); + method public void onFeatureRemoved(); + } + +} + +package android.telephony.ims.stub { + + public class ImsCallSessionImplBase implements java.lang.AutoCloseable { + ctor public ImsCallSessionImplBase(); + method public void accept(int, android.telephony.ims.ImsStreamMediaProfile); + method public void close(); + method public void deflect(String); + method public void extendToConference(String[]); + method public String getCallId(); + method public android.telephony.ims.ImsCallProfile getCallProfile(); + method public android.telephony.ims.ImsVideoCallProvider getImsVideoCallProvider(); + method public android.telephony.ims.ImsCallProfile getLocalCallProfile(); + method public String getProperty(String); + method public android.telephony.ims.ImsCallProfile getRemoteCallProfile(); + method public int getState(); + method public void hold(android.telephony.ims.ImsStreamMediaProfile); + method public void inviteParticipants(String[]); + method public boolean isInCall(); + method public boolean isMultiparty(); + method public void merge(); + method public void reject(int); + method public void removeParticipants(String[]); + method public void resume(android.telephony.ims.ImsStreamMediaProfile); + method public void sendDtmf(char, android.os.Message); + method public void sendRttMessage(String); + method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); + method public void sendRttModifyResponse(boolean); + method public void sendUssd(String); + method public void setListener(android.telephony.ims.ImsCallSessionListener); + method public void setMute(boolean); + method public void start(String, android.telephony.ims.ImsCallProfile); + method public void startConference(String[], android.telephony.ims.ImsCallProfile); + method public void startDtmf(char); + method public void stopDtmf(); + method public void terminate(int); + method public void update(int, android.telephony.ims.ImsStreamMediaProfile); + field public static final int USSD_MODE_NOTIFY = 0; // 0x0 + field public static final int USSD_MODE_REQUEST = 1; // 0x1 + } + + public static class ImsCallSessionImplBase.State { + method public static String toString(int); + field public static final int ESTABLISHED = 4; // 0x4 + field public static final int ESTABLISHING = 3; // 0x3 + field public static final int IDLE = 0; // 0x0 + field public static final int INITIATED = 1; // 0x1 + field public static final int INVALID = -1; // 0xffffffff + field public static final int NEGOTIATING = 2; // 0x2 + field public static final int REESTABLISHING = 6; // 0x6 + field public static final int RENEGOTIATING = 5; // 0x5 + field public static final int TERMINATED = 8; // 0x8 + field public static final int TERMINATING = 7; // 0x7 + } + + public class ImsConfigImplBase { + ctor public ImsConfigImplBase(); + method public int getConfigInt(int); + method public String getConfigString(int); + method public final void notifyProvisionedValueChanged(int, int); + method public final void notifyProvisionedValueChanged(int, String); + method public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); + method public int setConfig(int, int); + method public int setConfig(int, String); + field public static final int CONFIG_RESULT_FAILED = 1; // 0x1 + field public static final int CONFIG_RESULT_SUCCESS = 0; // 0x0 + field public static final int CONFIG_RESULT_UNKNOWN = -1; // 0xffffffff + } + + public class ImsEcbmImplBase { + ctor public ImsEcbmImplBase(); + method public final void enteredEcbm(); + method public void exitEmergencyCallbackMode(); + method public final void exitedEcbm(); + } + + public final class ImsFeatureConfiguration implements android.os.Parcelable { + method public int describeContents(); + method public java.util.Set<android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair> getServiceFeatures(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.stub.ImsFeatureConfiguration> CREATOR; + } + + public static class ImsFeatureConfiguration.Builder { + ctor public ImsFeatureConfiguration.Builder(); + method public android.telephony.ims.stub.ImsFeatureConfiguration.Builder addFeature(int, int); + method public android.telephony.ims.stub.ImsFeatureConfiguration build(); + } + + public static final class ImsFeatureConfiguration.FeatureSlotPair { + ctor public ImsFeatureConfiguration.FeatureSlotPair(int, int); + field public final int featureType; + field public final int slotId; + } + + public class ImsMultiEndpointImplBase { + ctor public ImsMultiEndpointImplBase(); + method public final void onImsExternalCallStateUpdate(java.util.List<android.telephony.ims.ImsExternalCallState>); + method public void requestImsExternalCallStateInfo(); + } + + public class ImsRegistrationImplBase { + ctor public ImsRegistrationImplBase(); + method public final void onDeregistered(android.telephony.ims.ImsReasonInfo); + method public final void onRegistered(int); + method public final void onRegistering(int); + method public final void onSubscriberAssociatedUriChanged(android.net.Uri[]); + method public final void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo); + field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1 + field public static final int REGISTRATION_TECH_LTE = 0; // 0x0 + field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff + } + + public class ImsSmsImplBase { + ctor public ImsSmsImplBase(); + method public void acknowledgeSms(int, @IntRange(from=0, to=65535) int, int); + method public void acknowledgeSmsReport(int, @IntRange(from=0, to=65535) int, int); + method public String getSmsFormat(); + method public void onReady(); + method @Deprecated public final void onSendSmsResult(int, @IntRange(from=0, to=65535) int, int, int) throws java.lang.RuntimeException; + method public final void onSendSmsResultError(int, @IntRange(from=0, to=65535) int, int, int, int) throws java.lang.RuntimeException; + method public final void onSendSmsResultSuccess(int, @IntRange(from=0, to=65535) int) throws java.lang.RuntimeException; + method public final void onSmsReceived(int, String, byte[]) throws java.lang.RuntimeException; + method @Deprecated public final void onSmsStatusReportReceived(int, @IntRange(from=0, to=65535) int, String, byte[]) throws java.lang.RuntimeException; + method public final void onSmsStatusReportReceived(int, String, byte[]) throws java.lang.RuntimeException; + method public void sendSms(int, @IntRange(from=0, to=65535) int, String, String, boolean, byte[]); + field public static final int DELIVER_STATUS_ERROR_GENERIC = 2; // 0x2 + field public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; // 0x3 + field public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; // 0x4 + field public static final int DELIVER_STATUS_OK = 1; // 0x1 + field public static final int RESULT_NO_NETWORK_ERROR = -1; // 0xffffffff + field public static final int SEND_STATUS_ERROR = 2; // 0x2 + field public static final int SEND_STATUS_ERROR_FALLBACK = 4; // 0x4 + field public static final int SEND_STATUS_ERROR_RETRY = 3; // 0x3 + field public static final int SEND_STATUS_OK = 1; // 0x1 + field public static final int STATUS_REPORT_STATUS_ERROR = 2; // 0x2 + field public static final int STATUS_REPORT_STATUS_OK = 1; // 0x1 + } + + public class ImsUtImplBase { + ctor public ImsUtImplBase(); + method public void close(); + method public int queryCallBarring(int); + method public int queryCallBarringForServiceClass(int, int); + method public int queryCallForward(int, String); + method public int queryCallWaiting(); + method public int queryClip(); + method public int queryClir(); + method public int queryColp(); + method public int queryColr(); + method public void setListener(android.telephony.ims.ImsUtListener); + method public int transact(android.os.Bundle); + method public int updateCallBarring(int, int, String[]); + method public int updateCallBarringForServiceClass(int, int, String[], int); + method public int updateCallForward(int, int, String, int, int); + method public int updateCallWaiting(boolean, int); + method public int updateClip(boolean); + method public int updateClir(int); + method public int updateColp(boolean); + method public int updateColr(int); + } + +} + +package android.telephony.mbms { + + public static class DownloadRequest.Builder { + method public android.telephony.mbms.DownloadRequest.Builder setServiceId(String); + } + + public final class FileInfo implements android.os.Parcelable { + ctor public FileInfo(android.net.Uri, String); + } + + public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable { + ctor public FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>); + } + + public class MbmsDownloadReceiver extends android.content.BroadcastReceiver { + field public static final int RESULT_APP_NOTIFICATION_ERROR = 6; // 0x6 + field public static final int RESULT_BAD_TEMP_FILE_ROOT = 3; // 0x3 + field public static final int RESULT_DOWNLOAD_FINALIZATION_ERROR = 4; // 0x4 + field public static final int RESULT_INVALID_ACTION = 1; // 0x1 + field public static final int RESULT_MALFORMED_INTENT = 2; // 0x2 + field public static final int RESULT_OK = 0; // 0x0 + field public static final int RESULT_TEMP_FILE_GENERATION_ERROR = 5; // 0x5 + } + + public final class StreamingServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable { + ctor public StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date); + } + + public final class UriPathPair implements android.os.Parcelable { + method public int describeContents(); + method public android.net.Uri getContentUri(); + method public android.net.Uri getFilePathUri(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.mbms.UriPathPair> CREATOR; + } + +} + +package android.telephony.mbms.vendor { + + public class MbmsDownloadServiceBase extends android.os.Binder implements android.os.IInterface { + ctor public MbmsDownloadServiceBase(); + method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; + method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; + method public android.os.IBinder asBinder(); + method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; + method public void dispose(int) throws android.os.RemoteException; + method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; + method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException; + method @NonNull public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException; + method public void onAppCallbackDied(int, int); + method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; + method public int removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; + method public int removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; + method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException; + method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; + method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; + method public int setTempFileRootDirectory(int, String) throws android.os.RemoteException; + } + + public class MbmsGroupCallServiceBase extends android.app.Service { + ctor public MbmsGroupCallServiceBase(); + method public void dispose(int) throws android.os.RemoteException; + method public int initialize(@NonNull android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException; + method public void onAppCallbackDied(int, int); + method public android.os.IBinder onBind(android.content.Intent); + method public int startGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull android.telephony.mbms.GroupCallCallback); + method public void stopGroupCall(int, long); + method public void updateGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>); + } + + public class MbmsStreamingServiceBase extends android.os.Binder implements android.os.IInterface { + ctor public MbmsStreamingServiceBase(); + method public android.os.IBinder asBinder(); + method public void dispose(int) throws android.os.RemoteException; + method @Nullable public android.net.Uri getPlaybackUri(int, String) throws android.os.RemoteException; + method public int initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) throws android.os.RemoteException; + method public void onAppCallbackDied(int, int); + method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; + method public int requestUpdateStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; + method public int startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException; + method public void stopStreaming(int, String) throws android.os.RemoteException; + } + + public class VendorUtils { + ctor public VendorUtils(); + method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, String); + field public static final String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP"; + field public static final String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL"; + field public static final String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST"; + field public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT"; + field public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI"; + field public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST"; + field public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST"; + field public static final String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST"; + field public static final String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID"; + field public static final String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE"; + field public static final String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT"; + field public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST"; + } + +} + diff --git a/telephony/api/system-removed.txt b/telephony/api/system-removed.txt new file mode 100644 index 000000000000..ae46075c4829 --- /dev/null +++ b/telephony/api/system-removed.txt @@ -0,0 +1,19 @@ +// Signature format: 2.0 +package android.telephony { + + public class TelephonyManager { + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void answerRingingCall(); + method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public boolean endCall(); + method @Deprecated public void silenceRinger(); + } + +} + +package android.telephony.data { + + public final class DataCallResponse implements android.os.Parcelable { + ctor public DataCallResponse(int, int, int, int, int, @Nullable String, @Nullable java.util.List<android.net.LinkAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, @Nullable java.util.List<java.net.InetAddress>, int); + } + +} + diff --git a/telephony/java/android/telephony/Annotation.java b/telephony/java/android/telephony/Annotation.java index 28cc7d0378a1..b8a74d2a1d47 100644 --- a/telephony/java/android/telephony/Annotation.java +++ b/telephony/java/android/telephony/Annotation.java @@ -571,6 +571,19 @@ public class Annotation { public @interface PreciseDisconnectCauses { } + /** + * Carrier Privilege Status. + */ + @IntDef(prefix = { "CARRIER_PRIVILEGE_STATUS_" }, value = { + TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS, + TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS, + TelephonyManager.CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED, + TelephonyManager.CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface CarrierPrivilegeStatus { + } + @IntDef({ Connection.AUDIO_CODEC_NONE, Connection.AUDIO_CODEC_AMR, diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index f6a305f4bf2b..6aea5eeca3fd 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -2894,7 +2894,7 @@ public final class SmsManager { getSubscriptionId(), null); } } catch (RemoteException ex) { - // ignore it + throw new RuntimeException(ex); } return smsc; } @@ -2916,7 +2916,7 @@ public final class SmsManager { * </p> * * @param smsc the SMSC address string. - * @return true for success, false otherwise. + * @return true for success, false otherwise. Failure can be due modem returning an error. */ @SuppressAutoDoc // for carrier privileges and default SMS application. @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @@ -2928,7 +2928,7 @@ public final class SmsManager { smsc, getSubscriptionId(), null); } } catch (RemoteException ex) { - // ignore it + throw new RuntimeException(ex); } return false; } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 5339fb900480..8cf596ca821b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -71,6 +71,7 @@ import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; import android.telephony.Annotation.ApnType; import android.telephony.Annotation.CallState; +import android.telephony.Annotation.CarrierPrivilegeStatus; import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.RadioPowerState; import android.telephony.Annotation.SimActivationState; @@ -11162,8 +11163,6 @@ public class TelephonyManager { retVal = telephony.isDataEnabled(subId); } catch (RemoteException e) { Log.e(TAG, "Error isDataConnectionAllowed", e); - } catch (NullPointerException e) { - return false; } return retVal; } @@ -12450,7 +12449,7 @@ public class TelephonyManager { */ @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) - public int getCarrierPrivilegeStatus(int uid) { + public @CarrierPrivilegeStatus int getCarrierPrivilegeStatus(int uid) { try { ITelephony telephony = getITelephony(); if (telephony != null) { diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java index dfaac2cde91d..2957192ecf0f 100644 --- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java @@ -1077,6 +1077,52 @@ public class PackageWatchdogTest { assertThat(observer1.mMitigatedPackages).isEmpty(); } + /** + * Test to verify that Package Watchdog syncs health check requests with the controller + * correctly, and that the requests are only synced when the set of observed packages + * changes. + */ + @Test + public void testSyncHealthCheckRequests() { + TestController testController = spy(TestController.class); + testController.setSupportedPackages(List.of(APP_A, APP_B, APP_C)); + PackageWatchdog watchdog = createWatchdog(testController, true); + + TestObserver testObserver1 = new TestObserver(OBSERVER_NAME_1); + watchdog.registerHealthObserver(testObserver1); + watchdog.startObservingHealth(testObserver1, List.of(APP_A), LONG_DURATION); + mTestLooper.dispatchAll(); + + TestObserver testObserver2 = new TestObserver(OBSERVER_NAME_2); + watchdog.registerHealthObserver(testObserver2); + watchdog.startObservingHealth(testObserver2, List.of(APP_B), LONG_DURATION); + mTestLooper.dispatchAll(); + + TestObserver testObserver3 = new TestObserver(OBSERVER_NAME_3); + watchdog.registerHealthObserver(testObserver3); + watchdog.startObservingHealth(testObserver3, List.of(APP_C), LONG_DURATION); + mTestLooper.dispatchAll(); + + watchdog.unregisterHealthObserver(testObserver1); + mTestLooper.dispatchAll(); + + watchdog.unregisterHealthObserver(testObserver2); + mTestLooper.dispatchAll(); + + watchdog.unregisterHealthObserver(testObserver3); + mTestLooper.dispatchAll(); + + List<Set> expectedSyncRequests = List.of( + Set.of(APP_A), + Set.of(APP_A, APP_B), + Set.of(APP_A, APP_B, APP_C), + Set.of(APP_B, APP_C), + Set.of(APP_C), + Set.of() + ); + assertThat(testController.getSyncRequests()).isEqualTo(expectedSyncRequests); + } + private void adoptShellPermissions(String... permissions) { InstrumentationRegistry .getInstrumentation() @@ -1233,6 +1279,7 @@ public class PackageWatchdogTest { private Consumer<String> mPassedConsumer; private Consumer<List<PackageConfig>> mSupportedConsumer; private Runnable mNotifySyncRunnable; + private List<Set> mSyncRequests = new ArrayList<>(); @Override public void setEnabled(boolean enabled) { @@ -1252,6 +1299,7 @@ public class PackageWatchdogTest { @Override public void syncRequests(Set<String> packages) { + mSyncRequests.add(packages); mRequestedPackages.clear(); if (mIsEnabled) { packages.retainAll(mSupportedPackages); @@ -1282,6 +1330,10 @@ public class PackageWatchdogTest { return Collections.emptyList(); } } + + public List<Set> getSyncRequests() { + return mSyncRequests; + } } private static class TestClock implements PackageWatchdog.SystemClock { diff --git a/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/WindowInsetsActivity.java b/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/WindowInsetsActivity.java index f254e4d3267a..548af0c54b03 100644 --- a/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/WindowInsetsActivity.java +++ b/tests/WindowInsetsTests/src/com/google/android/test/windowinsetstests/WindowInsetsActivity.java @@ -114,7 +114,14 @@ public class WindowInsetsActivity extends AppCompatActivity { } @Override - public void onCancelled() { + public void onFinished( + WindowInsetsAnimationController controller) { + mAnimationController = null; + } + + @Override + public void onCancelled( + WindowInsetsAnimationController controller) { mAnimationController = null; } }); @@ -230,7 +237,13 @@ public class WindowInsetsActivity extends AppCompatActivity { } @Override - public void onCancelled() { + public void onFinished( + WindowInsetsAnimationController controller) { + } + + @Override + public void onCancelled( + WindowInsetsAnimationController controller) { } }); } diff --git a/tests/net/common/java/android/net/KeepalivePacketDataTest.kt b/tests/net/common/java/android/net/KeepalivePacketDataTest.kt new file mode 100644 index 000000000000..f464ec6cf0e5 --- /dev/null +++ b/tests/net/common/java/android/net/KeepalivePacketDataTest.kt @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.net + +import android.net.InvalidPacketException.ERROR_INVALID_IP_ADDRESS +import android.net.InvalidPacketException.ERROR_INVALID_PORT +import android.os.Build +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.testutils.DevSdkIgnoreRule +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo +import java.net.InetAddress +import java.util.Arrays +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Assert.fail +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class KeepalivePacketDataTest { + @Rule @JvmField + val ignoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule() + + private val INVALID_PORT = 65537 + private val TEST_DST_PORT = 4244 + private val TEST_SRC_PORT = 4243 + + private val TESTBYTES = byteArrayOf(12, 31, 22, 44) + private val TEST_SRC_ADDRV4 = "198.168.0.2".address() + private val TEST_DST_ADDRV4 = "198.168.0.1".address() + private val TEST_ADDRV6 = "2001:db8::1".address() + + private fun String.address() = InetAddresses.parseNumericAddress(this) + + // Add for test because constructor of KeepalivePacketData is protected. + private inner class TestKeepalivePacketData( + srcAddress: InetAddress? = TEST_SRC_ADDRV4, + srcPort: Int = TEST_SRC_PORT, + dstAddress: InetAddress? = TEST_DST_ADDRV4, + dstPort: Int = TEST_DST_PORT, + data: ByteArray = TESTBYTES + ) : KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, data) + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testConstructor() { + var data: TestKeepalivePacketData + + try { + data = TestKeepalivePacketData(srcAddress = null) + fail("Null src address should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_IP_ADDRESS) + } + + try { + data = TestKeepalivePacketData(dstAddress = null) + fail("Null dst address should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_IP_ADDRESS) + } + + try { + data = TestKeepalivePacketData(dstAddress = TEST_ADDRV6) + fail("Ip family mismatched should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_IP_ADDRESS) + } + + try { + data = TestKeepalivePacketData(srcPort = INVALID_PORT) + fail("Invalid srcPort should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_PORT) + } + + try { + data = TestKeepalivePacketData(dstPort = INVALID_PORT) + fail("Invalid dstPort should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_PORT) + } + } + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testSrcAddress() = assertEquals(TEST_SRC_ADDRV4, TestKeepalivePacketData().srcAddress) + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testDstAddress() = assertEquals(TEST_DST_ADDRV4, TestKeepalivePacketData().dstAddress) + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testSrcPort() = assertEquals(TEST_SRC_PORT, TestKeepalivePacketData().srcPort) + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testDstPort() = assertEquals(TEST_DST_PORT, TestKeepalivePacketData().dstPort) + + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testPacket() = assertTrue(Arrays.equals(TESTBYTES, TestKeepalivePacketData().packet)) +}
\ No newline at end of file diff --git a/tests/net/common/java/android/net/NattKeepalivePacketDataTest.kt b/tests/net/common/java/android/net/NattKeepalivePacketDataTest.kt new file mode 100644 index 000000000000..46f39dd016fd --- /dev/null +++ b/tests/net/common/java/android/net/NattKeepalivePacketDataTest.kt @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net + +import android.net.InvalidPacketException.ERROR_INVALID_IP_ADDRESS +import android.net.InvalidPacketException.ERROR_INVALID_PORT +import android.net.NattSocketKeepalive.NATT_PORT +import android.os.Build +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.testutils.assertEqualBothWays +import com.android.testutils.assertFieldCountEquals +import com.android.testutils.assertParcelSane +import com.android.testutils.DevSdkIgnoreRule +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo +import com.android.testutils.parcelingRoundTrip +import java.net.InetAddress +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Assert.fail +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class NattKeepalivePacketDataTest { + @Rule @JvmField + val ignoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule() + + /* Refer to the definition in {@code NattKeepalivePacketData} */ + private val IPV4_HEADER_LENGTH = 20 + private val UDP_HEADER_LENGTH = 8 + + private val TEST_PORT = 4243 + private val TEST_PORT2 = 4244 + private val TEST_SRC_ADDRV4 = "198.168.0.2".address() + private val TEST_DST_ADDRV4 = "198.168.0.1".address() + private val TEST_ADDRV6 = "2001:db8::1".address() + + private fun String.address() = InetAddresses.parseNumericAddress(this) + private fun nattKeepalivePacket( + srcAddress: InetAddress? = TEST_SRC_ADDRV4, + srcPort: Int = TEST_PORT, + dstAddress: InetAddress? = TEST_DST_ADDRV4, + dstPort: Int = NATT_PORT + ) = NattKeepalivePacketData.nattKeepalivePacket(srcAddress, srcPort, dstAddress, dstPort) + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testConstructor() { + try { + nattKeepalivePacket(dstPort = TEST_PORT) + fail("Dst port is not NATT port should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_PORT) + } + + try { + nattKeepalivePacket(srcAddress = TEST_ADDRV6) + fail("A v6 srcAddress should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_IP_ADDRESS) + } + + try { + nattKeepalivePacket(dstAddress = TEST_ADDRV6) + fail("A v6 dstAddress should cause exception") + } catch (e: InvalidPacketException) { + assertEquals(e.error, ERROR_INVALID_IP_ADDRESS) + } + + try { + parcelingRoundTrip( + NattKeepalivePacketData(TEST_SRC_ADDRV4, TEST_PORT, TEST_DST_ADDRV4, TEST_PORT, + byteArrayOf(12, 31, 22, 44))) + fail("Invalid data should cause exception") + } catch (e: IllegalArgumentException) { } + } + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testParcel() { + assertParcelSane(nattKeepalivePacket(), 0) + } + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testEquals() { + assertEqualBothWays(nattKeepalivePacket(), nattKeepalivePacket()) + assertNotEquals(nattKeepalivePacket(dstAddress = TEST_SRC_ADDRV4), nattKeepalivePacket()) + assertNotEquals(nattKeepalivePacket(srcAddress = TEST_DST_ADDRV4), nattKeepalivePacket()) + // Test src port only because dst port have to be NATT_PORT + assertNotEquals(nattKeepalivePacket(srcPort = TEST_PORT2), nattKeepalivePacket()) + // Make sure the parceling test is updated if fields are added in the base class. + assertFieldCountEquals(5, KeepalivePacketData::class.java) + } + + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + fun testHashCode() { + assertEquals(nattKeepalivePacket().hashCode(), nattKeepalivePacket().hashCode()) + } +}
\ No newline at end of file diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index c21772a5d177..44216e804f6f 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -2464,8 +2464,8 @@ public class ConnectivityServiceTest { final MockNetworkFactory testFactory = new MockNetworkFactory(handlerThread.getLooper(), mServiceContext, "testFactory", filter); // Register the factory and don't be surprised when the default request arrives. - testFactory.register(); testFactory.expectAddRequestsWithScores(0); + testFactory.register(); testFactory.waitForNetworkRequests(1); testFactory.setScoreFilter(42); diff --git a/wifi/api/current.txt b/wifi/api/current.txt new file mode 100644 index 000000000000..1b62ec14c504 --- /dev/null +++ b/wifi/api/current.txt @@ -0,0 +1,1199 @@ +// Signature format: 2.0 +package android.net.wifi { + + public abstract class EasyConnectStatusCallback { + field public static final int EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION = -2; // 0xfffffffe + field public static final int EASY_CONNECT_EVENT_FAILURE_BUSY = -5; // 0xfffffffb + field public static final int EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK = -10; // 0xfffffff6 + field public static final int EASY_CONNECT_EVENT_FAILURE_CONFIGURATION = -4; // 0xfffffffc + field public static final int EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION = -11; // 0xfffffff5 + field public static final int EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION = -12; // 0xfffffff4 + field public static final int EASY_CONNECT_EVENT_FAILURE_GENERIC = -7; // 0xfffffff9 + field public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK = -9; // 0xfffffff7 + field public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_URI = -1; // 0xffffffff + field public static final int EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE = -3; // 0xfffffffd + field public static final int EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED = -8; // 0xfffffff8 + field public static final int EASY_CONNECT_EVENT_FAILURE_TIMEOUT = -6; // 0xfffffffa + } + + public class ScanResult implements android.os.Parcelable { + ctor public ScanResult(@NonNull android.net.wifi.ScanResult); + ctor public ScanResult(); + method public int describeContents(); + method @NonNull public java.util.List<android.net.wifi.ScanResult.InformationElement> getInformationElements(); + method public int getWifiStandard(); + method public boolean is80211mcResponder(); + method public boolean isPasspointNetwork(); + method public void writeToParcel(android.os.Parcel, int); + field public String BSSID; + field public static final int CHANNEL_WIDTH_160MHZ = 3; // 0x3 + field public static final int CHANNEL_WIDTH_20MHZ = 0; // 0x0 + field public static final int CHANNEL_WIDTH_40MHZ = 1; // 0x1 + field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2 + field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4 + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.ScanResult> CREATOR; + field public String SSID; + field public static final int WIFI_STANDARD_11AC = 5; // 0x5 + field public static final int WIFI_STANDARD_11AX = 6; // 0x6 + field public static final int WIFI_STANDARD_11N = 4; // 0x4 + field public static final int WIFI_STANDARD_LEGACY = 1; // 0x1 + field public static final int WIFI_STANDARD_UNKNOWN = 0; // 0x0 + field public String capabilities; + field public int centerFreq0; + field public int centerFreq1; + field public int channelWidth; + field public int frequency; + field public int level; + field public CharSequence operatorFriendlyName; + field public long timestamp; + field public CharSequence venueName; + } + + public static class ScanResult.InformationElement { + ctor public ScanResult.InformationElement(@NonNull android.net.wifi.ScanResult.InformationElement); + method @NonNull public java.nio.ByteBuffer getBytes(); + method public int getId(); + method public int getIdExt(); + } + + public final class SoftApConfiguration implements android.os.Parcelable { + method public int describeContents(); + method @Nullable public android.net.MacAddress getBssid(); + method @Nullable public String getPassphrase(); + method public int getSecurityType(); + method @Nullable public String getSsid(); + method public boolean isHiddenSsid(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApConfiguration> CREATOR; + field public static final int SECURITY_TYPE_OPEN = 0; // 0x0 + field public static final int SECURITY_TYPE_WPA2_PSK = 1; // 0x1 + field public static final int SECURITY_TYPE_WPA3_SAE = 3; // 0x3 + field public static final int SECURITY_TYPE_WPA3_SAE_TRANSITION = 2; // 0x2 + } + + public enum SupplicantState implements android.os.Parcelable { + method public int describeContents(); + method public static boolean isValidState(android.net.wifi.SupplicantState); + method public void writeToParcel(android.os.Parcel, int); + enum_constant public static final android.net.wifi.SupplicantState ASSOCIATED; + enum_constant public static final android.net.wifi.SupplicantState ASSOCIATING; + enum_constant public static final android.net.wifi.SupplicantState AUTHENTICATING; + enum_constant public static final android.net.wifi.SupplicantState COMPLETED; + enum_constant public static final android.net.wifi.SupplicantState DISCONNECTED; + enum_constant public static final android.net.wifi.SupplicantState DORMANT; + enum_constant public static final android.net.wifi.SupplicantState FOUR_WAY_HANDSHAKE; + enum_constant public static final android.net.wifi.SupplicantState GROUP_HANDSHAKE; + enum_constant public static final android.net.wifi.SupplicantState INACTIVE; + enum_constant public static final android.net.wifi.SupplicantState INTERFACE_DISABLED; + enum_constant public static final android.net.wifi.SupplicantState INVALID; + enum_constant public static final android.net.wifi.SupplicantState SCANNING; + enum_constant public static final android.net.wifi.SupplicantState UNINITIALIZED; + } + + @Deprecated public class WifiConfiguration implements android.os.Parcelable { + ctor @Deprecated public WifiConfiguration(); + ctor @Deprecated public WifiConfiguration(@NonNull android.net.wifi.WifiConfiguration); + method public int describeContents(); + method @Deprecated public android.net.ProxyInfo getHttpProxy(); + method @Deprecated @NonNull public String getKey(); + method @Deprecated @NonNull public android.net.MacAddress getRandomizedMacAddress(); + method @Deprecated public boolean isPasspoint(); + method @Deprecated public void setHttpProxy(android.net.ProxyInfo); + method @Deprecated public void setSecurityParams(int); + method public void writeToParcel(android.os.Parcel, int); + field @Deprecated public String BSSID; + field @Deprecated public String FQDN; + field @Deprecated public static final int SECURITY_TYPE_EAP = 3; // 0x3 + field @Deprecated public static final int SECURITY_TYPE_EAP_SUITE_B = 5; // 0x5 + field @Deprecated public static final int SECURITY_TYPE_OPEN = 0; // 0x0 + field @Deprecated public static final int SECURITY_TYPE_OWE = 6; // 0x6 + field @Deprecated public static final int SECURITY_TYPE_PSK = 2; // 0x2 + field @Deprecated public static final int SECURITY_TYPE_SAE = 4; // 0x4 + field @Deprecated public static final int SECURITY_TYPE_WAPI_CERT = 8; // 0x8 + field @Deprecated public static final int SECURITY_TYPE_WAPI_PSK = 7; // 0x7 + field @Deprecated public static final int SECURITY_TYPE_WEP = 1; // 0x1 + field @Deprecated public String SSID; + field @Deprecated @NonNull public java.util.BitSet allowedAuthAlgorithms; + field @Deprecated @NonNull public java.util.BitSet allowedGroupCiphers; + field @Deprecated @NonNull public java.util.BitSet allowedGroupManagementCiphers; + field @Deprecated @NonNull public java.util.BitSet allowedKeyManagement; + field @Deprecated @NonNull public java.util.BitSet allowedPairwiseCiphers; + field @Deprecated @NonNull public java.util.BitSet allowedProtocols; + field @Deprecated @NonNull public java.util.BitSet allowedSuiteBCiphers; + field @Deprecated public android.net.wifi.WifiEnterpriseConfig enterpriseConfig; + field @Deprecated public boolean hiddenSSID; + field @Deprecated public boolean isHomeProviderNetwork; + field @Deprecated public int networkId; + field @Deprecated public String preSharedKey; + field @Deprecated public int priority; + field @Deprecated public String providerFriendlyName; + field @Deprecated public long[] roamingConsortiumIds; + field @Deprecated public int status; + field @Deprecated public String[] wepKeys; + field @Deprecated public int wepTxKeyIndex; + } + + @Deprecated public static class WifiConfiguration.AuthAlgorithm { + field @Deprecated public static final int LEAP = 2; // 0x2 + field @Deprecated public static final int OPEN = 0; // 0x0 + field @Deprecated public static final int SAE = 3; // 0x3 + field @Deprecated public static final int SHARED = 1; // 0x1 + field @Deprecated public static final String[] strings; + field @Deprecated public static final String varName = "auth_alg"; + } + + @Deprecated public static class WifiConfiguration.GroupCipher { + field @Deprecated public static final int CCMP = 3; // 0x3 + field @Deprecated public static final int GCMP_256 = 5; // 0x5 + field @Deprecated public static final int SMS4 = 6; // 0x6 + field @Deprecated public static final int TKIP = 2; // 0x2 + field @Deprecated public static final int WEP104 = 1; // 0x1 + field @Deprecated public static final int WEP40 = 0; // 0x0 + field @Deprecated public static final String[] strings; + field @Deprecated public static final String varName = "group"; + } + + @Deprecated public static class WifiConfiguration.GroupMgmtCipher { + field @Deprecated public static final int BIP_CMAC_256 = 0; // 0x0 + field @Deprecated public static final int BIP_GMAC_128 = 1; // 0x1 + field @Deprecated public static final int BIP_GMAC_256 = 2; // 0x2 + } + + @Deprecated public static class WifiConfiguration.KeyMgmt { + field @Deprecated public static final int IEEE8021X = 3; // 0x3 + field @Deprecated public static final int NONE = 0; // 0x0 + field @Deprecated public static final int OWE = 9; // 0x9 + field @Deprecated public static final int SAE = 8; // 0x8 + field @Deprecated public static final int SUITE_B_192 = 10; // 0xa + field @Deprecated public static final int WPA_EAP = 2; // 0x2 + field @Deprecated public static final int WPA_PSK = 1; // 0x1 + field @Deprecated public static final String[] strings; + field @Deprecated public static final String varName = "key_mgmt"; + } + + @Deprecated public static class WifiConfiguration.PairwiseCipher { + field @Deprecated public static final int CCMP = 2; // 0x2 + field @Deprecated public static final int GCMP_256 = 3; // 0x3 + field @Deprecated public static final int NONE = 0; // 0x0 + field @Deprecated public static final int SMS4 = 4; // 0x4 + field @Deprecated public static final int TKIP = 1; // 0x1 + field @Deprecated public static final String[] strings; + field @Deprecated public static final String varName = "pairwise"; + } + + @Deprecated public static class WifiConfiguration.Protocol { + field @Deprecated public static final int RSN = 1; // 0x1 + field @Deprecated public static final int WAPI = 3; // 0x3 + field @Deprecated public static final int WPA = 0; // 0x0 + field @Deprecated public static final String[] strings; + field @Deprecated public static final String varName = "proto"; + } + + @Deprecated public static class WifiConfiguration.Status { + field @Deprecated public static final int CURRENT = 0; // 0x0 + field @Deprecated public static final int DISABLED = 1; // 0x1 + field @Deprecated public static final int ENABLED = 2; // 0x2 + field @Deprecated public static final String[] strings; + } + + public class WifiEnterpriseConfig implements android.os.Parcelable { + ctor public WifiEnterpriseConfig(); + ctor public WifiEnterpriseConfig(android.net.wifi.WifiEnterpriseConfig); + method public int describeContents(); + method public String getAltSubjectMatch(); + method public String getAnonymousIdentity(); + method @Nullable public java.security.cert.X509Certificate getCaCertificate(); + method @Nullable public java.security.cert.X509Certificate[] getCaCertificates(); + method public java.security.cert.X509Certificate getClientCertificate(); + method @Nullable public java.security.cert.X509Certificate[] getClientCertificateChain(); + method @Nullable public java.security.PrivateKey getClientPrivateKey(); + method public String getDomainSuffixMatch(); + method public int getEapMethod(); + method public String getIdentity(); + method public String getPassword(); + method public int getPhase2Method(); + method public String getPlmn(); + method public String getRealm(); + method @Deprecated public String getSubjectMatch(); + method public boolean isAuthenticationSimBased(); + method public void setAltSubjectMatch(String); + method public void setAnonymousIdentity(String); + method public void setCaCertificate(@Nullable java.security.cert.X509Certificate); + method public void setCaCertificates(@Nullable java.security.cert.X509Certificate[]); + method public void setClientKeyEntry(java.security.PrivateKey, java.security.cert.X509Certificate); + method public void setClientKeyEntryWithCertificateChain(java.security.PrivateKey, java.security.cert.X509Certificate[]); + method public void setDomainSuffixMatch(String); + method public void setEapMethod(int); + method public void setIdentity(String); + method public void setPassword(String); + method public void setPhase2Method(int); + method public void setPlmn(String); + method public void setRealm(String); + method @Deprecated public void setSubjectMatch(String); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiEnterpriseConfig> CREATOR; + field public static final String EXTRA_WAPI_AS_CERTIFICATE_DATA = "android.net.wifi.extra.WAPI_AS_CERTIFICATE_DATA"; + field public static final String EXTRA_WAPI_AS_CERTIFICATE_NAME = "android.net.wifi.extra.WAPI_AS_CERTIFICATE_NAME"; + field public static final String EXTRA_WAPI_USER_CERTIFICATE_DATA = "android.net.wifi.extra.WAPI_USER_CERTIFICATE_DATA"; + field public static final String EXTRA_WAPI_USER_CERTIFICATE_NAME = "android.net.wifi.extra.WAPI_USER_CERTIFICATE_NAME"; + field public static final String WAPI_AS_CERTIFICATE = "WAPIAS_"; + field public static final String WAPI_USER_CERTIFICATE = "WAPIUSR_"; + } + + public static final class WifiEnterpriseConfig.Eap { + field public static final int AKA = 5; // 0x5 + field public static final int AKA_PRIME = 6; // 0x6 + field public static final int NONE = -1; // 0xffffffff + field public static final int PEAP = 0; // 0x0 + field public static final int PWD = 3; // 0x3 + field public static final int SIM = 4; // 0x4 + field public static final int TLS = 1; // 0x1 + field public static final int TTLS = 2; // 0x2 + field public static final int UNAUTH_TLS = 7; // 0x7 + field public static final int WAPI_CERT = 8; // 0x8 + } + + public static final class WifiEnterpriseConfig.Phase2 { + field public static final int AKA = 6; // 0x6 + field public static final int AKA_PRIME = 7; // 0x7 + field public static final int GTC = 4; // 0x4 + field public static final int MSCHAP = 2; // 0x2 + field public static final int MSCHAPV2 = 3; // 0x3 + field public static final int NONE = 0; // 0x0 + field public static final int PAP = 1; // 0x1 + field public static final int SIM = 5; // 0x5 + } + + public class WifiInfo implements android.os.Parcelable { + method public int describeContents(); + method public String getBSSID(); + method public static android.net.NetworkInfo.DetailedState getDetailedStateOf(android.net.wifi.SupplicantState); + method public int getFrequency(); + method public boolean getHiddenSSID(); + method public int getIpAddress(); + method public int getLinkSpeed(); + method public String getMacAddress(); + method public int getMaxSupportedRxLinkSpeedMbps(); + method public int getMaxSupportedTxLinkSpeedMbps(); + method public int getNetworkId(); + method @Nullable public String getPasspointFqdn(); + method @Nullable public String getPasspointProviderFriendlyName(); + method public int getRssi(); + method @IntRange(from=0xffffffff) public int getRxLinkSpeedMbps(); + method public String getSSID(); + method public android.net.wifi.SupplicantState getSupplicantState(); + method @IntRange(from=0xffffffff) public int getTxLinkSpeedMbps(); + method public int getWifiStandard(); + method public void writeToParcel(android.os.Parcel, int); + field public static final String FREQUENCY_UNITS = "MHz"; + field public static final String LINK_SPEED_UNITS = "Mbps"; + field public static final int LINK_SPEED_UNKNOWN = -1; // 0xffffffff + } + + public static final class WifiInfo.Builder { + ctor public WifiInfo.Builder(); + method @NonNull public android.net.wifi.WifiInfo build(); + method @NonNull public android.net.wifi.WifiInfo.Builder setBssid(@NonNull String); + method @NonNull public android.net.wifi.WifiInfo.Builder setNetworkId(int); + method @NonNull public android.net.wifi.WifiInfo.Builder setRssi(int); + method @NonNull public android.net.wifi.WifiInfo.Builder setSsid(@NonNull byte[]); + } + + public class WifiManager { + method @Deprecated public int addNetwork(android.net.wifi.WifiConfiguration); + method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int addNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>); + method public void addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration); + method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public void addSuggestionConnectionStatusListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.SuggestionConnectionStatusListener); + method @Deprecated public static int calculateSignalLevel(int, int); + method @IntRange(from=0) public int calculateSignalLevel(int); + method @Deprecated public void cancelWps(android.net.wifi.WifiManager.WpsCallback); + method public static int compareSignalLevel(int, int); + method public android.net.wifi.WifiManager.MulticastLock createMulticastLock(String); + method public android.net.wifi.WifiManager.WifiLock createWifiLock(int, String); + method @Deprecated public android.net.wifi.WifiManager.WifiLock createWifiLock(String); + method @Deprecated public boolean disableNetwork(int); + method @Deprecated public boolean disconnect(); + method @Deprecated public boolean enableNetwork(int, boolean); + method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks(); + method public android.net.wifi.WifiInfo getConnectionInfo(); + method public android.net.DhcpInfo getDhcpInfo(); + method public int getMaxNumberOfNetworkSuggestionsPerApp(); + method @IntRange(from=0) public int getMaxSignalLevel(); + method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public java.util.List<android.net.wifi.WifiNetworkSuggestion> getNetworkSuggestions(); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.hotspot2.PasspointConfiguration> getPasspointConfigurations(); + method public java.util.List<android.net.wifi.ScanResult> getScanResults(); + method public int getWifiState(); + method public boolean is5GHzBandSupported(); + method public boolean is6GHzBandSupported(); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isAutoWakeupEnabled(); + method @Deprecated public boolean isDeviceToApRttSupported(); + method public boolean isEasyConnectSupported(); + method public boolean isEnhancedOpenSupported(); + method public boolean isEnhancedPowerReportingSupported(); + method public boolean isP2pSupported(); + method public boolean isPreferredNetworkOffloadSupported(); + method @Deprecated public boolean isScanAlwaysAvailable(); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isScanThrottleEnabled(); + method public boolean isStaApConcurrencySupported(); + method public boolean isTdlsSupported(); + method public boolean isWapiSupported(); + method public boolean isWifiEnabled(); + method public boolean isWifiStandardSupported(int); + method public boolean isWpa3SaeSupported(); + method public boolean isWpa3SuiteBSupported(); + method @Deprecated public boolean pingSupplicant(); + method @Deprecated public boolean reassociate(); + method @Deprecated public boolean reconnect(); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void registerScanResultsCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.ScanResultsCallback); + method @Deprecated public boolean removeNetwork(int); + method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int removeNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_CARRIER_PROVISIONING}) public void removePasspointConfiguration(String); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void removeSuggestionConnectionStatusListener(@NonNull android.net.wifi.WifiManager.SuggestionConnectionStatusListener); + method @Deprecated public boolean saveConfiguration(); + method public void setTdlsEnabled(java.net.InetAddress, boolean); + method public void setTdlsEnabledWithMacAddress(String, boolean); + method @Deprecated public boolean setWifiEnabled(boolean); + method @RequiresPermission(allOf={android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, @Nullable android.os.Handler); + method @Deprecated public boolean startScan(); + method @Deprecated public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void unregisterScanResultsCallback(@NonNull android.net.wifi.WifiManager.ScanResultsCallback); + method @Deprecated public int updateNetwork(android.net.wifi.WifiConfiguration); + field public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK"; + field public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE"; + field public static final String ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION = "android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION"; + field public static final String ACTION_WIFI_SCAN_AVAILABILITY_CHANGED = "android.net.wifi.action.WIFI_SCAN_AVAILABILITY_CHANGED"; + field @Deprecated public static final int ERROR_AUTHENTICATING = 1; // 0x1 + field @Deprecated public static final String EXTRA_BSSID = "bssid"; + field public static final String EXTRA_NETWORK_INFO = "networkInfo"; + field public static final String EXTRA_NETWORK_SUGGESTION = "android.net.wifi.extra.NETWORK_SUGGESTION"; + field public static final String EXTRA_NEW_RSSI = "newRssi"; + field @Deprecated public static final String EXTRA_NEW_STATE = "newState"; + field public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state"; + field public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated"; + field public static final String EXTRA_SCAN_AVAILABLE = "android.net.wifi.extra.SCAN_AVAILABLE"; + field @Deprecated public static final String EXTRA_SUPPLICANT_CONNECTED = "connected"; + field @Deprecated public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError"; + field @Deprecated public static final String EXTRA_WIFI_INFO = "wifiInfo"; + field public static final String EXTRA_WIFI_STATE = "wifi_state"; + field public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED"; + field public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE"; + field public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED"; + field public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS"; + field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE = 3; // 0x3 + field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP = 4; // 0x4 + field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_INVALID = 7; // 0x7 + field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED = 6; // 0x6 + field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED = 2; // 0x2 + field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL = 1; // 0x1 + field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5; // 0x5 + field public static final int STATUS_NETWORK_SUGGESTIONS_SUCCESS = 0; // 0x0 + field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_ASSOCIATION = 1; // 0x1 + field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION = 2; // 0x2 + field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_IP_PROVISIONING = 3; // 0x3 + field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_UNKNOWN = 0; // 0x0 + field @Deprecated public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = "android.net.wifi.supplicant.CONNECTION_CHANGE"; + field @Deprecated public static final String SUPPLICANT_STATE_CHANGED_ACTION = "android.net.wifi.supplicant.STATE_CHANGE"; + field public static final String UNKNOWN_SSID = "<unknown ssid>"; + field @Deprecated public static final int WIFI_MODE_FULL = 1; // 0x1 + field public static final int WIFI_MODE_FULL_HIGH_PERF = 3; // 0x3 + field public static final int WIFI_MODE_FULL_LOW_LATENCY = 4; // 0x4 + field @Deprecated public static final int WIFI_MODE_SCAN_ONLY = 2; // 0x2 + field public static final String WIFI_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_STATE_CHANGED"; + field public static final int WIFI_STATE_DISABLED = 1; // 0x1 + field public static final int WIFI_STATE_DISABLING = 0; // 0x0 + field public static final int WIFI_STATE_ENABLED = 3; // 0x3 + field public static final int WIFI_STATE_ENABLING = 2; // 0x2 + field public static final int WIFI_STATE_UNKNOWN = 4; // 0x4 + field @Deprecated public static final int WPS_AUTH_FAILURE = 6; // 0x6 + field @Deprecated public static final int WPS_OVERLAP_ERROR = 3; // 0x3 + field @Deprecated public static final int WPS_TIMED_OUT = 7; // 0x7 + field @Deprecated public static final int WPS_TKIP_ONLY_PROHIBITED = 5; // 0x5 + field @Deprecated public static final int WPS_WEP_PROHIBITED = 4; // 0x4 + } + + public static class WifiManager.LocalOnlyHotspotCallback { + ctor public WifiManager.LocalOnlyHotspotCallback(); + method public void onFailed(int); + method public void onStarted(android.net.wifi.WifiManager.LocalOnlyHotspotReservation); + method public void onStopped(); + field public static final int ERROR_GENERIC = 2; // 0x2 + field public static final int ERROR_INCOMPATIBLE_MODE = 3; // 0x3 + field public static final int ERROR_NO_CHANNEL = 1; // 0x1 + field public static final int ERROR_TETHERING_DISALLOWED = 4; // 0x4 + } + + public class WifiManager.LocalOnlyHotspotReservation implements java.lang.AutoCloseable { + method public void close(); + method @NonNull public android.net.wifi.SoftApConfiguration getSoftApConfiguration(); + method @Deprecated @Nullable public android.net.wifi.WifiConfiguration getWifiConfiguration(); + } + + public class WifiManager.MulticastLock { + method public void acquire(); + method public boolean isHeld(); + method public void release(); + method public void setReferenceCounted(boolean); + } + + public abstract static class WifiManager.ScanResultsCallback { + ctor public WifiManager.ScanResultsCallback(); + method public abstract void onScanResultsAvailable(); + } + + public static interface WifiManager.SuggestionConnectionStatusListener { + method public void onConnectionStatus(@NonNull android.net.wifi.WifiNetworkSuggestion, int); + } + + public class WifiManager.WifiLock { + method public void acquire(); + method public boolean isHeld(); + method public void release(); + method public void setReferenceCounted(boolean); + method public void setWorkSource(android.os.WorkSource); + } + + @Deprecated public abstract static class WifiManager.WpsCallback { + ctor @Deprecated public WifiManager.WpsCallback(); + method @Deprecated public abstract void onFailed(int); + method @Deprecated public abstract void onStarted(String); + method @Deprecated public abstract void onSucceeded(); + } + + public final class WifiNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSpecifier> CREATOR; + } + + public static final class WifiNetworkSpecifier.Builder { + ctor public WifiNetworkSpecifier.Builder(); + method @NonNull public android.net.wifi.WifiNetworkSpecifier build(); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssid(@NonNull android.net.MacAddress); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsEnhancedOpen(boolean); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsHiddenSsid(boolean); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setSsid(@NonNull String); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setSsidPattern(@NonNull android.os.PatternMatcher); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2Passphrase(@NonNull String); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig); + method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3Passphrase(@NonNull String); + } + + public final class WifiNetworkSuggestion implements android.os.Parcelable { + method public int describeContents(); + method @Nullable public android.net.MacAddress getBssid(); + method @Nullable public android.net.wifi.WifiEnterpriseConfig getEnterpriseConfig(); + method @Nullable public String getPassphrase(); + method @Nullable public android.net.wifi.hotspot2.PasspointConfiguration getPasspointConfig(); + method @IntRange(from=0) public int getPriority(); + method @Nullable public String getSsid(); + method public boolean isAppInteractionRequired(); + method public boolean isCredentialSharedWithUser(); + method public boolean isEnhancedOpen(); + method public boolean isHiddenSsid(); + method public boolean isInitialAutojoinEnabled(); + method public boolean isMetered(); + method public boolean isUntrusted(); + method public boolean isUserInteractionRequired(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSuggestion> CREATOR; + } + + public static final class WifiNetworkSuggestion.Builder { + ctor public WifiNetworkSuggestion.Builder(); + method @NonNull public android.net.wifi.WifiNetworkSuggestion build(); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCredentialSharedWithUser(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedOpen(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsHiddenSsid(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsInitialAutojoinEnabled(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsMetered(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsUserInteractionRequired(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setPasspointConfig(@NonNull android.net.wifi.hotspot2.PasspointConfiguration); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setPriority(@IntRange(from=0) int); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setSsid(@NonNull String); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setUntrusted(boolean); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWapiEnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWapiPassphrase(@NonNull String); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2Passphrase(@NonNull String); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig); + method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3Passphrase(@NonNull String); + } + + public class WpsInfo implements android.os.Parcelable { + ctor public WpsInfo(); + ctor public WpsInfo(android.net.wifi.WpsInfo); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public String BSSID; + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WpsInfo> CREATOR; + field public static final int DISPLAY = 1; // 0x1 + field public static final int INVALID = 4; // 0x4 + field public static final int KEYPAD = 2; // 0x2 + field public static final int LABEL = 3; // 0x3 + field public static final int PBC = 0; // 0x0 + field public String pin; + field public int setup; + } + +} + +package android.net.wifi.aware { + + public class AttachCallback { + ctor public AttachCallback(); + method public void onAttachFailed(); + method public void onAttached(android.net.wifi.aware.WifiAwareSession); + } + + public final class Characteristics implements android.os.Parcelable { + method public int describeContents(); + method public int getMaxMatchFilterLength(); + method public int getMaxServiceNameLength(); + method public int getMaxServiceSpecificInfoLength(); + method public int getSupportedCipherSuites(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.Characteristics> CREATOR; + field public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_128 = 1; // 0x1 + field public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_256 = 2; // 0x2 + } + + public class DiscoverySession implements java.lang.AutoCloseable { + method public void close(); + method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierOpen(@NonNull android.net.wifi.aware.PeerHandle); + method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(@NonNull android.net.wifi.aware.PeerHandle, @NonNull String); + method public void sendMessage(@NonNull android.net.wifi.aware.PeerHandle, int, @Nullable byte[]); + } + + public class DiscoverySessionCallback { + ctor public DiscoverySessionCallback(); + method public void onMessageReceived(android.net.wifi.aware.PeerHandle, byte[]); + method public void onMessageSendFailed(int); + method public void onMessageSendSucceeded(int); + method public void onPublishStarted(@NonNull android.net.wifi.aware.PublishDiscoverySession); + method public void onServiceDiscovered(android.net.wifi.aware.PeerHandle, byte[], java.util.List<byte[]>); + method public void onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle, byte[], java.util.List<byte[]>, int); + method public void onSessionConfigFailed(); + method public void onSessionConfigUpdated(); + method public void onSessionTerminated(); + method public void onSubscribeStarted(@NonNull android.net.wifi.aware.SubscribeDiscoverySession); + } + + public class IdentityChangedListener { + ctor public IdentityChangedListener(); + method public void onIdentityChanged(byte[]); + } + + public final class ParcelablePeerHandle extends android.net.wifi.aware.PeerHandle implements android.os.Parcelable { + ctor public ParcelablePeerHandle(@NonNull android.net.wifi.aware.PeerHandle); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.ParcelablePeerHandle> CREATOR; + } + + public class PeerHandle { + } + + public final class PublishConfig implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.PublishConfig> CREATOR; + field public static final int PUBLISH_TYPE_SOLICITED = 1; // 0x1 + field public static final int PUBLISH_TYPE_UNSOLICITED = 0; // 0x0 + } + + public static final class PublishConfig.Builder { + ctor public PublishConfig.Builder(); + method public android.net.wifi.aware.PublishConfig build(); + method public android.net.wifi.aware.PublishConfig.Builder setMatchFilter(@Nullable java.util.List<byte[]>); + method public android.net.wifi.aware.PublishConfig.Builder setPublishType(int); + method public android.net.wifi.aware.PublishConfig.Builder setRangingEnabled(boolean); + method public android.net.wifi.aware.PublishConfig.Builder setServiceName(@NonNull String); + method public android.net.wifi.aware.PublishConfig.Builder setServiceSpecificInfo(@Nullable byte[]); + method public android.net.wifi.aware.PublishConfig.Builder setTerminateNotificationEnabled(boolean); + method public android.net.wifi.aware.PublishConfig.Builder setTtlSec(int); + } + + public class PublishDiscoverySession extends android.net.wifi.aware.DiscoverySession { + method public void updatePublish(@NonNull android.net.wifi.aware.PublishConfig); + } + + public final class SubscribeConfig implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.SubscribeConfig> CREATOR; + field public static final int SUBSCRIBE_TYPE_ACTIVE = 1; // 0x1 + field public static final int SUBSCRIBE_TYPE_PASSIVE = 0; // 0x0 + } + + public static final class SubscribeConfig.Builder { + ctor public SubscribeConfig.Builder(); + method public android.net.wifi.aware.SubscribeConfig build(); + method public android.net.wifi.aware.SubscribeConfig.Builder setMatchFilter(@Nullable java.util.List<byte[]>); + method public android.net.wifi.aware.SubscribeConfig.Builder setMaxDistanceMm(int); + method public android.net.wifi.aware.SubscribeConfig.Builder setMinDistanceMm(int); + method public android.net.wifi.aware.SubscribeConfig.Builder setServiceName(@NonNull String); + method public android.net.wifi.aware.SubscribeConfig.Builder setServiceSpecificInfo(@Nullable byte[]); + method public android.net.wifi.aware.SubscribeConfig.Builder setSubscribeType(int); + method public android.net.wifi.aware.SubscribeConfig.Builder setTerminateNotificationEnabled(boolean); + method public android.net.wifi.aware.SubscribeConfig.Builder setTtlSec(int); + } + + public class SubscribeDiscoverySession extends android.net.wifi.aware.DiscoverySession { + method public void updateSubscribe(@NonNull android.net.wifi.aware.SubscribeConfig); + } + + public class WifiAwareManager { + method public void attach(@NonNull android.net.wifi.aware.AttachCallback, @Nullable android.os.Handler); + method public void attach(@NonNull android.net.wifi.aware.AttachCallback, @NonNull android.net.wifi.aware.IdentityChangedListener, @Nullable android.os.Handler); + method public android.net.wifi.aware.Characteristics getCharacteristics(); + method public boolean isAvailable(); + field public static final String ACTION_WIFI_AWARE_STATE_CHANGED = "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED"; + field public static final int WIFI_AWARE_DATA_PATH_ROLE_INITIATOR = 0; // 0x0 + field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1 + } + + public final class WifiAwareNetworkInfo implements android.os.Parcelable android.net.TransportInfo { + method public int describeContents(); + method @Nullable public java.net.Inet6Address getPeerIpv6Addr(); + method public int getPort(); + method public int getTransportProtocol(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.WifiAwareNetworkInfo> CREATOR; + } + + public final class WifiAwareNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.WifiAwareNetworkSpecifier> CREATOR; + } + + public static final class WifiAwareNetworkSpecifier.Builder { + ctor public WifiAwareNetworkSpecifier.Builder(@NonNull android.net.wifi.aware.DiscoverySession, @NonNull android.net.wifi.aware.PeerHandle); + method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier build(); + method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPmk(@NonNull byte[]); + method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPort(@IntRange(from=0, to=65535) int); + method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPskPassphrase(@NonNull String); + method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setTransportProtocol(@IntRange(from=0, to=255) int); + } + + public class WifiAwareSession implements java.lang.AutoCloseable { + method public void close(); + method public android.net.NetworkSpecifier createNetworkSpecifierOpen(int, @NonNull byte[]); + method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(int, @NonNull byte[], @NonNull String); + method public void publish(@NonNull android.net.wifi.aware.PublishConfig, @NonNull android.net.wifi.aware.DiscoverySessionCallback, @Nullable android.os.Handler); + method public void subscribe(@NonNull android.net.wifi.aware.SubscribeConfig, @NonNull android.net.wifi.aware.DiscoverySessionCallback, @Nullable android.os.Handler); + } + +} + +package android.net.wifi.hotspot2 { + + public final class ConfigParser { + method public static android.net.wifi.hotspot2.PasspointConfiguration parsePasspointConfig(String, byte[]); + } + + public final class PasspointConfiguration implements android.os.Parcelable { + ctor public PasspointConfiguration(); + ctor public PasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration); + method public int describeContents(); + method public android.net.wifi.hotspot2.pps.Credential getCredential(); + method public android.net.wifi.hotspot2.pps.HomeSp getHomeSp(); + method public long getSubscriptionExpirationTimeMillis(); + method @NonNull public String getUniqueId(); + method public boolean isOsuProvisioned(); + method public void setCredential(android.net.wifi.hotspot2.pps.Credential); + method public void setHomeSp(android.net.wifi.hotspot2.pps.HomeSp); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR; + } + +} + +package android.net.wifi.hotspot2.omadm { + + public final class PpsMoParser { + method public static android.net.wifi.hotspot2.PasspointConfiguration parseMoText(String); + } + +} + +package android.net.wifi.hotspot2.pps { + + public final class Credential implements android.os.Parcelable { + ctor public Credential(); + ctor public Credential(android.net.wifi.hotspot2.pps.Credential); + method public int describeContents(); + method public java.security.cert.X509Certificate getCaCertificate(); + method public android.net.wifi.hotspot2.pps.Credential.CertificateCredential getCertCredential(); + method public java.security.cert.X509Certificate[] getClientCertificateChain(); + method public java.security.PrivateKey getClientPrivateKey(); + method public String getRealm(); + method public android.net.wifi.hotspot2.pps.Credential.SimCredential getSimCredential(); + method public android.net.wifi.hotspot2.pps.Credential.UserCredential getUserCredential(); + method public void setCaCertificate(java.security.cert.X509Certificate); + method public void setCertCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential); + method public void setClientCertificateChain(java.security.cert.X509Certificate[]); + method public void setClientPrivateKey(java.security.PrivateKey); + method public void setRealm(String); + method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential); + method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential> CREATOR; + } + + public static final class Credential.CertificateCredential implements android.os.Parcelable { + ctor public Credential.CertificateCredential(); + ctor public Credential.CertificateCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential); + method public int describeContents(); + method public byte[] getCertSha256Fingerprint(); + method public String getCertType(); + method public void setCertSha256Fingerprint(byte[]); + method public void setCertType(String); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.CertificateCredential> CREATOR; + } + + public static final class Credential.SimCredential implements android.os.Parcelable { + ctor public Credential.SimCredential(); + ctor public Credential.SimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential); + method public int describeContents(); + method public int getEapType(); + method public String getImsi(); + method public void setEapType(int); + method public void setImsi(String); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.SimCredential> CREATOR; + } + + public static final class Credential.UserCredential implements android.os.Parcelable { + ctor public Credential.UserCredential(); + ctor public Credential.UserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential); + method public int describeContents(); + method public int getEapType(); + method public String getNonEapInnerMethod(); + method public String getPassword(); + method public String getUsername(); + method public void setEapType(int); + method public void setNonEapInnerMethod(String); + method public void setPassword(String); + method public void setUsername(String); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR; + } + + public final class HomeSp implements android.os.Parcelable { + ctor public HomeSp(); + ctor public HomeSp(android.net.wifi.hotspot2.pps.HomeSp); + method public int describeContents(); + method public String getFqdn(); + method public String getFriendlyName(); + method public long[] getRoamingConsortiumOis(); + method public void setFqdn(String); + method public void setFriendlyName(String); + method public void setRoamingConsortiumOis(long[]); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR; + } + +} + +package android.net.wifi.p2p { + + public class WifiP2pConfig implements android.os.Parcelable { + ctor public WifiP2pConfig(); + ctor public WifiP2pConfig(android.net.wifi.p2p.WifiP2pConfig); + method public int describeContents(); + method public int getGroupOwnerBand(); + method public int getNetworkId(); + method @Nullable public String getNetworkName(); + method @Nullable public String getPassphrase(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pConfig> CREATOR; + field public static final int GROUP_OWNER_BAND_2GHZ = 1; // 0x1 + field public static final int GROUP_OWNER_BAND_5GHZ = 2; // 0x2 + field public static final int GROUP_OWNER_BAND_AUTO = 0; // 0x0 + field public static final int GROUP_OWNER_INTENT_AUTO = -1; // 0xffffffff + field public static final int GROUP_OWNER_INTENT_MAX = 15; // 0xf + field public static final int GROUP_OWNER_INTENT_MIN = 0; // 0x0 + field public String deviceAddress; + field @IntRange(from=0, to=15) public int groupOwnerIntent; + field public android.net.wifi.WpsInfo wps; + } + + public static final class WifiP2pConfig.Builder { + ctor public WifiP2pConfig.Builder(); + method @NonNull public android.net.wifi.p2p.WifiP2pConfig build(); + method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder enablePersistentMode(boolean); + method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setDeviceAddress(@Nullable android.net.MacAddress); + method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setGroupOperatingBand(int); + method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setGroupOperatingFrequency(int); + method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setNetworkName(@NonNull String); + method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setPassphrase(@NonNull String); + } + + public class WifiP2pDevice implements android.os.Parcelable { + ctor public WifiP2pDevice(); + ctor public WifiP2pDevice(android.net.wifi.p2p.WifiP2pDevice); + method public int describeContents(); + method @Nullable public android.net.wifi.p2p.WifiP2pWfdInfo getWfdInfo(); + method public boolean isGroupOwner(); + method public boolean isServiceDiscoveryCapable(); + method public void update(@NonNull android.net.wifi.p2p.WifiP2pDevice); + method public boolean wpsDisplaySupported(); + method public boolean wpsKeypadSupported(); + method public boolean wpsPbcSupported(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int AVAILABLE = 3; // 0x3 + field public static final int CONNECTED = 0; // 0x0 + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pDevice> CREATOR; + field public static final int FAILED = 2; // 0x2 + field public static final int INVITED = 1; // 0x1 + field public static final int UNAVAILABLE = 4; // 0x4 + field public String deviceAddress; + field public String deviceName; + field public String primaryDeviceType; + field public String secondaryDeviceType; + field public int status; + } + + public class WifiP2pDeviceList implements android.os.Parcelable { + ctor public WifiP2pDeviceList(); + ctor public WifiP2pDeviceList(android.net.wifi.p2p.WifiP2pDeviceList); + method public int describeContents(); + method public android.net.wifi.p2p.WifiP2pDevice get(String); + method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getDeviceList(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pDeviceList> CREATOR; + } + + public class WifiP2pGroup implements android.os.Parcelable { + ctor public WifiP2pGroup(); + ctor public WifiP2pGroup(android.net.wifi.p2p.WifiP2pGroup); + method public int describeContents(); + method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getClientList(); + method public int getFrequency(); + method public String getInterface(); + method public int getNetworkId(); + method public String getNetworkName(); + method public android.net.wifi.p2p.WifiP2pDevice getOwner(); + method public String getPassphrase(); + method public boolean isGroupOwner(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pGroup> CREATOR; + field public static final int NETWORK_ID_PERSISTENT = -2; // 0xfffffffe + field public static final int NETWORK_ID_TEMPORARY = -1; // 0xffffffff + } + + public class WifiP2pInfo implements android.os.Parcelable { + ctor public WifiP2pInfo(); + ctor public WifiP2pInfo(android.net.wifi.p2p.WifiP2pInfo); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pInfo> CREATOR; + field public boolean groupFormed; + field public java.net.InetAddress groupOwnerAddress; + field public boolean isGroupOwner; + } + + public class WifiP2pManager { + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void addLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public void addServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public void cancelConnect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public void clearLocalServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public void clearServiceRequests(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void createGroup(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pConfig, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener); + method public void removeGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener); + method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestDeviceInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DeviceInfoListener); + method public void requestDiscoveryState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener); + method public void requestNetworkInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener); + method public void requestP2pState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.P2pStateListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener); + method public void setDnsSdResponseListeners(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.DnsSdServiceResponseListener, android.net.wifi.p2p.WifiP2pManager.DnsSdTxtRecordListener); + method public void setServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ServiceResponseListener); + method public void setUpnpServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.UpnpServiceResponseListener); + method public void stopPeerDiscovery(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener); + field public static final int BUSY = 2; // 0x2 + field public static final int ERROR = 0; // 0x0 + field public static final String EXTRA_DISCOVERY_STATE = "discoveryState"; + field public static final String EXTRA_NETWORK_INFO = "networkInfo"; + field public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList"; + field public static final String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice"; + field public static final String EXTRA_WIFI_P2P_GROUP = "p2pGroupInfo"; + field public static final String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo"; + field public static final String EXTRA_WIFI_STATE = "wifi_p2p_state"; + field public static final int NO_SERVICE_REQUESTS = 3; // 0x3 + field public static final int P2P_UNSUPPORTED = 1; // 0x1 + field public static final String WIFI_P2P_CONNECTION_CHANGED_ACTION = "android.net.wifi.p2p.CONNECTION_STATE_CHANGE"; + field public static final String WIFI_P2P_DISCOVERY_CHANGED_ACTION = "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE"; + field public static final int WIFI_P2P_DISCOVERY_STARTED = 2; // 0x2 + field public static final int WIFI_P2P_DISCOVERY_STOPPED = 1; // 0x1 + field public static final String WIFI_P2P_PEERS_CHANGED_ACTION = "android.net.wifi.p2p.PEERS_CHANGED"; + field public static final String WIFI_P2P_STATE_CHANGED_ACTION = "android.net.wifi.p2p.STATE_CHANGED"; + field public static final int WIFI_P2P_STATE_DISABLED = 1; // 0x1 + field public static final int WIFI_P2P_STATE_ENABLED = 2; // 0x2 + field public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION = "android.net.wifi.p2p.THIS_DEVICE_CHANGED"; + } + + public static interface WifiP2pManager.ActionListener { + method public void onFailure(int); + method public void onSuccess(); + } + + public static class WifiP2pManager.Channel implements java.lang.AutoCloseable { + method public void close(); + } + + public static interface WifiP2pManager.ChannelListener { + method public void onChannelDisconnected(); + } + + public static interface WifiP2pManager.ConnectionInfoListener { + method public void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo); + } + + public static interface WifiP2pManager.DeviceInfoListener { + method public void onDeviceInfoAvailable(@Nullable android.net.wifi.p2p.WifiP2pDevice); + } + + public static interface WifiP2pManager.DiscoveryStateListener { + method public void onDiscoveryStateAvailable(int); + } + + public static interface WifiP2pManager.DnsSdServiceResponseListener { + method public void onDnsSdServiceAvailable(String, String, android.net.wifi.p2p.WifiP2pDevice); + } + + public static interface WifiP2pManager.DnsSdTxtRecordListener { + method public void onDnsSdTxtRecordAvailable(String, java.util.Map<java.lang.String,java.lang.String>, android.net.wifi.p2p.WifiP2pDevice); + } + + public static interface WifiP2pManager.GroupInfoListener { + method public void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup); + } + + public static interface WifiP2pManager.NetworkInfoListener { + method public void onNetworkInfoAvailable(@NonNull android.net.NetworkInfo); + } + + public static interface WifiP2pManager.P2pStateListener { + method public void onP2pStateAvailable(int); + } + + public static interface WifiP2pManager.PeerListListener { + method public void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList); + } + + public static interface WifiP2pManager.ServiceResponseListener { + method public void onServiceAvailable(int, byte[], android.net.wifi.p2p.WifiP2pDevice); + } + + public static interface WifiP2pManager.UpnpServiceResponseListener { + method public void onUpnpServiceAvailable(java.util.List<java.lang.String>, android.net.wifi.p2p.WifiP2pDevice); + } + + public final class WifiP2pWfdInfo implements android.os.Parcelable { + ctor public WifiP2pWfdInfo(); + ctor public WifiP2pWfdInfo(@Nullable android.net.wifi.p2p.WifiP2pWfdInfo); + method public int describeContents(); + method public int getControlPort(); + method public int getDeviceType(); + method public int getMaxThroughput(); + method public boolean isContentProtectionSupported(); + method public boolean isEnabled(); + method public boolean isSessionAvailable(); + method public void setContentProtectionSupported(boolean); + method public void setControlPort(@IntRange(from=0) int); + method public boolean setDeviceType(int); + method public void setEnabled(boolean); + method public void setMaxThroughput(@IntRange(from=0) int); + method public void setSessionAvailable(boolean); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pWfdInfo> CREATOR; + field public static final int DEVICE_TYPE_PRIMARY_SINK = 1; // 0x1 + field public static final int DEVICE_TYPE_SECONDARY_SINK = 2; // 0x2 + field public static final int DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK = 3; // 0x3 + field public static final int DEVICE_TYPE_WFD_SOURCE = 0; // 0x0 + } + +} + +package android.net.wifi.p2p.nsd { + + public class WifiP2pDnsSdServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo { + method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo newInstance(String, String, java.util.Map<java.lang.String,java.lang.String>); + } + + public class WifiP2pDnsSdServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest { + method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(); + method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(String); + method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(String, String); + } + + public class WifiP2pServiceInfo implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int SERVICE_TYPE_ALL = 0; // 0x0 + field public static final int SERVICE_TYPE_BONJOUR = 1; // 0x1 + field public static final int SERVICE_TYPE_UPNP = 2; // 0x2 + field public static final int SERVICE_TYPE_VENDOR_SPECIFIC = 255; // 0xff + } + + public class WifiP2pServiceRequest implements android.os.Parcelable { + method public int describeContents(); + method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int, String); + method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int); + method public void writeToParcel(android.os.Parcel, int); + } + + public class WifiP2pUpnpServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo { + method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo newInstance(String, String, java.util.List<java.lang.String>); + } + + public class WifiP2pUpnpServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest { + method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance(); + method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance(String); + } + +} + +package android.net.wifi.rtt { + + public class CivicLocationKeys { + field public static final int ADDITIONAL_CODE = 32; // 0x20 + field public static final int APT = 26; // 0x1a + field public static final int BOROUGH = 4; // 0x4 + field public static final int BRANCH_ROAD_NAME = 36; // 0x24 + field public static final int BUILDING = 25; // 0x19 + field public static final int CITY = 3; // 0x3 + field public static final int COUNTY = 2; // 0x2 + field public static final int DESK = 33; // 0x21 + field public static final int FLOOR = 27; // 0x1b + field public static final int GROUP_OF_STREETS = 6; // 0x6 + field public static final int HNO = 19; // 0x13 + field public static final int HNS = 20; // 0x14 + field public static final int LANGUAGE = 0; // 0x0 + field public static final int LMK = 21; // 0x15 + field public static final int LOC = 22; // 0x16 + field public static final int NAM = 23; // 0x17 + field public static final int NEIGHBORHOOD = 5; // 0x5 + field public static final int PCN = 30; // 0x1e + field public static final int POD = 17; // 0x11 + field public static final int POSTAL_CODE = 24; // 0x18 + field public static final int PO_BOX = 31; // 0x1f + field public static final int PRD = 16; // 0x10 + field public static final int PRIMARY_ROAD_NAME = 34; // 0x22 + field public static final int ROAD_SECTION = 35; // 0x23 + field public static final int ROOM = 28; // 0x1c + field public static final int SCRIPT = 128; // 0x80 + field public static final int STATE = 1; // 0x1 + field public static final int STREET_NAME_POST_MODIFIER = 39; // 0x27 + field public static final int STREET_NAME_PRE_MODIFIER = 38; // 0x26 + field public static final int STS = 18; // 0x12 + field public static final int SUBBRANCH_ROAD_NAME = 37; // 0x25 + field public static final int TYPE_OF_PLACE = 29; // 0x1d + } + + public final class RangingRequest implements android.os.Parcelable { + method public int describeContents(); + method public static int getMaxPeers(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.RangingRequest> CREATOR; + } + + public static final class RangingRequest.Builder { + ctor public RangingRequest.Builder(); + method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoint(@NonNull android.net.wifi.ScanResult); + method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoints(@NonNull java.util.List<android.net.wifi.ScanResult>); + method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.MacAddress); + method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.wifi.aware.PeerHandle); + method public android.net.wifi.rtt.RangingRequest build(); + } + + public final class RangingResult implements android.os.Parcelable { + method public int describeContents(); + method public int getDistanceMm(); + method public int getDistanceStdDevMm(); + method @Nullable public android.net.MacAddress getMacAddress(); + method public int getNumAttemptedMeasurements(); + method public int getNumSuccessfulMeasurements(); + method @Nullable public android.net.wifi.aware.PeerHandle getPeerHandle(); + method public long getRangingTimestampMillis(); + method public int getRssi(); + method public int getStatus(); + method @Nullable public android.net.wifi.rtt.ResponderLocation getUnverifiedResponderLocation(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.RangingResult> CREATOR; + field public static final int STATUS_FAIL = 1; // 0x1 + field public static final int STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC = 2; // 0x2 + field public static final int STATUS_SUCCESS = 0; // 0x0 + } + + public abstract class RangingResultCallback { + ctor public RangingResultCallback(); + method public abstract void onRangingFailure(int); + method public abstract void onRangingResults(@NonNull java.util.List<android.net.wifi.rtt.RangingResult>); + field public static final int STATUS_CODE_FAIL = 1; // 0x1 + field public static final int STATUS_CODE_FAIL_RTT_NOT_AVAILABLE = 2; // 0x2 + } + + public final class ResponderLocation implements android.os.Parcelable { + method public int describeContents(); + method public double getAltitude(); + method public int getAltitudeType(); + method public double getAltitudeUncertainty(); + method public java.util.List<android.net.MacAddress> getColocatedBssids(); + method public int getDatum(); + method public int getExpectedToMove(); + method public double getFloorNumber(); + method public double getHeightAboveFloorMeters(); + method public double getHeightAboveFloorUncertaintyMeters(); + method public double getLatitude(); + method public double getLatitudeUncertainty(); + method public int getLciVersion(); + method public double getLongitude(); + method public double getLongitudeUncertainty(); + method @Nullable public String getMapImageMimeType(); + method @Nullable public android.net.Uri getMapImageUri(); + method public boolean getRegisteredLocationAgreementIndication(); + method public boolean isLciSubelementValid(); + method public boolean isZaxisSubelementValid(); + method @Nullable public android.location.Address toCivicLocationAddress(); + method @Nullable public android.util.SparseArray<java.lang.String> toCivicLocationSparseArray(); + method @NonNull public android.location.Location toLocation(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int ALTITUDE_FLOORS = 2; // 0x2 + field public static final int ALTITUDE_METERS = 1; // 0x1 + field public static final int ALTITUDE_UNDEFINED = 0; // 0x0 + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.ResponderLocation> CREATOR; + field public static final int DATUM_NAD83_MLLW = 3; // 0x3 + field public static final int DATUM_NAD83_NAV88 = 2; // 0x2 + field public static final int DATUM_UNDEFINED = 0; // 0x0 + field public static final int DATUM_WGS84 = 1; // 0x1 + field public static final int LCI_VERSION_1 = 1; // 0x1 + field public static final int LOCATION_FIXED = 0; // 0x0 + field public static final int LOCATION_MOVEMENT_UNKNOWN = 2; // 0x2 + field public static final int LOCATION_RESERVED = 3; // 0x3 + field public static final int LOCATION_VARIABLE = 1; // 0x1 + } + + public class WifiRttManager { + method public boolean isAvailable(); + method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_WIFI_STATE}) public void startRanging(@NonNull android.net.wifi.rtt.RangingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.rtt.RangingResultCallback); + field public static final String ACTION_WIFI_RTT_STATE_CHANGED = "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED"; + } + +} + diff --git a/wifi/api/module-lib-current.txt b/wifi/api/module-lib-current.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/wifi/api/module-lib-current.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/wifi/api/module-lib-removed.txt b/wifi/api/module-lib-removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/wifi/api/module-lib-removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/wifi/api/removed.txt b/wifi/api/removed.txt new file mode 100644 index 000000000000..d802177e249b --- /dev/null +++ b/wifi/api/removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt new file mode 100644 index 000000000000..150a6500745c --- /dev/null +++ b/wifi/api/system-current.txt @@ -0,0 +1,939 @@ +// Signature format: 2.0 +package android.net.wifi { + + public abstract class EasyConnectStatusCallback { + ctor public EasyConnectStatusCallback(); + method public abstract void onConfiguratorSuccess(int); + method public abstract void onEnrolleeSuccess(int); + method public void onFailure(int); + method public void onFailure(int, @Nullable String, @NonNull android.util.SparseArray<int[]>, @NonNull int[]); + method public abstract void onProgress(int); + field public static final int EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0; // 0x0 + field public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_ACCEPTED = 3; // 0x3 + field public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE = 2; // 0x2 + field public static final int EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING = 1; // 0x1 + field public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED = 1; // 0x1 + field public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 0; // 0x0 + } + + @Deprecated public class RttManager { + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void disableResponder(android.net.wifi.RttManager.ResponderCallback); + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void enableResponder(android.net.wifi.RttManager.ResponderCallback); + method @Deprecated public android.net.wifi.RttManager.Capabilities getCapabilities(); + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.net.wifi.RttManager.RttCapabilities getRttCapabilities(); + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startRanging(android.net.wifi.RttManager.RttParams[], android.net.wifi.RttManager.RttListener); + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopRanging(android.net.wifi.RttManager.RttListener); + field @Deprecated public static final int BASE; + field @Deprecated public static final int CMD_OP_ABORTED; + field @Deprecated public static final int CMD_OP_DISABLE_RESPONDER; + field @Deprecated public static final int CMD_OP_ENABLE_RESPONDER; + field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_FAILED; + field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_SUCCEEDED; + field @Deprecated public static final int CMD_OP_FAILED; + field @Deprecated public static final int CMD_OP_START_RANGING; + field @Deprecated public static final int CMD_OP_STOP_RANGING; + field @Deprecated public static final int CMD_OP_SUCCEEDED; + field @Deprecated public static final String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description"; + field @Deprecated public static final int PREAMBLE_HT = 2; // 0x2 + field @Deprecated public static final int PREAMBLE_LEGACY = 1; // 0x1 + field @Deprecated public static final int PREAMBLE_VHT = 4; // 0x4 + field @Deprecated public static final int REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON = -6; // 0xfffffffa + field @Deprecated public static final int REASON_INVALID_LISTENER = -3; // 0xfffffffd + field @Deprecated public static final int REASON_INVALID_REQUEST = -4; // 0xfffffffc + field @Deprecated public static final int REASON_NOT_AVAILABLE = -2; // 0xfffffffe + field @Deprecated public static final int REASON_PERMISSION_DENIED = -5; // 0xfffffffb + field @Deprecated public static final int REASON_UNSPECIFIED = -1; // 0xffffffff + field @Deprecated public static final int RTT_BW_10_SUPPORT = 2; // 0x2 + field @Deprecated public static final int RTT_BW_160_SUPPORT = 32; // 0x20 + field @Deprecated public static final int RTT_BW_20_SUPPORT = 4; // 0x4 + field @Deprecated public static final int RTT_BW_40_SUPPORT = 8; // 0x8 + field @Deprecated public static final int RTT_BW_5_SUPPORT = 1; // 0x1 + field @Deprecated public static final int RTT_BW_80_SUPPORT = 16; // 0x10 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_10 = 6; // 0x6 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_160 = 3; // 0x3 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_20 = 0; // 0x0 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_40 = 1; // 0x1 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_5 = 5; // 0x5 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_80 = 2; // 0x2 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_80P80 = 4; // 0x4 + field @Deprecated public static final int RTT_CHANNEL_WIDTH_UNSPECIFIED = -1; // 0xffffffff + field @Deprecated public static final int RTT_PEER_NAN = 5; // 0x5 + field @Deprecated public static final int RTT_PEER_P2P_CLIENT = 4; // 0x4 + field @Deprecated public static final int RTT_PEER_P2P_GO = 3; // 0x3 + field @Deprecated public static final int RTT_PEER_TYPE_AP = 1; // 0x1 + field @Deprecated public static final int RTT_PEER_TYPE_STA = 2; // 0x2 + field @Deprecated public static final int RTT_PEER_TYPE_UNSPECIFIED = 0; // 0x0 + field @Deprecated public static final int RTT_STATUS_ABORTED = 8; // 0x8 + field @Deprecated public static final int RTT_STATUS_FAILURE = 1; // 0x1 + field @Deprecated public static final int RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6; // 0x6 + field @Deprecated public static final int RTT_STATUS_FAIL_BUSY_TRY_LATER = 12; // 0xc + field @Deprecated public static final int RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15; // 0xf + field @Deprecated public static final int RTT_STATUS_FAIL_INVALID_TS = 9; // 0x9 + field @Deprecated public static final int RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4; // 0x4 + field @Deprecated public static final int RTT_STATUS_FAIL_NO_CAPABILITY = 7; // 0x7 + field @Deprecated public static final int RTT_STATUS_FAIL_NO_RSP = 2; // 0x2 + field @Deprecated public static final int RTT_STATUS_FAIL_PROTOCOL = 10; // 0xa + field @Deprecated public static final int RTT_STATUS_FAIL_REJECTED = 3; // 0x3 + field @Deprecated public static final int RTT_STATUS_FAIL_SCHEDULE = 11; // 0xb + field @Deprecated public static final int RTT_STATUS_FAIL_TM_TIMEOUT = 5; // 0x5 + field @Deprecated public static final int RTT_STATUS_INVALID_REQ = 13; // 0xd + field @Deprecated public static final int RTT_STATUS_NO_WIFI = 14; // 0xe + field @Deprecated public static final int RTT_STATUS_SUCCESS = 0; // 0x0 + field @Deprecated public static final int RTT_TYPE_11_MC = 4; // 0x4 + field @Deprecated public static final int RTT_TYPE_11_V = 2; // 0x2 + field @Deprecated public static final int RTT_TYPE_ONE_SIDED = 1; // 0x1 + field @Deprecated public static final int RTT_TYPE_TWO_SIDED = 2; // 0x2 + field @Deprecated public static final int RTT_TYPE_UNSPECIFIED = 0; // 0x0 + } + + @Deprecated public class RttManager.Capabilities { + ctor @Deprecated public RttManager.Capabilities(); + field @Deprecated public int supportedPeerType; + field @Deprecated public int supportedType; + } + + @Deprecated public static class RttManager.ParcelableRttParams implements android.os.Parcelable { + field @Deprecated @NonNull public android.net.wifi.RttManager.RttParams[] mParams; + } + + @Deprecated public static class RttManager.ParcelableRttResults implements android.os.Parcelable { + ctor @Deprecated public RttManager.ParcelableRttResults(android.net.wifi.RttManager.RttResult[]); + field @Deprecated public android.net.wifi.RttManager.RttResult[] mResults; + } + + @Deprecated public abstract static class RttManager.ResponderCallback { + ctor @Deprecated public RttManager.ResponderCallback(); + method @Deprecated public abstract void onResponderEnableFailure(int); + method @Deprecated public abstract void onResponderEnabled(android.net.wifi.RttManager.ResponderConfig); + } + + @Deprecated public static class RttManager.ResponderConfig implements android.os.Parcelable { + ctor @Deprecated public RttManager.ResponderConfig(); + method @Deprecated public int describeContents(); + method @Deprecated public void writeToParcel(android.os.Parcel, int); + field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.RttManager.ResponderConfig> CREATOR; + field @Deprecated public int centerFreq0; + field @Deprecated public int centerFreq1; + field @Deprecated public int channelWidth; + field @Deprecated public int frequency; + field @Deprecated public String macAddress; + field @Deprecated public int preamble; + } + + @Deprecated public static class RttManager.RttCapabilities implements android.os.Parcelable { + ctor @Deprecated public RttManager.RttCapabilities(); + field @Deprecated public int bwSupported; + field @Deprecated public boolean lciSupported; + field @Deprecated public boolean lcrSupported; + field @Deprecated public int mcVersion; + field @Deprecated public boolean oneSidedRttSupported; + field @Deprecated public int preambleSupported; + field @Deprecated public boolean responderSupported; + field @Deprecated public boolean secureRttSupported; + field @Deprecated public boolean supportedPeerType; + field @Deprecated public boolean supportedType; + field @Deprecated public boolean twoSided11McRttSupported; + } + + @Deprecated public static interface RttManager.RttListener { + method @Deprecated public void onAborted(); + method @Deprecated public void onFailure(int, String); + method @Deprecated public void onSuccess(android.net.wifi.RttManager.RttResult[]); + } + + @Deprecated public static class RttManager.RttParams { + ctor @Deprecated public RttManager.RttParams(); + field @Deprecated public boolean LCIRequest; + field @Deprecated public boolean LCRRequest; + field @Deprecated public int bandwidth; + field @Deprecated public String bssid; + field @Deprecated public int burstTimeout; + field @Deprecated public int centerFreq0; + field @Deprecated public int centerFreq1; + field @Deprecated public int channelWidth; + field @Deprecated public int deviceType; + field @Deprecated public int frequency; + field @Deprecated public int interval; + field @Deprecated public int numRetriesPerFTMR; + field @Deprecated public int numRetriesPerMeasurementFrame; + field @Deprecated public int numSamplesPerBurst; + field @Deprecated public int num_retries; + field @Deprecated public int num_samples; + field @Deprecated public int numberBurst; + field @Deprecated public int preamble; + field @Deprecated public int requestType; + field @Deprecated public boolean secure; + } + + @Deprecated public static class RttManager.RttResult { + ctor @Deprecated public RttManager.RttResult(); + field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCI; + field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCR; + field @Deprecated public String bssid; + field @Deprecated public int burstDuration; + field @Deprecated public int burstNumber; + field @Deprecated public int distance; + field @Deprecated public int distanceSpread; + field @Deprecated public int distanceStandardDeviation; + field @Deprecated public int distance_cm; + field @Deprecated public int distance_sd_cm; + field @Deprecated public int distance_spread_cm; + field @Deprecated public int frameNumberPerBurstPeer; + field @Deprecated public int measurementFrameNumber; + field @Deprecated public int measurementType; + field @Deprecated public int negotiatedBurstNum; + field @Deprecated public int requestType; + field @Deprecated public int retryAfterDuration; + field @Deprecated public int rssi; + field @Deprecated public int rssiSpread; + field @Deprecated public int rssi_spread; + field @Deprecated public long rtt; + field @Deprecated public long rttSpread; + field @Deprecated public long rttStandardDeviation; + field @Deprecated public long rtt_ns; + field @Deprecated public long rtt_sd_ns; + field @Deprecated public long rtt_spread_ns; + field @Deprecated public int rxRate; + field @Deprecated public boolean secure; + field @Deprecated public int status; + field @Deprecated public int successMeasurementFrameNumber; + field @Deprecated public long ts; + field @Deprecated public int txRate; + field @Deprecated public int tx_rate; + } + + @Deprecated public static class RttManager.WifiInformationElement { + ctor @Deprecated public RttManager.WifiInformationElement(); + field @Deprecated public byte[] data; + field @Deprecated public byte id; + } + + public class ScanResult implements android.os.Parcelable { + field public static final int CIPHER_CCMP = 3; // 0x3 + field public static final int CIPHER_GCMP_256 = 4; // 0x4 + field public static final int CIPHER_NONE = 0; // 0x0 + field public static final int CIPHER_NO_GROUP_ADDRESSED = 1; // 0x1 + field public static final int CIPHER_SMS4 = 5; // 0x5 + field public static final int CIPHER_TKIP = 2; // 0x2 + field public static final int KEY_MGMT_EAP = 2; // 0x2 + field public static final int KEY_MGMT_EAP_SHA256 = 6; // 0x6 + field public static final int KEY_MGMT_EAP_SUITE_B_192 = 10; // 0xa + field public static final int KEY_MGMT_FT_EAP = 4; // 0x4 + field public static final int KEY_MGMT_FT_PSK = 3; // 0x3 + field public static final int KEY_MGMT_FT_SAE = 11; // 0xb + field public static final int KEY_MGMT_NONE = 0; // 0x0 + field public static final int KEY_MGMT_OSEN = 7; // 0x7 + field public static final int KEY_MGMT_OWE = 9; // 0x9 + field public static final int KEY_MGMT_OWE_TRANSITION = 12; // 0xc + field public static final int KEY_MGMT_PSK = 1; // 0x1 + field public static final int KEY_MGMT_PSK_SHA256 = 5; // 0x5 + field public static final int KEY_MGMT_SAE = 8; // 0x8 + field public static final int KEY_MGMT_WAPI_CERT = 14; // 0xe + field public static final int KEY_MGMT_WAPI_PSK = 13; // 0xd + field public static final int PROTOCOL_NONE = 0; // 0x0 + field public static final int PROTOCOL_OSEN = 3; // 0x3 + field public static final int PROTOCOL_RSN = 2; // 0x2 + field public static final int PROTOCOL_WAPI = 4; // 0x4 + field public static final int PROTOCOL_WPA = 1; // 0x1 + } + + public final class SoftApCapability implements android.os.Parcelable { + method public boolean areFeaturesSupported(long); + method public int describeContents(); + method public int getMaxSupportedClients(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApCapability> CREATOR; + field public static final long SOFTAP_FEATURE_ACS_OFFLOAD = 1L; // 0x1L + field public static final long SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 2L; // 0x2L + field public static final long SOFTAP_FEATURE_WPA3_SAE = 4L; // 0x4L + } + + public final class SoftApConfiguration implements android.os.Parcelable { + method @NonNull public java.util.List<android.net.MacAddress> getAllowedClientList(); + method public int getBand(); + method @NonNull public java.util.List<android.net.MacAddress> getBlockedClientList(); + method public int getChannel(); + method public int getMaxNumberOfClients(); + method public long getShutdownTimeoutMillis(); + method public boolean isAutoShutdownEnabled(); + method public boolean isClientControlByUserEnabled(); + method @Nullable public android.net.wifi.WifiConfiguration toWifiConfiguration(); + field public static final int BAND_2GHZ = 1; // 0x1 + field public static final int BAND_5GHZ = 2; // 0x2 + field public static final int BAND_6GHZ = 4; // 0x4 + field public static final int BAND_ANY = 7; // 0x7 + } + + public static final class SoftApConfiguration.Builder { + ctor public SoftApConfiguration.Builder(); + ctor public SoftApConfiguration.Builder(@NonNull android.net.wifi.SoftApConfiguration); + method @NonNull public android.net.wifi.SoftApConfiguration build(); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setAllowedClientList(@NonNull java.util.List<android.net.MacAddress>); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setAutoShutdownEnabled(boolean); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBand(int); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBlockedClientList(@NonNull java.util.List<android.net.MacAddress>); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBssid(@Nullable android.net.MacAddress); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setChannel(int, int); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setClientControlByUserEnabled(boolean); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setHiddenSsid(boolean); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setMaxNumberOfClients(@IntRange(from=0) int); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setPassphrase(@Nullable String, int); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setShutdownTimeoutMillis(@IntRange(from=0) long); + method @NonNull public android.net.wifi.SoftApConfiguration.Builder setSsid(@Nullable String); + } + + public final class SoftApInfo implements android.os.Parcelable { + method public int describeContents(); + method public int getBandwidth(); + method public int getFrequency(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field public static final int CHANNEL_WIDTH_160MHZ = 6; // 0x6 + field public static final int CHANNEL_WIDTH_20MHZ = 2; // 0x2 + field public static final int CHANNEL_WIDTH_20MHZ_NOHT = 1; // 0x1 + field public static final int CHANNEL_WIDTH_40MHZ = 3; // 0x3 + field public static final int CHANNEL_WIDTH_80MHZ = 4; // 0x4 + field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 5; // 0x5 + field public static final int CHANNEL_WIDTH_INVALID = 0; // 0x0 + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApInfo> CREATOR; + } + + public final class WifiClient implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.net.MacAddress getMacAddress(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiClient> CREATOR; + } + + @Deprecated public class WifiConfiguration implements android.os.Parcelable { + method @Deprecated public int getAuthType(); + method @Deprecated @NonNull public android.net.IpConfiguration getIpConfiguration(); + method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus getNetworkSelectionStatus(); + method @Deprecated @NonNull public String getPrintableSsid(); + method @Deprecated public int getRecentFailureReason(); + method @Deprecated public boolean hasNoInternetAccess(); + method @Deprecated public boolean isEphemeral(); + method @Deprecated public static boolean isMetered(@Nullable android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiInfo); + method @Deprecated public boolean isNoInternetAccessExpected(); + method @Deprecated public void setIpConfiguration(@Nullable android.net.IpConfiguration); + method @Deprecated public void setNetworkSelectionStatus(@NonNull android.net.wifi.WifiConfiguration.NetworkSelectionStatus); + field @Deprecated public static final int INVALID_NETWORK_ID = -1; // 0xffffffff + field @Deprecated public static final int METERED_OVERRIDE_METERED = 1; // 0x1 + field @Deprecated public static final int METERED_OVERRIDE_NONE = 0; // 0x0 + field @Deprecated public static final int METERED_OVERRIDE_NOT_METERED = 2; // 0x2 + field @Deprecated public static final int RANDOMIZATION_NONE = 0; // 0x0 + field @Deprecated public static final int RANDOMIZATION_PERSISTENT = 1; // 0x1 + field @Deprecated public static final int RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA = 17; // 0x11 + field @Deprecated public static final int RECENT_FAILURE_NONE = 0; // 0x0 + field @Deprecated public boolean allowAutojoin; + field @Deprecated public int carrierId; + field @Deprecated public String creatorName; + field @Deprecated public int creatorUid; + field @Deprecated public boolean fromWifiNetworkSpecifier; + field @Deprecated public boolean fromWifiNetworkSuggestion; + field @Deprecated public String lastUpdateName; + field @Deprecated public int lastUpdateUid; + field @Deprecated public int macRandomizationSetting; + field @Deprecated public boolean meteredHint; + field @Deprecated public int meteredOverride; + field @Deprecated public int numAssociation; + field @Deprecated public int numScorerOverride; + field @Deprecated public int numScorerOverrideAndSwitchedNetwork; + field @Deprecated public boolean requirePmf; + field @Deprecated public boolean shared; + field @Deprecated public boolean useExternalScores; + } + + @Deprecated public static class WifiConfiguration.KeyMgmt { + field @Deprecated public static final int WAPI_CERT = 14; // 0xe + field @Deprecated public static final int WAPI_PSK = 13; // 0xd + field @Deprecated public static final int WPA2_PSK = 4; // 0x4 + } + + @Deprecated public static class WifiConfiguration.NetworkSelectionStatus { + method @Deprecated public int getDisableReasonCounter(int); + method @Deprecated public long getDisableTime(); + method @Deprecated public static int getMaxNetworkSelectionDisableReason(); + method @Deprecated public int getNetworkSelectionDisableReason(); + method @Deprecated @Nullable public static String getNetworkSelectionDisableReasonString(int); + method @Deprecated public int getNetworkSelectionStatus(); + method @Deprecated @NonNull public String getNetworkStatusString(); + method @Deprecated public boolean hasEverConnected(); + field @Deprecated public static final int DISABLED_ASSOCIATION_REJECTION = 1; // 0x1 + field @Deprecated public static final int DISABLED_AUTHENTICATION_FAILURE = 2; // 0x2 + field @Deprecated public static final int DISABLED_AUTHENTICATION_NO_CREDENTIALS = 5; // 0x5 + field @Deprecated public static final int DISABLED_AUTHENTICATION_NO_SUBSCRIPTION = 9; // 0x9 + field @Deprecated public static final int DISABLED_BY_WIFI_MANAGER = 7; // 0x7 + field @Deprecated public static final int DISABLED_BY_WRONG_PASSWORD = 8; // 0x8 + field @Deprecated public static final int DISABLED_DHCP_FAILURE = 3; // 0x3 + field @Deprecated public static final int DISABLED_NONE = 0; // 0x0 + field @Deprecated public static final int DISABLED_NO_INTERNET_PERMANENT = 6; // 0x6 + field @Deprecated public static final int DISABLED_NO_INTERNET_TEMPORARY = 4; // 0x4 + field @Deprecated public static final int NETWORK_SELECTION_ENABLED = 0; // 0x0 + field @Deprecated public static final int NETWORK_SELECTION_PERMANENTLY_DISABLED = 2; // 0x2 + field @Deprecated public static final int NETWORK_SELECTION_TEMPORARY_DISABLED = 1; // 0x1 + } + + @Deprecated public static final class WifiConfiguration.NetworkSelectionStatus.Builder { + ctor @Deprecated public WifiConfiguration.NetworkSelectionStatus.Builder(); + method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus build(); + method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus.Builder setNetworkSelectionDisableReason(int); + method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus.Builder setNetworkSelectionStatus(int); + } + + public class WifiEnterpriseConfig implements android.os.Parcelable { + method @Nullable public String[] getCaCertificateAliases(); + method @NonNull public String getCaPath(); + method @NonNull public String getClientCertificateAlias(); + method public int getOcsp(); + method @NonNull public String getWapiCertSuite(); + method public void setCaCertificateAliases(@Nullable String[]); + method public void setCaPath(@NonNull String); + method public void setClientCertificateAlias(@NonNull String); + method public void setOcsp(int); + method public void setWapiCertSuite(@NonNull String); + field public static final int OCSP_NONE = 0; // 0x0 + field public static final int OCSP_REQUEST_CERT_STATUS = 1; // 0x1 + field public static final int OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS = 3; // 0x3 + field public static final int OCSP_REQUIRE_CERT_STATUS = 2; // 0x2 + } + + public class WifiFrameworkInitializer { + method public static void registerServiceWrappers(); + } + + public class WifiInfo implements android.os.Parcelable { + method public double getLostTxPacketsPerSecond(); + method @Nullable public String getRequestingPackageName(); + method public double getRetriedTxPacketsPerSecond(); + method public int getScore(); + method public double getSuccessfulRxPacketsPerSecond(); + method public double getSuccessfulTxPacketsPerSecond(); + method public boolean isEphemeral(); + method public boolean isOsuAp(); + method public boolean isPasspointAp(); + method @Nullable public static String sanitizeSsid(@Nullable String); + field public static final String DEFAULT_MAC_ADDRESS = "02:00:00:00:00:00"; + field public static final int INVALID_RSSI = -127; // 0xffffff81 + } + + public class WifiManager { + method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void addOnWifiUsabilityStatsListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoin(int, boolean); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoinGlobal(boolean); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoinPasspoint(@NonNull String, boolean); + method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void clearWifiConnectedNetworkScorer(); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void connect(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void connect(int, @Nullable android.net.wifi.WifiManager.ActionListener); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void disable(int, @Nullable android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK}) public void disableEphemeralNetwork(@NonNull String); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void factoryReset(); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void forget(int, @Nullable android.net.wifi.WifiManager.ActionListener); + method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>); + method @Nullable @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String getCountryCode(); + method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public android.net.Network getCurrentNetwork(); + method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String[] getFactoryMacAddresses(); + method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(@Nullable java.util.List<android.net.wifi.ScanResult>); + method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>); + method @NonNull @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.Map<android.net.wifi.WifiNetworkSuggestion,java.util.List<android.net.wifi.ScanResult>> getMatchingScanResults(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>, @Nullable java.util.List<android.net.wifi.ScanResult>); + method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public java.util.List<android.net.wifi.WifiConfiguration> getPrivilegedConfiguredNetworks(); + method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public android.net.wifi.SoftApConfiguration getSoftApConfiguration(); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void getWifiActivityEnergyInfoAsync(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.OnWifiActivityEnergyInfoListener); + method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.WifiConfiguration getWifiApConfiguration(); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getWifiApState(); + method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.WifiConfiguration> getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(@NonNull java.util.List<android.net.wifi.ScanResult>); + method public boolean isApMacRandomizationSupported(); + method public boolean isConnectedMacRandomizationSupported(); + method @Deprecated public boolean isDeviceToDeviceRttSupported(); + method public boolean isPortableHotspotSupported(); + method public boolean isVerboseLoggingEnabled(); + method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled(); + method public boolean isWifiScannerSupported(); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerNetworkRequestMatchCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerSoftApCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.SoftApCallback); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerTrafficStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.TrafficStateCallback); + method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void removeOnWifiUsabilityStatsListener(@NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void restoreBackupData(@NonNull byte[]); + method @Nullable @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public android.net.wifi.SoftApConfiguration restoreSoftApBackupData(@NonNull byte[]); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void restoreSupplicantBackupData(@NonNull byte[], @NonNull byte[]); + method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public byte[] retrieveBackupData(); + method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public byte[] retrieveSoftApBackupData(); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setAutoWakeupEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.WIFI_SET_DEVICE_MOBILITY_STATE) public void setDeviceMobilityState(int); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setMacRandomizationSettingPasspointEnabled(@NonNull String, boolean); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setPasspointMeteredOverride(@NonNull String, int); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setScanAlwaysAvailable(boolean); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setScanThrottleEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public boolean setSoftApConfiguration(@NonNull android.net.wifi.SoftApConfiguration); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setVerboseLoggingEnabled(boolean); + method @Deprecated @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration); + method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public boolean setWifiConnectedNetworkScorer(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.WifiConnectedNetworkScorer); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsConfiguratorInitiator(@NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsEnrolleeInitiator(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startLocalOnlyHotspot(@NonNull android.net.wifi.SoftApConfiguration, @Nullable java.util.concurrent.Executor, @Nullable android.net.wifi.WifiManager.LocalOnlyHotspotCallback); + method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public boolean startScan(android.os.WorkSource); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startSubscriptionProvisioning(@NonNull android.net.wifi.hotspot2.OsuProvider, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.hotspot2.ProvisioningCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public boolean startTetheredHotspot(@Nullable android.net.wifi.SoftApConfiguration); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void stopEasyConnectSession(); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public boolean stopSoftAp(); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterNetworkRequestMatchCallback(@NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterSoftApCallback(@NonNull android.net.wifi.WifiManager.SoftApCallback); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterTrafficStateCallback(@NonNull android.net.wifi.WifiManager.TrafficStateCallback); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void updateInterfaceIpState(@Nullable String, int); + method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void updateWifiUsabilityScore(int, int, int); + field public static final String ACTION_LINK_CONFIGURATION_CHANGED = "android.net.wifi.LINK_CONFIGURATION_CHANGED"; + field @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public static final String ACTION_NETWORK_SETTINGS_RESET = "android.net.wifi.action.NETWORK_SETTINGS_RESET"; + field public static final String ACTION_PASSPOINT_LAUNCH_OSU_VIEW = "android.net.wifi.action.PASSPOINT_LAUNCH_OSU_VIEW"; + field public static final String ACTION_REQUEST_DISABLE = "android.net.wifi.action.REQUEST_DISABLE"; + field public static final String ACTION_REQUEST_ENABLE = "android.net.wifi.action.REQUEST_ENABLE"; + field public static final int CHANGE_REASON_ADDED = 0; // 0x0 + field public static final int CHANGE_REASON_CONFIG_CHANGE = 2; // 0x2 + field public static final int CHANGE_REASON_REMOVED = 1; // 0x1 + field public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE"; + field public static final int DEVICE_MOBILITY_STATE_HIGH_MVMT = 1; // 0x1 + field public static final int DEVICE_MOBILITY_STATE_LOW_MVMT = 2; // 0x2 + field public static final int DEVICE_MOBILITY_STATE_STATIONARY = 3; // 0x3 + field public static final int DEVICE_MOBILITY_STATE_UNKNOWN = 0; // 0x0 + field public static final int EASY_CONNECT_NETWORK_ROLE_AP = 1; // 0x1 + field public static final int EASY_CONNECT_NETWORK_ROLE_STA = 0; // 0x0 + field public static final String EXTRA_CHANGE_REASON = "changeReason"; + field public static final String EXTRA_LINK_PROPERTIES = "android.net.wifi.extra.LINK_PROPERTIES"; + field public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges"; + field public static final String EXTRA_OSU_NETWORK = "android.net.wifi.extra.OSU_NETWORK"; + field public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state"; + field public static final String EXTRA_URL = "android.net.wifi.extra.URL"; + field public static final String EXTRA_WIFI_AP_FAILURE_REASON = "android.net.wifi.extra.WIFI_AP_FAILURE_REASON"; + field public static final String EXTRA_WIFI_AP_INTERFACE_NAME = "android.net.wifi.extra.WIFI_AP_INTERFACE_NAME"; + field public static final String EXTRA_WIFI_AP_MODE = "android.net.wifi.extra.WIFI_AP_MODE"; + field public static final String EXTRA_WIFI_AP_STATE = "wifi_state"; + field public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration"; + field public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et"; + field public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid"; + field public static final int IFACE_IP_MODE_CONFIGURATION_ERROR = 0; // 0x0 + field public static final int IFACE_IP_MODE_LOCAL_ONLY = 2; // 0x2 + field public static final int IFACE_IP_MODE_TETHERED = 1; // 0x1 + field public static final int IFACE_IP_MODE_UNSPECIFIED = -1; // 0xffffffff + field public static final int PASSPOINT_HOME_NETWORK = 0; // 0x0 + field public static final int PASSPOINT_ROAMING_NETWORK = 1; // 0x1 + field public static final int SAP_CLIENT_BLOCK_REASON_CODE_BLOCKED_BY_USER = 0; // 0x0 + field public static final int SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS = 1; // 0x1 + field public static final int SAP_START_FAILURE_GENERAL = 0; // 0x0 + field public static final int SAP_START_FAILURE_NO_CHANNEL = 1; // 0x1 + field public static final int SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION = 2; // 0x2 + field public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED"; + field public static final int WIFI_AP_STATE_DISABLED = 11; // 0xb + field public static final int WIFI_AP_STATE_DISABLING = 10; // 0xa + field public static final int WIFI_AP_STATE_ENABLED = 13; // 0xd + field public static final int WIFI_AP_STATE_ENABLING = 12; // 0xc + field public static final int WIFI_AP_STATE_FAILED = 14; // 0xe + field public static final String WIFI_CREDENTIAL_CHANGED_ACTION = "android.net.wifi.WIFI_CREDENTIAL_CHANGED"; + field public static final int WIFI_CREDENTIAL_FORGOT = 1; // 0x1 + field public static final int WIFI_CREDENTIAL_SAVED = 0; // 0x0 + } + + public static interface WifiManager.ActionListener { + method public void onFailure(int); + method public void onSuccess(); + } + + public static interface WifiManager.NetworkRequestMatchCallback { + method public default void onAbort(); + method public default void onMatch(@NonNull java.util.List<android.net.wifi.ScanResult>); + method public default void onUserSelectionCallbackRegistration(@NonNull android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback); + method public default void onUserSelectionConnectFailure(@NonNull android.net.wifi.WifiConfiguration); + method public default void onUserSelectionConnectSuccess(@NonNull android.net.wifi.WifiConfiguration); + } + + public static interface WifiManager.NetworkRequestUserSelectionCallback { + method public default void reject(); + method public default void select(@NonNull android.net.wifi.WifiConfiguration); + } + + public static interface WifiManager.OnWifiActivityEnergyInfoListener { + method public void onWifiActivityEnergyInfo(@Nullable android.os.connectivity.WifiActivityEnergyInfo); + } + + public static interface WifiManager.OnWifiUsabilityStatsListener { + method public void onWifiUsabilityStats(int, boolean, @NonNull android.net.wifi.WifiUsabilityStatsEntry); + } + + public static interface WifiManager.ScoreUpdateObserver { + method public void notifyScoreUpdate(int, int); + method public void triggerUpdateOfWifiUsabilityStats(int); + } + + public static interface WifiManager.SoftApCallback { + method public default void onBlockedClientConnecting(@NonNull android.net.wifi.WifiClient, int); + method public default void onCapabilityChanged(@NonNull android.net.wifi.SoftApCapability); + method public default void onConnectedClientsChanged(@NonNull java.util.List<android.net.wifi.WifiClient>); + method public default void onInfoChanged(@NonNull android.net.wifi.SoftApInfo); + method public default void onStateChanged(int, int); + } + + public static interface WifiManager.TrafficStateCallback { + method public void onStateChanged(int); + field public static final int DATA_ACTIVITY_IN = 1; // 0x1 + field public static final int DATA_ACTIVITY_INOUT = 3; // 0x3 + field public static final int DATA_ACTIVITY_NONE = 0; // 0x0 + field public static final int DATA_ACTIVITY_OUT = 2; // 0x2 + } + + public static interface WifiManager.WifiConnectedNetworkScorer { + method public void onSetScoreUpdateObserver(@NonNull android.net.wifi.WifiManager.ScoreUpdateObserver); + method public void onStart(int); + method public void onStop(int); + } + + public class WifiNetworkConnectionStatistics implements android.os.Parcelable { + ctor public WifiNetworkConnectionStatistics(int, int); + ctor public WifiNetworkConnectionStatistics(); + ctor public WifiNetworkConnectionStatistics(android.net.wifi.WifiNetworkConnectionStatistics); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkConnectionStatistics> CREATOR; + field public int numConnection; + field public int numUsage; + } + + public final class WifiNetworkSuggestion implements android.os.Parcelable { + method @NonNull public android.net.wifi.WifiConfiguration getWifiConfiguration(); + } + + public static final class WifiNetworkSuggestion.Builder { + method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierId(int); + } + + public class WifiScanner { + method @Deprecated public void configureWifiChange(int, int, int, int, int, android.net.wifi.WifiScanner.BssidInfo[]); + method @Deprecated public void configureWifiChange(android.net.wifi.WifiScanner.WifiChangeSettings); + method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<java.lang.Integer> getAvailableChannels(int); + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean getScanResults(); + method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<android.net.wifi.ScanResult> getSingleScanResults(); + method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void registerScanListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiScanner.ScanListener); + method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setScanningEnabled(boolean); + method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener); + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource); + method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener); + method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource); + method @Deprecated public void startTrackingBssids(android.net.wifi.WifiScanner.BssidInfo[], int, android.net.wifi.WifiScanner.BssidListener); + method @Deprecated public void startTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener); + method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopBackgroundScan(android.net.wifi.WifiScanner.ScanListener); + method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopScan(android.net.wifi.WifiScanner.ScanListener); + method @Deprecated public void stopTrackingBssids(android.net.wifi.WifiScanner.BssidListener); + method @Deprecated public void stopTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener); + method public void unregisterScanListener(@NonNull android.net.wifi.WifiScanner.ScanListener); + field public static final int MAX_SCAN_PERIOD_MS = 1024000; // 0xfa000 + field public static final int MIN_SCAN_PERIOD_MS = 1000; // 0x3e8 + field public static final int REASON_DUPLICATE_REQEUST = -5; // 0xfffffffb + field public static final int REASON_INVALID_LISTENER = -2; // 0xfffffffe + field public static final int REASON_INVALID_REQUEST = -3; // 0xfffffffd + field public static final int REASON_NOT_AUTHORIZED = -4; // 0xfffffffc + field public static final int REASON_SUCCEEDED = 0; // 0x0 + field public static final int REASON_UNSPECIFIED = -1; // 0xffffffff + field @Deprecated public static final int REPORT_EVENT_AFTER_BUFFER_FULL = 0; // 0x0 + field public static final int REPORT_EVENT_AFTER_EACH_SCAN = 1; // 0x1 + field public static final int REPORT_EVENT_FULL_SCAN_RESULT = 2; // 0x2 + field public static final int REPORT_EVENT_NO_BATCH = 4; // 0x4 + field public static final int SCAN_TYPE_HIGH_ACCURACY = 2; // 0x2 + field public static final int SCAN_TYPE_LOW_LATENCY = 0; // 0x0 + field public static final int SCAN_TYPE_LOW_POWER = 1; // 0x1 + field public static final int WIFI_BAND_24_5_6_GHZ = 11; // 0xb + field public static final int WIFI_BAND_24_5_WITH_DFS_6_GHZ = 15; // 0xf + field public static final int WIFI_BAND_24_GHZ = 1; // 0x1 + field public static final int WIFI_BAND_5_GHZ = 2; // 0x2 + field public static final int WIFI_BAND_5_GHZ_DFS_ONLY = 4; // 0x4 + field public static final int WIFI_BAND_5_GHZ_WITH_DFS = 6; // 0x6 + field public static final int WIFI_BAND_6_GHZ = 8; // 0x8 + field public static final int WIFI_BAND_BOTH = 3; // 0x3 + field public static final int WIFI_BAND_BOTH_WITH_DFS = 7; // 0x7 + field public static final int WIFI_BAND_UNSPECIFIED = 0; // 0x0 + } + + public static interface WifiScanner.ActionListener { + method public void onFailure(int, String); + method public void onSuccess(); + } + + @Deprecated public static class WifiScanner.BssidInfo { + ctor @Deprecated public WifiScanner.BssidInfo(); + field @Deprecated public String bssid; + field @Deprecated public int frequencyHint; + field @Deprecated public int high; + field @Deprecated public int low; + } + + @Deprecated public static interface WifiScanner.BssidListener extends android.net.wifi.WifiScanner.ActionListener { + method @Deprecated public void onFound(android.net.wifi.ScanResult[]); + method @Deprecated public void onLost(android.net.wifi.ScanResult[]); + } + + public static class WifiScanner.ChannelSpec { + ctor public WifiScanner.ChannelSpec(int); + field public int frequency; + } + + @Deprecated public static class WifiScanner.HotlistSettings implements android.os.Parcelable { + ctor @Deprecated public WifiScanner.HotlistSettings(); + field @Deprecated public int apLostThreshold; + field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos; + } + + public static class WifiScanner.ParcelableScanData implements android.os.Parcelable { + ctor public WifiScanner.ParcelableScanData(android.net.wifi.WifiScanner.ScanData[]); + method public android.net.wifi.WifiScanner.ScanData[] getResults(); + field public android.net.wifi.WifiScanner.ScanData[] mResults; + } + + public static class WifiScanner.ParcelableScanResults implements android.os.Parcelable { + ctor public WifiScanner.ParcelableScanResults(android.net.wifi.ScanResult[]); + method public android.net.wifi.ScanResult[] getResults(); + field public android.net.wifi.ScanResult[] mResults; + } + + public static class WifiScanner.ScanData implements android.os.Parcelable { + ctor public WifiScanner.ScanData(int, int, android.net.wifi.ScanResult[]); + ctor public WifiScanner.ScanData(android.net.wifi.WifiScanner.ScanData); + method public int getFlags(); + method public int getId(); + method public android.net.wifi.ScanResult[] getResults(); + } + + public static interface WifiScanner.ScanListener extends android.net.wifi.WifiScanner.ActionListener { + method public void onFullResult(android.net.wifi.ScanResult); + method @Deprecated public void onPeriodChanged(int); + method public void onResults(android.net.wifi.WifiScanner.ScanData[]); + } + + public static class WifiScanner.ScanSettings implements android.os.Parcelable { + ctor public WifiScanner.ScanSettings(); + field public int band; + field public android.net.wifi.WifiScanner.ChannelSpec[] channels; + field @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public final java.util.List<android.net.wifi.WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks; + field public boolean hideFromAppOps; + field public boolean ignoreLocationSettings; + field @Deprecated public int maxPeriodInMs; + field @Deprecated public int maxScansToCache; + field @Deprecated public int numBssidsPerScan; + field @Deprecated public int periodInMs; + field @Deprecated public int reportEvents; + field @Deprecated public int stepCount; + field @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public int type; + } + + public static class WifiScanner.ScanSettings.HiddenNetwork { + ctor public WifiScanner.ScanSettings.HiddenNetwork(@NonNull String); + field @NonNull public final String ssid; + } + + @Deprecated public static interface WifiScanner.WifiChangeListener extends android.net.wifi.WifiScanner.ActionListener { + method @Deprecated public void onChanging(android.net.wifi.ScanResult[]); + method @Deprecated public void onQuiescence(android.net.wifi.ScanResult[]); + } + + @Deprecated public static class WifiScanner.WifiChangeSettings implements android.os.Parcelable { + ctor @Deprecated public WifiScanner.WifiChangeSettings(); + field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos; + field @Deprecated public int lostApSampleSize; + field @Deprecated public int minApsBreachingThreshold; + field @Deprecated public int periodInMs; + field @Deprecated public int rssiSampleSize; + field @Deprecated public int unchangedSampleSize; + } + + public final class WifiUsabilityStatsEntry implements android.os.Parcelable { + method public int describeContents(); + method public int getCellularDataNetworkType(); + method public int getCellularSignalStrengthDb(); + method public int getCellularSignalStrengthDbm(); + method public int getLinkSpeedMbps(); + method public int getProbeElapsedTimeSinceLastUpdateMillis(); + method public int getProbeMcsRateSinceLastUpdate(); + method public int getProbeStatusSinceLastUpdate(); + method public int getRssi(); + method public int getRxLinkSpeedMbps(); + method public long getTimeStampMillis(); + method public long getTotalBackgroundScanTimeMillis(); + method public long getTotalBeaconRx(); + method public long getTotalCcaBusyFreqTimeMillis(); + method public long getTotalHotspot2ScanTimeMillis(); + method public long getTotalNanScanTimeMillis(); + method public long getTotalPnoScanTimeMillis(); + method public long getTotalRadioOnFreqTimeMillis(); + method public long getTotalRadioOnTimeMillis(); + method public long getTotalRadioRxTimeMillis(); + method public long getTotalRadioTxTimeMillis(); + method public long getTotalRoamScanTimeMillis(); + method public long getTotalRxSuccess(); + method public long getTotalScanTimeMillis(); + method public long getTotalTxBad(); + method public long getTotalTxRetries(); + method public long getTotalTxSuccess(); + method public boolean isSameRegisteredCell(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiUsabilityStatsEntry> CREATOR; + field public static final int PROBE_STATUS_FAILURE = 3; // 0x3 + field public static final int PROBE_STATUS_NO_PROBE = 1; // 0x1 + field public static final int PROBE_STATUS_SUCCESS = 2; // 0x2 + field public static final int PROBE_STATUS_UNKNOWN = 0; // 0x0 + } + +} + +package android.net.wifi.aware { + + public class DiscoverySession implements java.lang.AutoCloseable { + method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPmk(@NonNull android.net.wifi.aware.PeerHandle, @NonNull byte[]); + } + + public class WifiAwareSession implements java.lang.AutoCloseable { + method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, @NonNull byte[], @NonNull byte[]); + } + +} + +package android.net.wifi.hotspot2 { + + public final class OsuProvider implements android.os.Parcelable { + method public int describeContents(); + method @Nullable public String getFriendlyName(); + method @Nullable public android.net.Uri getServerUri(); + method public void writeToParcel(android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.OsuProvider> CREATOR; + } + + public final class PasspointConfiguration implements android.os.Parcelable { + method public int getMeteredOverride(); + method public boolean isAutojoinEnabled(); + method public boolean isMacRandomizationEnabled(); + } + + public abstract class ProvisioningCallback { + ctor public ProvisioningCallback(); + method public abstract void onProvisioningComplete(); + method public abstract void onProvisioningFailure(int); + method public abstract void onProvisioningStatus(int); + field public static final int OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION = 22; // 0x16 + field public static final int OSU_FAILURE_AP_CONNECTION = 1; // 0x1 + field public static final int OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU = 8; // 0x8 + field public static final int OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE = 17; // 0x11 + field public static final int OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE = 21; // 0x15 + field public static final int OSU_FAILURE_NO_OSU_ACTIVITY_FOUND = 14; // 0xe + field public static final int OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE = 19; // 0x13 + field public static final int OSU_FAILURE_NO_PPS_MO = 16; // 0x10 + field public static final int OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE = 18; // 0x12 + field public static final int OSU_FAILURE_OSU_PROVIDER_NOT_FOUND = 23; // 0x17 + field public static final int OSU_FAILURE_PROVISIONING_ABORTED = 6; // 0x6 + field public static final int OSU_FAILURE_PROVISIONING_NOT_AVAILABLE = 7; // 0x7 + field public static final int OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES = 20; // 0x14 + field public static final int OSU_FAILURE_SERVER_CONNECTION = 3; // 0x3 + field public static final int OSU_FAILURE_SERVER_URL_INVALID = 2; // 0x2 + field public static final int OSU_FAILURE_SERVER_VALIDATION = 4; // 0x4 + field public static final int OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION = 5; // 0x5 + field public static final int OSU_FAILURE_SOAP_MESSAGE_EXCHANGE = 11; // 0xb + field public static final int OSU_FAILURE_START_REDIRECT_LISTENER = 12; // 0xc + field public static final int OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER = 13; // 0xd + field public static final int OSU_FAILURE_UNEXPECTED_COMMAND_TYPE = 9; // 0x9 + field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS = 15; // 0xf + field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE = 10; // 0xa + field public static final int OSU_STATUS_AP_CONNECTED = 2; // 0x2 + field public static final int OSU_STATUS_AP_CONNECTING = 1; // 0x1 + field public static final int OSU_STATUS_INIT_SOAP_EXCHANGE = 6; // 0x6 + field public static final int OSU_STATUS_REDIRECT_RESPONSE_RECEIVED = 8; // 0x8 + field public static final int OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS = 11; // 0xb + field public static final int OSU_STATUS_SECOND_SOAP_EXCHANGE = 9; // 0x9 + field public static final int OSU_STATUS_SERVER_CONNECTED = 5; // 0x5 + field public static final int OSU_STATUS_SERVER_CONNECTING = 3; // 0x3 + field public static final int OSU_STATUS_SERVER_VALIDATED = 4; // 0x4 + field public static final int OSU_STATUS_THIRD_SOAP_EXCHANGE = 10; // 0xa + field public static final int OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE = 7; // 0x7 + } + +} + +package android.net.wifi.p2p { + + public final class WifiP2pGroupList implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public java.util.List<android.net.wifi.p2p.WifiP2pGroup> getGroupList(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pGroupList> CREATOR; + } + + public class WifiP2pManager { + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void deletePersistentGroup(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, int, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void factoryReset(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public void requestPersistentGroupInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void setDeviceName(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull String, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY) public void setMiracastMode(int); + method @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY) public void setWfdInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pWfdInfo, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void setWifiP2pChannels(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, int, int, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void startListening(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void stopListening(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener); + field public static final String ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED = "android.net.wifi.p2p.action.WIFI_P2P_PERSISTENT_GROUPS_CHANGED"; + field public static final int MIRACAST_DISABLED = 0; // 0x0 + field public static final int MIRACAST_SINK = 2; // 0x2 + field public static final int MIRACAST_SOURCE = 1; // 0x1 + } + + public static interface WifiP2pManager.PersistentGroupInfoListener { + method public void onPersistentGroupInfoAvailable(@NonNull android.net.wifi.p2p.WifiP2pGroupList); + } + +} + +package android.net.wifi.rtt { + + public static final class RangingRequest.Builder { + method public android.net.wifi.rtt.RangingRequest.Builder addResponder(@NonNull android.net.wifi.rtt.ResponderConfig); + } + + public final class RangingResult implements android.os.Parcelable { + method @NonNull public byte[] getLci(); + method @NonNull public byte[] getLcr(); + } + + public final class ResponderConfig implements android.os.Parcelable { + ctor public ResponderConfig(@NonNull android.net.MacAddress, int, boolean, int, int, int, int, int); + ctor public ResponderConfig(@NonNull android.net.wifi.aware.PeerHandle, int, boolean, int, int, int, int, int); + method public int describeContents(); + method public static android.net.wifi.rtt.ResponderConfig fromScanResult(android.net.wifi.ScanResult); + method public static android.net.wifi.rtt.ResponderConfig fromWifiAwarePeerHandleWithDefaults(android.net.wifi.aware.PeerHandle); + method public static android.net.wifi.rtt.ResponderConfig fromWifiAwarePeerMacAddressWithDefaults(android.net.MacAddress); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CHANNEL_WIDTH_160MHZ = 3; // 0x3 + field public static final int CHANNEL_WIDTH_20MHZ = 0; // 0x0 + field public static final int CHANNEL_WIDTH_40MHZ = 1; // 0x1 + field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2 + field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4 + field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.ResponderConfig> CREATOR; + field public static final int PREAMBLE_HE = 3; // 0x3 + field public static final int PREAMBLE_HT = 1; // 0x1 + field public static final int PREAMBLE_LEGACY = 0; // 0x0 + field public static final int PREAMBLE_VHT = 2; // 0x2 + field public static final int RESPONDER_AP = 0; // 0x0 + field public static final int RESPONDER_AWARE = 4; // 0x4 + field public static final int RESPONDER_P2P_CLIENT = 3; // 0x3 + field public static final int RESPONDER_P2P_GO = 2; // 0x2 + field public static final int RESPONDER_STA = 1; // 0x1 + field public final int centerFreq0; + field public final int centerFreq1; + field public final int channelWidth; + field public final int frequency; + field public final android.net.MacAddress macAddress; + field public final android.net.wifi.aware.PeerHandle peerHandle; + field public final int preamble; + field public final int responderType; + field public final boolean supports80211mc; + } + + public final class ResponderLocation implements android.os.Parcelable { + method public boolean getExtraInfoOnAssociationIndication(); + } + + public class WifiRttManager { + method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE}) public void cancelRanging(@Nullable android.os.WorkSource); + method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_WIFI_STATE}) public void startRanging(@Nullable android.os.WorkSource, @NonNull android.net.wifi.rtt.RangingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.rtt.RangingResultCallback); + } + +} + diff --git a/wifi/api/system-removed.txt b/wifi/api/system-removed.txt new file mode 100644 index 000000000000..35f9726d30fc --- /dev/null +++ b/wifi/api/system-removed.txt @@ -0,0 +1,16 @@ +// Signature format: 2.0 +package android.net.wifi { + + @Deprecated public class BatchedScanResult implements android.os.Parcelable { + ctor public BatchedScanResult(); + ctor public BatchedScanResult(android.net.wifi.BatchedScanResult); + field public final java.util.List<android.net.wifi.ScanResult> scanResults; + field public boolean truncated; + } + + public class ScanResult implements android.os.Parcelable { + field public boolean untrusted; + } + +} + diff --git a/wifi/java/android/net/wifi/WifiMigration.java b/wifi/java/android/net/wifi/WifiMigration.java index 008b18bf04c3..f2a1aec550b1 100755 --- a/wifi/java/android/net/wifi/WifiMigration.java +++ b/wifi/java/android/net/wifi/WifiMigration.java @@ -16,25 +16,252 @@ package android.net.wifi; +import static android.os.Environment.getDataMiscCeDirectory; +import static android.os.Environment.getDataMiscDirectory; + +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; +import android.os.UserHandle; import android.provider.Settings; +import android.util.AtomicFile; +import android.util.SparseArray; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Objects; /** * Class used to provide one time hooks for existing OEM devices to migrate their config store - * data and other settings to the wifi mainline module. + * data and other settings to the wifi apex. * @hide */ @SystemApi public final class WifiMigration { + /** + * Directory to read the wifi config store files from under. + */ + private static final String LEGACY_WIFI_STORE_DIRECTORY_NAME = "wifi"; + /** + * Config store file for general shared store file. + * AOSP Path on Android 10: /data/misc/wifi/WifiConfigStore.xml + */ + public static final int STORE_FILE_SHARED_GENERAL = 0; + /** + * Config store file for softap shared store file. + * AOSP Path on Android 10: /data/misc/wifi/softap.conf + */ + public static final int STORE_FILE_SHARED_SOFTAP = 1; + /** + * Config store file for general user store file. + * AOSP Path on Android 10: /data/misc_ce/<userId>/wifi/WifiConfigStore.xml + */ + public static final int STORE_FILE_USER_GENERAL = 2; + /** + * Config store file for network suggestions user store file. + * AOSP Path on Android 10: /data/misc_ce/<userId>/wifi/WifiConfigStoreNetworkSuggestions.xml + */ + public static final int STORE_FILE_USER_NETWORK_SUGGESTIONS = 3; + + /** @hide */ + @IntDef(prefix = { "STORE_FILE_SHARED_" }, value = { + STORE_FILE_SHARED_GENERAL, + STORE_FILE_SHARED_SOFTAP, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SharedStoreFileId { } + + /** @hide */ + @IntDef(prefix = { "STORE_FILE_USER_" }, value = { + STORE_FILE_USER_GENERAL, + STORE_FILE_USER_NETWORK_SUGGESTIONS + }) + @Retention(RetentionPolicy.SOURCE) + public @interface UserStoreFileId { } + + /** + * Mapping of Store file Id to Store file names. + * + * NOTE: This is the default path for the files on AOSP devices. If the OEM has modified + * the path or renamed the files, please edit this appropriately. + */ + private static final SparseArray<String> STORE_ID_TO_FILE_NAME = + new SparseArray<String>() {{ + put(STORE_FILE_SHARED_GENERAL, "WifiConfigStore.xml"); + put(STORE_FILE_SHARED_SOFTAP, "softap.conf"); + put(STORE_FILE_USER_GENERAL, "WifiConfigStore.xml"); + put(STORE_FILE_USER_NETWORK_SUGGESTIONS, "WifiConfigStoreNetworkSuggestions.xml"); + }}; + + /** + * Pre-apex wifi shared folder. + */ + private static File getLegacyWifiSharedDirectory() { + return new File(getDataMiscDirectory(), LEGACY_WIFI_STORE_DIRECTORY_NAME); + } + + /** + * Pre-apex wifi user folder. + */ + private static File getLegacyWifiUserDirectory(int userId) { + return new File(getDataMiscCeDirectory(userId), LEGACY_WIFI_STORE_DIRECTORY_NAME); + } + + /** + * Legacy files were stored as AtomicFile. So, always use AtomicFile to operate on it to ensure + * data integrity. + */ + private static AtomicFile getSharedAtomicFile(@SharedStoreFileId int storeFileId) { + return new AtomicFile(new File( + getLegacyWifiSharedDirectory(), + STORE_ID_TO_FILE_NAME.get(storeFileId))); + } + + /** + * Legacy files were stored as AtomicFile. So, always use AtomicFile to operate on it to ensure + * data integrity. + */ + private static AtomicFile getUserAtomicFile(@UserStoreFileId int storeFileId, int userId) { + return new AtomicFile(new File( + getLegacyWifiUserDirectory(userId), + STORE_ID_TO_FILE_NAME.get(storeFileId))); + } private WifiMigration() { } /** + * Load data from legacy shared wifi config store file. + * TODO(b/149418926): Add XSD for the AOSP file format for each file from R. + * <p> + * Note: + * <li>OEMs need to change the implementation of + * {@link #convertAndRetrieveSharedConfigStoreFile(int)} only if their existing config store + * format or file locations differs from the vanilla AOSP implementation.</li> + * <li>The wifi apex will invoke + * {@link #convertAndRetrieveSharedConfigStoreFile(int)} + * method on every bootup, it is the responsibility of the OEM implementation to ensure that + * they perform the necessary in place conversion of their config store file to conform to the + * AOSP format. The OEM should ensure that the method should only return the + * {@link InputStream} stream for the data to be migrated only on the first bootup.</li> + * <li>Once the migration is done, the apex will invoke + * {@link #removeSharedConfigStoreFile(int)} to delete the store file.</li> + * <li>The only relevant invocation of {@link #convertAndRetrieveSharedConfigStoreFile(int)} + * occurs when a previously released device upgrades to the wifi apex from an OEM + * implementation of the wifi stack. + * <li>Ensure that the legacy file paths are accessible to the wifi module (sepolicy rules, file + * permissions, etc). Since the wifi service continues to run inside system_server process, this + * method will be called from the same context (so ideally the file should still be accessible). + * </li> + * + * @param storeFileId Identifier for the config store file. One of + * {@link #STORE_FILE_SHARED_GENERAL} or {@link #STORE_FILE_SHARED_GENERAL} + * @return Instance of {@link InputStream} for migrating data, null if no migration is + * necessary. + * @throws IllegalArgumentException on invalid storeFileId. + */ + @Nullable + public static InputStream convertAndRetrieveSharedConfigStoreFile( + @SharedStoreFileId int storeFileId) { + if (storeFileId != STORE_FILE_SHARED_GENERAL && storeFileId != STORE_FILE_SHARED_SOFTAP) { + throw new IllegalArgumentException("Invalid shared store file id"); + } + try { + // OEMs should do conversions necessary here before returning the stream. + return getSharedAtomicFile(storeFileId).openRead(); + } catch (FileNotFoundException e) { + return null; + } + } + + /** + * Remove the legacy shared wifi config store file. + * + * @param storeFileId Identifier for the config store file. One of + * {@link #STORE_FILE_SHARED_GENERAL} or {@link #STORE_FILE_SHARED_GENERAL} + * @throws IllegalArgumentException on invalid storeFileId. + */ + public static void removeSharedConfigStoreFile(@SharedStoreFileId int storeFileId) { + if (storeFileId != STORE_FILE_SHARED_GENERAL && storeFileId != STORE_FILE_SHARED_SOFTAP) { + throw new IllegalArgumentException("Invalid shared store file id"); + } + getSharedAtomicFile(storeFileId).delete(); + } + + /** + * Load data from legacy user wifi config store file. + * TODO(b/149418926): Add XSD for the AOSP file format for each file from R. + * <p> + * Note: + * <li>OEMs need to change the implementation of + * {@link #convertAndRetrieveUserConfigStoreFile(int, UserHandle)} only if their existing config + * store format or file locations differs from the vanilla AOSP implementation.</li> + * <li>The wifi apex will invoke + * {@link #convertAndRetrieveUserConfigStoreFile(int, UserHandle)} + * method on every bootup, it is the responsibility of the OEM implementation to ensure that + * they perform the necessary in place conversion of their config store file to conform to the + * AOSP format. The OEM should ensure that the method should only return the + * {@link InputStream} stream for the data to be migrated only on the first bootup.</li> + * <li>Once the migration is done, the apex will invoke + * {@link #removeUserConfigStoreFile(int, UserHandle)} to delete the store file.</li> + * <li>The only relevant invocation of + * {@link #convertAndRetrieveUserConfigStoreFile(int, UserHandle)} occurs when a previously + * released device upgrades to the wifi apex from an OEM implementation of the wifi + * stack. + * </li> + * <li>Ensure that the legacy file paths are accessible to the wifi module (sepolicy rules, file + * permissions, etc). Since the wifi service continues to run inside system_server process, this + * method will be called from the same context (so ideally the file should still be accessible). + * </li> + * + * @param storeFileId Identifier for the config store file. One of + * {@link #STORE_FILE_USER_GENERAL} or {@link #STORE_FILE_USER_NETWORK_SUGGESTIONS} + * @param userHandle User handle. + * @return Instance of {@link InputStream} for migrating data, null if no migration is + * necessary. + * @throws IllegalArgumentException on invalid storeFileId or userHandle. + */ + @Nullable + public static InputStream convertAndRetrieveUserConfigStoreFile( + @UserStoreFileId int storeFileId, @NonNull UserHandle userHandle) { + if (storeFileId != STORE_FILE_USER_GENERAL + && storeFileId != STORE_FILE_USER_NETWORK_SUGGESTIONS) { + throw new IllegalArgumentException("Invalid user store file id"); + } + Objects.requireNonNull(userHandle); + try { + // OEMs should do conversions necessary here before returning the stream. + return getUserAtomicFile(storeFileId, userHandle.getIdentifier()).openRead(); + } catch (FileNotFoundException e) { + return null; + } + } + + /** + * Remove the legacy user wifi config store file. + * + * @param storeFileId Identifier for the config store file. One of + * {@link #STORE_FILE_USER_GENERAL} or {@link #STORE_FILE_USER_NETWORK_SUGGESTIONS} + * @param userHandle User handle. + * @throws IllegalArgumentException on invalid storeFileId or userHandle. + */ + public static void removeUserConfigStoreFile( + @UserStoreFileId int storeFileId, @NonNull UserHandle userHandle) { + if (storeFileId != STORE_FILE_USER_GENERAL + && storeFileId != STORE_FILE_USER_NETWORK_SUGGESTIONS) { + throw new IllegalArgumentException("Invalid user store file id"); + } + Objects.requireNonNull(userHandle); + getUserAtomicFile(storeFileId, userHandle.getIdentifier()).delete(); + } + + /** * Container for all the wifi settings data to migrate. */ public static final class SettingsMigrationData implements Parcelable { @@ -260,7 +487,7 @@ public final class WifiMigration { * <li> This is method is invoked once on the first bootup. OEM can safely delete these settings * once the migration is complete. The first & only relevant invocation of * {@link #loadFromSettings(Context)} ()} occurs when a previously released - * device upgrades to the wifi mainline module from an OEM implementation of the wifi stack. + * device upgrades to the wifi apex from an OEM implementation of the wifi stack. * </li> * * @param context Context to use for loading the settings provider. |