diff options
146 files changed, 2112 insertions, 3054 deletions
diff --git a/api/current.txt b/api/current.txt index ccfc0f5fd57f..d6a905d60c0a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23776,27 +23776,6 @@ package android.media { field public static final int QUALITY_MEDIUM = 1; // 0x1 } - public class DataSourceDesc { - method public long getEndPosition(); - method @Nullable public String getMediaId(); - method public long getStartPosition(); - field public static final long LONG_MAX_TIME_MS = 576460752303423L; // 0x20c49ba5e353fL - field public static final long POSITION_UNKNOWN = 576460752303423L; // 0x20c49ba5e353fL - } - - public static final class DataSourceDesc.Builder { - ctor public DataSourceDesc.Builder(); - ctor public DataSourceDesc.Builder(@Nullable android.media.DataSourceDesc); - method @NonNull public android.media.DataSourceDesc build(); - method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.net.Uri); - method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.net.Uri, @Nullable java.util.Map<java.lang.String,java.lang.String>, @Nullable java.util.List<java.net.HttpCookie>); - method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor); - method @NonNull public android.media.DataSourceDesc.Builder setDataSource(@NonNull android.os.ParcelFileDescriptor, long, long); - method @NonNull public android.media.DataSourceDesc.Builder setEndPosition(long); - method @NonNull public android.media.DataSourceDesc.Builder setMediaId(@Nullable String); - method @NonNull public android.media.DataSourceDesc.Builder setStartPosition(long); - } - public final class DeniedByServerException extends android.media.MediaDrmException { ctor public DeniedByServerException(String); } @@ -25555,225 +25534,6 @@ package android.media { field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1 } - public class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable { - ctor public MediaPlayer2(@NonNull android.content.Context); - method public void addOnRoutingChangedListener(@NonNull android.media.AudioRouting.OnRoutingChangedListener, @Nullable android.os.Handler); - method @NonNull public Object attachAuxEffect(int); - method public boolean cancelCommand(@NonNull Object); - method public void clearDrmEventCallback(); - method @NonNull public Object clearNextDataSources(); - method public void clearPendingCommands(); - method public void close(); - method @NonNull public Object deselectTrack(@NonNull android.media.MediaPlayer2.TrackInfo); - method @NonNull public Object deselectTrack(@NonNull android.media.DataSourceDesc, @NonNull android.media.MediaPlayer2.TrackInfo); - method @NonNull public android.media.AudioAttributes getAudioAttributes(); - method public int getAudioSessionId(); - method public long getBufferedPosition(); - method public long getBufferedPosition(@NonNull android.media.DataSourceDesc); - method @Nullable public android.media.DataSourceDesc getCurrentDataSource(); - method public long getCurrentPosition(); - method public long getDuration(); - method public long getDuration(@NonNull android.media.DataSourceDesc); - method public float getMaxPlayerVolume(); - method @Nullable public android.os.PersistableBundle getMetrics(); - method @NonNull public android.media.PlaybackParams getPlaybackParams(); - method public float getPlayerVolume(); - method @Nullable public android.media.AudioDeviceInfo getPreferredDevice(); - method @Nullable public android.media.AudioDeviceInfo getRoutedDevice(); - method @Nullable public android.media.MediaPlayer2.TrackInfo getSelectedTrack(int); - method @Nullable public android.media.MediaPlayer2.TrackInfo getSelectedTrack(@NonNull android.media.DataSourceDesc, int); - method public int getState(); - method @NonNull public android.media.SyncParams getSyncParams(); - method @Nullable public android.media.MediaTimestamp getTimestamp(); - method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo(); - method @NonNull public java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo(@NonNull android.media.DataSourceDesc); - method @NonNull public android.util.Size getVideoSize(); - method public boolean isLooping(); - method @NonNull public Object loopCurrent(boolean); - method @NonNull public Object notifyWhenCommandLabelReached(@NonNull Object); - method @NonNull public Object pause(); - method @NonNull public Object play(); - method @NonNull public Object prepare(); - method public void registerEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaPlayer2.EventCallback); - method public void removeOnRoutingChangedListener(@NonNull android.media.AudioRouting.OnRoutingChangedListener); - method public void reset(); - method @NonNull public Object seekTo(long); - method @NonNull public Object seekTo(long, int); - method @NonNull public Object selectTrack(@NonNull android.media.MediaPlayer2.TrackInfo); - method @NonNull public Object selectTrack(@NonNull android.media.DataSourceDesc, @NonNull android.media.MediaPlayer2.TrackInfo); - method @NonNull public Object setAudioAttributes(@NonNull android.media.AudioAttributes); - method @NonNull public Object setAudioSessionId(int); - method @NonNull public Object setAuxEffectSendLevel(float); - method @NonNull public Object setDataSource(@NonNull android.media.DataSourceDesc); - method @NonNull public Object setDisplay(@Nullable android.view.SurfaceHolder); - method public void setDrmEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaPlayer2.DrmEventCallback); - method @NonNull public Object setNextDataSource(@NonNull android.media.DataSourceDesc); - method @NonNull public Object setNextDataSources(@NonNull java.util.List<android.media.DataSourceDesc>); - method @NonNull public Object setPlaybackParams(@NonNull android.media.PlaybackParams); - method @NonNull public Object setPlayerVolume(float); - method public boolean setPreferredDevice(@Nullable android.media.AudioDeviceInfo); - method @NonNull public Object setScreenOnWhilePlaying(boolean); - method @NonNull public Object setSurface(@Nullable android.view.Surface); - method @NonNull public Object setSyncParams(@NonNull android.media.SyncParams); - method @NonNull public Object setWakeLock(@NonNull android.os.PowerManager.WakeLock); - method @NonNull public Object skipToNext(); - method public void unregisterEventCallback(@NonNull android.media.MediaPlayer2.EventCallback); - field public static final int CALL_COMPLETED_ATTACH_AUX_EFFECT = 1; // 0x1 - field public static final int CALL_COMPLETED_CLEAR_NEXT_DATA_SOURCES = 30; // 0x1e - field public static final int CALL_COMPLETED_DESELECT_TRACK = 2; // 0x2 - field public static final int CALL_COMPLETED_LOOP_CURRENT = 3; // 0x3 - field public static final int CALL_COMPLETED_PAUSE = 4; // 0x4 - field public static final int CALL_COMPLETED_PLAY = 5; // 0x5 - field public static final int CALL_COMPLETED_PREPARE = 6; // 0x6 - field public static final int CALL_COMPLETED_SEEK_TO = 14; // 0xe - field public static final int CALL_COMPLETED_SELECT_TRACK = 15; // 0xf - field public static final int CALL_COMPLETED_SET_AUDIO_ATTRIBUTES = 16; // 0x10 - field public static final int CALL_COMPLETED_SET_AUDIO_SESSION_ID = 17; // 0x11 - field public static final int CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL = 18; // 0x12 - field public static final int CALL_COMPLETED_SET_DATA_SOURCE = 19; // 0x13 - field public static final int CALL_COMPLETED_SET_DISPLAY = 33; // 0x21 - field public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCE = 22; // 0x16 - field public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCES = 23; // 0x17 - field public static final int CALL_COMPLETED_SET_PLAYBACK_PARAMS = 24; // 0x18 - field public static final int CALL_COMPLETED_SET_PLAYER_VOLUME = 26; // 0x1a - field public static final int CALL_COMPLETED_SET_SCREEN_ON_WHILE_PLAYING = 35; // 0x23 - field public static final int CALL_COMPLETED_SET_SURFACE = 27; // 0x1b - field public static final int CALL_COMPLETED_SET_SYNC_PARAMS = 28; // 0x1c - field public static final int CALL_COMPLETED_SET_WAKE_LOCK = 34; // 0x22 - field public static final int CALL_COMPLETED_SKIP_TO_NEXT = 29; // 0x1d - field public static final int CALL_STATUS_BAD_VALUE = 2; // 0x2 - field public static final int CALL_STATUS_ERROR_IO = 4; // 0x4 - field public static final int CALL_STATUS_ERROR_UNKNOWN = -2147483648; // 0x80000000 - field public static final int CALL_STATUS_INVALID_OPERATION = 1; // 0x1 - field public static final int CALL_STATUS_NO_DRM_SCHEME = 6; // 0x6 - field public static final int CALL_STATUS_NO_ERROR = 0; // 0x0 - field public static final int CALL_STATUS_PERMISSION_DENIED = 3; // 0x3 - field public static final int CALL_STATUS_SKIPPED = 5; // 0x5 - field public static final int MEDIA_ERROR_IO = -1004; // 0xfffffc14 - field public static final int MEDIA_ERROR_MALFORMED = -1007; // 0xfffffc11 - field public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200; // 0xc8 - field public static final int MEDIA_ERROR_TIMED_OUT = -110; // 0xffffff92 - field public static final int MEDIA_ERROR_UNKNOWN = 1; // 0x1 - field public static final int MEDIA_ERROR_UNSUPPORTED = -1010; // 0xfffffc0e - field public static final int MEDIA_INFO_AUDIO_NOT_PLAYING = 804; // 0x324 - field public static final int MEDIA_INFO_AUDIO_RENDERING_START = 4; // 0x4 - field public static final int MEDIA_INFO_BAD_INTERLEAVING = 800; // 0x320 - field public static final int MEDIA_INFO_BUFFERING_END = 702; // 0x2be - field public static final int MEDIA_INFO_BUFFERING_START = 701; // 0x2bd - field public static final int MEDIA_INFO_BUFFERING_UPDATE = 704; // 0x2c0 - field public static final int MEDIA_INFO_DATA_SOURCE_END = 5; // 0x5 - field public static final int MEDIA_INFO_DATA_SOURCE_LIST_END = 6; // 0x6 - field public static final int MEDIA_INFO_DATA_SOURCE_REPEAT = 7; // 0x7 - field public static final int MEDIA_INFO_DATA_SOURCE_START = 2; // 0x2 - field public static final int MEDIA_INFO_METADATA_UPDATE = 802; // 0x322 - field public static final int MEDIA_INFO_NOT_SEEKABLE = 801; // 0x321 - field public static final int MEDIA_INFO_PREPARED = 100; // 0x64 - field public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902; // 0x386 - field public static final int MEDIA_INFO_UNKNOWN = 1; // 0x1 - field public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901; // 0x385 - field public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805; // 0x325 - field public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3; // 0x3 - field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc - field public static final int PLAYER_STATE_ERROR = 1005; // 0x3ed - field public static final int PLAYER_STATE_IDLE = 1001; // 0x3e9 - field public static final int PLAYER_STATE_PAUSED = 1003; // 0x3eb - field public static final int PLAYER_STATE_PLAYING = 1004; // 0x3ec - field public static final int PLAYER_STATE_PREPARED = 1002; // 0x3ea - field public static final int PREPARE_DRM_STATUS_KEY_EXCHANGE_ERROR = 7; // 0x7 - field public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; // 0x3 - field public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; // 0x1 - field public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; // 0x2 - field public static final int PREPARE_DRM_STATUS_RESOURCE_BUSY = 5; // 0x5 - field public static final int PREPARE_DRM_STATUS_RESTORE_ERROR = 6; // 0x6 - field public static final int PREPARE_DRM_STATUS_SUCCESS = 0; // 0x0 - field public static final int PREPARE_DRM_STATUS_UNSUPPORTED_SCHEME = 4; // 0x4 - field public static final int SEEK_CLOSEST = 3; // 0x3 - field public static final int SEEK_CLOSEST_SYNC = 2; // 0x2 - field public static final int SEEK_NEXT_SYNC = 1; // 0x1 - field public static final int SEEK_PREVIOUS_SYNC = 0; // 0x0 - } - - public abstract static class MediaPlayer2.DrmEventCallback { - ctor public MediaPlayer2.DrmEventCallback(); - method public void onDrmConfig(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaDrm); - method @Nullable public abstract android.media.MediaPlayer2.DrmPreparationInfo onDrmInfo(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaPlayer2.DrmInfo); - method @NonNull public abstract byte[] onDrmKeyRequest(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaDrm.KeyRequest); - method public void onDrmPrepared(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, @Nullable byte[]); - } - - public static final class MediaPlayer2.DrmInfo { - method @NonNull public java.util.Map<java.util.UUID,byte[]> getPssh(); - method @NonNull public java.util.List<java.util.UUID> getSupportedSchemes(); - } - - public static final class MediaPlayer2.DrmPreparationInfo { - method @Nullable public byte[] getInitData(); - method @Nullable public byte[] getKeySetId(); - method public int getKeyType(); - method @Nullable public String getMimeType(); - method @Nullable public java.util.Map<java.lang.String,java.lang.String> getOptionalParameters(); - method @NonNull public java.util.UUID getUuid(); - } - - public static final class MediaPlayer2.DrmPreparationInfo.Builder { - ctor public MediaPlayer2.DrmPreparationInfo.Builder(@NonNull java.util.UUID); - method @NonNull public android.media.MediaPlayer2.DrmPreparationInfo build(); - method @NonNull public android.media.MediaPlayer2.DrmPreparationInfo.Builder setInitData(@Nullable byte[]); - method @NonNull public android.media.MediaPlayer2.DrmPreparationInfo.Builder setKeySetId(@Nullable byte[]); - method @NonNull public android.media.MediaPlayer2.DrmPreparationInfo.Builder setKeyType(int); - method @NonNull public android.media.MediaPlayer2.DrmPreparationInfo.Builder setMimeType(@Nullable String); - method @NonNull public android.media.MediaPlayer2.DrmPreparationInfo.Builder setOptionalParameters(@Nullable java.util.Map<java.lang.String,java.lang.String>); - } - - public static class MediaPlayer2.EventCallback { - ctor public MediaPlayer2.EventCallback(); - method public void onCallCompleted(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, int); - method public void onCommandLabelReached(@NonNull android.media.MediaPlayer2, @NonNull Object); - method public void onError(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, int); - method public void onInfo(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, int, int); - method public void onMediaTimeDiscontinuity(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaTimestamp); - method public void onSubtitleData(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.MediaPlayer2.SubtitleData); - method public void onTimedMetaDataAvailable(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.media.TimedMetaData); - method public void onVideoSizeChanged(@NonNull android.media.MediaPlayer2, @NonNull android.media.DataSourceDesc, @NonNull android.util.Size); - } - - public static final class MediaPlayer2.MetricsConstants { - field public static final String CODEC_AUDIO = "android.media.mediaplayer.audio.codec"; - field public static final String CODEC_VIDEO = "android.media.mediaplayer.video.codec"; - field public static final String DURATION = "android.media.mediaplayer.durationMs"; - field public static final String ERRORS = "android.media.mediaplayer.err"; - field public static final String ERROR_CODE = "android.media.mediaplayer.errcode"; - field public static final String FRAMES = "android.media.mediaplayer.frames"; - field public static final String FRAMES_DROPPED = "android.media.mediaplayer.dropped"; - field public static final String HEIGHT = "android.media.mediaplayer.height"; - field public static final String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime"; - field public static final String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime"; - field public static final String PLAYING = "android.media.mediaplayer.playingMs"; - field public static final String WIDTH = "android.media.mediaplayer.width"; - } - - public static final class MediaPlayer2.NoDrmSchemeException extends android.media.MediaDrmException { - ctor public MediaPlayer2.NoDrmSchemeException(@Nullable String); - } - - public static final class MediaPlayer2.SubtitleData { - method @NonNull public byte[] getData(); - method public long getDurationUs(); - method public long getStartTimeUs(); - method @NonNull public android.media.MediaPlayer2.TrackInfo getTrackInfo(); - } - - public static class MediaPlayer2.TrackInfo { - method @Nullable public android.media.MediaFormat getFormat(); - method @NonNull public String getLanguage(); - method public int getTrackType(); - field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2 - field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5 - field public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; // 0x4 - field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0 - field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1 - } - public class MediaRecorder implements android.media.AudioRecordingMonitor android.media.AudioRouting android.media.MicrophoneDirection { ctor public MediaRecorder(); method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler); @@ -28756,10 +28516,13 @@ package android.net { public final class DnsResolver { method @NonNull public static android.net.DnsResolver getInstance(); - method public <T> void query(@Nullable android.net.Network, @NonNull byte[], int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.AnswerCallback<T>); - method public <T> void query(@Nullable android.net.Network, @NonNull String, int, int, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.AnswerCallback<T>); - method public void query(@Nullable android.net.Network, @NonNull String, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.InetAddressAnswerCallback); + method public void query(@Nullable android.net.Network, @NonNull String, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super java.util.List<java.net.InetAddress>>); + method public void query(@Nullable android.net.Network, @NonNull String, int, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super java.util.List<java.net.InetAddress>>); + method public void rawQuery(@Nullable android.net.Network, @NonNull byte[], int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super byte[]>); + method public void rawQuery(@Nullable android.net.Network, @NonNull String, int, int, int, @NonNull java.util.concurrent.Executor, @Nullable android.os.CancellationSignal, @NonNull android.net.DnsResolver.Callback<? super byte[]>); field public static final int CLASS_IN = 1; // 0x1 + field public static final int ERROR_PARSE = 0; // 0x0 + field public static final int ERROR_SYSTEM = 1; // 0x1 field public static final int FLAG_EMPTY = 0; // 0x0 field public static final int FLAG_NO_CACHE_LOOKUP = 4; // 0x4 field public static final int FLAG_NO_CACHE_STORE = 2; // 0x2 @@ -28768,23 +28531,13 @@ package android.net { field public static final int TYPE_AAAA = 28; // 0x1c } - public abstract static class DnsResolver.AnswerCallback<T> { - ctor public DnsResolver.AnswerCallback(@NonNull android.net.DnsResolver.AnswerParser<T>); - method public abstract void onAnswer(@NonNull T); - method public abstract void onParseException(@NonNull android.net.ParseException); - method public abstract void onQueryException(@NonNull android.system.ErrnoException); - } - - public static interface DnsResolver.AnswerParser<T> { - method @NonNull public T parse(@NonNull byte[]) throws android.net.ParseException; - } - - public abstract static class DnsResolver.InetAddressAnswerCallback extends android.net.DnsResolver.AnswerCallback<java.util.List<java.net.InetAddress>> { - ctor public DnsResolver.InetAddressAnswerCallback(); + public static interface DnsResolver.Callback<T> { + method public void onAnswer(@NonNull T, int); + method public void onError(@NonNull android.net.DnsResolver.DnsException); } - public abstract static class DnsResolver.RawAnswerCallback extends android.net.DnsResolver.AnswerCallback<byte[]> { - ctor public DnsResolver.RawAnswerCallback(); + public static class DnsResolver.DnsException extends java.lang.Exception { + field public final int code; } public class InetAddresses { @@ -29110,8 +28863,6 @@ package android.net { } public class ParseException extends java.lang.RuntimeException { - ctor public ParseException(@NonNull String); - ctor public ParseException(@NonNull String, @NonNull Throwable); field public String response; } @@ -38591,7 +38342,6 @@ package android.provider { field public static final String ARTIST_KEY = "artist_key"; field public static final String BOOKMARK = "bookmark"; field public static final String COMPOSER = "composer"; - field public static final String DURATION = "duration"; field public static final String IS_ALARM = "is_alarm"; field public static final String IS_AUDIOBOOK = "is_audiobook"; field public static final String IS_MUSIC = "is_music"; @@ -38674,7 +38424,6 @@ package android.provider { } public static interface MediaStore.DownloadColumns extends android.provider.MediaStore.MediaColumns { - field public static final String DESCRIPTION = "description"; field public static final String DOWNLOAD_URI = "download_uri"; field public static final String REFERER_URI = "referer_uri"; } @@ -38709,16 +38458,11 @@ package android.provider { } public static interface MediaStore.Images.ImageColumns extends android.provider.MediaStore.MediaColumns { - field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; - field public static final String BUCKET_ID = "bucket_id"; - field public static final String DATE_TAKEN = "datetaken"; field public static final String DESCRIPTION = "description"; - field public static final String GROUP_ID = "group_id"; field public static final String IS_PRIVATE = "isprivate"; field @Deprecated public static final String LATITUDE = "latitude"; field @Deprecated public static final String LONGITUDE = "longitude"; field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic"; - field public static final String ORIENTATION = "orientation"; field @Deprecated public static final String PICASA_ID = "picasa_id"; } @@ -38762,16 +38506,22 @@ package android.provider { } public static interface MediaStore.MediaColumns extends android.provider.BaseColumns { + field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; + field public static final String BUCKET_ID = "bucket_id"; field @Deprecated public static final String DATA = "_data"; field public static final String DATE_ADDED = "date_added"; field public static final String DATE_EXPIRES = "date_expires"; field public static final String DATE_MODIFIED = "date_modified"; + field public static final String DATE_TAKEN = "datetaken"; field public static final String DISPLAY_NAME = "_display_name"; field public static final String DOCUMENT_ID = "document_id"; + field public static final String DURATION = "duration"; + field public static final String GROUP_ID = "group_id"; field public static final String HEIGHT = "height"; field public static final String INSTANCE_ID = "instance_id"; field public static final String IS_PENDING = "is_pending"; field public static final String MIME_TYPE = "mime_type"; + field public static final String ORIENTATION = "orientation"; field public static final String ORIGINAL_DOCUMENT_ID = "original_document_id"; field public static final String OWNER_PACKAGE_NAME = "owner_package_name"; field public static final String RELATIVE_PATH = "relative_path"; @@ -38820,13 +38570,8 @@ package android.provider { field public static final String ALBUM = "album"; field public static final String ARTIST = "artist"; field public static final String BOOKMARK = "bookmark"; - field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; - field public static final String BUCKET_ID = "bucket_id"; field public static final String CATEGORY = "category"; - field public static final String DATE_TAKEN = "datetaken"; field public static final String DESCRIPTION = "description"; - field public static final String DURATION = "duration"; - field public static final String GROUP_ID = "group_id"; field public static final String IS_PRIVATE = "isprivate"; field public static final String LANGUAGE = "language"; field @Deprecated public static final String LATITUDE = "latitude"; @@ -48577,7 +48322,6 @@ package android.util { method public static boolean logEvent(int); method public static boolean logStart(int); method public static boolean logStop(int); - method public static void write(int, @NonNull java.lang.Object...); } public class StringBuilderPrinter implements android.util.Printer { @@ -54023,7 +53767,7 @@ package android.view.textclassifier { method public int getEnd(); method @NonNull public String getEntity(int); method public int getEntityCount(); - method public android.os.Bundle getExtras(); + method @NonNull public android.os.Bundle getExtras(); method public int getStart(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.TextLink> CREATOR; diff --git a/api/removed.txt b/api/removed.txt index 70ff50ed40a6..883632623a83 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -522,6 +522,22 @@ package android.provider { method @Deprecated public static void untrash(@NonNull android.content.Context, @NonNull android.net.Uri); } + public static interface MediaStore.Audio.AudioColumns extends android.provider.MediaStore.MediaColumns { + field public static final String DURATION = "duration"; + } + + public static interface MediaStore.DownloadColumns extends android.provider.MediaStore.MediaColumns { + field @Deprecated public static final String DESCRIPTION = "description"; + } + + public static interface MediaStore.Images.ImageColumns extends android.provider.MediaStore.MediaColumns { + field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; + field public static final String BUCKET_ID = "bucket_id"; + field public static final String DATE_TAKEN = "datetaken"; + field public static final String GROUP_ID = "group_id"; + field public static final String ORIENTATION = "orientation"; + } + public static interface MediaStore.MediaColumns extends android.provider.BaseColumns { field @Deprecated public static final String HASH = "_hash"; field @Deprecated public static final String IS_TRASHED = "is_trashed"; @@ -546,6 +562,14 @@ package android.provider { method @NonNull public android.net.Uri publish(); } + public static interface MediaStore.Video.VideoColumns extends android.provider.MediaStore.MediaColumns { + field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; + field public static final String BUCKET_ID = "bucket_id"; + field public static final String DATE_TAKEN = "datetaken"; + field public static final String DURATION = "duration"; + field public static final String GROUP_ID = "group_id"; + } + public static final class Settings.Global extends android.provider.Settings.NameValueTable { field @Deprecated public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync"; } diff --git a/api/system-current.txt b/api/system-current.txt index 026ce092ba85..2d8b09293abb 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -254,8 +254,6 @@ package android { field public static final int config_defaultAssistant = 17039393; // 0x1040021 field public static final int config_defaultBrowser = 17039394; // 0x1040022 field public static final int config_defaultDialer = 17039395; // 0x1040023 - field public static final int config_defaultGallery = 17039398; // 0x1040026 - field public static final int config_defaultMusic = 17039397; // 0x1040025 field public static final int config_defaultSms = 17039396; // 0x1040024 field public static final int config_feedbackIntentExtraKey = 17039391; // 0x104001f field public static final int config_feedbackIntentNameKey = 17039392; // 0x1040020 @@ -564,6 +562,7 @@ package android.app { method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]); 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; @@ -1217,7 +1216,6 @@ package android.app.usage { method public int getUsageSource(); method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void registerAppUsageLimitObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @Nullable android.app.PendingIntent); method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerAppUsageObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent); - method @Deprecated @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent); method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent); method public void reportUsageStart(@NonNull android.app.Activity, @NonNull String); method public void reportUsageStart(@NonNull android.app.Activity, @NonNull String, long); @@ -3498,8 +3496,8 @@ package android.media { method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes); method public void clearAudioServerStateCallback(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); - method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioProductStrategies getAudioProductStrategies(); - method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioVolumeGroups getAudioVolumeGroups(); + method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioProductStrategy> getAudioProductStrategies(); + method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups(); method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); @@ -3678,27 +3676,10 @@ package android.media.audiopolicy { method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setLooper(@NonNull android.os.Looper) throws java.lang.IllegalArgumentException; } - public final class AudioProductStrategies implements java.lang.Iterable<android.media.audiopolicy.AudioProductStrategy> android.os.Parcelable { - ctor public AudioProductStrategies(); - method public int describeContents(); - method @NonNull public android.media.AudioAttributes getAudioAttributesForLegacyStreamType(int); - method @NonNull public android.media.AudioAttributes getAudioAttributesForProductStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy); - method @Nullable public android.media.audiopolicy.AudioProductStrategy getById(int); - method public int getLegacyStreamTypeForAudioAttributes(@NonNull android.media.AudioAttributes); - method @Nullable public android.media.audiopolicy.AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull android.media.AudioAttributes); - method public int getVolumeGroupIdForAttributes(@NonNull android.media.AudioAttributes); - method public int getVolumeGroupIdForLegacyStreamType(int); - method @NonNull public java.util.Iterator<android.media.audiopolicy.AudioProductStrategy> iterator(); - method public int size(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioProductStrategies> CREATOR; - } - public final class AudioProductStrategy implements android.os.Parcelable { method public int describeContents(); method @NonNull public android.media.AudioAttributes getAudioAttributes(); method public int getId(); - method @NonNull public String name(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioProductStrategy> CREATOR; } @@ -3711,16 +3692,6 @@ package android.media.audiopolicy { method @NonNull public String name(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroup> CREATOR; - } - - public final class AudioVolumeGroups implements java.lang.Iterable<android.media.audiopolicy.AudioVolumeGroup> android.os.Parcelable { - ctor public AudioVolumeGroups(); - method public int describeContents(); - method @Nullable public android.media.audiopolicy.AudioVolumeGroup getById(int); - method @NonNull public java.util.Iterator<android.media.audiopolicy.AudioVolumeGroup> iterator(); - method public int size(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.media.audiopolicy.AudioVolumeGroups> CREATOR; field public static final int DEFAULT_VOLUME_GROUP = -1; // 0xffffffff } @@ -6816,7 +6787,7 @@ package android.service.textclassifier { public abstract class TextClassifierService extends android.app.Service { ctor public TextClassifierService(); - method public static android.view.textclassifier.TextClassifier getDefaultTextClassifierImplementation(@NonNull android.content.Context); + method @NonNull public static android.view.textclassifier.TextClassifier getDefaultTextClassifierImplementation(@NonNull android.content.Context); method @Deprecated public final android.view.textclassifier.TextClassifier getLocalTextClassifier(); method @Nullable public final android.os.IBinder onBind(android.content.Intent); method @MainThread public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>); @@ -7234,6 +7205,7 @@ package android.telephony { } 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>); @@ -9488,22 +9460,6 @@ package android.util { method public static void writeRaw(@NonNull byte[], int); } - public class StatsLogAtoms { - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED = 170; // 0xaa - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_DENIED = 8; // 0x8 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_GRANTED = 5; // 0x5 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED = 1; // 0x1 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_POLICY_FIXED = 3; // 0x3 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_RESTRICTED_PERMISSION = 9; // 0x9 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_USER_FIXED = 2; // 0x2 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED = 6; // 0x6 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED_WITH_PREJUDICE = 7; // 0x7 - field public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_GRANTED = 4; // 0x4 - } - - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix="PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__", value={android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED, android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_USER_FIXED, android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_POLICY_FIXED, android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_GRANTED, android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_GRANTED, android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED, android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED_WITH_PREJUDICE, android.util.StatsLogAtoms.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_DENIED}) public static @interface StatsLogAtoms.PermissionGrantRequestResultReported_Result { - } - } package android.view { diff --git a/api/test-current.txt b/api/test-current.txt index ac44dca9ae5b..6fb4a92d7816 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1124,13 +1124,6 @@ package android.media { method public android.media.BufferingParams.Builder setResumePlaybackMarkMs(int); } - public class FileDataSourceDesc extends android.media.DataSourceDesc { - method public long getLength(); - method public long getOffset(); - method @NonNull public android.os.ParcelFileDescriptor getParcelFileDescriptor(); - field public static final long FD_LENGTH_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL - } - public static final class MediaCodecInfo.VideoCapabilities.PerformancePoint { ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(int, int, int, int, @NonNull android.util.Size); ctor public MediaCodecInfo.VideoCapabilities.PerformancePoint(@NonNull android.media.MediaCodecInfo.VideoCapabilities.PerformancePoint, @NonNull android.util.Size); @@ -1139,28 +1132,11 @@ package android.media { method public int getMaxMacroBlocks(); } - public class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable { - method public android.media.MediaPlayer2.DrmInfo getDrmInfo(@NonNull android.media.DataSourceDesc); - method public android.media.MediaDrm.KeyRequest getDrmKeyRequest(@NonNull android.media.DataSourceDesc, @Nullable byte[], @Nullable byte[], @Nullable String, int, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException; - method public String getDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException; - method @NonNull public Object prepareDrm(@NonNull android.media.DataSourceDesc, @NonNull java.util.UUID); - method public byte[] provideDrmKeyResponse(@NonNull android.media.DataSourceDesc, @Nullable byte[], @NonNull byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer2.NoDrmSchemeException; - method public void releaseDrm(@NonNull android.media.DataSourceDesc) throws android.media.MediaPlayer2.NoDrmSchemeException; - method public void restoreDrmKeys(@NonNull android.media.DataSourceDesc, @NonNull byte[]) throws android.media.MediaPlayer2.NoDrmSchemeException; - method public void setDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException; - } - public final class PlaybackParams implements android.os.Parcelable { method public int getAudioStretchMode(); method public android.media.PlaybackParams setAudioStretchMode(int); } - public class UriDataSourceDesc extends android.media.DataSourceDesc { - method @Nullable public java.util.List<java.net.HttpCookie> getCookies(); - method @Nullable public java.util.Map<java.lang.String,java.lang.String> getHeaders(); - method @NonNull public android.net.Uri getUri(); - } - public static final class VolumeShaper.Configuration.Builder { method @NonNull public android.media.VolumeShaper.Configuration.Builder setOptionFlags(int); } diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index e577b6dda06d..55d3fba8845d 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -257,7 +257,8 @@ message Atom { BluetoothSmpPairingEventReported bluetooth_smp_pairing_event_reported = 167; ScreenTimeoutExtensionReported screen_timeout_extension_reported = 168; ProcessStartTime process_start_time = 169; - PermissionGrantRequestResultReported permission_grant_request_result_reported = 170; + PermissionGrantRequestResultReported permission_grant_request_result_reported = + 170 [(log_from_module) = "permissioncontroller"]; BluetoothSocketConnectionStateChanged bluetooth_socket_connection_state_changed = 171; DeviceIdentifierAccessDenied device_identifier_access_denied = 172; BubbleDeveloperErrorReported bubble_developer_error_reported = 173; @@ -278,7 +279,7 @@ message Atom { } // Pulled events will start at field 10000. - // Next: 10058 + // Next: 10059 oneof pulled { WifiBytesTransfer wifi_bytes_transfer = 10000; WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001; @@ -338,6 +339,7 @@ message Atom { GpuStatsAppInfo gpu_stats_app_info = 10055; SystemIonHeapSize system_ion_heap_size = 10056; AppsOnExternalStorageInfo apps_on_external_storage_info = 10057; + FaceSettings face_settings = 10058; } // DO NOT USE field numbers above 100,000 in AOSP. @@ -5583,6 +5585,7 @@ message BubbleUIChanged { SWIPE_LEFT = 13; SWIPE_RIGHT = 14; STACK_EXPANDED = 15; + FLYOUT = 16; } optional Action action = 6; @@ -5924,3 +5927,23 @@ message AppsOnExternalStorageInfo { // The name of the package that is installed on the external storage. optional string package_name = 2; } + +/** + * Logs the settings related to Face. + * Logged from: + * frameworks/base/services/core/java/com/android/server/stats + */ +message FaceSettings { + // Whether or not face unlock is allowed on Keyguard. + optional bool unlock_keyguard_enabled = 1; + // Whether or not face unlock dismisses the Keyguard. + optional bool unlock_dismisses_keyguard = 2; + // Whether or not face unlock requires attention. + optional bool unlock_attention_required = 3; + // Whether or not face unlock is allowed for apps (through BiometricPrompt). + optional bool unlock_app_enabled = 4; + // Whether or not face unlock always requires user confirmation. + optional bool unlock_always_require_confirmation = 5; + // Whether or not a diverse set of poses are required during enrollment. + optional bool unlock_diversity_required = 6; +} diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index d6411a748081..51839c4077bc 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -254,6 +254,9 @@ std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { // AppsOnExternalStorageInfo {android::util::APPS_ON_EXTERNAL_STORAGE_INFO, {.puller = new StatsCompanionServicePuller(android::util::APPS_ON_EXTERNAL_STORAGE_INFO)}}, + // Face Settings + {android::util::FACE_SETTINGS, + {.puller = new StatsCompanionServicePuller(android::util::FACE_SETTINGS)}}, }; StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) { diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 4f388a441aab..cf4ef205b303 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1838,17 +1838,17 @@ public class ActivityManager { private final float mScale; private final int mSystemUiVisibility; private final boolean mIsTranslucent; - - // TODO(b/116112787) TaskSnapshot must also book keep the color space from hardware bitmap - // when created. - private final ColorSpace mColorSpace = ColorSpace.get(ColorSpace.Named.SRGB); + // Must be one of the named color spaces, otherwise, always use SRGB color space. + private final ColorSpace mColorSpace; public TaskSnapshot(@NonNull ComponentName topActivityComponent, GraphicBuffer snapshot, - int orientation, Rect contentInsets, boolean reducedResolution, float scale, - boolean isRealSnapshot, int windowingMode, int systemUiVisibility, - boolean isTranslucent) { + @NonNull ColorSpace colorSpace, int orientation, Rect contentInsets, + boolean reducedResolution, float scale, boolean isRealSnapshot, int windowingMode, + int systemUiVisibility, boolean isTranslucent) { mTopActivityComponent = topActivityComponent; mSnapshot = snapshot; + mColorSpace = colorSpace.getId() < 0 + ? ColorSpace.get(ColorSpace.Named.SRGB) : colorSpace; mOrientation = orientation; mContentInsets = new Rect(contentInsets); mReducedResolution = reducedResolution; @@ -1862,6 +1862,10 @@ public class ActivityManager { private TaskSnapshot(Parcel source) { mTopActivityComponent = ComponentName.readFromParcel(source); mSnapshot = source.readParcelable(null /* classLoader */); + int colorSpaceId = source.readInt(); + mColorSpace = colorSpaceId >= 0 + ? ColorSpace.get(ColorSpace.Named.values()[colorSpaceId]) + : ColorSpace.get(ColorSpace.Named.SRGB); mOrientation = source.readInt(); mContentInsets = source.readParcelable(null /* classLoader */); mReducedResolution = source.readBoolean(); @@ -1968,6 +1972,7 @@ public class ActivityManager { public void writeToParcel(Parcel dest, int flags) { ComponentName.writeToParcel(mTopActivityComponent, dest); dest.writeParcelable(mSnapshot, 0); + dest.writeInt(mColorSpace.getId()); dest.writeInt(mOrientation); dest.writeParcelable(mContentInsets, 0); dest.writeBoolean(mReducedResolution); @@ -1985,6 +1990,7 @@ public class ActivityManager { return "TaskSnapshot{" + " mTopActivityComponent=" + mTopActivityComponent.flattenToShortString() + " mSnapshot=" + mSnapshot + " (" + width + "x" + height + ")" + + " mColorSpace=" + mColorSpace.toString() + " mOrientation=" + mOrientation + " mContentInsets=" + mContentInsets.toShortString() + " mReducedResolution=" + mReducedResolution + " mScale=" + mScale diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 15982a796a7e..6f9224481eba 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -38,7 +38,6 @@ import android.os.Parcelable; import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteException; -import android.os.SystemProperties; import android.os.UserManager; import android.util.ArrayMap; import android.util.LongSparseArray; @@ -5209,7 +5208,6 @@ public class AppOpsManager { * @hide */ public int noteProxyOpNoThrow(int op, String proxiedPackageName, int proxiedUid) { - logOperationIfNeeded(op, mContext.getOpPackageName(), proxiedPackageName); try { return mService.noteProxyOperation(op, Process.myUid(), mContext.getOpPackageName(), proxiedUid, proxiedPackageName); @@ -5238,7 +5236,6 @@ public class AppOpsManager { */ @UnsupportedAppUsage public int noteOpNoThrow(int op, int uid, String packageName) { - logOperationIfNeeded(op, packageName, null); try { return mService.noteOperation(op, uid, packageName); } catch (RemoteException e) { @@ -5346,7 +5343,6 @@ public class AppOpsManager { * @hide */ public int startOpNoThrow(int op, int uid, String packageName, boolean startIfModeDefault) { - logOperationIfNeeded(op, packageName, null); try { return mService.startOperation(getToken(mService), op, uid, packageName, startIfModeDefault); @@ -5363,7 +5359,6 @@ public class AppOpsManager { * @hide */ public void finishOp(int op, int uid, String packageName) { - logOperationIfNeeded(op, packageName, null); try { mService.finishOperation(getToken(mService), op, uid, packageName); } catch (RemoteException e) { @@ -5703,45 +5698,4 @@ public class AppOpsManager { return AppOpsManager.MODE_DEFAULT; } - - private static void logOperationIfNeeded(int op, String callingPackage, String proxiedPackage) { - // Check if debug logging propety is enabled. - if (!SystemProperties.getBoolean(DEBUG_LOGGING_ENABLE_PROP, false)) { - return; - } - // Check if this package should be logged. - String packages = SystemProperties.get(DEBUG_LOGGING_PACKAGES_PROP, ""); - if (!"".equals(packages) && callingPackage != null) { - boolean found = false; - for (String pkg : packages.split(",")) { - if (callingPackage.equals(pkg)) { - found = true; - break; - } - } - if (!found) { - return; - } - } - String opStr = opToName(op); - // Check if this app op should be logged - String logOps = SystemProperties.get(DEBUG_LOGGING_OPS_PROP, ""); - if (!"".equals(logOps)) { - boolean found = false; - for (String logOp : logOps.split(",")) { - if (opStr.equals(logOp)) { - found = true; - break; - } - } - if (!found) { - return; - } - } - - // Log a stack trace - Exception here = new Exception("HERE!"); - android.util.Log.i(DEBUG_LOGGING_TAG, "Note operation package= " + callingPackage - + " proxied= " + proxiedPackage + " op= " + opStr, here); - } } diff --git a/core/java/android/app/StatsManager.java b/core/java/android/app/StatsManager.java index 2e14d03a912c..e6682d620b99 100644 --- a/core/java/android/app/StatsManager.java +++ b/core/java/android/app/StatsManager.java @@ -414,7 +414,6 @@ public final class StatsManager { * Returns the experiments IDs registered with statsd, or an empty array if there aren't any. * * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service - * @hide */ @RequiresPermission(allOf = {DUMP, PACKAGE_USAGE_STATS}) public long[] getRegisteredExperimentIds() diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index eb1ea90e4382..f8dc20e9af09 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -678,29 +678,6 @@ public final class UsageStatsManager { } } - - /** - * @deprecated use {@link #registerUsageSessionObserver(int, String[], Duration, Duration, - * PendingIntent, PendingIntent)}. - * - * @hide - */ - @Deprecated - @SystemApi - @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) - // STOPSHIP b/128455269: remove this method - public void registerUsageSessionObserver(int sessionObserverId, - @NonNull String[] observedEntities, long timeLimit, @NonNull TimeUnit timeUnit, - long sessionThresholdTime, @NonNull TimeUnit sessionThresholdTimeUnit, - @NonNull PendingIntent limitReachedCallbackIntent, - @Nullable PendingIntent sessionEndCallbackIntent) { - final Duration timeLimitDuration = Duration.ofMillis(timeUnit.toMillis(timeLimit)); - final Duration sessionThresholdDuration = - Duration.ofMillis(sessionThresholdTimeUnit.toMillis(sessionThresholdTime)); - registerUsageSessionObserver(sessionObserverId, observedEntities, timeLimitDuration, - sessionThresholdDuration, limitReachedCallbackIntent, sessionEndCallbackIntent); - } - /** * Register a usage session observer that receives a callback on the provided {@code * limitReachedCallbackIntent} when the sum of usages of apps and tokens in the {@code diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 6c72a9a1c0c2..6ce682843ed5 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -841,13 +841,12 @@ public class PackageInstaller { * installation (for example, the same split name), the APK in this session * will replace the existing APK. * <p> - * In such a case that multiple packages need to be commited simultaneously, + * In such a case that multiple packages need to be committed simultaneously, * multiple sessions can be referenced by a single multi-package session. * This session is created with no package name and calling - * {@link SessionParams#setMultiPackage()} with {@code true}. The - * individual session IDs can be added with {@link #addChildSessionId(int)} - * and commit of the multi-package session will result in all child sessions - * being committed atomically. + * {@link SessionParams#setMultiPackage()}. The individual session IDs can be + * added with {@link #addChildSessionId(int)} and commit of the multi-package + * session will result in all child sessions being committed atomically. */ public static class Session implements Closeable { /** {@hide} */ diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 9e0ee5884199..d3575c03c9f6 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -1252,6 +1252,7 @@ public abstract class CameraMetadata<TKey> { * fire the flash for flash power metering during precapture, and then fire the flash * for the final capture, if a flash is available on the device and the AE mode is set to * enable the flash.</p> + * <p>Devices that initially shipped with Android version {@link android.os.Build.VERSION_CODES#Q Q} or newer will not include any LEGACY-level devices.</p> * * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 6035f40e768a..7349f0cbe55d 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -93,8 +93,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } @Override // binder call - public void onAuthenticationSucceeded(long deviceId, Face face) { - mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, face).sendToTarget(); + public void onAuthenticationSucceeded(long deviceId, Face face, int userId) { + mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, userId, 0, face).sendToTarget(); } @Override // binder call @@ -168,6 +168,44 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan @RequiresPermission(USE_BIOMETRIC_INTERNAL) public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler) { + authenticate(crypto, cancel, flags, callback, handler, mContext.getUserId()); + } + + /** + * Use the provided handler thread for events. + */ + private void useHandler(Handler handler) { + if (handler != null) { + mHandler = new MyHandler(handler.getLooper()); + } else if (mHandler.getLooper() != mContext.getMainLooper()) { + mHandler = new MyHandler(mContext.getMainLooper()); + } + } + + /** + * Request authentication of a crypto object. This call operates the face recognition hardware + * and starts capturing images. It terminates when + * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)} or + * {@link AuthenticationCallback#onAuthenticationSucceeded(AuthenticationResult)} is called, at + * which point the object is no longer valid. The operation can be canceled by using the + * provided cancel object. + * + * @param crypto object associated with the call or null if none required. + * @param cancel an object that can be used to cancel authentication + * @param flags optional flags; should be 0 + * @param callback an object to receive authentication events + * @param handler an optional handler to handle callback events + * @param userId userId to authenticate for + * @throws IllegalArgumentException if the crypto operation is not supported or is not backed + * by + * <a href="{@docRoot}training/articles/keystore.html">Android + * Keystore facility</a>. + * @throws IllegalStateException if the crypto primitive is not initialized. + * @hide + */ + public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, + int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler, + int userId) { if (callback == null) { throw new IllegalArgumentException("Must supply an authentication callback"); } @@ -187,7 +225,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan mAuthenticationCallback = callback; mCryptoObject = crypto; long sessionId = crypto != null ? crypto.getOpId() : 0; - mService.authenticate(mToken, sessionId, mContext.getUserId(), mServiceReceiver, + mService.authenticate(mToken, sessionId, userId, mServiceReceiver, flags, mContext.getOpPackageName()); } catch (RemoteException e) { Log.w(TAG, "Remote exception while authenticating: ", e); @@ -196,24 +234,13 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan // try again later. callback.onAuthenticationError(FACE_ERROR_HW_UNAVAILABLE, getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE, - 0 /* vendorCode */)); + 0 /* vendorCode */)); } } } } /** - * Use the provided handler thread for events. - */ - private void useHandler(Handler handler) { - if (handler != null) { - mHandler = new MyHandler(handler.getLooper()); - } else if (mHandler.getLooper() != mContext.getMainLooper()) { - mHandler = new MyHandler(mContext.getMainLooper()); - } - } - - /** * Request face authentication enrollment. This call operates the face authentication hardware * and starts capturing images. Progress will be indicated by callbacks to the * {@link EnrollmentCallback} object. It terminates when diff --git a/core/java/android/hardware/face/IFaceServiceReceiver.aidl b/core/java/android/hardware/face/IFaceServiceReceiver.aidl index 217690273969..10f9c435c415 100644 --- a/core/java/android/hardware/face/IFaceServiceReceiver.aidl +++ b/core/java/android/hardware/face/IFaceServiceReceiver.aidl @@ -24,7 +24,7 @@ import android.hardware.face.Face; oneway interface IFaceServiceReceiver { void onEnrollResult(long deviceId, int faceId, int remaining); void onAcquired(long deviceId, int acquiredInfo, int vendorCode); - void onAuthenticationSucceeded(long deviceId, in Face face); + void onAuthenticationSucceeded(long deviceId, in Face face, int userId); void onAuthenticationFailed(long deviceId); void onError(long deviceId, int error, int vendorCode); void onRemoved(long deviceId, int faceId, int remaining); diff --git a/core/java/android/net/DnsResolver.java b/core/java/android/net/DnsResolver.java index 06c32c675a31..b6c4fe2de4f4 100644 --- a/core/java/android/net/DnsResolver.java +++ b/core/java/android/net/DnsResolver.java @@ -93,6 +93,23 @@ public final class DnsResolver { public static final int FLAG_NO_CACHE_STORE = 1 << 1; public static final int FLAG_NO_CACHE_LOOKUP = 1 << 2; + @IntDef(prefix = { "ERROR_" }, value = { + ERROR_PARSE, + ERROR_SYSTEM + }) + @Retention(RetentionPolicy.SOURCE) + @interface DnsError {} + /** + * Indicates that there was an error parsing the response the query. + * The cause of this error is available via getCause() and is a ParseException. + */ + public static final int ERROR_PARSE = 0; + /** + * Indicates that there was an error sending the query. + * The cause of this error is available via getCause() and is an ErrnoException. + */ + public static final int ERROR_SYSTEM = 1; + private static final int NETID_UNSET = 0; private static final DnsResolver sInstance = new DnsResolver(); @@ -107,97 +124,57 @@ public final class DnsResolver { private DnsResolver() {} /** - * Answer parser for parsing raw answers + * Base interface for answer callbacks * - * @param <T> The type of the parsed answer + * @param <T> The type of the answer */ - public interface AnswerParser<T> { - /** - * Creates a <T> answer by parsing the given raw answer. - * - * @param rawAnswer the raw answer to be parsed - * @return a parsed <T> answer - * @throws ParseException if parsing failed - */ - @NonNull T parse(@NonNull byte[] rawAnswer) throws ParseException; - } - - /** - * Base class for answer callbacks - * - * @param <T> The type of the parsed answer - */ - public abstract static class AnswerCallback<T> { - /** @hide */ - public final AnswerParser<T> parser; - - public AnswerCallback(@NonNull AnswerParser<T> parser) { - this.parser = parser; - }; - + public interface Callback<T> { /** * Success response to - * {@link android.net.DnsResolver#query query()}. + * {@link android.net.DnsResolver#query query()} or + * {@link android.net.DnsResolver#rawQuery rawQuery()}. * * Invoked when the answer to a query was successfully parsed. * - * @param answer parsed answer to the query. + * @param answer <T> answer to the query. + * @param rcode The response code in the DNS response. * * {@see android.net.DnsResolver#query query()} */ - public abstract void onAnswer(@NonNull T answer); - + void onAnswer(@NonNull T answer, int rcode); /** * Error response to - * {@link android.net.DnsResolver#query query()}. + * {@link android.net.DnsResolver#query query()} or + * {@link android.net.DnsResolver#rawQuery rawQuery()}. * * Invoked when there is no valid answer to * {@link android.net.DnsResolver#query query()} + * {@link android.net.DnsResolver#rawQuery rawQuery()}. * - * @param exception a {@link ParseException} object with additional + * @param error a {@link DnsException} object with additional * detail regarding the failure */ - public abstract void onParseException(@NonNull ParseException exception); - - /** - * Error response to - * {@link android.net.DnsResolver#query query()}. - * - * Invoked if an error happens when - * issuing the DNS query or receiving the result. - * {@link android.net.DnsResolver#query query()} - * - * @param exception an {@link ErrnoException} object with additional detail - * regarding the failure - */ - public abstract void onQueryException(@NonNull ErrnoException exception); + void onError(@NonNull DnsException error); } /** - * Callback for receiving raw answers + * Class to represent DNS error */ - public abstract static class RawAnswerCallback extends AnswerCallback<byte[]> { - public RawAnswerCallback() { - super(rawAnswer -> rawAnswer); - } - } - - /** - * Callback for receiving parsed {@link InetAddress} answers - * - * Note that if the answer does not contain any IP addresses, - * onAnswer will be called with an empty list. - */ - public abstract static class InetAddressAnswerCallback - extends AnswerCallback<List<InetAddress>> { - public InetAddressAnswerCallback() { - super(rawAnswer -> new DnsAddressAnswer(rawAnswer).getAddresses()); + public static class DnsException extends Exception { + /** + * DNS error code as one of the ERROR_* constants + */ + @DnsError public final int code; + + DnsException(@DnsError int code, @Nullable Throwable cause) { + super(cause); + this.code = code; } } /** * Send a raw DNS query. - * The answer will be provided asynchronously through the provided {@link AnswerCallback}. + * The answer will be provided asynchronously through the provided {@link Callback}. * * @param network {@link Network} specifying which network to query on. * {@code null} for query on default network. @@ -206,13 +183,13 @@ public final class DnsResolver { * @param executor The {@link Executor} that the callback should be executed on. * @param cancellationSignal used by the caller to signal if the query should be * cancelled. May be {@code null}. - * @param callback an {@link AnswerCallback} which will be called to notify the caller + * @param callback a {@link Callback} which will be called to notify the caller * of the result of dns query. */ - public <T> void query(@Nullable Network network, @NonNull byte[] query, @QueryFlag int flags, + public void rawQuery(@Nullable Network network, @NonNull byte[] query, @QueryFlag int flags, @NonNull @CallbackExecutor Executor executor, @Nullable CancellationSignal cancellationSignal, - @NonNull AnswerCallback<T> callback) { + @NonNull Callback<? super byte[]> callback) { if (cancellationSignal != null && cancellationSignal.isCanceled()) { return; } @@ -222,9 +199,7 @@ public final class DnsResolver { queryfd = resNetworkSend((network != null ? network.netId : NETID_UNSET), query, query.length, flags); } catch (ErrnoException e) { - executor.execute(() -> { - callback.onQueryException(e); - }); + executor.execute(() -> callback.onError(new DnsException(ERROR_SYSTEM, e))); return; } @@ -237,7 +212,7 @@ public final class DnsResolver { /** * Send a DNS query with the specified name, class and query type. - * The answer will be provided asynchronously through the provided {@link AnswerCallback}. + * The answer will be provided asynchronously through the provided {@link Callback}. * * @param network {@link Network} specifying which network to query on. * {@code null} for query on default network. @@ -248,14 +223,14 @@ public final class DnsResolver { * @param executor The {@link Executor} that the callback should be executed on. * @param cancellationSignal used by the caller to signal if the query should be * cancelled. May be {@code null}. - * @param callback an {@link AnswerCallback} which will be called to notify the caller + * @param callback a {@link Callback} which will be called to notify the caller * of the result of dns query. */ - public <T> void query(@Nullable Network network, @NonNull String domain, + public void rawQuery(@Nullable Network network, @NonNull String domain, @QueryClass int nsClass, @QueryType int nsType, @QueryFlag int flags, @NonNull @CallbackExecutor Executor executor, @Nullable CancellationSignal cancellationSignal, - @NonNull AnswerCallback<T> callback) { + @NonNull Callback<? super byte[]> callback) { if (cancellationSignal != null && cancellationSignal.isCanceled()) { return; } @@ -265,9 +240,7 @@ public final class DnsResolver { queryfd = resNetworkQuery((network != null ? network.netId : NETID_UNSET), domain, nsClass, nsType, flags); } catch (ErrnoException e) { - executor.execute(() -> { - callback.onQueryException(e); - }); + executor.execute(() -> callback.onError(new DnsException(ERROR_SYSTEM, e))); return; } synchronized (lock) { @@ -277,27 +250,28 @@ public final class DnsResolver { } } - private class InetAddressAnswerAccumulator extends InetAddressAnswerCallback { + private class InetAddressAnswerAccumulator implements Callback<byte[]> { private final List<InetAddress> mAllAnswers; - private ParseException mParseException; - private ErrnoException mErrnoException; - private final InetAddressAnswerCallback mUserCallback; + private int mRcode; + private DnsException mDnsException; + private final Callback<? super List<InetAddress>> mUserCallback; private final int mTargetAnswerCount; private int mReceivedAnswerCount = 0; - InetAddressAnswerAccumulator(int size, @NonNull InetAddressAnswerCallback callback) { + InetAddressAnswerAccumulator(int size, + @NonNull Callback<? super List<InetAddress>> callback) { mTargetAnswerCount = size; mAllAnswers = new ArrayList<>(); mUserCallback = callback; } - private boolean maybeReportException() { - if (mErrnoException != null) { - mUserCallback.onQueryException(mErrnoException); + private boolean maybeReportError() { + if (mRcode != 0) { + mUserCallback.onAnswer(mAllAnswers, mRcode); return true; } - if (mParseException != null) { - mUserCallback.onParseException(mParseException); + if (mDnsException != null) { + mUserCallback.onError(mDnsException); return true; } return false; @@ -305,34 +279,43 @@ public final class DnsResolver { private void maybeReportAnswer() { if (++mReceivedAnswerCount != mTargetAnswerCount) return; - if (mAllAnswers.isEmpty() && maybeReportException()) return; + if (mAllAnswers.isEmpty() && maybeReportError()) return; // TODO: Do RFC6724 sort. - mUserCallback.onAnswer(mAllAnswers); - } - - @Override - public void onAnswer(@NonNull List<InetAddress> answer) { - mAllAnswers.addAll(answer); - maybeReportAnswer(); + mUserCallback.onAnswer(mAllAnswers, mRcode); } @Override - public void onParseException(@NonNull ParseException e) { - mParseException = e; + public void onAnswer(@NonNull byte[] answer, int rcode) { + // If at least one query succeeded, return an rcode of 0. + // Otherwise, arbitrarily return the first rcode received. + if (mReceivedAnswerCount == 0 || rcode == 0) { + mRcode = rcode; + } + try { + mAllAnswers.addAll(new DnsAddressAnswer(answer).getAddresses()); + } catch (ParseException e) { + mDnsException = new DnsException(ERROR_PARSE, e); + } maybeReportAnswer(); } @Override - public void onQueryException(@NonNull ErrnoException e) { - mErrnoException = e; + public void onError(@NonNull DnsException error) { + mDnsException = error; maybeReportAnswer(); } } /** - * Send a DNS query with the specified name, get back a set of InetAddresses asynchronously. - * The answer will be provided asynchronously through the provided - * {@link InetAddressAnswerCallback}. + * Send a DNS query with the specified name on a network with both IPv4 and IPv6, + * get back a set of InetAddresses asynchronously. + * + * This method will examine the connection ability on given network, and query IPv4 + * and IPv6 if connection is available. + * + * If at least one query succeeded with valid answer, rcode will be 0 + * + * The answer will be provided asynchronously through the provided {@link Callback}. * * @param network {@link Network} specifying which network to query on. * {@code null} for query on default network. @@ -341,13 +324,13 @@ public final class DnsResolver { * @param executor The {@link Executor} that the callback should be executed on. * @param cancellationSignal used by the caller to signal if the query should be * cancelled. May be {@code null}. - * @param callback an {@link InetAddressAnswerCallback} which will be called to notify the + * @param callback a {@link Callback} which will be called to notify the * caller of the result of dns query. */ public void query(@Nullable Network network, @NonNull String domain, @QueryFlag int flags, @NonNull @CallbackExecutor Executor executor, @Nullable CancellationSignal cancellationSignal, - @NonNull InetAddressAnswerCallback callback) { + @NonNull Callback<? super List<InetAddress>> callback) { if (cancellationSignal != null && cancellationSignal.isCanceled()) { return; } @@ -365,9 +348,7 @@ public final class DnsResolver { v6fd = resNetworkQuery((network != null ? network.netId : NETID_UNSET), domain, CLASS_IN, TYPE_AAAA, flags); } catch (ErrnoException e) { - executor.execute(() -> { - callback.onQueryException(e); - }); + executor.execute(() -> callback.onError(new DnsException(ERROR_SYSTEM, e))); return; } queryCount++; @@ -377,7 +358,9 @@ public final class DnsResolver { // Avoiding gateways drop packets if queries are sent too close together try { Thread.sleep(SLEEP_TIME_MS); - } catch (InterruptedException ex) { } + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } if (queryIpv4) { try { @@ -385,9 +368,7 @@ public final class DnsResolver { ? network.netId : NETID_UNSET), domain, CLASS_IN, TYPE_A, flags); } catch (ErrnoException e) { if (queryIpv6) resNetworkCancel(v6fd); // Closes fd, marks it invalid. - executor.execute(() -> { - callback.onQueryException(e); - }); + executor.execute(() -> callback.onError(new DnsException(ERROR_SYSTEM, e))); return; } queryCount++; @@ -413,34 +394,89 @@ public final class DnsResolver { } } - private <T> void registerFDListener(@NonNull Executor executor, - @NonNull FileDescriptor queryfd, @NonNull AnswerCallback<T> answerCallback, + /** + * Send a DNS query with the specified name and query type, get back a set of + * InetAddresses asynchronously. + * + * The answer will be provided asynchronously through the provided {@link Callback}. + * + * @param network {@link Network} specifying which network to query on. + * {@code null} for query on default network. + * @param domain domain name to query + * @param nsType dns resource record (RR) type as one of the TYPE_* constants + * @param flags flags as a combination of the FLAGS_* constants + * @param executor The {@link Executor} that the callback should be executed on. + * @param cancellationSignal used by the caller to signal if the query should be + * cancelled. May be {@code null}. + * @param callback a {@link Callback} which will be called to notify the caller + * of the result of dns query. + */ + public void query(@Nullable Network network, @NonNull String domain, + @QueryType int nsType, @QueryFlag int flags, + @NonNull @CallbackExecutor Executor executor, + @Nullable CancellationSignal cancellationSignal, + @NonNull Callback<? super List<InetAddress>> callback) { + if (cancellationSignal != null && cancellationSignal.isCanceled()) { + return; + } + final Object lock = new Object(); + final FileDescriptor queryfd; + try { + queryfd = resNetworkQuery((network != null + ? network.netId : NETID_UNSET), domain, CLASS_IN, nsType, flags); + } catch (ErrnoException e) { + executor.execute(() -> callback.onError(new DnsException(ERROR_SYSTEM, e))); + return; + } + final InetAddressAnswerAccumulator accumulator = + new InetAddressAnswerAccumulator(1, callback); + synchronized (lock) { + registerFDListener(executor, queryfd, accumulator, cancellationSignal, lock); + if (cancellationSignal == null) return; + addCancellationSignal(cancellationSignal, queryfd, lock); + } + } + + /** + * Class to retrieve DNS response + * + * @hide + */ + public static final class DnsResponse { + public final @NonNull byte[] answerbuf; + public final int rcode; + public DnsResponse(@NonNull byte[] answerbuf, int rcode) { + this.answerbuf = answerbuf; + this.rcode = rcode; + } + } + + private void registerFDListener(@NonNull Executor executor, + @NonNull FileDescriptor queryfd, @NonNull Callback<? super byte[]> answerCallback, @Nullable CancellationSignal cancellationSignal, @NonNull Object lock) { Looper.getMainLooper().getQueue().addOnFileDescriptorEventListener( queryfd, FD_EVENTS, (fd, events) -> { executor.execute(() -> { + DnsResponse resp = null; + ErrnoException exception = null; synchronized (lock) { if (cancellationSignal != null && cancellationSignal.isCanceled()) { return; } - byte[] answerbuf = null; try { - answerbuf = resNetworkResult(fd); // Closes fd, marks it invalid. + resp = resNetworkResult(fd); // Closes fd, marks it invalid. } catch (ErrnoException e) { Log.e(TAG, "resNetworkResult:" + e.toString()); - answerCallback.onQueryException(e); - return; - } - - try { - answerCallback.onAnswer( - answerCallback.parser.parse(answerbuf)); - } catch (ParseException e) { - answerCallback.onParseException(e); + exception = e; } } + if (exception != null) { + answerCallback.onError(new DnsException(ERROR_SYSTEM, exception)); + return; + } + answerCallback.onAnswer(resp.answerbuf, resp.rcode); }); // Unregister this fd listener return 0; diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index db87c97e4fc7..c06a13269d83 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -145,9 +145,10 @@ public class NetworkUtils { /** * DNS resolver series jni method. * Read a result for the query associated with the {@code fd}. - * @return a byte array containing blob answer + * @return DnsResponse containing blob answer and rcode */ - public static native byte[] resNetworkResult(FileDescriptor fd) throws ErrnoException; + public static native DnsResolver.DnsResponse resNetworkResult(FileDescriptor fd) + throws ErrnoException; /** * DNS resolver series jni method. diff --git a/core/java/android/net/ParseException.java b/core/java/android/net/ParseException.java index 9d4727a84bc0..bcfdd7ef09cc 100644 --- a/core/java/android/net/ParseException.java +++ b/core/java/android/net/ParseException.java @@ -25,12 +25,12 @@ import android.annotation.NonNull; public class ParseException extends RuntimeException { public String response; - public ParseException(@NonNull String response) { + ParseException(@NonNull String response) { super(response); this.response = response; } - public ParseException(@NonNull String response, @NonNull Throwable cause) { + ParseException(@NonNull String response, @NonNull Throwable cause) { super(response, cause); this.response = response; } diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java index 847b8e48b296..02f99258395c 100644 --- a/core/java/android/preference/SeekBarVolumizer.java +++ b/core/java/android/preference/SeekBarVolumizer.java @@ -16,6 +16,7 @@ package android.preference; +import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.app.NotificationManager; import android.content.BroadcastReceiver; @@ -27,8 +28,8 @@ import android.media.AudioAttributes; import android.media.AudioManager; import android.media.Ringtone; import android.media.RingtoneManager; -import android.media.audiopolicy.AudioProductStrategies; -import android.media.audiopolicy.AudioVolumeGroups; +import android.media.audiopolicy.AudioProductStrategy; +import android.media.audiopolicy.AudioVolumeGroup; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; @@ -67,7 +68,6 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba private static final int MSG_GROUP_VOLUME_CHANGED = 1; private final Handler mVolumeHandler = new VolumeHandler(); - private final AudioProductStrategies mAudioProductStrategies; private AudioAttributes mAttributes; private int mVolumeGroupId; @@ -161,11 +161,9 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } mZenMode = mNotificationManager.getZenMode(); - mAudioProductStrategies = mAudioManager.getAudioProductStrategies(); - if (mAudioProductStrategies.size() > 0) { - mVolumeGroupId = mAudioProductStrategies.getVolumeGroupIdForLegacyStreamType( - mStreamType); - mAttributes = mAudioProductStrategies.getAudioAttributesForLegacyStreamType( + if (hasAudioProductStrategies()) { + mVolumeGroupId = getVolumeGroupIdForLegacyStreamType(mStreamType); + mAttributes = getAudioAttributesForLegacyStreamType( mStreamType); } @@ -190,6 +188,40 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mDefaultUri = defaultUri; } + private boolean hasAudioProductStrategies() { + return AudioManager.getAudioProductStrategies().size() > 0; + } + + private int getVolumeGroupIdForLegacyStreamType(int streamType) { + for (final AudioProductStrategy productStrategy : + AudioManager.getAudioProductStrategies()) { + int volumeGroupId = productStrategy.getVolumeGroupIdForLegacyStreamType(streamType); + if (volumeGroupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) { + return volumeGroupId; + } + } + + return AudioManager.getAudioProductStrategies().stream() + .map(strategy -> strategy.getVolumeGroupIdForAudioAttributes( + AudioProductStrategy.sDefaultAttributes)) + .filter(volumeGroupId -> volumeGroupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) + .findFirst() + .orElse(AudioVolumeGroup.DEFAULT_VOLUME_GROUP); + } + + private @NonNull AudioAttributes getAudioAttributesForLegacyStreamType(int streamType) { + for (final AudioProductStrategy productStrategy : + AudioManager.getAudioProductStrategies()) { + AudioAttributes aa = productStrategy.getAudioAttributesForLegacyStreamType(streamType); + if (aa != null) { + return aa; + } + } + return new AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN) + .setUsage(AudioAttributes.USAGE_UNKNOWN).build(); + } + private static boolean isNotificationOrRing(int stream) { return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION; } @@ -329,7 +361,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba postStopSample(); mContext.getContentResolver().unregisterContentObserver(mVolumeObserver); mReceiver.setListening(false); - if (mAudioProductStrategies.size() > 0) { + if (hasAudioProductStrategies()) { unregisterVolumeGroupCb(); } mSeekBar.setOnSeekBarChangeListener(null); @@ -349,7 +381,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba System.getUriFor(System.VOLUME_SETTINGS_INT[mStreamType]), false, mVolumeObserver); mReceiver.setListening(true); - if (mAudioProductStrategies.size() > 0) { + if (hasAudioProductStrategies()) { registerVolumeGroupCb(); } } @@ -507,7 +539,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba if (AudioManager.VOLUME_CHANGED_ACTION.equals(action)) { int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); - if (mAudioProductStrategies.size() == 0) { + if (hasAudioProductStrategies()) { updateVolumeSlider(streamType, streamValue); } } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { @@ -519,13 +551,12 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } } else if (AudioManager.STREAM_DEVICES_CHANGED_ACTION.equals(action)) { int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); - if (mAudioProductStrategies.size() == 0) { + if (hasAudioProductStrategies()) { int streamVolume = mAudioManager.getStreamVolume(streamType); updateVolumeSlider(streamType, streamVolume); } else { - int volumeGroup = mAudioProductStrategies.getVolumeGroupIdForLegacyStreamType( - streamType); - if (volumeGroup != AudioVolumeGroups.DEFAULT_VOLUME_GROUP + int volumeGroup = getVolumeGroupIdForLegacyStreamType(streamType); + if (volumeGroup != AudioVolumeGroup.DEFAULT_VOLUME_GROUP && volumeGroup == mVolumeGroupId) { int streamVolume = mAudioManager.getStreamVolume(streamType); updateVolumeSlider(streamType, streamVolume); @@ -558,14 +589,14 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } private void registerVolumeGroupCb() { - if (mVolumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { + if (mVolumeGroupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) { mAudioManager.registerVolumeGroupCallback(Runnable::run, mVolumeGroupCallback); mLastProgress = mAudioManager.getVolumeIndexForAttributes(mAttributes); } } private void unregisterVolumeGroupCb() { - if (mVolumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { + if (mVolumeGroupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) { mAudioManager.unregisterVolumeGroupCallback(mVolumeGroupCallback); } } @@ -578,7 +609,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba case MSG_GROUP_VOLUME_CHANGED: int group = (int) args.arg1; if (mVolumeGroupId != group - || mVolumeGroupId == AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { + || mVolumeGroupId == AudioVolumeGroup.DEFAULT_VOLUME_GROUP) { return; } updateSlider(); diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index da19d59367a0..bff8328defa0 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -31,7 +31,6 @@ import android.annotation.UnsupportedAppUsage; import android.app.Activity; import android.app.AppGlobals; import android.content.ClipData; -import android.content.ContentInterface; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentUris; @@ -968,6 +967,13 @@ public final class MediaStore { public static final String DATE_MODIFIED = "date_modified"; /** + * The time the media item was taken. + */ + @CurrentTimeMillisLong + @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + public static final String DATE_TAKEN = "datetaken"; + + /** * The MIME type of the media item. * <p> * This is typically defined based on the file extension of the media @@ -1117,6 +1123,38 @@ public final class MediaStore { public static final String SECONDARY_DIRECTORY = "secondary_directory"; /** + * The primary bucket ID of this media item. This can be useful to + * present the user a first-level clustering of related media items. + * This is a read-only column that is automatically computed. + */ + @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + public static final String BUCKET_ID = "bucket_id"; + + /** + * The primary bucket display name of this media item. This can be + * useful to present the user a first-level clustering of related + * media items. This is a read-only column that is automatically + * computed. + */ + @Column(value = Cursor.FIELD_TYPE_STRING, readOnly = true) + public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; + + /** + * The group ID of this media item. This can be useful to present + * the user a grouping of related media items, such a burst of + * images, or a {@code JPG} and {@code DNG} version of the same + * image. + * <p> + * This is a read-only column that is automatically computed based + * on the first portion of the filename. For example, + * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG} + * will have the same {@link #GROUP_ID} because the first portion of + * their filenames is identical. + */ + @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + public static final String GROUP_ID = "group_id"; + + /** * The "document ID" GUID as defined by the <em>XMP Media * Management</em> standard, extracted from any XMP metadata contained * within this media item. The value is {@code null} when no metadata @@ -1152,6 +1190,20 @@ public final class MediaStore { */ @Column(value = Cursor.FIELD_TYPE_STRING, readOnly = true) public static final String ORIGINAL_DOCUMENT_ID = "original_document_id"; + + /** + * The duration of the media item. + */ + @DurationMillisLong + @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + public static final String DURATION = "duration"; + + /** + * The orientation for the media item, expressed in degrees. For + * example, 0, 90, 180, or 270 degrees. + */ + @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + public static final String ORIENTATION = "orientation"; } /** @@ -1357,7 +1409,10 @@ public final class MediaStore { /** * The description of the download. + * + * @removed */ + @Deprecated @Column(Cursor.FIELD_TYPE_STRING) String DESCRIPTION = "description"; } @@ -1573,18 +1628,9 @@ public final class MediaStore { @Column(value = Cursor.FIELD_TYPE_FLOAT, readOnly = true) public static final String LONGITUDE = "longitude"; - /** - * The time the media item was taken. - */ - @CurrentTimeMillisLong - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String DATE_TAKEN = "datetaken"; - - /** - * The orientation for the image expressed as degrees. - * Only degrees 0, 90, 180, 270 will work. - */ - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String ORIENTATION = "orientation"; /** @@ -1598,36 +1644,11 @@ public final class MediaStore { @Column(Cursor.FIELD_TYPE_INTEGER) public static final String MINI_THUMB_MAGIC = "mini_thumb_magic"; - /** - * The primary bucket ID of this media item. This can be useful to - * present the user a first-level clustering of related media items. - * This is a read-only column that is automatically computed. - */ - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String BUCKET_ID = "bucket_id"; - - /** - * The primary bucket display name of this media item. This can be - * useful to present the user a first-level clustering of related - * media items. This is a read-only column that is automatically - * computed. - */ - @Column(value = Cursor.FIELD_TYPE_STRING, readOnly = true) + /** @removed promoted to parent interface */ public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; - - /** - * The group ID of this media item. This can be useful to present - * the user a grouping of related media items, such a burst of - * images, or a {@code JPG} and {@code DNG} version of the same - * image. - * <p> - * This is a read-only column that is automatically computed based - * on the first portion of the filename. For example, - * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG} - * will have the same {@link #GROUP_ID} because the first portion of - * their filenames is identical. - */ - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String GROUP_ID = "group_id"; } @@ -2048,11 +2069,7 @@ public final class MediaStore { @Column(value = Cursor.FIELD_TYPE_STRING, readOnly = true) public static final String TITLE_KEY = "title_key"; - /** - * The duration of the audio item. - */ - @DurationMillisLong - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String DURATION = "duration"; /** @@ -2885,12 +2902,7 @@ public final class MediaStore { * Video metadata columns. */ public interface VideoColumns extends MediaColumns { - - /** - * The duration of the video item. - */ - @DurationMillisLong - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String DURATION = "duration"; /** @@ -2965,11 +2977,7 @@ public final class MediaStore { @Column(value = Cursor.FIELD_TYPE_FLOAT, readOnly = true) public static final String LONGITUDE = "longitude"; - /** - * The time the media item was taken. - */ - @CurrentTimeMillisLong - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String DATE_TAKEN = "datetaken"; /** @@ -2983,36 +2991,11 @@ public final class MediaStore { @Column(Cursor.FIELD_TYPE_INTEGER) public static final String MINI_THUMB_MAGIC = "mini_thumb_magic"; - /** - * The primary bucket ID of this media item. This can be useful to - * present the user a first-level clustering of related media items. - * This is a read-only column that is automatically computed. - */ - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String BUCKET_ID = "bucket_id"; - - /** - * The primary bucket display name of this media item. This can be - * useful to present the user a first-level clustering of related - * media items. This is a read-only column that is automatically - * computed. - */ - @Column(value = Cursor.FIELD_TYPE_STRING, readOnly = true) + /** @removed promoted to parent interface */ public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; - - /** - * The group ID of this media item. This can be useful to present - * the user a grouping of related media items, such a burst of - * images, or a {@code JPG} and {@code DNG} version of the same - * image. - * <p> - * This is a read-only column that is automatically computed based - * on the first portion of the filename. For example, - * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG} - * will have the same {@link #GROUP_ID} because the first portion of - * their filenames is identical. - */ - @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true) + /** @removed promoted to parent interface */ public static final String GROUP_ID = "group_id"; /** diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 4088ce8ea4b0..30c4e900f83c 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -358,6 +358,7 @@ public abstract class TextClassifierService extends Service { /** * Returns the platform's default TextClassifier implementation. */ + @NonNull public static TextClassifier getDefaultTextClassifierImplementation(@NonNull Context context) { final TextClassificationManager tcm = context.getSystemService(TextClassificationManager.class); diff --git a/core/java/android/util/StatsLog.java b/core/java/android/util/StatsLog.java index 9da29c0c334e..cfc092cb78e8 100644 --- a/core/java/android/util/StatsLog.java +++ b/core/java/android/util/StatsLog.java @@ -187,21 +187,6 @@ public final class StatsLog extends StatsLogInternal { } /** - * Add a log to the stats log. - * - * @param id The id of the atom - * @param params The parameters of the atom's message. - */ - public static void write(int id, @NonNull Object... params) { - switch (id) { - case PERMISSION_GRANT_REQUEST_RESULT_REPORTED: - write(id, (long) params[0], (int) params[1], (String) params[2], (String) params[3], - (boolean) params[4], (int) params[5]); - break; - } - } - - /** * Write an event to stats log using the raw format. * * @param buffer The encoded buffer of data to write.. diff --git a/core/java/android/util/StatsLogAtoms.java b/core/java/android/util/StatsLogAtoms.java deleted file mode 100644 index 4780cb58ca06..000000000000 --- a/core/java/android/util/StatsLogAtoms.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.util; - -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.annotation.IntDef; -import android.annotation.SystemApi; - -import java.lang.annotation.Retention; - -/** - * Exposed stats logs atom ids. - * - * @hide - */ -@SystemApi -public class StatsLogAtoms { - private StatsLogAtoms() { - } - - /** - * Information about a permission grant request - * - * Usage: {@code StatsLog.write(PERMISSION_GRANT_REQUEST_RESULT_REPORTED, long request_id, - * int requesting_uid, String requesting_package_name, String permission_name, - * boolean is_implicit, @PermissionGrantRequestResultReported_Result int result)} - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED; - - @Retention(SOURCE) - @IntDef(prefix = "PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__", - value = {PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED, - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_USER_FIXED, - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_POLICY_FIXED, - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_GRANTED, - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_GRANTED, - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED, - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED_WITH_PREJUDICE, - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_DENIED}) - public @interface PermissionGrantRequestResultReported_Result {} - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission request was ignored - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission request was ignored because it was user fixed - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_USER_FIXED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_USER_FIXED; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission request was ignored because it was policy fixed - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_POLICY_FIXED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_POLICY_FIXED; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission request was ignored because it was restricted - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_RESTRICTED_PERMISSION = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__IGNORED_RESTRICTED_PERMISSION; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission was granted by user action - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_GRANTED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_GRANTED; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission was automatically granted - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_GRANTED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_GRANTED; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission was denied by user action - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission was denied with prejudice by the user - */ - public static final int - PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED_WITH_PREJUDICE = - StatsLogInternal - .PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_DENIED_WITH_PREJUDICE; - - /** - * Possible value of {@link PermissionGrantRequestResultReported_Result}: - * permission was automatically denied - */ - public static final int PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_DENIED = - StatsLogInternal.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__AUTO_DENIED; -} diff --git a/core/java/android/view/InputMonitor.java b/core/java/android/view/InputMonitor.java index 693f2873522c..bbd27dc45779 100644 --- a/core/java/android/view/InputMonitor.java +++ b/core/java/android/view/InputMonitor.java @@ -22,6 +22,13 @@ import android.os.Parcelable; import android.os.RemoteException; /** + * An {@code InputMonitor} allows privileged applications and components to monitor streams of + * {@link InputEvent}s without having to be the designated recipient for the event. + * + * For example, focus dispatched events would normally only go to the focused window on the + * targeted display, but an {@code InputMonitor} will also receive a copy of that event if they're + * registered to monitor that type of event on the targeted display. + * * @hide */ public final class InputMonitor implements Parcelable { diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index b5ad908e5ea5..d67c8847f3bc 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -90,8 +90,8 @@ public final class SurfaceControl implements Parcelable { private static native ScreenshotGraphicBuffer nativeScreenshot(IBinder displayToken, Rect sourceCrop, int width, int height, boolean useIdentityTransform, int rotation, boolean captureSecureLayers); - private static native ScreenshotGraphicBuffer nativeCaptureLayers(IBinder layerHandleToken, - Rect sourceCrop, float frameScale, IBinder[] excludeLayers); + private static native ScreenshotGraphicBuffer nativeCaptureLayers(IBinder displayToken, + IBinder layerHandleToken, Rect sourceCrop, float frameScale, IBinder[] excludeLayers); private static native long nativeCreateTransaction(); private static native long nativeGetNativeTransactionFinalizer(); @@ -1998,7 +1998,8 @@ public final class SurfaceControl implements Parcelable { */ public static ScreenshotGraphicBuffer captureLayers(IBinder layerHandleToken, Rect sourceCrop, float frameScale) { - return nativeCaptureLayers(layerHandleToken, sourceCrop, frameScale, null); + final IBinder displayToken = SurfaceControl.getInternalDisplayToken(); + return nativeCaptureLayers(displayToken, layerHandleToken, sourceCrop, frameScale, null); } /** @@ -2007,7 +2008,8 @@ public final class SurfaceControl implements Parcelable { */ public static ScreenshotGraphicBuffer captureLayersExcluding(IBinder layerHandleToken, Rect sourceCrop, float frameScale, IBinder[] exclude) { - return nativeCaptureLayers(layerHandleToken, sourceCrop, frameScale, exclude); + final IBinder displayToken = SurfaceControl.getInternalDisplayToken(); + return nativeCaptureLayers(displayToken, layerHandleToken, sourceCrop, frameScale, exclude); } /** diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java index 66a72f9b2e9e..f3e0dc1ed843 100644 --- a/core/java/android/view/textclassifier/TextLinks.java +++ b/core/java/android/view/textclassifier/TextLinks.java @@ -281,6 +281,7 @@ public final class TextLinks implements Parcelable { /** * Returns a bundle containing custom data related to this TextLink. */ + @NonNull public Bundle getExtras() { return mExtras; } diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 37bed6538a26..4c32f03f6cb3 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -21,6 +21,7 @@ import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.content.Context; +import android.content.res.ResourceId; import android.content.res.TypedArray; import android.graphics.Rect; import android.os.Build; @@ -1991,7 +1992,7 @@ public class RelativeLayout extends ViewGroup { // dependencies for a specific set of rules for (int j = 0; j < rulesCount; j++) { final int rule = rules[rulesFilter[j]]; - if (rule > 0) { + if (ResourceId.isValid(rule)) { // The node this node depends on final Node dependency = keyNodes.get(rule); // Skip unknowns and self dependencies diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index bfdbf4c1ec23..4d4fe0397791 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -1427,11 +1427,9 @@ public class ChooserActivity extends ResolverActivity { } private void updateAlphabeticalList() { - if (getDisplayList().size() > MAX_RANKED_TARGETS) { - mSortedList.clear(); - mSortedList.addAll(getDisplayList()); - Collections.sort(mSortedList, new AzInfoComparator(ChooserActivity.this)); - } + mSortedList.clear(); + mSortedList.addAll(getDisplayList()); + Collections.sort(mSortedList, new AzInfoComparator(ChooserActivity.this)); } /** @@ -2047,12 +2045,13 @@ public class ChooserActivity extends ResolverActivity { @Override public int getUnfilteredCount() { int appTargets = super.getUnfilteredCount(); - if (appTargets > MAX_RANKED_TARGETS) { - appTargets = appTargets + MAX_RANKED_TARGETS; + if (appTargets > getMaxRankedTargets()) { + appTargets = appTargets + getMaxRankedTargets(); } return appTargets + getSelectableServiceTargetCount() + getCallerTargetCount(); } + public int getCallerTargetCount() { return Math.min(mCallerTargets.size(), MAX_SUGGESTED_APP_TARGETS); } @@ -2080,14 +2079,17 @@ public class ChooserActivity extends ResolverActivity { int getAlphaTargetCount() { int standardCount = super.getCount(); - return standardCount > MAX_RANKED_TARGETS ? standardCount : 0; + return standardCount > getMaxRankedTargets() ? standardCount : 0; } int getRankedTargetCount() { - int spacesAvailable = MAX_RANKED_TARGETS - getCallerTargetCount(); + int spacesAvailable = getMaxRankedTargets() - getCallerTargetCount(); return Math.min(spacesAvailable, super.getCount()); } + private int getMaxRankedTargets() { + return mChooserRowAdapter == null ? 4 : mChooserRowAdapter.getMaxTargetsPerRow(); + } public int getPositionTargetType(int position) { int offset = 0; diff --git a/core/java/com/android/internal/app/SimpleIconFactory.java b/core/java/com/android/internal/app/SimpleIconFactory.java index a85485d3969b..2484109f8520 100644 --- a/core/java/com/android/internal/app/SimpleIconFactory.java +++ b/core/java/com/android/internal/app/SimpleIconFactory.java @@ -34,6 +34,8 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AdaptiveIconDrawable; @@ -56,7 +58,7 @@ import java.nio.ByteBuffer; /** * @deprecated Use the Launcher3 Iconloaderlib at packages/apps/Launcher3/iconloaderlib. This class * is a temporary fork of Iconloader. It combines all necessary methods to render app icons that are - * possibly badged. It is intended to be used only by Sharesheet for the Q release. + * possibly badged. It is intended to be used only by Sharesheet for the Q release with custom code. */ @Deprecated public class SimpleIconFactory { @@ -202,6 +204,7 @@ public class SimpleIconFactory { /** * Creates bitmap using the source drawable and flattened pre-rendered app icon. * The bitmap is visually normalized with other icons and has enough spacing to add shadow. + * This is custom functionality added to Iconloaderlib that will need to be ported. * * @param icon source of the icon associated with a user that has no badge * @param renderedAppIcon pre-rendered app icon to use as a badge, likely the output @@ -212,34 +215,70 @@ public class SimpleIconFactory { */ @Deprecated Bitmap createAppBadgedIconBitmap(@Nullable Drawable icon, Bitmap renderedAppIcon) { - // Flatten the passed in icon - float [] scale = new float[1]; - // If no icon is provided use the system default if (icon == null) { icon = getFullResDefaultActivityIcon(mFillResIconDpi); } - icon = normalizeAndWrapToAdaptiveIcon(icon, null, scale); - Bitmap bitmap = createIconBitmap(icon, scale[0]); - if (icon instanceof AdaptiveIconDrawable) { - mCanvas.setBitmap(bitmap); - recreateIcon(Bitmap.createBitmap(bitmap), mCanvas); - mCanvas.setBitmap(null); + + // Direct share icons cannot be adaptive, most will arrive as bitmaps. To get reliable + // presentation, force all DS icons to be circular. Scale DS image so it completely fills. + int w = icon.getIntrinsicWidth(); + int h = icon.getIntrinsicHeight(); + float scale = 1; + if (h > w && w > 0) { + scale = (float) h / w; + } else if (w > h && h > 0) { + scale = (float) w / h; } + Bitmap bitmap = createIconBitmap(icon, scale); + bitmap = maskBitmapToCircle(bitmap); + icon = new BitmapDrawable(mContext.getResources(), bitmap); - // Now scale down and apply the badge to the bottom right corner of the flattened icon - renderedAppIcon = Bitmap.createScaledBitmap(renderedAppIcon, mBadgeBitmapSize, - mBadgeBitmapSize, false); + // We now have a circular masked and scaled icon, inset and apply shadow + scale = getScale(icon, null); + bitmap = createIconBitmap(icon, scale); - // Paint the provided badge on top of the flattened icon mCanvas.setBitmap(bitmap); - mCanvas.drawBitmap(renderedAppIcon, mIconBitmapSize - mBadgeBitmapSize, - mIconBitmapSize - mBadgeBitmapSize, null); + recreateIcon(Bitmap.createBitmap(bitmap), mCanvas); + + if (renderedAppIcon != null) { + // Now scale down and apply the badge to the bottom right corner of the flattened icon + renderedAppIcon = Bitmap.createScaledBitmap(renderedAppIcon, mBadgeBitmapSize, + mBadgeBitmapSize, false); + + // Paint the provided badge on top of the flattened icon + mCanvas.drawBitmap(renderedAppIcon, mIconBitmapSize - mBadgeBitmapSize, + mIconBitmapSize - mBadgeBitmapSize, null); + } + mCanvas.setBitmap(null); return bitmap; } + private Bitmap maskBitmapToCircle(Bitmap bitmap) { + final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), + bitmap.getHeight(), Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(output); + final Paint paint = new Paint(); + paint.setAntiAlias(true); + + // Draw mask + paint.setColor(0xffffffff); + canvas.drawARGB(0, 0, 0, 0); + canvas.drawCircle(bitmap.getWidth() / 2f, + bitmap.getHeight() / 2f, + bitmap.getWidth() / 2f - 1 /* -1 to avoid circles with flat sides */, + paint); + + // Draw masked bitmap + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + canvas.drawBitmap(bitmap, rect, rect, paint); + + return output; + } + private static Drawable getFullResDefaultActivityIcon(int iconDpi) { return Resources.getSystem().getDrawableForDensity(android.R.mipmap.sym_def_app_icon, iconDpi); diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index afdeb1b602d7..a295bd21b20f 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -566,7 +566,18 @@ public final class Zygote { System.exit(-1); } finally { IoUtils.closeQuietly(sessionSocket); - IoUtils.closeQuietly(usapPoolSocket); + + try { + // This socket is closed using Os.close due to an issue with the implementation of + // LocalSocketImp.close. Because the raw FD is created by init and then loaded from + // an environment variable (as opposed to being created by the LocalSocketImpl + // itself) the current implementation will not actually close the underlying FD. + // + // See b/130309968 for discussion of this issue. + Os.close(usapPoolSocket.getFileDescriptor()); + } catch (ErrnoException ex) { + Log.e("USAP", "Failed to close USAP pool socket: " + ex.getMessage()); + } } try { diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index b6ee0fe782a6..f2665020b49e 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -678,6 +678,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) char lockProfThresholdBuf[sizeof("-Xlockprofthreshold:")-1 + PROPERTY_VALUE_MAX]; char nativeBridgeLibrary[sizeof("-XX:NativeBridge=") + PROPERTY_VALUE_MAX]; char cpuAbiListBuf[sizeof("--cpu-abilist=") + PROPERTY_VALUE_MAX]; + char corePlatformApiPolicyBuf[sizeof("-Xcore-platform-api-policy:") + PROPERTY_VALUE_MAX]; char methodTraceFileBuf[sizeof("-Xmethod-trace-file:") + PROPERTY_VALUE_MAX]; char methodTraceFileSizeBuf[sizeof("-Xmethod-trace-file-size:") + PROPERTY_VALUE_MAX]; std::string fingerprintBuf; @@ -1024,6 +1025,16 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) addOption("--generate-mini-debug-info"); } + // If set, the property below can be used to enable core platform API violation reporting. + property_get("persist.debug.dalvik.vm.core_platform_api_policy", propBuf, ""); + if (propBuf[0] != '\0') { + snprintf(corePlatformApiPolicyBuf, + sizeof(corePlatformApiPolicyBuf), + "-Xcore-platform-api-policy:%s", + propBuf); + addOption(corePlatformApiPolicyBuf); + } + /* * Retrieve the build fingerprint and provide it to the runtime. That way, ANR dumps will * contain the fingerprint and can be parsed. diff --git a/core/jni/android_media_AudioProductStrategies.cpp b/core/jni/android_media_AudioProductStrategies.cpp index 822b74a6b990..17a02b24c697 100644 --- a/core/jni/android_media_AudioProductStrategies.cpp +++ b/core/jni/android_media_AudioProductStrategies.cpp @@ -39,7 +39,7 @@ using namespace android; // ---------------------------------------------------------------------------- -static const char* const kClassPathName = "android/media/audiopolicy/AudioProductStrategies"; +static const char* const kClassPathName = "android/media/audiopolicy/AudioProductStrategy"; static const char* const kAudioProductStrategyClassPathName = "android/media/audiopolicy/AudioProductStrategy"; @@ -194,34 +194,12 @@ exit: return jStatus; } -static jint -android_media_AudioSystem_getProductStrategyFromAudioAttributes(JNIEnv *env, jobject clazz, - jobject jAudioAttributes) -{ - JNIAudioAttributeHelper::UniqueAaPtr attributes = JNIAudioAttributeHelper::makeUnique(); - jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, - jAudioAttributes, - attributes.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { - return jStatus; - } - product_strategy_t psId; - status_t status = AudioSystem::getProductStrategyFromAudioAttributes( - AudioAttributes(*attributes.get()), psId); - if (status != NO_ERROR) { - return nativeToJavaStatus(status); - } - return psId; -} - /* * JNI registration. */ static const JNINativeMethod gMethods[] = { {"native_list_audio_product_strategies", "(Ljava/util/ArrayList;)I", (void *)android_media_AudioSystem_listAudioProductStrategies}, - {"native_get_product_strategies_from_audio_attributes", "(Landroid/media/AudioAttributes;)I", - (void *)android_media_AudioSystem_getProductStrategyFromAudioAttributes}, }; int register_android_media_AudioProductStrategies(JNIEnv *env) diff --git a/core/jni/android_media_AudioVolumeGroups.cpp b/core/jni/android_media_AudioVolumeGroups.cpp index 64f0c1e33e1c..7098451901c4 100644 --- a/core/jni/android_media_AudioVolumeGroups.cpp +++ b/core/jni/android_media_AudioVolumeGroups.cpp @@ -39,7 +39,7 @@ using namespace android; // ---------------------------------------------------------------------------- -static const char* const kClassPathName = "android/media/audiopolicy/AudioVolumeGroups"; +static const char* const kClassPathName = "android/media/audiopolicy/AudioVolumeGroup"; static const char* const kAudioVolumeGroupClassPathName = "android/media/audiopolicy/AudioVolumeGroup"; diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp index dd754f35bba8..28c59db6b932 100644 --- a/core/jni/android_net_NetUtils.cpp +++ b/core/jni/android_net_NetUtils.cpp @@ -270,7 +270,7 @@ static jobject android_net_utils_resNetworkSend(JNIEnv *env, jobject thiz, jint return jniCreateFileDescriptor(env, fd); } -static jbyteArray android_net_utils_resNetworkResult(JNIEnv *env, jobject thiz, jobject javaFd) { +static jobject android_net_utils_resNetworkResult(JNIEnv *env, jobject thiz, jobject javaFd) { int fd = jniGetFDFromFileDescriptor(env, javaFd); int rcode; std::vector<uint8_t> buf(MAXPACKETSIZE, 0); @@ -291,7 +291,10 @@ static jbyteArray android_net_utils_resNetworkResult(JNIEnv *env, jobject thiz, reinterpret_cast<jbyte*>(buf.data())); } - return answer; + jclass class_DnsResponse = env->FindClass("android/net/DnsResolver$DnsResponse"); + jmethodID ctor = env->GetMethodID(class_DnsResponse, "<init>", "([BI)V"); + + return env->NewObject(class_DnsResponse, ctor, answer, rcode); } static void android_net_utils_resNetworkCancel(JNIEnv *env, jobject thiz, jobject javaFd) { @@ -354,7 +357,7 @@ static const JNINativeMethod gNetworkUtilMethods[] = { { "setupRaSocket", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_utils_setupRaSocket }, { "resNetworkSend", "(I[BII)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkSend }, { "resNetworkQuery", "(ILjava/lang/String;III)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkQuery }, - { "resNetworkResult", "(Ljava/io/FileDescriptor;)[B", (void*) android_net_utils_resNetworkResult }, + { "resNetworkResult", "(Ljava/io/FileDescriptor;)Landroid/net/DnsResolver$DnsResponse;", (void*) android_net_utils_resNetworkResult }, { "resNetworkCancel", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_resNetworkCancel }, }; diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 3135c62c9c61..c0b31e49960b 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -271,8 +271,9 @@ static jobject nativeScreenshot(JNIEnv* env, jclass clazz, capturedSecureLayers); } -static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandleToken, - jobject sourceCropObj, jfloat frameScale, jobjectArray excludeArray) { +static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject displayTokenObj, + jobject layerHandleToken, jobject sourceCropObj, jfloat frameScale, + jobjectArray excludeArray) { sp<IBinder> layerHandle = ibinderForJavaObject(env, layerHandleToken); if (layerHandle == NULL) { @@ -301,7 +302,12 @@ static jobject nativeCaptureLayers(JNIEnv* env, jclass clazz, jobject layerHandl } sp<GraphicBuffer> buffer; - const ui::Dataspace dataspace = ui::Dataspace::V0_SRGB; + ui::Dataspace dataspace = ui::Dataspace::V0_SRGB; + sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj); + if (displayToken != nullptr) { + const ui::ColorMode colorMode = SurfaceComposerClient::getActiveColorMode(displayToken); + dataspace = pickDataspaceFromColorMode(colorMode); + } status_t res = ScreenshotClient::captureChildLayers(layerHandle, dataspace, ui::PixelFormat::RGBA_8888, sourceCrop, excludeHandles, frameScale, &buffer); @@ -1373,7 +1379,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { "Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;", (void*)nativeScreenshot }, {"nativeCaptureLayers", - "(Landroid/os/IBinder;Landroid/graphics/Rect;F[Landroid/os/IBinder;)" + "(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/graphics/Rect;" + "F[Landroid/os/IBinder;)" "Landroid/view/SurfaceControl$ScreenshotGraphicBuffer;", (void*)nativeCaptureLayers }, {"nativeSetInputWindowInfo", "(JJLandroid/view/InputWindowHandle;)V", diff --git a/core/res/res/layout/chooser_grid_preview_text.xml b/core/res/res/layout/chooser_grid_preview_text.xml index 45287002ebf7..3c9ffdb8e439 100644 --- a/core/res/res/layout/chooser_grid_preview_text.xml +++ b/core/res/res/layout/chooser_grid_preview_text.xml @@ -54,6 +54,7 @@ android:layout_gravity="center_vertical" android:src="@drawable/ic_content_copy_gm2" android:clickable="true" + android:contentDescription="@string/copy" android:background="?attr/selectableItemBackgroundBorderless"/> </LinearLayout> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index f27f34ae3420..edcc0572cb2e 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -745,6 +745,10 @@ <!-- XXXXXX END OF RESOURCES USING WRONG NAMING CONVENTION --> + <!-- If this is true, notification effects will be played by the notification server. + When false, car notification effects will be handled elsewhere. --> + <bool name="config_enableServerNotificationEffectsForAutomotive">false</bool> + <!-- If this is true, the screen will come on when you unplug usb/power/whatever. --> <bool name="config_unplugTurnsOnScreen">false</bool> @@ -1971,10 +1975,6 @@ <bool name="config_showDefaultEmergency">false</bool> <!-- Whether the default home settings should be shown. --> <bool name="config_showDefaultHome">true</bool> - <!-- The name of the package that will hold the music role by default. --> - <string name="config_defaultMusic" translatable="false">com.android.music</string> - <!-- The name of the package that will hold the gallery role by default. --> - <string name="config_defaultGallery" translatable="false">com.android.gallery3d</string> <!-- Enable/disable default bluetooth profiles: HSP_AG, ObexObjectPush, Audio, NAP --> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 626518c97ac1..0bcd39f82edf 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2987,10 +2987,6 @@ <public name="config_defaultDialer" /> <!-- @hide @SystemApi --> <public name="config_defaultSms" /> - <!-- @hide @SystemApi --> - <public name="config_defaultMusic" /> - <!-- @hide @SystemApi --> - <public name="config_defaultGallery" /> </public-group> <public-group type="bool" first-id="0x01110000"> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e9ce6ac93973..da2f89083fef 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1910,6 +1910,7 @@ <java-symbol type="array" name="config_testLocationProviders" /> <java-symbol type="array" name="config_defaultNotificationVibePattern" /> <java-symbol type="array" name="config_notificationFallbackVibePattern" /> + <java-symbol type="bool" name="config_enableServerNotificationEffectsForAutomotive" /> <java-symbol type="bool" name="config_useAttentionLight" /> <java-symbol type="bool" name="config_adaptive_sleep_available" /> <java-symbol type="bool" name="config_animateScreenLights" /> @@ -3751,4 +3752,9 @@ <!-- For DropBox --> <java-symbol type="integer" name="config_dropboxLowPriorityBroadcastRateLimitPeriod" /> <java-symbol type="array" name="config_dropboxLowPriorityTags" /> + + <!-- For Privacy Type --> + <java-symbol type="drawable" name="perm_group_camera" /> + <java-symbol type="drawable" name="perm_group_location" /> + <java-symbol type="drawable" name="perm_group_microphone" /> </resources> diff --git a/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java b/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java index 99b6421d2bc7..267cb365748e 100644 --- a/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java +++ b/core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java @@ -163,6 +163,20 @@ public class InstallOverlayTests extends BaseHostJUnit4Test { assertTrue(overlayManagerContainsPackage(APP_OVERLAY_PACKAGE_NAME)); } + @Test + public void changesPersistedWhenUninstallingDisabledOverlay() throws Exception { + getDevice().enableAdbRoot(); + assertFalse(getDevice().executeShellCommand("cat /data/system/overlays.xml") + .contains(APP_OVERLAY_PACKAGE_NAME)); + installPackage("OverlayHostTests_AppOverlayV1.apk"); + assertTrue(getDevice().executeShellCommand("cat /data/system/overlays.xml") + .contains(APP_OVERLAY_PACKAGE_NAME)); + uninstallPackage(APP_OVERLAY_PACKAGE_NAME); + delay(); + assertFalse(getDevice().executeShellCommand("cat /data/system/overlays.xml") + .contains(APP_OVERLAY_PACKAGE_NAME)); + } + private void delay() { try { Thread.sleep(1000); diff --git a/location/java/android/location/GnssStatus.java b/location/java/android/location/GnssStatus.java index ce464b7bda37..211a0cb5852d 100644 --- a/location/java/android/location/GnssStatus.java +++ b/location/java/android/location/GnssStatus.java @@ -17,6 +17,7 @@ package android.location; import android.annotation.IntDef; +import android.annotation.NonNull; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -44,6 +45,8 @@ public final class GnssStatus { public static final int CONSTELLATION_GALILEO = 6; /** Constellation type constant for IRNSS. */ public static final int CONSTELLATION_IRNSS = 7; + /** @hide */ + public static final int CONSTELLATION_COUNT = 8; /** @hide */ public static final int GNSS_SV_FLAGS_NONE = 0; @@ -251,4 +254,36 @@ public final class GnssStatus { public float getCarrierFrequencyHz(int satIndex) { return mCarrierFrequencies[satIndex]; } + + /** + * Returns the string representation of a constellation type. For example, + * {@link #CONSTELLATION_GPS} is represented by the string GPS. + * + * @param constellationType the constellation type. + * @return the string representation. + * @hide + */ + @NonNull + public static String constellationTypeToString(@ConstellationType int constellationType) { + switch (constellationType) { + case CONSTELLATION_UNKNOWN: + return "UNKNOWN"; + case CONSTELLATION_GPS: + return "GPS"; + case CONSTELLATION_SBAS: + return "SBAS"; + case CONSTELLATION_GLONASS: + return "GLONASS"; + case CONSTELLATION_QZSS: + return "QZSS"; + case CONSTELLATION_BEIDOU: + return "BEIDOU"; + case CONSTELLATION_GALILEO: + return "GALILEO"; + case CONSTELLATION_IRNSS: + return "IRNSS"; + default: + return Integer.toString(constellationType); + } + } } diff --git a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java index 057a4ae879f4..78239714ca3b 100644 --- a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java +++ b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java @@ -16,26 +16,26 @@ package com.android.internal.location.gnssmetrics; +import android.location.GnssStatus; import android.os.SystemClock; -import android.os.connectivity.GpsBatteryStats; import android.os.SystemProperties; - +import android.os.connectivity.GpsBatteryStats; import android.server.location.ServerLocationProtoEnums; - import android.text.format.DateUtils; import android.util.Base64; import android.util.Log; import android.util.StatsLog; import android.util.TimeUtils; -import java.util.Arrays; - import com.android.internal.app.IBatteryStats; import com.android.internal.location.nano.GnssLogsProto.GnssLog; import com.android.internal.location.nano.GnssLogsProto.PowerMetrics; +import java.util.Arrays; + /** * GnssMetrics: Is used for logging GNSS metrics + * * @hide */ public class GnssMetrics { @@ -66,6 +66,11 @@ public class GnssMetrics { /* GNSS power metrics */ private GnssPowerMetrics mGnssPowerMetrics; + /** + * A boolean array indicating whether the constellation types have been used in fix. + */ + private boolean[] mConstellationTypes; + /** Constructor */ public GnssMetrics(IBatteryStats stats) { mGnssPowerMetrics = new GnssPowerMetrics(stats); @@ -156,6 +161,18 @@ public class GnssMetrics { return; } + + /** + * Logs that a constellation type has been observed. + */ + public void logConstellationType(int constellationType) { + if (constellationType >= mConstellationTypes.length) { + Log.e(TAG, "Constellation type " + constellationType + " is not valid."); + return; + } + mConstellationTypes[constellationType] = true; + } + /** * Dumps GNSS metrics as a proto string * @return @@ -232,6 +249,13 @@ public class GnssMetrics { s.append(" Top 4 Avg CN0 standard deviation (dB-Hz): ").append( topFourAverageCn0Statistics.getStandardDeviation()).append("\n"); } + s.append(" Used-in-fix constellation types: "); + for (int i = 0; i < mConstellationTypes.length; i++) { + if (mConstellationTypes[i]) { + s.append(GnssStatus.constellationTypeToString(i)).append(" "); + } + } + s.append("\n"); s.append("GNSS_KPI_END").append("\n"); GpsBatteryStats stats = mGnssPowerMetrics.getGpsBatteryStats(); if (stats != null) { @@ -320,9 +344,15 @@ public class GnssMetrics { timeToFirstFixSecStatistics.reset(); positionAccuracyMeterStatistics.reset(); topFourAverageCn0Statistics.reset(); + resetConstellationTypes(); return; } + /** Resets {@link #mConstellationTypes} as an all-false boolean array. */ + public void resetConstellationTypes() { + mConstellationTypes = new boolean[GnssStatus.CONSTELLATION_COUNT]; + } + /* Class for handling GNSS power related metrics */ private class GnssPowerMetrics { diff --git a/media/apex/java/android/media/DataSourceDesc.java b/media/apex/java/android/media/DataSourceDesc.java index d00ff2a70955..9a9c74aba2c7 100644 --- a/media/apex/java/android/media/DataSourceDesc.java +++ b/media/apex/java/android/media/DataSourceDesc.java @@ -34,6 +34,8 @@ import java.util.Map; * * Used by {@link MediaPlayer2#setDataSource}, {@link MediaPlayer2#setNextDataSource} and * {@link MediaPlayer2#setNextDataSources} to set data source for playback. + * + * @hide */ public class DataSourceDesc { // intentionally less than long.MAX_VALUE diff --git a/media/apex/java/android/media/FileDataSourceDesc.java b/media/apex/java/android/media/FileDataSourceDesc.java index feb67e136d9b..2aa2cb7eb1bb 100644 --- a/media/apex/java/android/media/FileDataSourceDesc.java +++ b/media/apex/java/android/media/FileDataSourceDesc.java @@ -17,7 +17,6 @@ package android.media; import android.annotation.NonNull; -import android.annotation.TestApi; import android.os.ParcelFileDescriptor; import android.util.Log; @@ -32,7 +31,6 @@ import java.io.IOException; * <p>Users should use {@link Builder} to create {@link FileDataSourceDesc}. * @hide */ -@TestApi public class FileDataSourceDesc extends DataSourceDesc { private static final String TAG = "FileDataSourceDesc"; diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java index 72c18f6148f0..614d737e3758 100644 --- a/media/apex/java/android/media/MediaPlayer2.java +++ b/media/apex/java/android/media/MediaPlayer2.java @@ -273,6 +273,8 @@ import java.util.concurrent.atomic.AtomicLong; * Then check the <code>status</code> parameter. The value {@link #CALL_STATUS_NO_ERROR} indicates a * successful transition. Any other value will be an error. Call {@link #getState()} to * determine the current state. </p> + * + * @hide */ public class MediaPlayer2 implements AutoCloseable, AudioRouting { static { diff --git a/media/apex/java/android/media/UriDataSourceDesc.java b/media/apex/java/android/media/UriDataSourceDesc.java index eaedf1e377e2..adf7a7ddddb9 100644 --- a/media/apex/java/android/media/UriDataSourceDesc.java +++ b/media/apex/java/android/media/UriDataSourceDesc.java @@ -18,7 +18,6 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.TestApi; import android.net.Uri; import java.net.HttpCookie; @@ -36,7 +35,6 @@ import java.util.Map; * <p>Users should use {@link Builder} to change {@link UriDataSourceDesc}. * @hide */ -@TestApi public class UriDataSourceDesc extends DataSourceDesc { private Uri mUri; private Map<String, String> mHeader; diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index 9d4bce7b4301..d8640967a30a 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -20,7 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; -import android.media.audiopolicy.AudioProductStrategies; +import android.media.audiopolicy.AudioProductStrategy; import android.os.Build; import android.os.Bundle; import android.os.Parcel; @@ -783,9 +783,10 @@ public final class AudioAttributes implements Parcelable { */ @UnsupportedAppUsage public Builder setInternalLegacyStreamType(int streamType) { - final AudioProductStrategies ps = new AudioProductStrategies(); - if (ps.size() > 0) { - AudioAttributes attributes = ps.getAudioAttributesForLegacyStreamType(streamType); + if (AudioProductStrategy.getAudioProductStrategies().size() > 0) { + AudioAttributes attributes = + AudioProductStrategy.getAudioAttributesForStrategyWithLegacyStreamType( + streamType); if (attributes != null) { return new Builder(attributes); } @@ -1165,9 +1166,8 @@ public final class AudioAttributes implements Parcelable { AudioSystem.STREAM_MUSIC : AudioSystem.STREAM_TTS; } - final AudioProductStrategies ps = new AudioProductStrategies(); - if (ps.size() > 0) { - return ps.getLegacyStreamTypeForAudioAttributes(aa); + if (AudioProductStrategy.getAudioProductStrategies().size() > 0) { + return AudioProductStrategy.getLegacyStreamTypeForStrategyWithAudioAttributes(aa); } // usage to stream type mapping switch (aa.getUsage()) { diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index a5a409286754..d5eee6308ae0 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -37,9 +37,9 @@ import android.content.Context; import android.content.Intent; import android.media.audiopolicy.AudioPolicy; import android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener; -import android.media.audiopolicy.AudioProductStrategies; +import android.media.audiopolicy.AudioProductStrategy; +import android.media.audiopolicy.AudioVolumeGroup; import android.media.audiopolicy.AudioVolumeGroupChangeHandler; -import android.media.audiopolicy.AudioVolumeGroups; import android.media.projection.MediaProjection; import android.media.session.MediaController; import android.media.session.MediaSession; @@ -5406,8 +5406,9 @@ public class AudioManager { * {@see android.media.audiopolicy.AudioProductStrategy} objects. */ @SystemApi + @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) - public @NonNull AudioProductStrategies getAudioProductStrategies() { + public static List<AudioProductStrategy> getAudioProductStrategies() { final IAudioService service = getService(); try { return service.getAudioProductStrategies(); @@ -5421,15 +5422,16 @@ public class AudioManager { * Introspection API to retrieve audio volume groups. * When implementing {Car|Oem}AudioManager, use this method to retrieve the collection of * audio volume groups. - * @return a (possibly zero-length) array of - * {@see android.media.audiopolicy.AudioVolumeGroups} objects. + * @return a (possibly zero-length) List of + * {@see android.media.audiopolicy.AudioVolumeGroup} objects. */ @SystemApi + @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) - public @NonNull AudioVolumeGroups getAudioVolumeGroups() { + public static List<AudioVolumeGroup> getAudioVolumeGroups() { final IAudioService service = getService(); try { - return service.listAudioVolumeGroups(); + return service.getAudioVolumeGroups(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 980cb0459821..eddbee46252e 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -33,8 +33,8 @@ import android.media.IVolumeController; import android.media.PlayerBase; import android.media.VolumePolicy; import android.media.audiopolicy.AudioPolicyConfig; -import android.media.audiopolicy.AudioProductStrategies; -import android.media.audiopolicy.AudioVolumeGroups; +import android.media.audiopolicy.AudioProductStrategy; +import android.media.audiopolicy.AudioVolumeGroup; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; import android.net.Uri; @@ -86,7 +86,7 @@ interface IAudioService { @UnsupportedAppUsage int getStreamMaxVolume(int streamType); - AudioVolumeGroups listAudioVolumeGroups(); + List<AudioVolumeGroup> getAudioVolumeGroups(); void setVolumeIndexForAttributes(in AudioAttributes aa, int index, int flags, String callingPackage); @@ -98,7 +98,7 @@ interface IAudioService { int getLastAudibleStreamVolume(int streamType); - AudioProductStrategies getAudioProductStrategies(); + List<AudioProductStrategy> getAudioProductStrategies(); void setMicrophoneMute(boolean on, String callingPackage, int userId); diff --git a/media/java/android/media/audiopolicy/AudioProductStrategies.aidl b/media/java/android/media/audiopolicy/AudioProductStrategies.aidl deleted file mode 100644 index bec11bcfab5d..000000000000 --- a/media/java/android/media/audiopolicy/AudioProductStrategies.aidl +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright 2018, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -package android.media.audiopolicy; - -parcelable AudioProductStrategies; diff --git a/media/java/android/media/audiopolicy/AudioProductStrategies.java b/media/java/android/media/audiopolicy/AudioProductStrategies.java deleted file mode 100644 index c305b683f136..000000000000 --- a/media/java/android/media/audiopolicy/AudioProductStrategies.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.media.audiopolicy; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SystemApi; -import android.media.AudioAttributes; -import android.media.AudioSystem; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; - -import com.android.internal.util.Preconditions; - -import java.util.ArrayList; -import java.util.Iterator; - -/** - * @hide - * A class to encapsulate a collection of {@link AudioProductStrategy}. - * Provides helper functions to easily retrieve the {@link AudioAttributes} for a given product - * strategy or legacy stream type. - */ -@SystemApi -public final class AudioProductStrategies implements Iterable<AudioProductStrategy>, Parcelable { - - private final ArrayList<AudioProductStrategy> mAudioProductStrategyList; - - private static final String TAG = "AudioProductStrategies"; - - public AudioProductStrategies() { - ArrayList<AudioProductStrategy> apsList = new ArrayList<AudioProductStrategy>(); - int status = native_list_audio_product_strategies(apsList); - if (status != AudioSystem.SUCCESS) { - Log.w(TAG, ": createAudioProductStrategies failed"); - } - mAudioProductStrategyList = apsList; - } - - private AudioProductStrategies(ArrayList<AudioProductStrategy> audioProductStrategy) { - mAudioProductStrategyList = audioProductStrategy; - } - - /** - * @hide - * @return number of {@link AudioProductStrategy} objects - */ - @SystemApi - public int size() { - return mAudioProductStrategyList.size(); - } - - /** - * @hide - * @return the matching {@link AudioProductStrategy} objects with the given id, - * null object if not found. - */ - @SystemApi - public @Nullable AudioProductStrategy getById(int productStrategyId) { - for (final AudioProductStrategy avg : this) { - if (avg.getId() == productStrategyId) { - return avg; - } - } - Log.e(TAG, ": invalid product strategy id: " + productStrategyId + " requested"); - return null; - } - - /** - * Returns an {@link Iterator} - */ - @Override - public @NonNull Iterator<AudioProductStrategy> iterator() { - return mAudioProductStrategyList.iterator(); - } - - @Override - public boolean equals(@Nullable Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - AudioProductStrategies that = (AudioProductStrategies) o; - - return mAudioProductStrategyList.equals(that.mAudioProductStrategyList); - } - - /** - * @hide - * @param aps {@link AudioProductStrategy} (which is the generalisation of Car Audio Usage / - * legacy routing_strategy linked to {@link AudioAttributes#getUsage()} ) - * @return the {@link AudioAttributes} relevant for the given product strategy. - * If none is found, it builds the default attributes. - * TODO: shall the helper collection be able to identify the platform default? - */ - @SystemApi - @NonNull - public AudioAttributes getAudioAttributesForProductStrategy(@NonNull AudioProductStrategy aps) { - Preconditions.checkNotNull(aps, "AudioProductStrategy must not be null"); - for (final AudioProductStrategy audioProductStrategy : this) { - if (audioProductStrategy.equals(aps)) { - return audioProductStrategy.getAudioAttributes(); - } - } - return new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN) - .setUsage(AudioAttributes.USAGE_UNKNOWN).build(); - } - - /** - * @hide - * @param streamType legacy stream type used for volume operation only - * @return the {@link AudioAttributes} relevant for the given streamType. - * If none is found, it builds the default attributes. - */ - @SystemApi - public @NonNull AudioAttributes getAudioAttributesForLegacyStreamType(int streamType) { - for (final AudioProductStrategy productStrategy : this) { - AudioAttributes aa = productStrategy.getAudioAttributesForLegacyStreamType(streamType); - if (aa != null) { - return aa; - } - } - return new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN) - .setUsage(AudioAttributes.USAGE_UNKNOWN).build(); - } - - /** - * @hide - * @param aa the {@link AudioAttributes} for which stream type is requested - * @return the legacy stream type relevant for the given {@link AudioAttributes}. - * If the product strategy is not associated to any stream, it returns - * {@link AudioSystem#STREAM_MUSIC}. - * If no product strategy supports the stream type, it returns - * {@link AudioSystem#STREAM_MUSIC}. - */ - @SystemApi - public int getLegacyStreamTypeForAudioAttributes(@NonNull AudioAttributes aa) { - Preconditions.checkNotNull(aa, "AudioAttributes must not be null"); - for (final AudioProductStrategy productStrategy : this) { - if (productStrategy.supportsAudioAttributes(aa)) { - int streamType = productStrategy.getLegacyStreamTypeForAudioAttributes(aa); - if (streamType == AudioSystem.STREAM_DEFAULT) { - Log.w(TAG, "Attributes " + aa.toString() + " ported by strategy " - + productStrategy.name() + " has no stream type associated, " - + "DO NOT USE STREAM TO CONTROL THE VOLUME"); - return AudioSystem.STREAM_MUSIC; - } - return streamType; - } - } - return AudioSystem.STREAM_MUSIC; - } - - /** - * @hide - * @param aa the {@link AudioAttributes} to be considered - * @return {@link AudioProductStrategy} supporting the given {@link AudioAttributes}. - * null is returned if no match with given attributes. - */ - @SystemApi - @Nullable - public AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull AudioAttributes aa) { - Preconditions.checkNotNull(aa, "attributes must not be null"); - int productStrategyId = native_get_product_strategies_from_audio_attributes(aa); - if (productStrategyId < 0) { - Log.w(TAG, "no strategy found for Attributes " + aa.toString()); - return null; - } - return getById(productStrategyId); - } - - /** - * @hide - * @param attributes the {@link AudioAttributes} to be considered - * @return volume group associated to the given {@link AudioAttributes}. - * If no group supports the given {@link AudioAttributes}, it returns the volume group - * for the default attributes. - * If no group supports the default attributes, it returns {@link #DEFAULT_VOLUME_GROUP} - */ - @SystemApi - public int getVolumeGroupIdForAttributes(@NonNull AudioAttributes attributes) { - Preconditions.checkNotNull(attributes, "attributes must not be null"); - int volumeGroupId = getVolumeGroupIdForAttributesInt(attributes); - if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { - return volumeGroupId; - } - // The default volume group is the one hosted by default product strategy, i.e. - // supporting Default Attributes - return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes); - } - - /** - * @hide - * @param streamType to be considered - * @return volume group associated to the given stream type. - */ - @SystemApi - public int getVolumeGroupIdForLegacyStreamType(int streamType) { - for (final AudioProductStrategy productStrategy : this) { - int volumeGroupId = productStrategy.getVolumeGroupIdForLegacyStreamType(streamType); - if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { - return volumeGroupId; - } - } - // The default volume group is the one hosted by default product strategy, i.e. - // supporting Default Attributes - return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(size()); - for (final AudioProductStrategy productStrategy : this) { - productStrategy.writeToParcel(dest, flags); - } - } - - /** - * @param attributes to be considered - * @return volume group associated to the given {@link AudioAttributes}. - */ - private int getVolumeGroupIdForAttributesInt(@NonNull AudioAttributes attributes) { - Preconditions.checkNotNull(attributes, "attributes must not be null"); - for (final AudioProductStrategy productStrategy : this) { - int volumeGroupId = productStrategy.getVolumeGroupIdForAudioAttributes(attributes); - if (volumeGroupId != AudioVolumeGroups.DEFAULT_VOLUME_GROUP) { - return volumeGroupId; - } - } - return AudioVolumeGroups.DEFAULT_VOLUME_GROUP; - } - - public static final @android.annotation.NonNull Parcelable.Creator<AudioProductStrategies> CREATOR = - new Parcelable.Creator<AudioProductStrategies>() { - @Override - public AudioProductStrategies createFromParcel(@NonNull Parcel in) { - ArrayList<AudioProductStrategy> apsList = new ArrayList<AudioProductStrategy>(); - int size = in.readInt(); - for (int index = 0; index < size; index++) { - apsList.add(AudioProductStrategy.CREATOR.createFromParcel(in)); - } - return new AudioProductStrategies(apsList); - } - - @Override - public @NonNull AudioProductStrategies[] newArray(int size) { - return new AudioProductStrategies[size]; - } - }; - - private static native int native_list_audio_product_strategies( - ArrayList<AudioProductStrategy> strategies); - - private static native int native_get_product_strategies_from_audio_attributes( - AudioAttributes attributes); -} diff --git a/media/java/android/media/audiopolicy/AudioProductStrategy.java b/media/java/android/media/audiopolicy/AudioProductStrategy.java index c1c255f68996..9ac9411370ab 100644 --- a/media/java/android/media/audiopolicy/AudioProductStrategy.java +++ b/media/java/android/media/audiopolicy/AudioProductStrategy.java @@ -25,9 +25,14 @@ import android.media.MediaRecorder; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.Preconditions; +import java.util.ArrayList; +import java.util.List; + /** * @hide * A class to encapsulate a collection of attributes associated to a given product strategy @@ -41,6 +46,9 @@ public final class AudioProductStrategy implements Parcelable { */ public static final int DEFAULT_GROUP = -1; + + private static final String TAG = "AudioProductStrategy"; + private final AudioAttributesGroup[] mAudioAttributesGroups; private final String mName; /** @@ -51,6 +59,86 @@ public final class AudioProductStrategy implements Parcelable { */ private int mId; + private static final Object sLock = new Object(); + + @GuardedBy("sLock") + private static List<AudioProductStrategy> sAudioProductStrategies; + + /** + * @hide + * @return the list of AudioProductStrategy discovered from platform configuration file. + */ + @NonNull + public static List<AudioProductStrategy> getAudioProductStrategies() { + if (sAudioProductStrategies == null) { + synchronized (sLock) { + if (sAudioProductStrategies == null) { + sAudioProductStrategies = initializeAudioProductStrategies(); + } + } + } + return sAudioProductStrategies; + } + + /** + * @hide + * @param streamType to match against AudioProductStrategy + * @return the AudioAttributes for the first strategy found with the associated stream type + * If no match is found, returns AudioAttributes with unknown content_type and usage + */ + @NonNull + public static AudioAttributes getAudioAttributesForStrategyWithLegacyStreamType( + int streamType) { + for (final AudioProductStrategy productStrategy : + AudioProductStrategy.getAudioProductStrategies()) { + AudioAttributes aa = productStrategy.getAudioAttributesForLegacyStreamType(streamType); + if (aa != null) { + return aa; + } + } + return new AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN) + .setUsage(AudioAttributes.USAGE_UNKNOWN).build(); + } + + /** + * @hide + * @param audioAttributes to identify AudioProductStrategy with + * @return legacy stream type associated with matched AudioProductStrategy + * Defaults to STREAM_MUSIC if no match is found, or if matches is STREAM_DEFAULT + */ + public static int getLegacyStreamTypeForStrategyWithAudioAttributes( + @NonNull AudioAttributes audioAttributes) { + Preconditions.checkNotNull(audioAttributes, "AudioAttributes must not be null"); + for (final AudioProductStrategy productStrategy : + AudioProductStrategy.getAudioProductStrategies()) { + if (productStrategy.supportsAudioAttributes(audioAttributes)) { + int streamType = productStrategy.getLegacyStreamTypeForAudioAttributes( + audioAttributes); + if (streamType == AudioSystem.STREAM_DEFAULT) { + Log.w(TAG, "Attributes " + audioAttributes.toString() + " ported by strategy " + + productStrategy.getId() + " has no stream type associated, " + + "DO NOT USE STREAM TO CONTROL THE VOLUME"); + return AudioSystem.STREAM_MUSIC; + } + return streamType; + } + } + return AudioSystem.STREAM_MUSIC; + } + + private static List<AudioProductStrategy> initializeAudioProductStrategies() { + ArrayList<AudioProductStrategy> apsList = new ArrayList<AudioProductStrategy>(); + int status = native_list_audio_product_strategies(apsList); + if (status != AudioSystem.SUCCESS) { + Log.w(TAG, ": initializeAudioProductStrategies failed"); + } + return apsList; + } + + private static native int native_list_audio_product_strategies( + ArrayList<AudioProductStrategy> strategies); + @Override public boolean equals(@Nullable Object o) { if (this == o) return true; @@ -65,8 +153,7 @@ public final class AudioProductStrategy implements Parcelable { /** * @param name of the product strategy * @param id of the product strategy - * @param audioAttributes {@link AudioAttributes} associated to the given product strategy - * @param legacyStreamTypes associated to the given product strategy. + * @param aag {@link AudioAttributesGroup} associated to the given product strategy */ private AudioProductStrategy(@NonNull String name, int id, @NonNull AudioAttributesGroup[] aag) { @@ -79,15 +166,6 @@ public final class AudioProductStrategy implements Parcelable { /** * @hide - * @return human-readable name of this product strategy, which is similar to a usage - */ - @SystemApi - public @NonNull String name() { - return mName; - } - - /** - * @hide * @return the product strategy ID (which is the generalisation of Car Audio Usage / legacy * routing_strategy linked to {@link AudioAttributes#getUsage()}). */ @@ -158,7 +236,7 @@ public final class AudioProductStrategy implements Parcelable { * @hide * @param streamType legacy stream type used for volume operation only * @return the volume group id relevant for the given streamType. - * If none is found, {@link AudioVolumeGroups#DEFAULT_VOLUME_GROUP} is returned. + * If none is found, {@link AudioVolumeGroup#DEFAULT_VOLUME_GROUP} is returned. */ public int getVolumeGroupIdForLegacyStreamType(int streamType) { for (final AudioAttributesGroup aag : mAudioAttributesGroups) { @@ -166,14 +244,14 @@ public final class AudioProductStrategy implements Parcelable { return aag.getVolumeGroupId(); } } - return AudioVolumeGroups.DEFAULT_VOLUME_GROUP; + return AudioVolumeGroup.DEFAULT_VOLUME_GROUP; } /** * @hide * @param aa the {@link AudioAttributes} to be considered * @return the volume group id associated with the given audio attributes if found, - * {@link AudioVolumeGroups#DEFAULT_VOLUME_GROUP} otherwise. + * {@link AudioVolumeGroup#DEFAULT_VOLUME_GROUP} otherwise. */ public int getVolumeGroupIdForAudioAttributes(@NonNull AudioAttributes aa) { Preconditions.checkNotNull(aa, "AudioAttributes must not be null"); @@ -182,7 +260,7 @@ public final class AudioProductStrategy implements Parcelable { return aag.getVolumeGroupId(); } } - return AudioVolumeGroups.DEFAULT_VOLUME_GROUP; + return AudioVolumeGroup.DEFAULT_VOLUME_GROUP; } @Override @@ -200,7 +278,8 @@ public final class AudioProductStrategy implements Parcelable { } } - public static final @android.annotation.NonNull Parcelable.Creator<AudioProductStrategy> CREATOR = + @NonNull + public static final Parcelable.Creator<AudioProductStrategy> CREATOR = new Parcelable.Creator<AudioProductStrategy>() { @Override public AudioProductStrategy createFromParcel(@NonNull Parcel in) { diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroup.java b/media/java/android/media/audiopolicy/AudioVolumeGroup.java index b60947f13c1f..79be92214455 100644 --- a/media/java/android/media/audiopolicy/AudioVolumeGroup.java +++ b/media/java/android/media/audiopolicy/AudioVolumeGroup.java @@ -19,11 +19,15 @@ package android.media.audiopolicy; import android.annotation.NonNull; import android.annotation.SystemApi; import android.media.AudioAttributes; +import android.media.AudioSystem; import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.Preconditions; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -34,6 +38,12 @@ import java.util.List; */ @SystemApi public final class AudioVolumeGroup implements Parcelable { + private static final String TAG = "AudioVolumeGroup"; + /** + * Volume group value to use when introspection API fails. + */ + public static final int DEFAULT_VOLUME_GROUP = -1; + /** * Unique identifier of a volume group. */ @@ -46,10 +56,43 @@ public final class AudioVolumeGroup implements Parcelable { private final AudioAttributes[] mAudioAttributes; private int[] mLegacyStreamTypes; + private static final Object sLock = new Object(); + + @GuardedBy("sLock") + private static List<AudioVolumeGroup> sAudioVolumeGroups; + + /** + * @hide + * @return the List of AudioVolumeGroup discovered from platform configuration file. + */ + @NonNull + public static List<AudioVolumeGroup> getAudioVolumeGroups() { + if (sAudioVolumeGroups == null) { + synchronized (sLock) { + if (sAudioVolumeGroups == null) { + sAudioVolumeGroups = initializeAudioVolumeGroups(); + } + } + } + return sAudioVolumeGroups; + } + + private static List<AudioVolumeGroup> initializeAudioVolumeGroups() { + ArrayList<AudioVolumeGroup> avgList = new ArrayList<>(); + int status = native_list_audio_volume_groups(avgList); + if (status != AudioSystem.SUCCESS) { + Log.w(TAG, ": listAudioVolumeGroups failed"); + } + return avgList; + } + + private static native int native_list_audio_volume_groups( + ArrayList<AudioVolumeGroup> groups); + /** * @param name of the volume group * @param id of the volume group - * @param followers {@link AudioProductStrategies} strategy following this volume group + * @param legacyStreamTypes of volume group */ AudioVolumeGroup(@NonNull String name, int id, @NonNull AudioAttributes[] audioAttributes, diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl b/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl deleted file mode 100644 index 918cac39f19a..000000000000 --- a/media/java/android/media/audiopolicy/AudioVolumeGroups.aidl +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright 2018, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -package android.media.audiopolicy; - -parcelable AudioVolumeGroups; diff --git a/media/java/android/media/audiopolicy/AudioVolumeGroups.java b/media/java/android/media/audiopolicy/AudioVolumeGroups.java deleted file mode 100644 index 2e56f846e574..000000000000 --- a/media/java/android/media/audiopolicy/AudioVolumeGroups.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.media.audiopolicy; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SystemApi; -import android.media.AudioSystem; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; - -import com.android.internal.util.Preconditions; - -import java.util.ArrayList; -import java.util.Iterator; - -/** - * @hide - * A class to encapsulate a collection of {@link AudioVolumeGroup}. - */ -@SystemApi -public final class AudioVolumeGroups implements Iterable<AudioVolumeGroup>, Parcelable { - - private final ArrayList<AudioVolumeGroup> mAudioVolumeGroupList; - - private static final String TAG = "AudioVolumeGroups"; - - /** - * Volume group value to use when introspection API fails. - */ - public static final int DEFAULT_VOLUME_GROUP = -1; - - public AudioVolumeGroups() { - ArrayList<AudioVolumeGroup> avgList = new ArrayList<AudioVolumeGroup>(); - int status = native_list_audio_volume_groups(avgList); - if (status != AudioSystem.SUCCESS) { - Log.w(TAG, ": listAudioVolumeGroups failed"); - } - mAudioVolumeGroupList = avgList; - } - - private AudioVolumeGroups(@NonNull ArrayList<AudioVolumeGroup> audioVolumeGroupList) { - Preconditions.checkNotNull(audioVolumeGroupList, "audioVolumeGroupList must not be null"); - mAudioVolumeGroupList = audioVolumeGroupList; - } - - /** - * @return number of {@link AudioProductStrategy} objects - */ - public int size() { - return mAudioVolumeGroupList.size(); - } - - /** - * Returns an {@link Iterator} - */ - @Override - public @NonNull Iterator<AudioVolumeGroup> iterator() { - return mAudioVolumeGroupList.iterator(); - } - - @Override - public boolean equals(@NonNull Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - AudioVolumeGroups that = (AudioVolumeGroups) o; - - return mAudioVolumeGroupList.equals(that.mAudioVolumeGroupList); - } - - /** - * @return the matching {@link AudioVolumeGroup} objects with the given id, - * null object if not found. - */ - public @Nullable AudioVolumeGroup getById(int volumeGroupId) { - for (final AudioVolumeGroup avg : this) { - if (avg.getId() == volumeGroupId) { - return avg; - } - } - Log.e(TAG, ": invalid volume group id: " + volumeGroupId + " requested"); - return null; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeInt(size()); - for (final AudioVolumeGroup volumeGroup : this) { - volumeGroup.writeToParcel(dest, flags); - } - } - - private static native int native_list_audio_volume_groups( - ArrayList<AudioVolumeGroup> groups); - - public static final Parcelable.Creator<AudioVolumeGroups> CREATOR = - new Parcelable.Creator<AudioVolumeGroups>() { - @Override - public @NonNull AudioVolumeGroups createFromParcel(@NonNull Parcel in) { - Preconditions.checkNotNull(in, "in Parcel must not be null"); - ArrayList<AudioVolumeGroup> avgList = new ArrayList<AudioVolumeGroup>(); - int size = in.readInt(); - for (int index = 0; index < size; index++) { - avgList.add(AudioVolumeGroup.CREATOR.createFromParcel(in)); - } - return new AudioVolumeGroups(avgList); - } - - @Override - public @NonNull AudioVolumeGroups[] newArray(int size) { - return new AudioVolumeGroups[size]; - } - }; -} diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 44e8874f8386..efebfc2a4a1e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.car; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.car.drivingstate.CarDrivingStateEvent; @@ -39,6 +40,7 @@ import com.android.car.notification.CarUxRestrictionManagerWrapper; import com.android.car.notification.NotificationClickHandlerFactory; import com.android.car.notification.NotificationViewController; import com.android.car.notification.PreprocessingManager; +import com.android.internal.statusbar.RegisterStatusBarResult; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.BatteryMeterView; import com.android.systemui.CarSystemUIFactory; @@ -259,8 +261,8 @@ public class CarStatusBar extends StatusBar implements @Override - protected void makeStatusBarView() { - super.makeStatusBarView(); + protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) { + super.makeStatusBarView(result); mHvacController = new HvacController(mContext); CarSystemUIFactory factory = SystemUIFactory.getInstance(); @@ -432,7 +434,7 @@ public class CarStatusBar extends StatusBar implements } @Override - protected void createNavigationBar() { + protected void createNavigationBar(@Nullable RegisterStatusBarResult result) { mShowBottom = mContext.getResources().getBoolean(R.bool.config_enableBottomNavigationBar); mShowLeft = mContext.getResources().getBoolean(R.bool.config_enableLeftNavigationBar); mShowRight = mContext.getResources().getBoolean(R.bool.config_enableRightNavigationBar); @@ -443,7 +445,7 @@ public class CarStatusBar extends StatusBar implements // There has been a car customized nav bar on the default display, so just create nav bars // on external displays. - mNavigationBarController.createNavigationBars(false /* includeDefaultDisplay */); + mNavigationBarController.createNavigationBars(false /* includeDefaultDisplay */, result); } private void buildNavBarContent() { diff --git a/packages/PackageInstaller/TEST_MAPPING b/packages/PackageInstaller/TEST_MAPPING new file mode 100644 index 000000000000..42aa47cab154 --- /dev/null +++ b/packages/PackageInstaller/TEST_MAPPING @@ -0,0 +1,24 @@ +{ + "presubmit": [ + { + "name": "CtsPackageInstallTestCases", + "options": [ + { + "exclude-annotation": "android.platform.test.annotations.AppModeInstant" + } + ] + }, + { + "name": "CtsNoPermissionTestCases" + }, + { + "name": "CtsNoPermissionTestCases25" + }, + { + "name": "CtsPackageInstallerTapjackingTestCases" + }, + { + "name": "CtsPackageUninstallTestCases" + } + ] +}
\ No newline at end of file diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java index cee4666a39ba..93f24f7881a6 100755 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java @@ -83,28 +83,6 @@ public class InstallInstalling extends AlertActivity { ApplicationInfo appInfo = getIntent() .getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO); mPackageURI = getIntent().getData(); - final File sourceFile = new File(mPackageURI.getPath()); - PackageUtil.AppSnippet as = PackageUtil.getAppSnippet(this, appInfo, sourceFile); - - mAlert.setIcon(as.icon); - mAlert.setTitle(as.label); - mAlert.setView(R.layout.install_content_view); - mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), - (ignored, ignored2) -> { - if (mInstallingTask != null) { - mInstallingTask.cancel(true); - } - - if (mSessionId > 0) { - getPackageManager().getPackageInstaller().abandonSession(mSessionId); - mSessionId = 0; - } - - setResult(RESULT_CANCELED); - finish(); - }, null); - setupAlert(); - requireViewById(R.id.installing).setVisibility(View.VISIBLE); if ("package".equals(mPackageURI.getScheme())) { try { @@ -114,6 +92,29 @@ public class InstallInstalling extends AlertActivity { launchFailure(PackageManager.INSTALL_FAILED_INTERNAL_ERROR, null); } } else { + final File sourceFile = new File(mPackageURI.getPath()); + PackageUtil.AppSnippet as = PackageUtil.getAppSnippet(this, appInfo, sourceFile); + + mAlert.setIcon(as.icon); + mAlert.setTitle(as.label); + mAlert.setView(R.layout.install_content_view); + mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), + (ignored, ignored2) -> { + if (mInstallingTask != null) { + mInstallingTask.cancel(true); + } + + if (mSessionId > 0) { + getPackageManager().getPackageInstaller().abandonSession(mSessionId); + mSessionId = 0; + } + + setResult(RESULT_CANCELED); + finish(); + }, null); + setupAlert(); + requireViewById(R.id.installing).setVisibility(View.VISIBLE); + if (savedInstanceState != null) { mSessionId = savedInstanceState.getInt(SESSION_ID); mInstallId = savedInstanceState.getInt(INSTALL_ID); diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java index f2de9ecd8f5d..881f4b183f40 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java @@ -109,8 +109,8 @@ public class InstallStart extends Activity { } else { Uri packageUri = intent.getData(); - if (packageUri != null && (packageUri.getScheme().equals(ContentResolver.SCHEME_FILE) - || packageUri.getScheme().equals(ContentResolver.SCHEME_CONTENT))) { + if (packageUri != null && packageUri.getScheme().equals( + ContentResolver.SCHEME_CONTENT)) { // [IMPORTANT] This path is deprecated, but should still work. Only necessary // features should be added. diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java deleted file mode 100644 index 4c45a75d876a..000000000000 --- a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.settingslib.users; - -import android.app.ActivityManager; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.UserInfo; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.os.SystemProperties; -import android.os.UserHandle; -import android.os.UserManager; -import android.util.Log; - -import com.android.internal.util.UserIcons; - -import java.util.Iterator; -import java.util.List; - -/** - * Helper class for managing users, providing methods for removing, adding and switching users. - * - * @deprecated - Do not use - */ -@Deprecated -public final class UserManagerHelper { - private static final String TAG = "UserManagerHelper"; - private static final String HEADLESS_SYSTEM_USER = "android.car.systemuser.headless"; - private final Context mContext; - private final UserManager mUserManager; - private final ActivityManager mActivityManager; - private OnUsersUpdateListener mUpdateListener; - private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - mUpdateListener.onUsersUpdate(); - } - }; - - public UserManagerHelper(Context context) { - mContext = context; - mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); - } - - /** - * Registers a listener for updates to all users - removing, adding users or changing user info. - * - * @param listener Instance of {@link OnUsersUpdateListener}. - */ - public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) { - mUpdateListener = listener; - registerReceiver(); - } - - /** - * Unregisters listener by unregistering {@code BroadcastReceiver}. - */ - public void unregisterOnUsersUpdateListener() { - unregisterReceiver(); - } - - /** - * Returns {@code true} if the system is in the headless user 0 model. - * - * @return {@boolean true} if headless system user. - */ - public boolean isHeadlessSystemUser() { - return SystemProperties.getBoolean(HEADLESS_SYSTEM_USER, false); - } - - /** - * Gets UserInfo for the foreground user. - * - * Concept of foreground user is relevant for the multi-user deployment. Foreground user - * corresponds to the currently "logged in" user. - * - * @return {@link UserInfo} for the foreground user. - */ - public UserInfo getForegroundUserInfo() { - return mUserManager.getUserInfo(getForegroundUserId()); - } - - /** - * @return Id of the foreground user. - */ - public int getForegroundUserId() { - return mActivityManager.getCurrentUser(); - } - - /** - * Gets UserInfo for the user running the caller process. - * - * Differentiation between foreground user and current process user is relevant for multi-user - * deployments. - * - * Some multi-user aware components (like SystemUI) might run as a singleton - one component - * for all users. Current process user is then always the same for that component, even when - * the foreground user changes. - * - * @return {@link UserInfo} for the user running the current process. - */ - public UserInfo getCurrentProcessUserInfo() { - return mUserManager.getUserInfo(getCurrentProcessUserId()); - } - - /** - * @return Id for the user running the current process. - */ - public int getCurrentProcessUserId() { - return UserHandle.myUserId(); - } - - /** - * Gets all the other users on the system that are not the user running the current process. - * - * @return List of {@code UserInfo} for each user that is not the user running the process. - */ - public List<UserInfo> getAllUsersExcludesCurrentProcessUser() { - return getAllUsersExceptUser(getCurrentProcessUserId()); - } - - /** - * Gets all the existing users on the system that are not the currently running as the - * foreground user. - * - * @return List of {@code UserInfo} for each user that is not the foreground user. - */ - public List<UserInfo> getAllUsersExcludesForegroundUser() { - return getAllUsersExceptUser(getForegroundUserId()); - } - - /** - * Gets all the other users on the system that are not the system user. - * - * @return List of {@code UserInfo} for each user that is not the system user. - */ - public List<UserInfo> getAllUsersExcludesSystemUser() { - return getAllUsersExceptUser(UserHandle.USER_SYSTEM); - } - - /** - * Get all the users except the one with userId passed in. - * - * @param userId of the user not to be returned. - * @return All users other than user with userId. - */ - public List<UserInfo> getAllUsersExceptUser(int userId) { - List<UserInfo> others = mUserManager.getUsers(/* excludeDying= */true); - - for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) { - UserInfo userInfo = iterator.next(); - if (userInfo.id == userId) { - // Remove user with userId from the list. - iterator.remove(); - } - } - return others; - } - - /** - * Gets all the users on the system that are not currently being removed. - */ - public List<UserInfo> getAllUsers() { - if (isHeadlessSystemUser()) { - return getAllUsersExcludesSystemUser(); - } - return mUserManager.getUsers(/* excludeDying= */true); - } - - // User information accessors - - /** - * Checks whether the user is system user (admin). - * - * @param userInfo User to check against system user. - * @return {@code true} if system user, {@code false} otherwise. - */ - public boolean userIsSystemUser(UserInfo userInfo) { - return userInfo.id == UserHandle.USER_SYSTEM; - } - - /** - * Returns whether this user can be removed from the system. - * - * @param userInfo User to be removed - * @return {@code true} if they can be removed, {@code false} otherwise. - */ - public boolean userCanBeRemoved(UserInfo userInfo) { - return !userIsSystemUser(userInfo); - } - - /** - * Checks whether passed in user is the foreground user. - * - * @param userInfo User to check. - * @return {@code true} if foreground user, {@code false} otherwise. - */ - public boolean userIsForegroundUser(UserInfo userInfo) { - return getForegroundUserId() == userInfo.id; - } - - /** - * Checks whether passed in user is the user that's running the current process. - * - * @param userInfo User to check. - * @return {@code true} if user running the process, {@code false} otherwise. - */ - public boolean userIsRunningCurrentProcess(UserInfo userInfo) { - return getCurrentProcessUserId() == userInfo.id; - } - - // Foreground user information accessors. - - /** - * Checks if the foreground user is a guest user. - */ - public boolean foregroundUserIsGuestUser() { - return getForegroundUserInfo().isGuest(); - } - - /** - * Return whether the foreground user has a restriction. - * - * @param restriction Restriction to check. Should be a UserManager.* restriction. - * @return Whether that restriction exists for the foreground user. - */ - public boolean foregroundUserHasUserRestriction(String restriction) { - return mUserManager.hasUserRestriction(restriction, getForegroundUserInfo().getUserHandle()); - } - - /** - * Checks if the foreground user can add new users. - */ - public boolean foregroundUserCanAddUsers() { - return !foregroundUserHasUserRestriction(UserManager.DISALLOW_ADD_USER); - } - - // Current process user information accessors - - /** - * Checks if the calling app is running in a demo user. - */ - public boolean currentProcessRunningAsDemoUser() { - return mUserManager.isDemoUser(); - } - - /** - * Checks if the calling app is running as a guest user. - */ - public boolean currentProcessRunningAsGuestUser() { - return mUserManager.isGuestUser(); - } - - /** - * Checks whether this process is running under the system user. - */ - public boolean currentProcessRunningAsSystemUser() { - return mUserManager.isSystemUser(); - } - - // Current process user restriction accessors - - /** - * Return whether the user running the current process has a restriction. - * - * @param restriction Restriction to check. Should be a UserManager.* restriction. - * @return Whether that restriction exists for the user running the process. - */ - public boolean currentProcessHasUserRestriction(String restriction) { - return mUserManager.hasUserRestriction(restriction); - } - - /** - * Checks if the user running the current process can add new users. - */ - public boolean currentProcessCanAddUsers() { - return !currentProcessHasUserRestriction(UserManager.DISALLOW_ADD_USER); - } - - /** - * Checks if the user running the current process can remove users. - */ - public boolean currentProcessCanRemoveUsers() { - return !currentProcessHasUserRestriction(UserManager.DISALLOW_REMOVE_USER); - } - - /** - * Checks if the user running the current process is allowed to switch to another user. - */ - public boolean currentProcessCanSwitchUsers() { - return !currentProcessHasUserRestriction(UserManager.DISALLOW_USER_SWITCH); - } - - /** - * Checks if the current process user can modify accounts. Demo and Guest users cannot modify - * accounts even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied. - */ - public boolean currentProcessCanModifyAccounts() { - return !currentProcessHasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS) - && !currentProcessRunningAsDemoUser() - && !currentProcessRunningAsGuestUser(); - } - - // User actions - - /** - * Creates a new user on the system. - * - * @param userName Name to give to the newly created user. - * @return Newly created user. - */ - public UserInfo createNewUser(String userName) { - UserInfo user = mUserManager.createUser(userName, 0 /* flags */); - if (user == null) { - // Couldn't create user, most likely because there are too many, but we haven't - // been able to reload the list yet. - Log.w(TAG, "can't create user."); - return null; - } - assignDefaultIcon(user); - return user; - } - - /** - * Tries to remove the user that's passed in. System user cannot be removed. - * If the user to be removed is user currently running the process, - * it switches to the system user first, and then removes the user. - * - * @param userInfo User to be removed - * @return {@code true} if user is successfully removed, {@code false} otherwise. - */ - public boolean removeUser(UserInfo userInfo) { - if (userIsSystemUser(userInfo)) { - Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed."); - return false; - } - - if (userInfo.id == getCurrentProcessUserId()) { - switchToUserId(UserHandle.USER_SYSTEM); - } - - return mUserManager.removeUser(userInfo.id); - } - - /** - * Switches (logs in) to another user. - * - * @param userInfo User to switch to. - */ - public void switchToUser(UserInfo userInfo) { - if (userInfo.id == getForegroundUserId()) { - return; - } - - switchToUserId(userInfo.id); - } - - /** - * Creates a new guest session and switches into the guest session. - * - * @param guestName Username for the guest user. - */ - public void startNewGuestSession(String guestName) { - UserInfo guest = mUserManager.createGuest(mContext, guestName); - if (guest == null) { - // Couldn't create user, most likely because there are too many, but we haven't - // been able to reload the list yet. - Log.w(TAG, "can't create user."); - return; - } - assignDefaultIcon(guest); - switchToUserId(guest.id); - } - - /** - * Gets an icon for the user. - * - * @param userInfo User for which we want to get the icon. - * @return a Bitmap for the icon - */ - public Bitmap getUserIcon(UserInfo userInfo) { - Bitmap picture = mUserManager.getUserIcon(userInfo.id); - - if (picture == null) { - return assignDefaultIcon(userInfo); - } - - return picture; - } - - /** - * Method for scaling a Bitmap icon to a desirable size. - * - * @param icon Bitmap to scale. - * @param desiredSize Wanted size for the icon. - * @return Drawable for the icon, scaled to the new size. - */ - public Drawable scaleUserIcon(Bitmap icon, int desiredSize) { - Bitmap scaledIcon = Bitmap.createScaledBitmap( - icon, desiredSize, desiredSize, true /* filter */); - return new BitmapDrawable(mContext.getResources(), scaledIcon); - } - - /** - * Sets new Username for the user. - * - * @param user User whose name should be changed. - * @param name New username. - */ - public void setUserName(UserInfo user, String name) { - mUserManager.setUserName(user.id, name); - } - - /** - * Gets a bitmap representing the user's default avatar. - * - * @param userInfo User whose avatar should be returned. - * @return Default user icon - */ - public Bitmap getUserDefaultIcon(UserInfo userInfo) { - return UserIcons.convertToBitmap( - UserIcons.getDefaultUserIcon(mContext.getResources(), userInfo.id, false)); - } - - /** - * Gets a bitmap representing the default icon for a Guest user. - * - * @return Degault guest icon - */ - public Bitmap getGuestDefaultIcon() { - return UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon( - mContext.getResources(), UserHandle.USER_NULL, false)); - } - - private void registerReceiver() { - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_REMOVED); - filter.addAction(Intent.ACTION_USER_ADDED); - filter.addAction(Intent.ACTION_USER_INFO_CHANGED); - filter.addAction(Intent.ACTION_USER_SWITCHED); - filter.addAction(Intent.ACTION_USER_STOPPED); - filter.addAction(Intent.ACTION_USER_UNLOCKED); - mContext.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, null); - } - - /** - * Assigns a default icon to a user according to the user's id. - * - * @param userInfo User to assign a default icon to. - * @return Bitmap that has been assigned to the user. - */ - private Bitmap assignDefaultIcon(UserInfo userInfo) { - Bitmap bitmap = userInfo.isGuest() ? getGuestDefaultIcon() : getUserDefaultIcon(userInfo); - mUserManager.setUserIcon(userInfo.id, bitmap); - return bitmap; - } - - private void switchToUserId(int id) { - try { - mActivityManager.switchUser(id); - } catch (Exception e) { - Log.e(TAG, "Couldn't switch user.", e); - } - } - - private void unregisterReceiver() { - mContext.unregisterReceiver(mUserChangeReceiver); - } - - /** - * Interface for listeners that want to register for receiving updates to changes to the users - * on the system including removing and adding users, and changing user info. - */ - public interface OnUsersUpdateListener { - /** - * Method that will get called when users list has been changed. - */ - void onUsersUpdate(); - } -} diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java deleted file mode 100644 index 46557d3106af..000000000000 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.settingslib.users; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.ActivityManager; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.UserInfo; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.UserHandle; -import android.os.UserManager; - -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.List; - -@RunWith(AndroidJUnit4.class) -public class UserManagerHelperTest { - @Mock - private Context mContext; - @Mock - private UserManager mUserManager; - @Mock - private ActivityManager mActivityManager; - @Mock - private UserManagerHelper.OnUsersUpdateListener mTestListener; - - private UserManagerHelper mHelper; - private UserInfo mCurrentProcessUser; - private UserInfo mSystemUser; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); - when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(mActivityManager); - when(mContext.getResources()) - .thenReturn(InstrumentationRegistry.getTargetContext().getResources()); - mHelper = new UserManagerHelper(mContext); - - mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId()); - mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM); - when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentProcessUser); - } - - @Test - public void userIsSystemUser() { - UserInfo testInfo = new UserInfo(); - - testInfo.id = UserHandle.USER_SYSTEM; - assertThat(mHelper.userIsSystemUser(testInfo)).isTrue(); - - testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id. - assertThat(mHelper.userIsSystemUser(testInfo)).isFalse(); - } - - @Test - public void getAllUsersExcludesSystemUser() { - UserInfo otherUser1 = createUserInfoForId(10); - UserInfo otherUser2 = createUserInfoForId(11); - UserInfo otherUser3 = createUserInfoForId(12); - - List<UserInfo> testUsers = new ArrayList<>(); - testUsers.add(otherUser1); - testUsers.add(otherUser2); - testUsers.add(mSystemUser); - testUsers.add(otherUser3); - - when(mUserManager.getUsers(true)).thenReturn(testUsers); - - // Should return 3 users that don't have SYSTEM USER id. - assertThat(mHelper.getAllUsersExcludesSystemUser()).hasSize(3); - assertThat(mHelper.getAllUsersExcludesSystemUser()) - .containsExactly(otherUser1, otherUser2, otherUser3); - } - - @Test - public void getAllUsersExceptUser() { - UserInfo user1 = createUserInfoForId(10); - UserInfo user2 = createUserInfoForId(10); - UserInfo user3 = createUserInfoForId(12); - - List<UserInfo> testUsers = new ArrayList<>(); - testUsers.add(user1); - testUsers.add(user2); - testUsers.add(user3); - - when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers)); - - // Should return all 3 users. - assertThat(mHelper.getAllUsersExceptUser(9).size()).isEqualTo(3); - - // Should return only user 12. - assertThat(mHelper.getAllUsersExceptUser(10).size()).isEqualTo(1); - assertThat(mHelper.getAllUsersExceptUser(10)).contains(user3); - - when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers)); - - // Should drop user 12. - assertThat(mHelper.getAllUsersExceptUser(12).size()).isEqualTo(2); - assertThat(mHelper.getAllUsersExceptUser(12)).contains(user1); - assertThat(mHelper.getAllUsersExceptUser(12)).contains(user2); - } - - @Test - public void getAllUsers() { - int currentUser = UserHandle.myUserId(); - - UserInfo otherUser1 = createUserInfoForId(currentUser + 1); - UserInfo otherUser2 = createUserInfoForId(currentUser - 1); - UserInfo otherUser3 = createUserInfoForId(currentUser + 2); - - List<UserInfo> testUsers = new ArrayList<>(); - testUsers.add(otherUser1); - testUsers.add(otherUser2); - testUsers.add(mCurrentProcessUser); - testUsers.add(otherUser3); - - when(mUserManager.getUsers(true)).thenReturn(testUsers); - - assertThat(mHelper.getAllUsers().size()).isEqualTo(4); - assertThat(mHelper.getAllUsers()) - .containsExactly(mCurrentProcessUser, otherUser1, otherUser2, otherUser3); - } - - @Test - public void userCanBeRemoved() { - UserInfo testInfo = new UserInfo(); - - // System user cannot be removed. - testInfo.id = UserHandle.USER_SYSTEM; - assertThat(mHelper.userCanBeRemoved(testInfo)).isFalse(); - - testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id. - assertThat(mHelper.userCanBeRemoved(testInfo)).isTrue(); - } - - @Test - public void currentProcessCanAddUsers() { - when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false); - assertThat(mHelper.currentProcessCanAddUsers()).isTrue(); - - when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true); - assertThat(mHelper.currentProcessCanAddUsers()).isFalse(); - } - - @Test - public void currentProcessCanRemoveUsers() { - when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false); - assertThat(mHelper.currentProcessCanRemoveUsers()).isTrue(); - - when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true); - assertThat(mHelper.currentProcessCanRemoveUsers()).isFalse(); - } - - @Test - public void currentProcessCanSwitchUsers() { - when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false); - assertThat(mHelper.currentProcessCanSwitchUsers()).isTrue(); - - when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true); - assertThat(mHelper.currentProcessCanSwitchUsers()).isFalse(); - } - - @Test - public void currentProcessRunningAsGuestCannotModifyAccounts() { - assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue(); - - when(mUserManager.isGuestUser()).thenReturn(true); - assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse(); - } - - @Test - public void currentProcessRunningAsDemoUserCannotModifyAccounts() { - assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue(); - - when(mUserManager.isDemoUser()).thenReturn(true); - assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse(); - } - - @Test - public void currentProcessWithDisallowModifyAccountsRestrictionCannotModifyAccounts() { - assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue(); - - when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) - .thenReturn(true); - assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse(); - } - - @Test - public void createNewUser() { - // Verify createUser on UserManager gets called. - mHelper.createNewUser("Test User"); - verify(mUserManager).createUser("Test User", 0); - - when(mUserManager.createUser("Test User", 0)).thenReturn(null); - assertThat(mHelper.createNewUser("Test User")).isNull(); - - UserInfo newUser = new UserInfo(); - newUser.name = "Test User"; - when(mUserManager.createUser("Test User", 0)).thenReturn(newUser); - assertThat(mHelper.createNewUser("Test User")).isEqualTo(newUser); - } - - @Test - public void removeUser() { - // Cannot remove system user. - assertThat(mHelper.removeUser(mSystemUser)).isFalse(); - - // Removing non-current, non-system user, simply calls removeUser. - UserInfo userToRemove = createUserInfoForId(mCurrentProcessUser.id + 2); - - mHelper.removeUser(userToRemove); - verify(mUserManager).removeUser(mCurrentProcessUser.id + 2); - } - - @Test - public void startNewGuestSession() { - mHelper.startNewGuestSession("Test Guest"); - verify(mUserManager).createGuest(mContext, "Test Guest"); - - UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST); - when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo); - mHelper.startNewGuestSession("Test Guest"); - verify(mActivityManager).switchUser(21); - } - - @Test - public void getUserIcon() { - mHelper.getUserIcon(mCurrentProcessUser); - verify(mUserManager).getUserIcon(mCurrentProcessUser.id); - } - - @Test - public void scaleUserIcon() { - Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); - Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300); - assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300); - assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300); - } - - @Test - public void setUserName() { - UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3); - mHelper.setUserName(testInfo, "New Test Name"); - verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, "New Test Name"); - } - - @Test - public void registerUserChangeReceiver() { - mHelper.registerOnUsersUpdateListener(mTestListener); - - ArgumentCaptor<BroadcastReceiver> receiverCaptor = - ArgumentCaptor.forClass(BroadcastReceiver.class); - ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class); - ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class); - ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class); - - verify(mContext).registerReceiverAsUser( - receiverCaptor.capture(), - handleCaptor.capture(), - filterCaptor.capture(), - permissionCaptor.capture(), - handlerCaptor.capture()); - - // Verify we're listening to Intents from ALL users. - assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL); - - // Verify the presence of each intent in the filter. - // Verify the exact number of filters. Every time a new intent is added, this test should - // get updated. - assertThat(filterCaptor.getValue().countActions()).isEqualTo(6); - assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue(); - assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue(); - assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue(); - assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_SWITCHED)).isTrue(); - assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_STOPPED)).isTrue(); - assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_UNLOCKED)).isTrue(); - - - // Verify that calling the receiver calls the listener. - receiverCaptor.getValue().onReceive(mContext, new Intent()); - verify(mTestListener).onUsersUpdate(); - - assertThat(permissionCaptor.getValue()).isNull(); - assertThat(handlerCaptor.getValue()).isNull(); - - - // Unregister the receiver. - mHelper.unregisterOnUsersUpdateListener(); - verify(mContext).unregisterReceiver(receiverCaptor.getValue()); - } - - private UserInfo createUserInfoForId(int id) { - UserInfo userInfo = new UserInfo(); - userInfo.id = id; - return userInfo; - } -} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java deleted file mode 100644 index 83cc39a8a1a9..000000000000 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.users; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.ActivityManager; -import android.content.Context; -import android.content.pm.UserInfo; -import android.os.UserHandle; -import android.os.UserManager; - -import com.android.settingslib.testutils.shadow.ShadowActivityManager; - -import org.junit.After; -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; -import org.robolectric.annotation.Config; -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; -import org.robolectric.annotation.Resetter; - -import java.util.ArrayList; -import java.util.List; - -@RunWith(RobolectricTestRunner.class) -@Config(shadows = { ShadowActivityManager.class, UserManagerHelperRoboTest.ShadowUserHandle.class}) -public class UserManagerHelperRoboTest { - @Mock - private Context mContext; - @Mock - private UserManager mUserManager; - - private UserManagerHelper mHelper; - - @Before - public void setUpMocksAndUserManagerHelper() { - MockitoAnnotations.initMocks(this); - when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); - when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn( - RuntimeEnvironment.application.getSystemService(ActivityManager.class)); - mHelper = new UserManagerHelper(mContext); - } - - @After - public void tearDown() { - ShadowActivityManager.getShadow().reset(); - } - - @Test - public void getForegroundUserId() { - ShadowActivityManager.setCurrentUser(15); - assertThat(mHelper.getForegroundUserId()).isEqualTo(15); - } - - @Test - public void getForegroundUserInfo() { - ShadowActivityManager.setCurrentUser(17); - when(mUserManager.getUserInfo(ActivityManager.getCurrentUser())) - .thenReturn(createUserInfoForId(ActivityManager.getCurrentUser())); - assertThat(mHelper.getForegroundUserInfo().id).isEqualTo(17); - } - - @Test - public void getCurrentProcessUserId() { - ShadowUserHandle.setUid(11); - assertThat(mHelper.getCurrentProcessUserId()).isEqualTo(11); - } - - @Test - public void getCurrentProcessUserInfo() { - ShadowUserHandle.setUid(12); - when(mUserManager.getUserInfo(UserHandle.myUserId())) - .thenReturn(createUserInfoForId(UserHandle.myUserId())); - assertThat(mHelper.getCurrentProcessUserInfo().id).isEqualTo(12); - } - - @Test - public void getAllUsersExcludesCurrentProcessUser() { - ShadowUserHandle.setUid(12); - UserInfo currentProcessUser = createUserInfoForId(12); - - UserInfo otherUser1 = createUserInfoForId(13); - UserInfo otherUser2 = createUserInfoForId(11); - UserInfo otherUser3 = createUserInfoForId(14); - - List<UserInfo> testUsers = new ArrayList<>(); - testUsers.add(otherUser1); - testUsers.add(otherUser2); - testUsers.add(currentProcessUser); - testUsers.add(otherUser3); - - when(mUserManager.getUsers(true)).thenReturn(testUsers); - - // Should return 3 users that don't have currentProcessUser id. - assertThat(mHelper.getAllUsersExcludesCurrentProcessUser()).hasSize(3); - assertThat(mHelper.getAllUsersExcludesCurrentProcessUser()) - .containsExactly(otherUser1, otherUser2, otherUser3); - } - - @Test - public void getAllUsersExcludesForegroundUser() { - ShadowActivityManager.setCurrentUser(17); - UserInfo foregroundUser = createUserInfoForId(17); - - UserInfo otherUser1 = createUserInfoForId(11); - UserInfo otherUser2 = createUserInfoForId(18); - UserInfo otherUser3 = createUserInfoForId(16); - - List<UserInfo> testUsers = new ArrayList<>(); - testUsers.add(otherUser1); - testUsers.add(otherUser2); - testUsers.add(foregroundUser); - testUsers.add(otherUser3); - - when(mUserManager.getUsers(true)).thenReturn(testUsers); - - // Should return 3 users that don't have foregroundUser id. - assertThat(mHelper.getAllUsersExcludesForegroundUser()).hasSize(3); - assertThat(mHelper.getAllUsersExcludesForegroundUser()) - .containsExactly(otherUser1, otherUser2, otherUser3); - } - - @Test - public void userIsForegroundUser() { - ShadowActivityManager.setCurrentUser(10); - assertThat(mHelper.userIsForegroundUser(createUserInfoForId(10))).isTrue(); - assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isFalse(); - - ShadowActivityManager.setCurrentUser(11); - assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isTrue(); - } - - @Test - public void userIsRunningCurrentProcess() { - ShadowUserHandle.setUid(10); - assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(10))).isTrue(); - assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isFalse(); - - ShadowUserHandle.setUid(11); - assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isTrue(); - } - - @Test - public void removingCurrentProcessUserSwitchesToSystemUser() { - // Set currentProcess user to be user 10. - ShadowUserHandle.setUid(10); - - // Removing a currentProcess user, calls "switch" to system user - mHelper.removeUser(createUserInfoForId(10)); - assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue(); - assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(0); - - verify(mUserManager).removeUser(10); - } - - @Test - public void switchToUser() { - ShadowActivityManager.setCurrentUser(20); - - // Switching to foreground user doesn't do anything. - mHelper.switchToUser(createUserInfoForId(20)); - assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isFalse(); - - // Switching to non-foreground user, simply calls switchUser. - UserInfo userToSwitchTo = new UserInfo(22, "Test User", 0); - mHelper.switchToUser(userToSwitchTo); - assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue(); - assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(22); - } - - private UserInfo createUserInfoForId(int id) { - UserInfo userInfo = new UserInfo(); - userInfo.id = id; - return userInfo; - } - - @Implements(UserHandle.class) - public static class ShadowUserHandle { - private static int sUid = 0; // SYSTEM by default - - public static void setUid(int uid) { - sUid = uid; - } - - @Implementation - public static int myUserId() { - return sUid; - } - - @Resetter - public static void reset() { - sUid = 0; - } - } -} diff --git a/packages/SystemUI/res/layout/ongoing_privacy_chip.xml b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml index b16e06207ca3..49c16bee7b1f 100644 --- a/packages/SystemUI/res/layout/ongoing_privacy_chip.xml +++ b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml @@ -23,21 +23,20 @@ android:layout_width="wrap_content" android:layout_marginLeft="@dimen/ongoing_appops_chip_margin" android:layout_marginRight="@dimen/ongoing_appops_chip_margin" - android:layout_gravity="center_vertical|start" + android:layout_gravity="center_vertical|end" android:gravity="center_vertical" android:orientation="horizontal" - android:focusable="true"> + android:focusable="true" > <FrameLayout android:id="@+id/background" android:layout_height="@dimen/ongoing_appops_chip_height" - android:layout_width="wrap_content" - > + android:minWidth="48dp" + android:layout_width="wrap_content" > <LinearLayout android:id="@+id/icons_container" android:layout_height="match_parent" android:layout_width="wrap_content" - android:layout_gravity="center" android:gravity="center_vertical" /> </FrameLayout> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 74924fb5562c..bfdb21877277 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1044,7 +1044,7 @@ <!-- Margin between icons of Ongoing App Ops chip when QS--> <dimen name="ongoing_appops_chip_icon_margin_expanded">2dp</dimen> <!-- Icon size of Ongoing App Ops chip --> - <dimen name="ongoing_appops_chip_icon_size">@*android:dimen/status_bar_icon_size</dimen> + <dimen name="ongoing_appops_chip_icon_size">@dimen/status_bar_icon_drawing_size</dimen> <!-- Radius of Ongoing App Ops chip corners --> <dimen name="ongoing_appops_chip_bg_corner_radius">16dp</dimen> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index fa39ccd28ff1..fd557083aefd 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1665,7 +1665,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } mFaceCancelSignal = new CancellationSignal(); mFaceManager.authenticate(null, mFaceCancelSignal, 0, - mFaceAuthenticationCallback, null); + mFaceAuthenticationCallback, null, userId); setFaceRunningState(BIOMETRIC_STATE_RUNNING); } } diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 70f2ccee7d60..a4219402259e 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -293,6 +293,7 @@ public class Dependency extends SystemUI { @Inject Lazy<DevicePolicyManagerWrapper> mDevicePolicyManagerWrapper; @Inject Lazy<PackageManagerWrapper> mPackageManagerWrapper; @Inject Lazy<SensorPrivacyController> mSensorPrivacyController; + @Inject Lazy<DumpController> mDumpController; @Inject public Dependency() { @@ -464,7 +465,7 @@ public class Dependency extends SystemUI { mProviders.put(DevicePolicyManagerWrapper.class, mDevicePolicyManagerWrapper::get); mProviders.put(PackageManagerWrapper.class, mPackageManagerWrapper::get); mProviders.put(SensorPrivacyController.class, mSensorPrivacyController::get); - + mProviders.put(DumpController.class, mDumpController::get); // TODO(b/118592525): to support multi-display , we start to add something which is // per-display, while others may be global. I think it's time to add @@ -478,6 +479,11 @@ public class Dependency extends SystemUI { @Override public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) { super.dump(fd, pw, args); + + // Make sure that the DumpController gets added to mDependencies, as they are only added + // with Dependency#get. + getDependency(DumpController.class); + pw.println("Dumping existing controllers:"); mDependencies.values().stream().filter(obj -> obj instanceof Dumpable) .forEach(o -> ((Dumpable) o).dump(fd, pw, args)); diff --git a/packages/SystemUI/src/com/android/systemui/DumpController.kt b/packages/SystemUI/src/com/android/systemui/DumpController.kt new file mode 100644 index 000000000000..646abb5c2c5a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/DumpController.kt @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui + +import android.util.Log +import androidx.annotation.GuardedBy +import com.android.internal.util.Preconditions +import java.io.FileDescriptor +import java.io.PrintWriter +import java.lang.ref.WeakReference +import javax.inject.Inject +import javax.inject.Singleton + +// TODO: Move all Dumpable dependencies to use DumpController +/** + * Controller that allows any [Dumpable] to subscribe and be dumped along with other SystemUI + * dependencies. + */ +@Singleton +class DumpController @Inject constructor() : Dumpable { + + companion object { + private const val TAG = "DumpController" + private const val DEBUG = false + } + + @GuardedBy("listeners") + private val listeners = mutableListOf<WeakReference<Dumpable>>() + val numListeners: Int + get() = listeners.size + + /** + * Adds a [Dumpable] listener to be dumped. It will only be added if it is not already tracked. + * + * @param listener the [Dumpable] to be added + */ + fun addListener(listener: Dumpable) { + Preconditions.checkNotNull(listener, "The listener to be added cannot be null") + if (DEBUG) Log.v(TAG, "*** register callback for $listener") + synchronized<Unit>(listeners) { + if (listeners.any { it.get() == listener }) { + if (DEBUG) { + Log.e(TAG, "Object tried to add another callback") + } + } else { + listeners.add(WeakReference(listener)) + } + } + } + + /** + * Removes a listener from the list of elements to be dumped. + * + * @param listener the [Dumpable] to be removed. + */ + fun removeListener(listener: Dumpable) { + if (DEBUG) Log.v(TAG, "*** unregister callback for $listener") + synchronized(listeners) { + listeners.removeAll { it.get() == listener || it.get() == null } + } + } + + /** + * Dump all the [Dumpable] registered with the controller + */ + override fun dump(fd: FileDescriptor?, pw: PrintWriter, args: Array<String>?) { + pw.println("DumpController state:") + synchronized(listeners) { + listeners.forEach { it.get()?.dump(fd, pw, args) } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 686edada1036..424cd5544e50 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -926,6 +926,7 @@ public class BubbleStackView extends FrameLayout { mFlyout.removeCallbacks(mHideFlyout); mFlyout.postDelayed(mHideFlyout, FLYOUT_HIDE_AFTER); }); + logBubbleEvent(bubble, StatsLog.BUBBLE_UICHANGED__ACTION__FLYOUT); } } @@ -1097,7 +1098,8 @@ public class BubbleStackView extends FrameLayout { * @param action the user interaction enum. */ private void logBubbleEvent(@Nullable Bubble bubble, int action) { - if (bubble == null) { + if (bubble == null || bubble.entry == null + || bubble.entry.notification == null) { StatsLog.write(StatsLog.BUBBLE_UI_CHANGED, null /* package name */, null /* notification channel */, diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java index 21406e57ad7b..d935466757de 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java @@ -34,7 +34,6 @@ import static android.opengl.GLES20.glVertexAttribPointer; import android.graphics.Bitmap; import android.opengl.GLUtils; -import android.os.Build; import android.util.Log; import java.nio.ByteBuffer; @@ -196,58 +195,76 @@ class ImageGLWallpaper { glUniform1i(mUniTexture, 0); } + /** + * This method adjust s(x-axis), t(y-axis) texture coordinates + * to prevent the wallpaper from being stretched. + * The adjustment happens if either the width or height of the bitmap is larger than + * corresponding size of the surface. + * If both width and height are larger than corresponding size of the surface, + * the adjustment will happen at both s, t side. + * + * @param bitmapWidth The width of the bitmap. + * @param bitmapHeight The height of the bitmap. + * @param surfaceWidth The width of the surface. + * @param surfaceHeight The height of the surface. + * @param xOffset The offset amount along s axis. + * @param yOffset The offset amount along t axis. + */ void adjustTextureCoordinates(int bitmapWidth, int bitmapHeight, int surfaceWidth, int surfaceHeight, float xOffset, float yOffset) { - float ratioW = 1f; - float ratioH = 1f; - float rX = 0f; - float rY = 0f; - float[] coordinates = null; - - final boolean adjustWidth = bitmapWidth > surfaceWidth; - final boolean adjustHeight = bitmapHeight > surfaceHeight; - - if (adjustWidth || adjustHeight) { - coordinates = TEXTURES.clone(); - } - - if (adjustWidth) { - float x = (float) Math.round((bitmapWidth - surfaceWidth) * xOffset) / bitmapWidth; - ratioW = (float) surfaceWidth / bitmapWidth; - float referenceX = x + ratioW > 1f ? 1f - ratioW : x; + float[] coordinates = TEXTURES.clone(); + + if (bitmapWidth > surfaceWidth) { + // Calculate the new s pos in pixels. + float pixelS = (float) Math.round((bitmapWidth - surfaceWidth) * xOffset); + // Calculate the s pos in texture coordinate. + float coordinateS = pixelS / bitmapWidth; + // Calculate the percentage occupied by the surface width in bitmap width. + float surfacePercentageW = (float) surfaceWidth / bitmapWidth; + // Need also consider the case if bitmap height is smaller than surface height. + if (bitmapHeight < surfaceHeight) { + // We will narrow the surface percentage to keep aspect ratio. + surfacePercentageW *= (float) bitmapHeight / surfaceHeight; + } + // Determine the final s pos, also limit the legal s pos to prevent from out of range. + float s = coordinateS + surfacePercentageW > 1f ? 1f - surfacePercentageW : coordinateS; + // Traverse the s pos in texture coordinates array and adjust the s pos accordingly. for (int i = 0; i < coordinates.length; i += 2) { + // indices 2, 4 and 6 are the end of s coordinates. if (i == 2 || i == 4 || i == 6) { - coordinates[i] = Math.min(1f, referenceX + ratioW); + coordinates[i] = Math.min(1f, s + surfacePercentageW); } else { - coordinates[i] = referenceX; + coordinates[i] = s; } } - rX = referenceX; } - - if (adjustHeight) { - float y = (float) Math.round((bitmapHeight - surfaceHeight) * yOffset) / bitmapHeight; - ratioH = (float) surfaceHeight / bitmapHeight; - float referenceY = y + ratioH > 1f ? 1f - ratioH : y; + if (bitmapHeight > surfaceHeight) { + // Calculate the new t pos in pixels. + float pixelT = (float) Math.round((bitmapHeight - surfaceHeight) * yOffset); + // Calculate the t pos in texture coordinate. + float coordinateT = pixelT / bitmapHeight; + // Calculate the percentage occupied by the surface height in bitmap height. + float surfacePercentageH = (float) surfaceHeight / bitmapHeight; + // Need also consider the case if bitmap width is smaller than surface width. + if (bitmapWidth < surfaceWidth) { + // We will narrow the surface percentage to keep aspect ratio. + surfacePercentageH *= (float) bitmapWidth / surfaceWidth; + } + // Determine the final t pos, also limit the legal t pos to prevent from out of range. + float t = coordinateT + surfacePercentageH > 1f ? 1f - surfacePercentageH : coordinateT; + // Traverse the t pos in texture coordinates array and adjust the t pos accordingly. for (int i = 1; i < coordinates.length; i += 2) { + // indices 1, 3 and 11 are the end of t coordinates. if (i == 1 || i == 3 || i == 11) { - coordinates[i] = Math.min(1f, referenceY + ratioH); + coordinates[i] = Math.min(1f, t + surfacePercentageH); } else { - coordinates[i] = referenceY; + coordinates[i] = t; } } - rY = referenceY; } - if (adjustWidth || adjustHeight) { - if (Build.IS_DEBUGGABLE) { - Log.d(TAG, "adjustTextureCoordinates: sW=" + surfaceWidth + ", sH=" + surfaceHeight - + ", bW=" + bitmapWidth + ", bH=" + bitmapHeight - + ", rW=" + ratioW + ", rH=" + ratioH + ", rX=" + rX + ", rY=" + rY); - } - mTextureBuffer.put(coordinates); - mTextureBuffer.position(0); - } + mTextureBuffer.put(coordinates); + mTextureBuffer.position(0); } } diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt index 23742c0953bb..a5a915b88cad 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt @@ -16,13 +16,12 @@ package com.android.systemui.privacy import android.content.Context import android.util.AttributeSet +import android.view.Gravity import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView import android.widget.LinearLayout -import com.android.systemui.Dependency import com.android.systemui.R -import com.android.systemui.statusbar.policy.KeyguardMonitor class OngoingPrivacyChip @JvmOverloads constructor( context: Context, @@ -51,8 +50,7 @@ class OngoingPrivacyChip @JvmOverloads constructor( updateView() } } - @Suppress("DEPRECATION") - private val keyguardMonitor = Dependency.get(KeyguardMonitor::class.java) + var builder = PrivacyDialogBuilder(context, emptyList<PrivacyItem>()) var privacyList = emptyList<PrivacyItem>() set(value) { @@ -94,14 +92,16 @@ class OngoingPrivacyChip @JvmOverloads constructor( if (!privacyList.isEmpty()) { generateContentDescription() setIcons(builder, iconsContainer) + val lp = iconsContainer.layoutParams as FrameLayout.LayoutParams + lp.gravity = Gravity.CENTER_VERTICAL or + (if (expanded) Gravity.CENTER_HORIZONTAL else Gravity.END) + iconsContainer.layoutParams = lp } else { iconsContainer.removeAllViews() } requestLayout() } - private fun amISecure() = keyguardMonitor.isShowing && keyguardMonitor.isSecure - private fun generateContentDescription() { val typesText = builder.joinTypes() contentDescription = context.getString( diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt index 3f581c4de5fb..290942412eed 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt @@ -24,10 +24,14 @@ import com.android.systemui.R typealias Privacy = PrivacyType -enum class PrivacyType(val nameId: Int, val iconId: Int) { - TYPE_CAMERA(R.string.privacy_type_camera, R.drawable.stat_sys_camera), - TYPE_MICROPHONE(R.string.privacy_type_microphone, R.drawable.stat_sys_mic_none), - TYPE_LOCATION(R.string.privacy_type_location, R.drawable.stat_sys_location); +enum class PrivacyType(private val nameId: Int, val iconId: Int) { + // This is uses the icons used by the corresponding permission groups in the AndroidManifest + TYPE_CAMERA(R.string.privacy_type_camera, + com.android.internal.R.drawable.perm_group_camera), + TYPE_MICROPHONE(R.string.privacy_type_microphone, + com.android.internal.R.drawable.perm_group_microphone), + TYPE_LOCATION(R.string.privacy_type_location, + com.android.internal.R.drawable.perm_group_location); fun getName(context: Context) = context.resources.getString(nameId) diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index bb159a9ba2e8..ebc3a6adaeee 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -91,6 +91,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { if (mLayoutOrientation != newConfig.orientation) { mLayoutOrientation = newConfig.orientation; setCurrentItem(0, false); + mPageToRestore = 0; } } @@ -101,6 +102,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { mLayoutDirection = layoutDirection; setAdapter(mAdapter); setCurrentItem(0, false); + mPageToRestore = 0; } } @@ -112,6 +114,17 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { super.setCurrentItem(item, smoothScroll); } + /** + * Obtains the current page number respecting RTL + */ + private int getCurrentPageNumber() { + int page = getCurrentItem(); + if (mLayoutDirection == LAYOUT_DIRECTION_RTL) { + page = mPages.size() - 1 - page; + } + return page; + } + @Override public void setListening(boolean listening) { if (mListening == listening) return; @@ -199,7 +212,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { // marquee. This will ensure that accessibility doesn't announce the TYPE_VIEW_SELECTED // event on any of the children. setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - int currentItem = isLayoutRtl() ? mPages.size() - 1 - getCurrentItem() : getCurrentItem(); + int currentItem = getCurrentPageNumber(); for (int i = 0; i < mPages.size(); i++) { mPages.get(i).setSelected(i == currentItem ? selected : false); } @@ -328,7 +341,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { public int getNumVisibleTiles() { if (mPages.size() == 0) return 0; - TilePage currentPage = mPages.get(getCurrentItem()); + TilePage currentPage = mPages.get(getCurrentPageNumber()); return currentPage.mRecords.size(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 8e77851acc8a..ec2feba8291b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -213,7 +213,11 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha } else { // These tiles disappear when expanding firstPageBuilder.addFloat(quickTileView, "alpha", 1, 0); translationYBuilder.addFloat(quickTileView, "translationY", 0, yDiff); - translationXBuilder.addFloat(quickTileView, "translationX", 0, xDiff + width); + + // xDiff is negative here and this makes it "more" negative + final int translationX = mQsPanel.isLayoutRtl() ? xDiff - width : xDiff + width; + translationXBuilder.addFloat(quickTileView, "translationX", 0, + translationX); } mQuickQsViews.add(tileView.getIconWithBackground()); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 00aef9aed85d..72559f56aaa1 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -498,7 +498,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis mSysUiStateFlags = 0; mSysUiStateFlags |= ActivityManagerWrapper.getInstance().isScreenPinningActive() ? SYSUI_STATE_SCREEN_PINNING : 0; - mSysUiStateFlags |= (navBarFragment == null || !navBarFragment.isNavBarWindowVisible()) + mSysUiStateFlags |= (navBarFragment != null && !navBarFragment.isNavBarWindowVisible()) ? SYSUI_STATE_NAV_BAR_HIDDEN : 0; mSysUiStateFlags |= panelExpanded ? SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED : 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java index c833ded6a85f..907b3ad08c8c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java @@ -33,6 +33,7 @@ import android.view.View; import android.view.WindowManagerGlobal; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.statusbar.RegisterStatusBarResult; import com.android.systemui.Dependency; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.statusbar.CommandQueue.Callbacks; @@ -81,7 +82,7 @@ public class NavigationBarController implements Callbacks { @Override public void onDisplayReady(int displayId) { Display display = mDisplayManager.getDisplay(displayId); - createNavigationBar(display); + createNavigationBar(display, null); } // TODO(b/117478341): I use {@code includeDefaultDisplay} to make this method compatible to @@ -91,11 +92,12 @@ public class NavigationBarController implements Callbacks { * * @param includeDefaultDisplay {@code true} to create navigation bar on default display. */ - public void createNavigationBars(final boolean includeDefaultDisplay) { + public void createNavigationBars(final boolean includeDefaultDisplay, + RegisterStatusBarResult result) { Display[] displays = mDisplayManager.getDisplays(); for (Display display : displays) { if (includeDefaultDisplay || display.getDisplayId() != DEFAULT_DISPLAY) { - createNavigationBar(display); + createNavigationBar(display, result); } } } @@ -107,7 +109,7 @@ public class NavigationBarController implements Callbacks { * @param display the display to add navigation bar on. */ @VisibleForTesting - void createNavigationBar(Display display) { + void createNavigationBar(Display display, RegisterStatusBarResult result) { if (display == null) { return; } @@ -151,6 +153,12 @@ public class NavigationBarController implements Callbacks { navBar.setAutoHideController(autoHideController); navBar.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); mNavigationBars.append(displayId, navBar); + + if (result != null) { + navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken, + result.mImeWindowVis, result.mImeBackDisposition, + result.mShowImeSwitcher); + } }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java index 99f5874448b5..b54de5a42ef8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java @@ -90,6 +90,8 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi @Override public void onPlaybackStateChanged(PlaybackState state) { if (state.getState() != PlaybackState.STATE_PLAYING) { + // Update the UI once, in case playback info changed while we were paused + mUpdatePlaybackUi.run(); clearTimer(); } else if (mSeekBarTimer == null) { startTimer(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 591b1b48ddc2..9eecdb924448 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -316,6 +316,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback if (savedInstanceState != null) { mNavigationBarView.getLightTransitionsController().restoreState(savedInstanceState); } + mNavigationBarView.setNavigationIconHints(mNavigationIconHints); prepareNavigationBarView(); checkNavBarModes(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 0e9264b6b5a4..dd957b402b31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -1709,7 +1709,8 @@ public class NotificationPanelView extends PanelView implements min = Math.max(min, minHeight); } int maxHeight; - if (mQsExpandImmediate || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) { + if (mQsExpandImmediate || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted + || mPulsing) { maxHeight = calculatePanelHeightQsExpanded(); } else { maxHeight = calculatePanelHeightShade(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index aaaf3edfba68..9fccf9132fc8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -660,7 +660,6 @@ public class StatusBar extends SystemUI implements DemoMode, mDisplayId = mDisplay.getDisplayId(); updateDisplaySize(); - Resources res = mContext.getResources(); mVibrateOnOpening = mContext.getResources().getBoolean( R.bool.config_vibrateOnIconAnimation); mVibratorHelper = Dependency.get(VibratorHelper.class); @@ -696,7 +695,7 @@ public class StatusBar extends SystemUI implements DemoMode, ex.rethrowFromSystemServer(); } - createAndAddWindows(); + createAndAddWindows(result); // Make sure we always have the most current wallpaper info. IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED); @@ -778,7 +777,7 @@ public class StatusBar extends SystemUI implements DemoMode, // ================================================================================ // Constructing the view // ================================================================================ - protected void makeStatusBarView() { + protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) { final Context context = mContext; updateDisplaySize(); // populates mDisplayMetrics updateResources(); @@ -871,7 +870,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationLogger.setHeadsUpManager(mHeadsUpManager); putComponent(HeadsUpManager.class, mHeadsUpManager); - createNavigationBar(); + createNavigationBar(result); if (ENABLE_LOCKSCREEN_WALLPAPER) { mLockscreenWallpaper = new LockscreenWallpaper(mContext, this, mHandler); @@ -1118,8 +1117,8 @@ public class StatusBar extends SystemUI implements DemoMode, // TODO(b/117478341): This was left such that CarStatusBar can override this method. // Try to remove this. - protected void createNavigationBar() { - mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */); + protected void createNavigationBar(@Nullable RegisterStatusBarResult result) { + mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result); } /** @@ -2401,12 +2400,8 @@ public class StatusBar extends SystemUI implements DemoMode, pw.println(BarTransitions.modeToString(transitions.getMode())); } - public void createAndAddWindows() { - addStatusBarWindow(); - } - - private void addStatusBarWindow() { - makeStatusBarView(); + public void createAndAddWindows(@Nullable RegisterStatusBarResult result) { + makeStatusBarView(result); mStatusBarWindowController = Dependency.get(StatusBarWindowController.class); mStatusBarWindowController.add(mStatusBarWindow, getStatusBarHeight()); } diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java index 1a9fd5315c32..51ae70b84286 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java @@ -23,9 +23,11 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.google.android.collect.Lists; import com.google.android.collect.Sets; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -62,15 +64,18 @@ class ThemeOverlayManager { static final String OVERLAY_CATEGORY_ICON_LAUNCHER = "android.theme.customization.icon_pack.launcher"; - /* All theme customization categories used by the system. */ - static final Set<String> THEME_CATEGORIES = Sets.newHashSet( - OVERLAY_CATEGORY_COLOR, - OVERLAY_CATEGORY_FONT, + /* + * All theme customization categories used by the system, in order that they should be applied, + * starts with launcher and grouped by target package. + */ + static final List<String> THEME_CATEGORIES = Lists.newArrayList( + OVERLAY_CATEGORY_ICON_LAUNCHER, OVERLAY_CATEGORY_SHAPE, + OVERLAY_CATEGORY_FONT, + OVERLAY_CATEGORY_COLOR, OVERLAY_CATEGORY_ICON_ANDROID, OVERLAY_CATEGORY_ICON_SYSUI, - OVERLAY_CATEGORY_ICON_SETTINGS, - OVERLAY_CATEGORY_ICON_LAUNCHER); + OVERLAY_CATEGORY_ICON_SETTINGS); /* Categories that need to applied to the current user as well as the system user. */ @VisibleForTesting @@ -115,29 +120,30 @@ class ThemeOverlayManager { */ void applyCurrentUserOverlays( Map<String, String> categoryToPackage, Set<UserHandle> userHandles) { - final Map<Boolean, List<String>> categorySplit = THEME_CATEGORIES.stream().collect( - Collectors.partitioningBy((category) -> categoryToPackage.containsKey(category))); - final List<String> overlayCategoriesToEnable = categorySplit.get(true); - final List<String> overlayCategoriesToDisable = categorySplit.get(false); - // Disable all overlays that have not been specified in the user setting. - final List<OverlayInfo> overlays = new ArrayList<>(); - overlayCategoriesToDisable.stream() + final Set<String> overlayCategoriesToDisable = new HashSet<>(THEME_CATEGORIES); + overlayCategoriesToDisable.removeAll(categoryToPackage.keySet()); + final Set<String> targetPackagesToQuery = overlayCategoriesToDisable.stream() .map(category -> mCategoryToTargetPackage.get(category)) - .collect(Collectors.toSet()) - .forEach(targetPackage -> overlays.addAll(mOverlayManager - .getOverlayInfosForTarget(targetPackage, UserHandle.SYSTEM))); - overlays.stream() + .collect(Collectors.toSet()); + final List<OverlayInfo> overlays = new ArrayList<>(); + targetPackagesToQuery.forEach(targetPackage -> overlays.addAll(mOverlayManager + .getOverlayInfosForTarget(targetPackage, UserHandle.SYSTEM))); + final Map<String, String> overlaysToDisable = overlays.stream() .filter(o -> mTargetPackageToCategories.get(o.targetPackageName).contains(o.category)) .filter(o -> overlayCategoriesToDisable.contains(o.category)) .filter(o -> o.isEnabled()) - .forEach(o -> setEnabled(o.packageName, o.category, userHandles, false)); - - - // Enable all overlays specified in the user setting. - overlayCategoriesToEnable.forEach((category) -> - setEnabled(categoryToPackage.get(category), category, userHandles, true)); + .collect(Collectors.toMap((o) -> o.category, (o) -> o.packageName)); + + // Toggle overlays in the order of THEME_CATEGORIES. + for (String category : THEME_CATEGORIES) { + if (categoryToPackage.containsKey(category)) { + setEnabled(categoryToPackage.get(category), category, userHandles, true); + } else if (overlaysToDisable.containsKey(category)) { + setEnabled(overlaysToDisable.get(category), category, userHandles, false); + } + } } private void setEnabled( diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index ffe3ece52e45..6bed43eb37b6 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -288,7 +288,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true); mTestableLooper.processAllMessages(); - verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any()); + verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); verify(mFaceManager).isHardwareDetected(); verify(mFaceManager).hasEnrolledTemplates(anyInt()); } @@ -298,7 +298,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.dispatchStartedWakingUp(); mTestableLooper.processAllMessages(); mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); - verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any()); + verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); } @Test @@ -317,7 +317,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.setKeyguardOccluded(true); mKeyguardUpdateMonitor.setAssistantVisible(true); - verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any()); + verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/DumpControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/DumpControllerTest.kt new file mode 100644 index 000000000000..cca35ca39606 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/DumpControllerTest.kt @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.any +import org.mockito.Mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations +import java.io.FileDescriptor +import java.io.PrintWriter + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class DumpControllerTest : SysuiTestCase() { + + private lateinit var controller: DumpController + @Mock private lateinit var callback1: Dumpable + @Mock private lateinit var callback2: Dumpable + @Mock private lateinit var fd: FileDescriptor + @Mock private lateinit var pw: PrintWriter + private val args = emptyArray<String>() + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + controller = DumpController() +// Debug.waitForDebugger() + } + + @Test + fun testListenerOnlyAddedOnce() { + controller.apply { + addListener(callback1) + addListener(callback1) + } + assertEquals(1, controller.numListeners) + + controller.dump(fd, pw, args) + verify(callback1 /* only once */).dump(fd, pw, args) + } + + @Test + fun testListenersCalledOnDump() { + controller.apply { + addListener(callback1) + addListener(callback2) + } + + controller.dump(fd, pw, args) + + verify(callback1 /* only once */).dump(fd, pw, args) + verify(callback2 /* only once */).dump(fd, pw, args) + } + + @Test + fun testRemoveListener() { + controller.apply { + addListener(callback1) + addListener(callback2) + removeListener(callback1) + } + + controller.dump(fd, pw, args) + + verify(callback1, never()).dump(any(), any(), any()) + verify(callback2 /* only once */).dump(fd, pw, args) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java index 34a726d526a3..7d2ccdc8f0a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java @@ -96,21 +96,21 @@ public class NavigationBarControllerTest extends SysuiTestCase { @Test public void testCreateNavigationBarsIncludeDefaultTrue() { initializeDisplayManager(); - doNothing().when(mNavigationBarController).createNavigationBar(any()); + doNothing().when(mNavigationBarController).createNavigationBar(any(), any()); - mNavigationBarController.createNavigationBars(true); + mNavigationBarController.createNavigationBars(true, null); - verify(mNavigationBarController).createNavigationBar(any(Display.class)); + verify(mNavigationBarController).createNavigationBar(any(Display.class), any()); } @Test public void testCreateNavigationBarsIncludeDefaultFalse() { initializeDisplayManager(); - doNothing().when(mNavigationBarController).createNavigationBar(any()); + doNothing().when(mNavigationBarController).createNavigationBar(any(), any()); - mNavigationBarController.createNavigationBars(false); + mNavigationBarController.createNavigationBars(false, null); - verify(mNavigationBarController, never()).createNavigationBar(any()); + verify(mNavigationBarController, never()).createNavigationBar(any(), any()); } private void initializeDisplayManager() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java index da039a403087..a904704e3ea6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java @@ -51,7 +51,9 @@ import com.google.common.collect.Sets; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InOrder; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.util.HashMap; @@ -134,6 +136,17 @@ public class ThemeOverlayManagerTest extends SysuiTestCase { } @Test + public void allCategoriesSpecified_enabledInOrder() { + mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, TEST_USER_HANDLES); + + InOrder inOrder = Mockito.inOrder(mOverlayManager); + for (String category : THEME_CATEGORIES) { + inOrder.verify(mOverlayManager) + .setEnabledExclusiveInCategory(ALL_CATEGORIES_MAP.get(category), TEST_USER); + } + } + + @Test public void allCategoriesSpecified_sysuiCategoriesAlsoAppliedToSysuiUser() { mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, TEST_USER_HANDLES); diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_clear.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_clear.xml deleted file mode 100644 index 59af0133bdf7..000000000000 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_clear.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24" - android:width="24dp" > - <path - android:fillColor="#000000" - android:pathData="M9,20h6c1.66,0,3-1.34,3-3V6h0.5c0.41,0,0.75-0.34,0.75-0.75S18.91,4.5,18.5,4.5H18h-3l-1-1h-4l-1,1H6H5.5 c-0.41,0-0.75,0.34-0.75,0.75S5.09,6,5.5,6H6v11C6,18.66,7.34,20,9,20z M16.5,6v11c0,0.83-0.67,1.5-1.5,1.5H9 c-0.83,0-1.5-0.67-1.5-1.5V6H16.5z" /> - <path - android:fillColor="#000000" - android:pathData="M13.97,16c0.41,0,0.75-0.34,0.75-0.75v-6.5c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75v6.5 C13.22,15.66,13.55,16,13.97,16z" /> - <path - android:fillColor="#000000" - android:pathData="M10,16c0.41,0,0.75-0.34,0.75-0.75v-6.5C10.75,8.34,10.41,8,10,8S9.25,8.34,9.25,8.75v6.5C9.25,15.66,9.59,16,10,16z" /> -</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml index b6f777749965..798907c386c7 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorHint" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M16,4c0-1.1-0.9-2-2-2h-4C8.9,2,8,2.9,8,4v2H2v12c0,1.66,1.34,3,3,3h14c1.66,0,3-1.34,3-3V6h-6V4z M9.5,4 c0-0.28,0.22-0.5,0.5-0.5h4c0.28,0,0.5,0.22,0.5,0.5v2h-5V4z M20.5,7.5V18c0,0.83-0.67,1.5-1.5,1.5H5c-0.83,0-1.5-0.67-1.5-1.5V7.5 H20.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_drag_handle.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_drag_handle.xml new file mode 100644 index 000000000000..a7ab99e39af6 --- /dev/null +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_drag_handle.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorHint"> + + <path + android:fillColor="@android:color/white" + android:pathData="M4.75,10.5h14.5c0.41,0,0.75-0.34,0.75-0.75S19.66,9,19.25,9H4.75C4.34,9,4,9.34,4,9.75S4.34,10.5,4.75,10.5z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M4.75,15h14.5c0.41,0,0.75-0.34,0.75-0.75s-0.34-0.75-0.75-0.75H4.75C4.34,13.5,4,13.84,4,14.25S4.34,15,4.75,15z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_hourglass_top.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_hourglass_top.xml new file mode 100644 index 000000000000..8160e682f4f5 --- /dev/null +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_hourglass_top.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorPrimary"> + + <path + android:fillColor="@android:color/white" + android:pathData="M7,6.8c0,2.23,1.22,4.16,3.02,5.2C8.22,13.04,7,14.97,7,17.2V22h10v-4.8c0-2.23-1.22-4.16-3.02-5.2 +C15.78,10.96,17,9.03,17,6.8V2H7V6.8z +M15.5,17.2v3.3h-7v-3.3c0-1.6,0.87-3.1,2.26-3.9L12,12.59l1.24,0.71 +C14.63,14.1,15.5,15.6,15.5,17.2z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_info_no_shadow.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_info_no_shadow.xml index 7bd6028591e2..82924bb6c983 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_info_no_shadow.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_info_no_shadow.xml @@ -16,16 +16,16 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M11.99,2C6.47,2,2,6.48,2,12c0,5.52,4.47,10,9.99,10C17.52,22,22,17.52,22,12C22,6.48,17.52,2,11.99,2z M11.99,20.5 c-4.68,0-8.49-3.81-8.49-8.5c0-4.69,3.81-8.5,8.49-8.5c4.69,0,8.51,3.81,8.51,8.5C20.5,16.69,16.68,20.5,11.99,20.5z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M12,10.5c-0.41,0-0.75,0.34-0.75,0.75v5c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-5 C12.75,10.84,12.41,10.5,12,10.5z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 12 7 C 12.5522847498 7 13 7.44771525017 13 8 C 13 8.55228474983 12.5522847498 9 12 9 C 11.4477152502 9 11 8.55228474983 11 8 C 11 7.44771525017 11.4477152502 7 12 7 Z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_wallpaper.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_palette.xml index e58c7b8f1496..964955bc96ca 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_wallpaper.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_palette.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <group @@ -26,20 +26,20 @@ android:translateX="2.000000" android:translateY="2.000000" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M-109-356.5c4.69,0,8.5,3.36,8.5,7.5c0,2.48-2.02,4.5-4.5,4.5h-1.77c-1.1,0-2,0.9-2,2 c0,0.45,0.16,0.89,0.46,1.27l0.02,0.02l0.02,0.02c0.17,0.2,0.27,0.44,0.27,0.68c0,0.55-0.45,1-1,1c-4.69,0-8.5-3.81-8.5-8.5 S-113.69-356.5-109-356.5 M-109-358c-5.51,0-10,4.49-10,10s4.49,10,10,10c1.38,0,2.5-1.12,2.5-2.5c0-0.61-0.23-1.2-0.64-1.67 c-0.08-0.1-0.13-0.21-0.13-0.33c0-0.28,0.22-0.5,0.5-0.5h1.77c3.31,0,6-2.69,6-6C-99-353.96-103.49-358-109-358L-109-358z" /> </group> </group> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 6.5 10 C 7.32842712475 10 8 10.6715728753 8 11.5 C 8 12.3284271247 7.32842712475 13 6.5 13 C 5.67157287525 13 5 12.3284271247 5 11.5 C 5 10.6715728753 5.67157287525 10 6.5 10 Z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 9.5 6 C 10.3284271247 6 11 6.67157287525 11 7.5 C 11 8.32842712475 10.3284271247 9 9.5 9 C 8.67157287525 9 8 8.32842712475 8 7.5 C 8 6.67157287525 8.67157287525 6 9.5 6 Z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 14.5 6 C 15.3284271247 6 16 6.67157287525 16 7.5 C 16 8.32842712475 15.3284271247 9 14.5 9 C 13.6715728753 9 13 8.32842712475 13 7.5 C 13 6.67157287525 13.6715728753 6 14.5 6 Z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 17.5 10 C 18.3284271247 10 19 10.6715728753 19 11.5 C 19 12.3284271247 18.3284271247 13 17.5 13 C 16.6715728753 13 16 12.3284271247 16 11.5 C 16 10.6715728753 16.6715728753 10 17.5 10 Z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_pin.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_pin.xml new file mode 100644 index 000000000000..35c0b810ec58 --- /dev/null +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_pin.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorPrimary"> + + <path + android:fillColor="@android:color/white" + android:pathData="M4.63,14.62C4.24,15.21,4.66,16,5.37,16h5.88c0,0,0,0,0,0v6.25c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75V16 +c0,0,0,0,0,0h5.84c0.71,0,1.13-0.79,0.74-1.38c-0.84-1.25-1.99-2.26-3.33-2.95V4.5h1.23c0.41,0,0.75-0.34,0.75-0.75 +S17.65,3,17.23,3H6.73C6.32,3,5.98,3.34,5.98,3.75S6.32,4.5,6.73,4.5H8v7.15C6.64,12.34,5.48,13.36,4.63,14.62z +M14.5,4.5v8.08 +L15.32,13c0.75,0.39,1.43,0.89,2,1.5H6.64c0.58-0.61,1.27-1.12,2.03-1.51l0.82-0.42V4.5H14.5z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_remove_no_shadow.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_remove_no_shadow.xml index 458223d84684..5fa740d63acc 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_remove_no_shadow.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_remove_no_shadow.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M3.97,20.03c0.15,0.15,0.34,0.22,0.53,0.22s0.38-0.07,0.53-0.22L12,13.06l6.97,6.97c0.15,0.15,0.34,0.22,0.53,0.22 s0.38-0.07,0.53-0.22c0.29-0.29,0.29-0.77,0-1.06L13.06,12l6.97-6.97c0.29-0.29,0.29-0.77,0-1.06s-0.77-0.29-1.06,0L12,10.94 L5.03,3.97c-0.29-0.29-0.77-0.29-1.06,0s-0.29,0.77,0,1.06L10.94,12l-6.97,6.97C3.68,19.26,3.68,19.74,3.97,20.03z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml index abb1b54ac88b..afa0a150bd65 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M12,8.5c-1.93,0-3.5,1.57-3.5,3.5s1.57,3.5,3.5,3.5c1.93,0,3.5-1.57,3.5-3.5S13.93,8.5,12,8.5z M12,14c-1.1,0-2-0.9-2-2 s0.9-2,2-2c1.1,0,2,0.9,2,2S13.1,14,12,14z M21.29,13.9l-1.83-1.05c-0.3-0.17-0.49-0.49-0.48-0.84v-0.01 c0-0.35,0.18-0.67,0.48-0.84l1.83-1.05c0.48-0.28,0.64-0.89,0.37-1.37l-2-3.46c-0.19-0.32-0.52-0.5-0.87-0.5 c-0.17,0-0.34,0.04-0.5,0.13l-1.84,1.06c-0.14,0.08-0.29,0.12-0.45,0.12c-0.17,0-0.35-0.05-0.5-0.14c0,0-0.01,0-0.01-0.01 C15.2,5.77,15,5.47,15,5.12V3c0-0.55-0.45-1-1-1h-4C9.45,2,9,2.45,9,3v2.12c0,0.34-0.2,0.65-0.5,0.82c0,0-0.01,0-0.01,0.01 c-0.16,0.09-0.33,0.14-0.5,0.14c-0.15,0-0.31-0.04-0.45-0.12L5.71,4.9c-0.16-0.09-0.33-0.13-0.5-0.13c-0.35,0-0.68,0.18-0.87,0.5 l-2,3.46C2.06,9.21,2.23,9.82,2.71,10.1l1.83,1.05c0.3,0.17,0.49,0.49,0.48,0.84v0.01c0,0.35-0.18,0.67-0.48,0.84L2.71,13.9 c-0.48,0.28-0.64,0.89-0.37,1.37l2,3.46c0.19,0.32,0.52,0.5,0.87,0.5c0.17,0,0.34-0.04,0.5-0.13l1.84-1.06 c0.14-0.08,0.29-0.12,0.45-0.12c0.17,0,0.35,0.05,0.5,0.14c0,0,0.01,0,0.01,0.01C8.8,18.23,9,18.53,9,18.88V21c0,0.55,0.45,1,1,1h4 c0.55,0,1-0.45,1-1v-2.12c0-0.34,0.2-0.65,0.5-0.82c0,0,0.01,0,0.01-0.01c0.16-0.09,0.33-0.14,0.5-0.14c0.15,0,0.31,0.04,0.45,0.12 l1.84,1.06c0.16,0.09,0.33,0.13,0.5,0.13c0.35,0,0.68-0.18,0.87-0.5l2-3.46C21.94,14.79,21.77,14.18,21.29,13.9z M18.61,17.55 l-1.41-0.81c-0.36-0.21-0.78-0.32-1.2-0.32c-0.43,0-0.86,0.12-1.25,0.34c-0.77,0.44-1.25,1.25-1.25,2.12v1.62h-3v-1.62 c0-0.87-0.48-1.68-1.26-2.12c-0.38-0.22-0.81-0.33-1.25-0.33c-0.42,0-0.84,0.11-1.2,0.32l-1.41,0.81l-1.5-2.6l1.39-0.8 c0.76-0.44,1.24-1.26,1.23-2.15c0-0.88-0.47-1.7-1.23-2.14l-1.39-0.8l1.5-2.6L6.8,7.26c0.36,0.21,0.78,0.32,1.2,0.32 c0.43,0,0.86-0.12,1.25-0.34c0.77-0.44,1.25-1.25,1.25-2.12V3.5h3v1.62c0,0.87,0.48,1.68,1.26,2.12c0.38,0.22,0.81,0.33,1.25,0.33 c0.42,0,0.84-0.11,1.2-0.32l1.41-0.81l1.5,2.6l-1.39,0.8c-0.76,0.44-1.24,1.26-1.23,2.15c0,0.88,0.47,1.7,1.23,2.14l1.39,0.8 L18.61,17.55z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_smartspace_preferences.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_smartspace_preferences.xml index f588c16a24b1..b7d31a216cfd 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_smartspace_preferences.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_smartspace_preferences.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M15.08,8.01c-0.39-0.39-0.91-0.59-1.42-0.59c-0.51,0-1.02,0.2-1.41,0.59L0.59,19.67l3.75,3.75l11.66-11.66 c0.78-0.78,0.78-2.04,0.01-2.82L15.08,8.01z M4.34,21.29l-1.63-1.63l7.45-7.45l1.63,1.63L4.34,21.29z M14.93,10.7l-2.09,2.09 l-1.63-1.63l2.09-2.09c0.13-0.13,0.28-0.15,0.35-0.15c0.08,0,0.23,0.02,0.36,0.15l0.92,0.93C15.13,10.18,15.13,10.5,14.93,10.7z M17.67,5.25h1.08v1.08c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75V5.25h1.08c0.41,0,0.75-0.34,0.75-0.75 s-0.34-0.75-0.75-0.75h-1.08V2.67c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75v1.08h-1.08c-0.41,0-0.75,0.34-0.75,0.75 S17.26,5.25,17.67,5.25z M5.67,5.25h1.08v1.08c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75V5.25h1.08 c0.41,0,0.75-0.34,0.75-0.75S9.74,3.75,9.33,3.75H8.25V2.67c0-0.41-0.34-0.75-0.75-0.75S6.75,2.26,6.75,2.67v1.08H5.67 c-0.41,0-0.75,0.34-0.75,0.75S5.26,5.25,5.67,5.25z M21.33,15.75h-1.08v-1.08c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75 v1.08h-1.08c-0.41,0-0.75,0.34-0.75,0.75s0.34,0.75,0.75,0.75h1.08v1.08c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-1.08 h1.08c0.41,0,0.75-0.34,0.75-0.75S21.74,15.75,21.33,15.75z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_split_screen.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_split_screen.xml index 081f2d882329..649e555cdb92 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_split_screen.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_split_screen.xml @@ -16,13 +16,13 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M4,6v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6c0-1.1-0.9-2-2-2H6C4.9,4,4,4.9,4,6z M18.5,6v3c0,0.28-0.22,0.5-0.5,0.5H6 C5.72,9.5,5.5,9.28,5.5,9V6c0-0.28,0.22-0.5,0.5-0.5h12C18.28,5.5,18.5,5.72,18.5,6z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M4,18c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3c0-1.1-0.9-2-2-2H6c-1.1,0-2,0.9-2,2V18z M5.5,15c0-0.28,0.22-0.5,0.5-0.5h12 c0.28,0,0.5,0.22,0.5,0.5v3c0,0.28-0.22,0.5-0.5,0.5H6c-0.28,0-0.5-0.22-0.5-0.5V15z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_warning.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_warning.xml index f9e742333493..e78ae9a2a522 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_warning.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_warning.xml @@ -16,16 +16,16 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M4.47,21h15.06c1.54,0,2.5-1.67,1.73-3L13.73,4.99c-0.39-0.67-1.06-1-1.73-1s-1.35,0.33-1.73,1L2.74,18 C1.97,19.33,2.93,21,4.47,21z M4.04,18.75l7.53-13.01c0.13-0.22,0.33-0.25,0.43-0.25s0.31,0.03,0.43,0.25l7.53,13.01 c0.13,0.22,0.05,0.41,0,0.5c-0.05,0.09-0.18,0.25-0.43,0.25H4.47c-0.25,0-0.38-0.16-0.43-0.25C3.98,19.16,3.91,18.97,4.04,18.75z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M12,14.75c0.41,0,0.75-0.34,0.75-0.75V9.75C12.75,9.33,12.41,9,12,9s-0.75,0.34-0.75,0.75V14 C11.25,14.41,11.59,14.75,12,14.75z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 12 16 C 12.5522847498 16 13 16.4477152502 13 17 C 13 17.5522847498 12.5522847498 18 12 18 C 11.4477152502 18 11 17.5522847498 11 17 C 11 16.4477152502 11.4477152502 16 12 16 Z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_widget.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_widget.xml index 60698183c7df..c3bc34976f0c 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_widget.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_widget.xml @@ -16,19 +16,19 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M11,5c0-1.1-0.9-2-2-2H5C3.9,3,3,3.9,3,5v4c0,1.1,0.9,2,2,2h4c1.1,0,2-0.9,2-2V5z M9.5,9c0,0.28-0.22,0.5-0.5,0.5H5 C4.72,9.5,4.5,9.28,4.5,9V5c0-0.28,0.22-0.5,0.5-0.5h4c0.28,0,0.5,0.22,0.5,0.5V9z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M9,13H5c-1.1,0-2,0.9-2,2v4c0,1.1,0.9,2,2,2h4c1.1,0,2-0.9,2-2v-4C11,13.9,10.1,13,9,13z M9.5,19c0,0.28-0.22,0.5-0.5,0.5 H5c-0.28,0-0.5-0.22-0.5-0.5v-4c0-0.28,0.22-0.5,0.5-0.5h4c0.28,0,0.5,0.22,0.5,0.5V19z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M19,13h-4c-1.1,0-2,0.9-2,2v4c0,1.1,0.9,2,2,2h4c1.1,0,2-0.9,2-2v-4C21,13.9,20.1,13,19,13z M19.5,19 c0,0.28-0.22,0.5-0.5,0.5h-4c-0.28,0-0.5-0.22-0.5-0.5v-4c0-0.28,0.22-0.5,0.5-0.5h4c0.28,0,0.5,0.22,0.5,0.5V19z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M18.41,2.76c-0.39-0.39-0.9-0.59-1.41-0.59s-1.02,0.2-1.41,0.59l-2.83,2.83c-0.78,0.78-0.78,2.05,0,2.83l2.83,2.83 c0.39,0.39,0.9,0.59,1.41,0.59s1.02-0.2,1.41-0.59l2.83-2.83c0.78-0.78,0.78-2.05,0-2.83L18.41,2.76z M20.18,7.35l-2.83,2.83 c-0.13,0.13-0.28,0.15-0.35,0.15s-0.23-0.02-0.35-0.15l-2.83-2.83C13.69,7.23,13.67,7.08,13.67,7s0.02-0.23,0.15-0.35l2.83-2.83 c0.13-0.13,0.28-0.15,0.35-0.15s0.23,0.02,0.35,0.15l2.83,2.83c0.13,0.13,0.15,0.28,0.15,0.35S20.31,7.23,20.18,7.35z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_clear.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_clear.xml deleted file mode 100644 index 49e7f1de3755..000000000000 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_clear.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24" - android:width="24dp" > - <path - android:fillColor="#000000" - android:pathData="M20,4h-1h-4c0-0.55-0.45-1-1-1h-4C9.45,3,9,3.45,9,4H5H4C3.59,4,3.25,4.34,3.25,4.75S3.59,5.5,4,5.5h1V18 c0,1.66,1.34,3,3,3h8c1.66,0,3-1.34,3-3V5.5h1c0.41,0,0.75-0.34,0.75-0.75S20.41,4,20,4z M17.5,18c0,0.83-0.67,1.5-1.5,1.5H8 c-0.83,0-1.5-0.67-1.5-1.5V5.5h11V18z" /> - <path - android:fillColor="#000000" - android:pathData="M14.25,8c-0.41,0-0.75,0.34-0.75,0.75v7.5c0,0.41,0.34,0.75,0.75,0.75S15,16.66,15,16.25v-7.5C15,8.34,14.66,8,14.25,8z" /> - <path - android:fillColor="#000000" - android:pathData="M9.75,8C9.34,8,9,8.34,9,8.75v7.5C9,16.66,9.34,17,9.75,17s0.75-0.34,0.75-0.75v-7.5C10.5,8.34,10.16,8,9.75,8z" /> -</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml index f7b7f779e32d..76d8882097a7 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorHint" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M20,6h-4V4c0-1.1-0.9-2-2-2h-4C8.9,2,8,2.9,8,4v2H4C2.9,6,2,6.9,2,8v11c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V8 C22,6.9,21.1,6,20,6z M9.5,4c0-0.28,0.22-0.5,0.5-0.5h4c0.28,0,0.5,0.22,0.5,0.5v2h-5V4z M20.5,19c0,0.28-0.22,0.5-0.5,0.5H4 c-0.28,0-0.5-0.22-0.5-0.5V8c0-0.28,0.22-0.5,0.5-0.5h16c0.28,0,0.5,0.22,0.5,0.5V19z" /> + android:fillColor="@android:color/white" + android:pathData="M20,6h-4V4c0-1.11-0.89-2-2-2h-4C8.89,2,8,2.89,8,4v2H4C2.89,6,2.01,6.89,2.01,8L2,19c0,1.11,0.89,2,2,2h16 c1.11,0,2-0.89,2-2V8C22,6.89,21.11,6,20,6z M14,6h-4V4h4V6z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_drag_handle.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_drag_handle.xml new file mode 100644 index 000000000000..3117ae132fe8 --- /dev/null +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_drag_handle.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorHint"> + + <path + android:fillColor="@android:color/white" + android:pathData="M19,13H5c-0.55,0-1,0.45-1,1s0.45,1,1,1h14c0.55,0,1-0.45,1-1S19.55,13,19,13z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M19,9H5c-0.55,0-1,0.45-1,1s0.45,1,1,1h14c0.55,0,1-0.45,1-1S19.55,9,19,9z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_hourglass_top.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_hourglass_top.xml new file mode 100644 index 000000000000..b389e4b83d29 --- /dev/null +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_hourglass_top.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorPrimary"> + + <path + android:fillColor="@android:color/white" + android:pathData="M17,2H7C6.45,2,6,2.45,6,3l0.01,3.75c0,0.79,0.32,1.55,0.87,2.11L10,12l-3.12,3.12c-0.56,0.56-0.87,1.32-0.88,2.11L6,21 +c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1v-3.77c0-0.8-0.32-1.56-0.88-2.12L14,12l3.12-3.13C17.68,8.31,18,7.54,18,6.75V3 +C18,2.45,17.55,2,17,2z +M15.71,16.21c0.19,0.19,0.29,0.44,0.29,0.71V20H8v-3.09c0-0.27,0.11-0.52,0.29-0.71L12,12.5L15.71,16.21z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_info_no_shadow.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_info_no_shadow.xml index 6c9c732af347..f50fa2bcdba2 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_info_no_shadow.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_info_no_shadow.xml @@ -16,16 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M4.92,4.94c-3.9,3.91-3.9,10.24,0.01,14.14s10.24,3.9,14.14-0.01C20.95,17.2,22,14.65,22,12c0-2.65-1.06-5.19-2.93-7.07 C15.16,1.03,8.83,1.03,4.92,4.94z M18,18c-1.6,1.59-3.76,2.48-6.02,2.48c-4.69-0.01-8.49-3.83-8.48-8.52 c0.01-4.69,3.83-8.49,8.52-8.48c4.69,0.01,8.49,3.83,8.48,8.52C20.49,14.25,19.6,16.41,18,18z" /> - <path - android:fillColor="#000000" - android:pathData="M 12 7 C 12.5522847498 7 13 7.44771525017 13 8 C 13 8.55228474983 12.5522847498 9 12 9 C 11.4477152502 9 11 8.55228474983 11 8 C 11 7.44771525017 11.4477152502 7 12 7 Z" /> - <path - android:fillColor="#000000" - android:pathData="M12,10.5c-0.41,0-0.75,0.34-0.75,0.75v5c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-5 C12.75,10.84,12.41,10.5,12,10.5z" /> + android:fillColor="@android:color/white" + android:pathData="M12,2C6.48,2,2,6.48,2,12c0,5.52,4.48,10,10,10s10-4.48,10-10C22,6.48,17.52,2,12,2z M13,17c0,0.55-0.45,1-1,1s-1-0.45-1-1 v-5c0-0.55,0.45-1,1-1s1,0.45,1,1V17z M12,9.25c-0.69,0-1.25-0.56-1.25-1.25S11.31,6.75,12,6.75S13.25,7.31,13.25,8 S12.69,9.25,12,9.25z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_wallpaper.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_palette.xml index 880b2abc8752..e9a89ec569f2 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_wallpaper.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_palette.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M12,2C6.49,2,2,6.49,2,12s4.49,10,10,10c1.38,0,2.5-1.12,2.5-2.5c0-0.61-0.23-1.2-0.64-1.67c-0.08-0.1-0.13-0.21-0.13-0.33 c0-0.28,0.22-0.5,0.5-0.5H16c3.31,0,6-2.69,6-6C22,6.04,17.51,2,12,2z M6.5,13C5.67,13,5,12.33,5,11.5S5.67,10,6.5,10 S8,10.67,8,11.5S7.33,13,6.5,13z M9.5,9C8.67,9,8,8.33,8,7.5S8.67,6,9.5,6S11,6.67,11,7.5S10.33,9,9.5,9z M14.5,9 C13.67,9,13,8.33,13,7.5S13.67,6,14.5,6S16,6.67,16,7.5S15.33,9,14.5,9z M17.5,13c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5 s1.5,0.67,1.5,1.5S18.33,13,17.5,13z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_pin.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_pin.xml new file mode 100644 index 000000000000..698f718090fe --- /dev/null +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_pin.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorPrimary"> + + <path + android:fillColor="@android:color/white" + android:pathData="M5.71,14.29C5.08,14.92,5.52,16,6.41,16H11v6c0,0.55,0.45,1,1,1s1-0.45,1-1v-6h4.59c0.89,0,1.34-1.08,0.71-1.71L16,12V5 +h0.5c0.55,0,1-0.45,1-1s-0.45-1-1-1h-9c-0.55,0-1,0.45-1,1s0.45,1,1,1H8v7L5.71,14.29z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_remove_no_shadow.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_remove_no_shadow.xml index 82c2a3197e00..b3288d93d237 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_remove_no_shadow.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_remove_no_shadow.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M5.22,18.78C5.37,18.93,5.56,19,5.75,19s0.38-0.07,0.53-0.22L12,13.06l5.72,5.72c0.15,0.15,0.34,0.22,0.53,0.22 s0.38-0.07,0.53-0.22c0.29-0.29,0.29-0.77,0-1.06L13.06,12l5.72-5.72c0.29-0.29,0.29-0.77,0-1.06s-0.77-0.29-1.06,0L12,10.94 L6.28,5.22c-0.29-0.29-0.77-0.29-1.06,0s-0.29,0.77,0,1.06L10.94,12l-5.72,5.72C4.93,18.01,4.93,18.49,5.22,18.78z" /> + android:fillColor="@android:color/white" + android:pathData="M5.7,18.3c0.39,0.39,1.02,0.39,1.41,0L12,13.41l4.89,4.89c0.39,0.39,1.02,0.39,1.41,0s0.39-1.02,0-1.41L13.41,12l4.89-4.89 c0.38-0.38,0.38-1.02,0-1.4c-0.39-0.39-1.02-0.39-1.41,0c0,0,0,0,0,0L12,10.59L7.11,5.7c-0.39-0.39-1.02-0.39-1.41,0 s-0.39,1.02,0,1.41L10.59,12L5.7,16.89C5.31,17.28,5.31,17.91,5.7,18.3z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml index c4c5eaab72f5..513633bdc57d 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml @@ -16,13 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M2.43,15.45l1.79,3.09c0.25,0.45,0.74,0.73,1.25,0.73c0.17,0,0.35-0.03,0.52-0.09l1.76-0.7c0.25,0.17,0.51,0.31,0.77,0.45 l0.26,1.84c0.09,0.71,0.69,1.24,1.42,1.24h3.61c0.72,0,1.33-0.53,1.43-1.19l0.26-1.86c0.25-0.14,0.51-0.28,0.76-0.45l1.76,0.7 c0.17,0.07,0.35,0.1,0.53,0.1c0.5,0,0.98-0.27,1.23-0.72l1.82-3.14c0.34-0.61,0.19-1.38-0.36-1.82l-1.48-1.16 c0.01-0.15,0.02-0.29,0.02-0.45s-0.01-0.3-0.02-0.45l1.48-1.16c0.55-0.43,0.7-1.19,0.35-1.84l-1.8-3.1 c-0.25-0.45-0.74-0.73-1.26-0.73c-0.17,0-0.35,0.03-0.52,0.09l-1.76,0.7c-0.25-0.17-0.51-0.31-0.77-0.45l-0.26-1.84 c-0.09-0.71-0.69-1.24-1.42-1.24h-3.61c-0.71,0-1.32,0.54-1.41,1.22L8.52,5.09C8.26,5.23,8.01,5.37,7.75,5.54L5.99,4.83 c-0.17-0.07-0.35-0.1-0.52-0.1c-0.5,0-0.98,0.27-1.22,0.72L2.43,8.55c-0.36,0.61-0.21,1.4,0.36,1.84l1.48,1.16 C4.27,11.7,4.26,11.85,4.26,12c0,0.16,0.01,0.3,0.02,0.45l-1.49,1.16C2.24,14.04,2.09,14.8,2.43,15.45z M5.2,13.63l0.63-0.49 l-0.05-0.79c-0.01-0.11-0.01-0.58,0-0.7l0.05-0.79L5.2,10.37L3.77,9.25l1.74-3l1.69,0.68l0.73,0.29l0.66-0.43 c0.19-0.13,0.4-0.25,0.65-0.38l0.67-0.36L10,5.3l0.25-1.79h3.48l0.26,1.8l0.11,0.76l0.69,0.36c0.23,0.12,0.44,0.24,0.64,0.37 l0.65,0.43l0.72-0.29l1.7-0.68l1.75,3.02l-1.43,1.12l-0.62,0.49l0.05,0.79c0.01,0.11,0.01,0.58,0,0.7l-0.05,0.79l0.62,0.49 l1.43,1.12l-1.74,3.02l-1.69-0.68l-0.72-0.29l-0.65,0.43c-0.19,0.13-0.4,0.25-0.65,0.38l-0.67,0.36l-0.11,0.75l-0.25,1.77h-3.5 L10,18.71l-0.11-0.76l-0.69-0.36c-0.23-0.12-0.44-0.24-0.64-0.37l-0.65-0.43l-0.72,0.29L5.5,17.76l-1.73-3.01L5.2,13.63z" /> - <path - android:fillColor="#000000" - android:pathData="M12,16c2.21,0,4-1.79,4-4s-1.79-4-4-4c-2.21,0-4,1.79-4,4S9.79,16,12,16z M12,9.5c1.38,0,2.5,1.12,2.5,2.5 s-1.12,2.5-2.5,2.5c-1.38,0-2.5-1.12-2.5-2.5S10.62,9.5,12,9.5z" /> + android:fillColor="@android:color/white" + android:pathData="M21.64,8.39l-1.6-2.76c-0.28-0.48-0.88-0.7-1.36-0.5l-2.14,0.91c-0.48-0.37-1.01-0.68-1.57-0.92l-0.27-2.2 C14.64,2.4,14.14,2,13.59,2h-3.18C9.86,2,9.36,2.4,9.3,2.92L9.04,5.11c-0.57,0.24-1.1,0.55-1.58,0.92L5.32,5.12 c-0.48-0.2-1.08,0.02-1.36,0.5l-1.6,2.76C2.08,8.86,2.18,9.48,2.6,9.8l1.94,1.45C4.51,11.49,4.5,11.74,4.5,12s0.01,0.51,0.04,0.76 L2.6,14.2c-0.42,0.31-0.52,0.94-0.24,1.41l1.6,2.76c0.28,0.48,0.88,0.7,1.36,0.5l2.14-0.91c0.48,0.37,1.01,0.68,1.57,0.92 l0.27,2.19C9.36,21.6,9.86,22,10.41,22h3.18c0.55,0,1.04-0.4,1.11-0.92l0.27-2.19c0.56-0.24,1.09-0.55,1.57-0.92l2.14,0.91 c0.48,0.2,1.08-0.02,1.36-0.5l1.6-2.76c0.28-0.48,0.18-1.1-0.24-1.42l-1.94-1.45c0.03-0.25,0.04-0.5,0.04-0.76 s-0.01-0.51-0.04-0.76L21.4,9.8C21.82,9.49,21.92,8.86,21.64,8.39z M12,15.5c-1.93,0-3.5-1.57-3.5-3.5s1.57-3.5,3.5-3.5 s3.5,1.57,3.5,3.5S13.93,15.5,12,15.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_smartspace_preferences.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_smartspace_preferences.xml index 790248ade6ee..4ca296701e6f 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_smartspace_preferences.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_smartspace_preferences.xml @@ -16,10 +16,16 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M14.38,7.3C14.18,7.1,13.92,7,13.66,7c-0.26,0-0.51,0.1-0.71,0.29L1.29,18.96c-0.39,0.39-0.39,1.02,0,1.41l2.34,2.34 C3.82,22.9,4.08,23,4.34,23s0.51-0.1,0.71-0.29L16.7,11.05c0.39-0.39,0.39-1.02,0-1.41L14.38,7.3z M4.34,21.29l-1.63-1.63 l7.45-7.45l1.63,1.63L4.34,21.29z M12.84,12.78l-1.63-1.63l2.45-2.45l1.62,1.64L12.84,12.78z M17.75,5.25h1v1 C18.75,6.66,19.09,7,19.5,7s0.75-0.34,0.75-0.75v-1h1C21.66,5.25,22,4.91,22,4.5s-0.34-0.75-0.75-0.75h-1v-1 C20.25,2.34,19.91,2,19.5,2s-0.75,0.34-0.75,0.75v1h-1C17.34,3.75,17,4.09,17,4.5S17.34,5.25,17.75,5.25z M5.75,5.25h1v1 C6.75,6.66,7.09,7,7.5,7s0.75-0.34,0.75-0.75v-1h1C9.66,5.25,10,4.91,10,4.5S9.66,3.75,9.25,3.75h-1v-1C8.25,2.34,7.91,2,7.5,2 S6.75,2.34,6.75,2.75v1h-1C5.34,3.75,5,4.09,5,4.5S5.34,5.25,5.75,5.25z M21.25,15.75h-1v-1c0-0.41-0.34-0.75-0.75-0.75 s-0.75,0.34-0.75,0.75v1h-1c-0.41,0-0.75,0.34-0.75,0.75s0.34,0.75,0.75,0.75h1v1c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75 v-1h1c0.41,0,0.75-0.34,0.75-0.75S21.66,15.75,21.25,15.75z" /> + android:fillColor="@android:color/white" + android:pathData="M21.23,2.43L19.5,3.4l-1.73-0.97c-0.22-0.12-0.46,0.12-0.34,0.34L18.4,4.5l-0.97,1.73c-0.12,0.22,0.12,0.46,0.34,0.34 L19.5,5.6l1.73,0.97c0.22,0.12,0.46-0.12,0.34-0.34L20.6,4.5l0.97-1.73C21.69,2.55,21.45,2.31,21.23,2.43z M14.37,7.29 c-0.39-0.39-1.02-0.39-1.41,0L1.29,18.96c-0.39,0.39-0.39,1.02,0,1.41l2.34,2.34c0.39,0.39,1.02,0.39,1.41,0L16.7,11.05 c0.39-0.39,0.39-1.02,0-1.41L14.37,7.29z M13.34,12.78l-2.12-2.12l2.44-2.44l2.12,2.12L13.34,12.78z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M21.23,14.43L19.5,15.4l-1.73-0.97c-0.22-0.12-0.46,0.12-0.34,0.34l0.97,1.73l-0.97,1.73c-0.12,0.22,0.12,0.46,0.34,0.34 l1.73-0.97l1.73,0.97c0.22,0.12,0.46-0.12,0.34-0.34L20.6,16.5l0.97-1.73C21.69,14.55,21.45,14.31,21.23,14.43z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M9.23,2.43L7.5,3.4L5.77,2.43C5.55,2.31,5.31,2.55,5.43,2.77L6.4,4.5L5.43,6.23C5.31,6.45,5.55,6.69,5.77,6.57L7.5,5.6 l1.73,0.97c0.22,0.12,0.46-0.12,0.34-0.34L8.6,4.5l0.97-1.73C9.69,2.55,9.45,2.31,9.23,2.43z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_split_screen.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_split_screen.xml index 013b40f41cff..6eddf3d86864 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_split_screen.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_split_screen.xml @@ -16,13 +16,13 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M5,11h14c0.55,0,1-0.45,1-1V4c0-0.55-0.45-1-1-1H5C4.45,3,4,3.45,4,4v6C4,10.55,4.45,11,5,11z M5.5,4.5h13v5h-13V4.5z" /> + android:fillColor="@android:color/white" + android:pathData="M18,2H6C4.9,2,4,2.9,4,4v5c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C20,2.9,19.1,2,18,2z" /> <path - android:fillColor="#000000" - android:pathData="M4,20c0,0.55,0.45,1,1,1h14c0.55,0,1-0.45,1-1v-6c0-0.55-0.45-1-1-1H5c-0.55,0-1,0.45-1,1V20z M5.5,14.5h13v5h-13V14.5z" /> + android:fillColor="@android:color/white" + android:pathData="M18,13H6c-1.1,0-2,0.9-2,2v5c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-5C20,13.9,19.1,13,18,13z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_warning.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_warning.xml index 4af8a3734d1d..41987590a702 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_warning.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_warning.xml @@ -16,16 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M4.47,21h15.06c1.54,0,2.5-1.67,1.73-3L13.73,4.99c-0.39-0.67-1.06-1-1.73-1s-1.35,0.33-1.73,1L2.74,18 C1.97,19.33,2.93,21,4.47,21z M4.04,18.75l7.53-13.01c0.13-0.22,0.33-0.25,0.43-0.25s0.31,0.03,0.43,0.25l7.53,13.01 c0.13,0.22,0.05,0.41,0,0.5c-0.05,0.09-0.18,0.25-0.43,0.25H4.47c-0.25,0-0.38-0.16-0.43-0.25C3.98,19.16,3.91,18.97,4.04,18.75z" /> - <path - android:fillColor="#000000" - android:pathData="M12,14.5c0.41,0,0.75-0.34,0.75-0.75v-4C12.75,9.33,12.41,9,12,9s-0.75,0.34-0.75,0.75v4C11.25,14.16,11.59,14.5,12,14.5z" /> - <path - android:fillColor="#000000" - android:pathData="M 12 16 C 12.5522847498 16 13 16.4477152502 13 17 C 13 17.5522847498 12.5522847498 18 12 18 C 11.4477152502 18 11 17.5522847498 11 17 C 11 16.4477152502 11.4477152502 16 12 16 Z" /> + android:fillColor="@android:color/white" + android:pathData="M12.87,3.49c-0.39-0.67-1.35-0.67-1.73,0l-9.27,16C1.48,20.17,1.96,21,2.73,21h18.53c0.77,0,1.25-0.83,0.87-1.5L12.87,3.49 z M11,10c0-0.55,0.45-1,1-1s1,0.45,1,1v3c0,0.55-0.45,1-1,1s-1-0.45-1-1V10z M12,18.25c-0.69,0-1.25-0.56-1.25-1.25 s0.56-1.25,1.25-1.25s1.25,0.56,1.25,1.25S12.69,18.25,12,18.25z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_widget.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_widget.xml index 7cbf7f1ff0e7..7316c02d5214 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_widget.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_widget.xml @@ -16,19 +16,19 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M10,3H4C3.45,3,3,3.45,3,4v6c0,0.55,0.45,1,1,1h6c0.55,0,1-0.45,1-1V4C11,3.45,10.55,3,10,3z M9.5,9.5h-5v-5h5V9.5z" /> + android:fillColor="@android:color/white" + android:pathData="M17.7,2.3c-0.4-0.4-1-0.4-1.4,0l-4,4c-0.4,0.4-0.4,1,0,1.4l4,4c0.4,0.4,1,0.4,1.4,0l4-4c0.4-0.4,0.4-1,0-1.4L17.7,2.3z" /> <path - android:fillColor="#000000" - android:pathData="M10,13H4c-0.55,0-1,0.45-1,1v6c0,0.55,0.45,1,1,1h6c0.55,0,1-0.45,1-1v-6C11,13.45,10.55,13,10,13z M9.5,19.5h-5v-5h5 V19.5z" /> + android:fillColor="@android:color/white" + android:pathData="M11,4c0-0.5-0.4-1-1-1H4C3.5,3,3,3.5,3,4v6c0,0.6,0.5,1,1,1h6c0.6,0,1-0.4,1-1V4z" /> <path - android:fillColor="#000000" - android:pathData="M20,13h-6c-0.55,0-1,0.45-1,1v6c0,0.55,0.45,1,1,1h6c0.55,0,1-0.45,1-1v-6C21,13.45,20.55,13,20,13z M19.5,19.5h-5v-5h5 V19.5z" /> + android:fillColor="@android:color/white" + android:pathData="M20,21c0.5,0,1-0.5,1-1v-6c0-0.6-0.5-1-1-1h-6c-0.6,0-1,0.4-1,1v6c0,0.5,0.4,1,1,1H20z" /> <path - android:fillColor="#000000" - android:pathData="M21.95,6.29l-4.24-4.24c-0.2-0.2-0.45-0.29-0.71-0.29s-0.51,0.1-0.71,0.29l-4.24,4.24c-0.39,0.39-0.39,1.02,0,1.41 l4.24,4.24c0.2,0.2,0.45,0.29,0.71,0.29s0.51-0.1,0.71-0.29l4.24-4.24C22.34,7.32,22.34,6.68,21.95,6.29z M17,10.54L13.46,7 L17,3.46L20.54,7L17,10.54z" /> + android:fillColor="@android:color/white" + android:pathData="M10,13H4c-0.5,0-1,0.4-1,1v6c0,0.5,0.5,1,1,1h6c0.6,0,1-0.5,1-1v-6C11,13.4,10.6,13,10,13z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_clear.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_clear.xml deleted file mode 100644 index d04eb1f53c37..000000000000 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_clear.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24" - android:width="24dp" > - <path - android:fillColor="#000000" - android:pathData="M18,4h-2.5l-0.71-0.71C14.61,3.11,14.35,3,14.09,3H9.9C9.64,3,9.38,3.11,9.2,3.29L8.49,4h-2.5c-0.55,0-1,0.45-1,1 s0.45,1,1,1h12c0.55,0,1-0.45,1-1C19,4.45,18.55,4,18,4z" /> - <path - android:fillColor="#000000" - android:pathData="M6,19c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2V7H6V19z" /> -</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml index ed395433ae5b..dccc23c82530 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorHint" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M20,6h-4V4c0-1.11-0.89-2-2-2h-4C8.89,2,8,2.89,8,4v2H4C2.89,6,2.01,6.89,2.01,8L2,19c0,1.11,0.89,2,2,2h16 c1.11,0,2-0.89,2-2V8C22,6.89,21.11,6,20,6z M14,6h-4V4h4V6z" /> + android:fillColor="@android:color/white" + android:pathData="M20,6h-4V4c0-1.1-0.9-2-2-2h-4C8.9,2,8,2.9,8,4v2H4C2.9,6,2,6.9,2,8v11c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V8 C22,6.9,21.1,6,20,6z M9.5,4c0-0.28,0.22-0.5,0.5-0.5h4c0.28,0,0.5,0.22,0.5,0.5v2h-5V4z M20.5,19c0,0.28-0.22,0.5-0.5,0.5H4 c-0.28,0-0.5-0.22-0.5-0.5V8c0-0.28,0.22-0.5,0.5-0.5h16c0.28,0,0.5,0.22,0.5,0.5V19z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_drag_handle.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_drag_handle.xml new file mode 100644 index 000000000000..68c0a8022e79 --- /dev/null +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_drag_handle.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorHint"> + + <path + android:fillColor="@android:color/white" + android:pathData="M5.75,10.5h12.5c0.41,0,0.75-0.34,0.75-0.75S18.66,9,18.25,9H5.75C5.34,9,5,9.34,5,9.75S5.34,10.5,5.75,10.5z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M18.25,13.5H5.75C5.34,13.5,5,13.84,5,14.25S5.34,15,5.75,15h12.5c0.41,0,0.75-0.34,0.75-0.75S18.66,13.5,18.25,13.5z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_hourglass_top.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_hourglass_top.xml new file mode 100644 index 000000000000..0fd3229c26f3 --- /dev/null +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_hourglass_top.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorPrimary"> + + <path + android:fillColor="@android:color/white" + android:pathData="M16,3H8C7.45,3,7,3.45,7,4v1.93v0c0,0.33,0.03,0.66,0.1,0.98c0.19,0.96,0.66,1.85,1.37,2.56L11,12l-2.54,2.54 +C7.53,15.47,7,16.74,7,18.07V20c0,0.55,0.45,1,1,1h8c0.55,0,1-0.45,1-1v-1.93c0-1.33-0.53-2.6-1.46-3.54L13,12l2.54-2.54 +c0.7-0.7,1.18-1.59,1.37-2.56C16.97,6.59,17,6.26,17,5.93v0V4C17,3.45,16.55,3,16,3z +M14.47,15.6c0.66,0.66,1.03,1.54,1.03,2.47 +v1.43h-7v-1.43c0-0.93,0.36-1.81,1.03-2.47L12,13.12L14.47,15.6z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_info_no_shadow.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_info_no_shadow.xml index dfa17d6142f4..f799d40cacc7 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_info_no_shadow.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_info_no_shadow.xml @@ -16,10 +16,16 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M12,2C6.48,2,2,6.48,2,12c0,5.52,4.48,10,10,10s10-4.48,10-10C22,6.48,17.52,2,12,2z M13,17c0,0.55-0.45,1-1,1s-1-0.45-1-1 v-5c0-0.55,0.45-1,1-1s1,0.45,1,1V17z M12,9.25c-0.69,0-1.25-0.56-1.25-1.25S11.31,6.75,12,6.75S13.25,7.31,13.25,8 S12.69,9.25,12,9.25z" /> + android:fillColor="@android:color/white" + android:pathData="M4.92,4.94c-3.9,3.91-3.9,10.24,0.01,14.14s10.24,3.9,14.14-0.01C20.95,17.2,22,14.65,22,12c0-2.65-1.06-5.19-2.93-7.07 C15.16,1.03,8.83,1.03,4.92,4.94z M18,18c-1.6,1.59-3.76,2.48-6.02,2.48c-4.69-0.01-8.49-3.83-8.48-8.52 c0.01-4.69,3.83-8.49,8.52-8.48c4.69,0.01,8.49,3.83,8.48,8.52C20.49,14.25,19.6,16.41,18,18z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M 12 7 C 12.5522847498 7 13 7.44771525017 13 8 C 13 8.55228474983 12.5522847498 9 12 9 C 11.4477152502 9 11 8.55228474983 11 8 C 11 7.44771525017 11.4477152502 7 12 7 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M12,10.5c-0.41,0-0.75,0.34-0.75,0.75v5c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-5 C12.75,10.84,12.41,10.5,12,10.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_wallpaper.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_palette.xml index e58c7b8f1496..964955bc96ca 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_wallpaper.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_palette.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <group @@ -26,20 +26,20 @@ android:translateX="2.000000" android:translateY="2.000000" > <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M-109-356.5c4.69,0,8.5,3.36,8.5,7.5c0,2.48-2.02,4.5-4.5,4.5h-1.77c-1.1,0-2,0.9-2,2 c0,0.45,0.16,0.89,0.46,1.27l0.02,0.02l0.02,0.02c0.17,0.2,0.27,0.44,0.27,0.68c0,0.55-0.45,1-1,1c-4.69,0-8.5-3.81-8.5-8.5 S-113.69-356.5-109-356.5 M-109-358c-5.51,0-10,4.49-10,10s4.49,10,10,10c1.38,0,2.5-1.12,2.5-2.5c0-0.61-0.23-1.2-0.64-1.67 c-0.08-0.1-0.13-0.21-0.13-0.33c0-0.28,0.22-0.5,0.5-0.5h1.77c3.31,0,6-2.69,6-6C-99-353.96-103.49-358-109-358L-109-358z" /> </group> </group> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 6.5 10 C 7.32842712475 10 8 10.6715728753 8 11.5 C 8 12.3284271247 7.32842712475 13 6.5 13 C 5.67157287525 13 5 12.3284271247 5 11.5 C 5 10.6715728753 5.67157287525 10 6.5 10 Z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 9.5 6 C 10.3284271247 6 11 6.67157287525 11 7.5 C 11 8.32842712475 10.3284271247 9 9.5 9 C 8.67157287525 9 8 8.32842712475 8 7.5 C 8 6.67157287525 8.67157287525 6 9.5 6 Z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 14.5 6 C 15.3284271247 6 16 6.67157287525 16 7.5 C 16 8.32842712475 15.3284271247 9 14.5 9 C 13.6715728753 9 13 8.32842712475 13 7.5 C 13 6.67157287525 13.6715728753 6 14.5 6 Z" /> <path - android:fillColor="#000000" + android:fillColor="@android:color/white" android:pathData="M 17.5 10 C 18.3284271247 10 19 10.6715728753 19 11.5 C 19 12.3284271247 18.3284271247 13 17.5 13 C 16.6715728753 13 16 12.3284271247 16 11.5 C 16 10.6715728753 16.6715728753 10 17.5 10 Z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_pin.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_pin.xml new file mode 100644 index 000000000000..f1bf5c345474 --- /dev/null +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_pin.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<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/textColorPrimary"> + + <path + android:fillColor="@android:color/white" + android:pathData="M5.71,14.29C5.08,14.92,5.53,16,6.42,16h4.83v6.25c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75V16h4.84 +c0.89,0,1.34-1.08,0.71-1.71L16,12V4.5h1.23c0.41,0,0.75-0.34,0.75-0.75S17.65,3,17.23,3H16H8H6.73C6.32,3,5.98,3.34,5.98,3.75 +S6.32,4.5,6.73,4.5H8V12L5.71,14.29z +M14.5,4.5V12c0,0.4,0.16,0.78,0.44,1.06l1.44,1.44H7.62l1.44-1.44C9.34,12.78,9.5,12.4,9.5,12 +V4.5H14.5z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_remove_no_shadow.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_remove_no_shadow.xml index 22401a1a1cca..864a047844a4 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_remove_no_shadow.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_remove_no_shadow.xml @@ -16,10 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M5.7,18.3c0.39,0.39,1.02,0.39,1.41,0L12,13.41l4.89,4.89c0.39,0.39,1.02,0.39,1.41,0s0.39-1.02,0-1.41L13.41,12l4.89-4.89 c0.38-0.38,0.38-1.02,0-1.4c-0.39-0.39-1.02-0.39-1.41,0c0,0,0,0,0,0L12,10.59L7.11,5.7c-0.39-0.39-1.02-0.39-1.41,0 s-0.39,1.02,0,1.41L10.59,12L5.7,16.89C5.31,17.28,5.31,17.91,5.7,18.3z" /> + android:fillColor="@android:color/white" + android:pathData="M5.22,18.78C5.37,18.93,5.56,19,5.75,19s0.38-0.07,0.53-0.22L12,13.06l5.72,5.72c0.15,0.15,0.34,0.22,0.53,0.22 s0.38-0.07,0.53-0.22c0.29-0.29,0.29-0.77,0-1.06L13.06,12l5.72-5.72c0.29-0.29,0.29-0.77,0-1.06s-0.77-0.29-1.06,0L12,10.94 L6.28,5.22c-0.29-0.29-0.77-0.29-1.06,0s-0.29,0.77,0,1.06L10.94,12l-5.72,5.72C4.93,18.01,4.93,18.49,5.22,18.78z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml index b4f0478f48b5..6ff3144b9a73 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml @@ -16,10 +16,13 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M21.64,8.39l-1.6-2.76c-0.28-0.48-0.88-0.7-1.36-0.5l-2.14,0.91c-0.48-0.37-1.01-0.68-1.57-0.92l-0.27-2.2 C14.64,2.4,14.14,2,13.59,2h-3.18C9.86,2,9.36,2.4,9.3,2.92L9.04,5.11c-0.57,0.24-1.1,0.55-1.58,0.92L5.32,5.12 c-0.48-0.2-1.08,0.02-1.36,0.5l-1.6,2.76C2.08,8.86,2.18,9.48,2.6,9.8l1.94,1.45C4.51,11.49,4.5,11.74,4.5,12s0.01,0.51,0.04,0.76 L2.6,14.2c-0.42,0.31-0.52,0.94-0.24,1.41l1.6,2.76c0.28,0.48,0.88,0.7,1.36,0.5l2.14-0.91c0.48,0.37,1.01,0.68,1.57,0.92 l0.27,2.19C9.36,21.6,9.86,22,10.41,22h3.18c0.55,0,1.04-0.4,1.11-0.92l0.27-2.19c0.56-0.24,1.09-0.55,1.57-0.92l2.14,0.91 c0.48,0.2,1.08-0.02,1.36-0.5l1.6-2.76c0.28-0.48,0.18-1.1-0.24-1.42l-1.94-1.45c0.03-0.25,0.04-0.5,0.04-0.76 s-0.01-0.51-0.04-0.76L21.4,9.8C21.82,9.49,21.92,8.86,21.64,8.39z M12,15.5c-1.93,0-3.5-1.57-3.5-3.5s1.57-3.5,3.5-3.5 s3.5,1.57,3.5,3.5S13.93,15.5,12,15.5z" /> + android:fillColor="@android:color/white" + android:pathData="M2.43,15.45l1.79,3.09c0.25,0.45,0.74,0.73,1.25,0.73c0.17,0,0.35-0.03,0.52-0.09l1.76-0.7c0.25,0.17,0.51,0.31,0.77,0.45 l0.26,1.84c0.09,0.71,0.69,1.24,1.42,1.24h3.61c0.72,0,1.33-0.53,1.43-1.19l0.26-1.86c0.25-0.14,0.51-0.28,0.76-0.45l1.76,0.7 c0.17,0.07,0.35,0.1,0.53,0.1c0.5,0,0.98-0.27,1.23-0.72l1.82-3.14c0.34-0.61,0.19-1.38-0.36-1.82l-1.48-1.16 c0.01-0.15,0.02-0.29,0.02-0.45s-0.01-0.3-0.02-0.45l1.48-1.16c0.55-0.43,0.7-1.19,0.35-1.84l-1.8-3.1 c-0.25-0.45-0.74-0.73-1.26-0.73c-0.17,0-0.35,0.03-0.52,0.09l-1.76,0.7c-0.25-0.17-0.51-0.31-0.77-0.45l-0.26-1.84 c-0.09-0.71-0.69-1.24-1.42-1.24h-3.61c-0.71,0-1.32,0.54-1.41,1.22L8.52,5.09C8.26,5.23,8.01,5.37,7.75,5.54L5.99,4.83 c-0.17-0.07-0.35-0.1-0.52-0.1c-0.5,0-0.98,0.27-1.22,0.72L2.43,8.55c-0.36,0.61-0.21,1.4,0.36,1.84l1.48,1.16 C4.27,11.7,4.26,11.85,4.26,12c0,0.16,0.01,0.3,0.02,0.45l-1.49,1.16C2.24,14.04,2.09,14.8,2.43,15.45z M5.2,13.63l0.63-0.49 l-0.05-0.79c-0.01-0.11-0.01-0.58,0-0.7l0.05-0.79L5.2,10.37L3.77,9.25l1.74-3l1.69,0.68l0.73,0.29l0.66-0.43 c0.19-0.13,0.4-0.25,0.65-0.38l0.67-0.36L10,5.3l0.25-1.79h3.48l0.26,1.8l0.11,0.76l0.69,0.36c0.23,0.12,0.44,0.24,0.64,0.37 l0.65,0.43l0.72-0.29l1.7-0.68l1.75,3.02l-1.43,1.12l-0.62,0.49l0.05,0.79c0.01,0.11,0.01,0.58,0,0.7l-0.05,0.79l0.62,0.49 l1.43,1.12l-1.74,3.02l-1.69-0.68l-0.72-0.29l-0.65,0.43c-0.19,0.13-0.4,0.25-0.65,0.38l-0.67,0.36l-0.11,0.75l-0.25,1.77h-3.5 L10,18.71l-0.11-0.76l-0.69-0.36c-0.23-0.12-0.44-0.24-0.64-0.37l-0.65-0.43l-0.72,0.29L5.5,17.76l-1.73-3.01L5.2,13.63z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M12,16c2.21,0,4-1.79,4-4s-1.79-4-4-4c-2.21,0-4,1.79-4,4S9.79,16,12,16z M12,9.5c1.38,0,2.5,1.12,2.5,2.5 s-1.12,2.5-2.5,2.5c-1.38,0-2.5-1.12-2.5-2.5S10.62,9.5,12,9.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_smartspace_preferences.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_smartspace_preferences.xml index 57ae91f89839..3cc9e51c21cb 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_smartspace_preferences.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_smartspace_preferences.xml @@ -16,16 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M21.23,2.43L19.5,3.4l-1.73-0.97c-0.22-0.12-0.46,0.12-0.34,0.34L18.4,4.5l-0.97,1.73c-0.12,0.22,0.12,0.46,0.34,0.34 L19.5,5.6l1.73,0.97c0.22,0.12,0.46-0.12,0.34-0.34L20.6,4.5l0.97-1.73C21.69,2.55,21.45,2.31,21.23,2.43z M14.37,7.29 c-0.39-0.39-1.02-0.39-1.41,0L1.29,18.96c-0.39,0.39-0.39,1.02,0,1.41l2.34,2.34c0.39,0.39,1.02,0.39,1.41,0L16.7,11.05 c0.39-0.39,0.39-1.02,0-1.41L14.37,7.29z M13.34,12.78l-2.12-2.12l2.44-2.44l2.12,2.12L13.34,12.78z" /> - <path - android:fillColor="#000000" - android:pathData="M21.23,14.43L19.5,15.4l-1.73-0.97c-0.22-0.12-0.46,0.12-0.34,0.34l0.97,1.73l-0.97,1.73c-0.12,0.22,0.12,0.46,0.34,0.34 l1.73-0.97l1.73,0.97c0.22,0.12,0.46-0.12,0.34-0.34L20.6,16.5l0.97-1.73C21.69,14.55,21.45,14.31,21.23,14.43z" /> - <path - android:fillColor="#000000" - android:pathData="M9.23,2.43L7.5,3.4L5.77,2.43C5.55,2.31,5.31,2.55,5.43,2.77L6.4,4.5L5.43,6.23C5.31,6.45,5.55,6.69,5.77,6.57L7.5,5.6 l1.73,0.97c0.22,0.12,0.46-0.12,0.34-0.34L8.6,4.5l0.97-1.73C9.69,2.55,9.45,2.31,9.23,2.43z" /> + android:fillColor="@android:color/white" + android:pathData="M14.38,7.3C14.18,7.1,13.92,7,13.66,7c-0.26,0-0.51,0.1-0.71,0.29L1.29,18.96c-0.39,0.39-0.39,1.02,0,1.41l2.34,2.34 C3.82,22.9,4.08,23,4.34,23s0.51-0.1,0.71-0.29L16.7,11.05c0.39-0.39,0.39-1.02,0-1.41L14.38,7.3z M4.34,21.29l-1.63-1.63 l7.45-7.45l1.63,1.63L4.34,21.29z M12.84,12.78l-1.63-1.63l2.45-2.45l1.62,1.64L12.84,12.78z M17.75,5.25h1v1 C18.75,6.66,19.09,7,19.5,7s0.75-0.34,0.75-0.75v-1h1C21.66,5.25,22,4.91,22,4.5s-0.34-0.75-0.75-0.75h-1v-1 C20.25,2.34,19.91,2,19.5,2s-0.75,0.34-0.75,0.75v1h-1C17.34,3.75,17,4.09,17,4.5S17.34,5.25,17.75,5.25z M5.75,5.25h1v1 C6.75,6.66,7.09,7,7.5,7s0.75-0.34,0.75-0.75v-1h1C9.66,5.25,10,4.91,10,4.5S9.66,3.75,9.25,3.75h-1v-1C8.25,2.34,7.91,2,7.5,2 S6.75,2.34,6.75,2.75v1h-1C5.34,3.75,5,4.09,5,4.5S5.34,5.25,5.75,5.25z M21.25,15.75h-1v-1c0-0.41-0.34-0.75-0.75-0.75 s-0.75,0.34-0.75,0.75v1h-1c-0.41,0-0.75,0.34-0.75,0.75s0.34,0.75,0.75,0.75h1v1c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75 v-1h1c0.41,0,0.75-0.34,0.75-0.75S21.66,15.75,21.25,15.75z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_split_screen.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_split_screen.xml index dc3bd95eb624..aaf490046407 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_split_screen.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_split_screen.xml @@ -16,13 +16,13 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M18,2H6C4.9,2,4,2.9,4,4v5c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C20,2.9,19.1,2,18,2z" /> + android:fillColor="@android:color/white" + android:pathData="M5,11h14c0.55,0,1-0.45,1-1V4c0-0.55-0.45-1-1-1H5C4.45,3,4,3.45,4,4v6C4,10.55,4.45,11,5,11z M5.5,4.5h13v5h-13V4.5z" /> <path - android:fillColor="#000000" - android:pathData="M18,13H6c-1.1,0-2,0.9-2,2v5c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-5C20,13.9,19.1,13,18,13z" /> + android:fillColor="@android:color/white" + android:pathData="M4,20c0,0.55,0.45,1,1,1h14c0.55,0,1-0.45,1-1v-6c0-0.55-0.45-1-1-1H5c-0.55,0-1,0.45-1,1V20z M5.5,14.5h13v5h-13V14.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_warning.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_warning.xml index 184714c8e4d3..63d7b78f76c2 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_warning.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_warning.xml @@ -16,10 +16,16 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M12.87,3.49c-0.39-0.67-1.35-0.67-1.73,0l-9.27,16C1.48,20.17,1.96,21,2.73,21h18.53c0.77,0,1.25-0.83,0.87-1.5L12.87,3.49 z M11,10c0-0.55,0.45-1,1-1s1,0.45,1,1v3c0,0.55-0.45,1-1,1s-1-0.45-1-1V10z M12,18.25c-0.69,0-1.25-0.56-1.25-1.25 s0.56-1.25,1.25-1.25s1.25,0.56,1.25,1.25S12.69,18.25,12,18.25z" /> + android:fillColor="@android:color/white" + android:pathData="M4.47,21h15.06c1.54,0,2.5-1.67,1.73-3L13.73,4.99c-0.39-0.67-1.06-1-1.73-1s-1.35,0.33-1.73,1L2.74,18 C1.97,19.33,2.93,21,4.47,21z M4.04,18.75l7.53-13.01c0.13-0.22,0.33-0.25,0.43-0.25s0.31,0.03,0.43,0.25l7.53,13.01 c0.13,0.22,0.05,0.41,0,0.5c-0.05,0.09-0.18,0.25-0.43,0.25H4.47c-0.25,0-0.38-0.16-0.43-0.25C3.98,19.16,3.91,18.97,4.04,18.75z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M12,14.5c0.41,0,0.75-0.34,0.75-0.75v-4C12.75,9.33,12.41,9,12,9s-0.75,0.34-0.75,0.75v4C11.25,14.16,11.59,14.5,12,14.5z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M 12 16 C 12.5522847498 16 13 16.4477152502 13 17 C 13 17.5522847498 12.5522847498 18 12 18 C 11.4477152502 18 11 17.5522847498 11 17 C 11 16.4477152502 11.4477152502 16 12 16 Z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_widget.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_widget.xml index ca09fc9e4caf..df3a9fdcc40f 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_widget.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_widget.xml @@ -16,19 +16,19 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:viewportHeight="24" + android:viewportHeight="24" android:tint="?android:attr/textColorPrimary" android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="#000000" - android:pathData="M17.7,2.3c-0.4-0.4-1-0.4-1.4,0l-4,4c-0.4,0.4-0.4,1,0,1.4l4,4c0.4,0.4,1,0.4,1.4,0l4-4c0.4-0.4,0.4-1,0-1.4L17.7,2.3z" /> + android:fillColor="@android:color/white" + android:pathData="M10,3H4C3.45,3,3,3.45,3,4v6c0,0.55,0.45,1,1,1h6c0.55,0,1-0.45,1-1V4C11,3.45,10.55,3,10,3z M9.5,9.5h-5v-5h5V9.5z" /> <path - android:fillColor="#000000" - android:pathData="M11,4c0-0.5-0.4-1-1-1H4C3.5,3,3,3.5,3,4v6c0,0.6,0.5,1,1,1h6c0.6,0,1-0.4,1-1V4z" /> + android:fillColor="@android:color/white" + android:pathData="M10,13H4c-0.55,0-1,0.45-1,1v6c0,0.55,0.45,1,1,1h6c0.55,0,1-0.45,1-1v-6C11,13.45,10.55,13,10,13z M9.5,19.5h-5v-5h5 V19.5z" /> <path - android:fillColor="#000000" - android:pathData="M20,21c0.5,0,1-0.5,1-1v-6c0-0.6-0.5-1-1-1h-6c-0.6,0-1,0.4-1,1v6c0,0.5,0.4,1,1,1H20z" /> + android:fillColor="@android:color/white" + android:pathData="M20,13h-6c-0.55,0-1,0.45-1,1v6c0,0.55,0.45,1,1,1h6c0.55,0,1-0.45,1-1v-6C21,13.45,20.55,13,20,13z M19.5,19.5h-5v-5h5 V19.5z" /> <path - android:fillColor="#000000" - android:pathData="M10,13H4c-0.5,0-1,0.4-1,1v6c0,0.5,0.5,1,1,1h6c0.6,0,1-0.5,1-1v-6C11,13.4,10.6,13,10,13z" /> + android:fillColor="@android:color/white" + android:pathData="M21.95,6.29l-4.24-4.24c-0.2-0.2-0.45-0.29-0.71-0.29s-0.51,0.1-0.71,0.29l-4.24,4.24c-0.39,0.39-0.39,1.02,0,1.41 l4.24,4.24c0.2,0.2,0.45,0.29,0.71,0.29s0.51-0.1,0.71-0.29l4.24-4.24C22.34,7.32,22.34,6.68,21.95,6.29z M17,10.54L13.46,7 L17,3.46L20.54,7L17,10.54z" /> </vector>
\ No newline at end of file diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 833faa6f3faf..52a4218238e7 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -1399,8 +1399,8 @@ public class DeviceIdleController extends SystemService } break; case MSG_TEMP_APP_WHITELIST_TIMEOUT: { // TODO: What is keeping the device awake at this point? Does it need to be? - int uid = msg.arg1; - checkTempAppWhitelistTimeout(uid); + int appId = msg.arg1; + checkTempAppWhitelistTimeout(appId); } break; case MSG_REPORT_MAINTENANCE_ACTIVITY: { // TODO: What is keeping the device awake at this point? Does it need to be? @@ -1656,9 +1656,9 @@ public class DeviceIdleController extends SystemService } // duration in milliseconds - public void addPowerSaveTempWhitelistAppDirect(int appId, long duration, boolean sync, + public void addPowerSaveTempWhitelistAppDirect(int uid, long duration, boolean sync, String reason) { - addPowerSaveTempWhitelistAppDirectInternal(0, appId, duration, sync, reason); + addPowerSaveTempWhitelistAppDirectInternal(0, uid, duration, sync, reason); } // duration in milliseconds @@ -2357,8 +2357,7 @@ public class DeviceIdleController extends SystemService long duration, int userId, boolean sync, String reason) { try { int uid = getContext().getPackageManager().getPackageUidAsUser(packageName, userId); - int appId = UserHandle.getAppId(uid); - addPowerSaveTempWhitelistAppDirectInternal(callingUid, appId, duration, sync, reason); + addPowerSaveTempWhitelistAppDirectInternal(callingUid, uid, duration, sync, reason); } catch (NameNotFoundException e) { } } @@ -2367,10 +2366,11 @@ public class DeviceIdleController extends SystemService * Adds an app to the temporary whitelist and resets the endTime for granting the * app an exemption to access network and acquire wakelocks. */ - void addPowerSaveTempWhitelistAppDirectInternal(int callingUid, int appId, + void addPowerSaveTempWhitelistAppDirectInternal(int callingUid, int uid, long duration, boolean sync, String reason) { final long timeNow = SystemClock.elapsedRealtime(); boolean informWhitelistChanged = false; + int appId = UserHandle.getAppId(uid); synchronized (this) { int callingAppId = UserHandle.getAppId(callingUid); if (callingAppId >= Process.FIRST_APPLICATION_UID) { @@ -2395,7 +2395,7 @@ public class DeviceIdleController extends SystemService // No pending timeout for the app id, post a delayed message try { mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_TEMP_WHITELIST_START, - reason, appId); + reason, uid); } catch (RemoteException e) { } postTempActiveTimeoutMessage(appId, duration); @@ -2440,34 +2440,34 @@ public class DeviceIdleController extends SystemService } } - private void postTempActiveTimeoutMessage(int uid, long delay) { + private void postTempActiveTimeoutMessage(int appId, long delay) { if (DEBUG) { - Slog.d(TAG, "postTempActiveTimeoutMessage: uid=" + uid + ", delay=" + delay); + Slog.d(TAG, "postTempActiveTimeoutMessage: appId=" + appId + ", delay=" + delay); } - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_TEMP_APP_WHITELIST_TIMEOUT, uid, 0), - delay); + mHandler.sendMessageDelayed( + mHandler.obtainMessage(MSG_TEMP_APP_WHITELIST_TIMEOUT, appId, 0), delay); } - void checkTempAppWhitelistTimeout(int uid) { + void checkTempAppWhitelistTimeout(int appId) { final long timeNow = SystemClock.elapsedRealtime(); if (DEBUG) { - Slog.d(TAG, "checkTempAppWhitelistTimeout: uid=" + uid + ", timeNow=" + timeNow); + Slog.d(TAG, "checkTempAppWhitelistTimeout: appId=" + appId + ", timeNow=" + timeNow); } synchronized (this) { - Pair<MutableLong, String> entry = mTempWhitelistAppIdEndTimes.get(uid); + Pair<MutableLong, String> entry = mTempWhitelistAppIdEndTimes.get(appId); if (entry == null) { // Nothing to do return; } if (timeNow >= entry.first.value) { - mTempWhitelistAppIdEndTimes.delete(uid); - onAppRemovedFromTempWhitelistLocked(uid, entry.second); + mTempWhitelistAppIdEndTimes.delete(appId); + onAppRemovedFromTempWhitelistLocked(appId, entry.second); } else { // Need more time if (DEBUG) { - Slog.d(TAG, "Time to remove UID " + uid + ": " + entry.first.value); + Slog.d(TAG, "Time to remove AppId " + appId + ": " + entry.first.value); } - postTempActiveTimeoutMessage(uid, entry.first.value - timeNow); + postTempActiveTimeoutMessage(appId, entry.first.value - timeNow); } } } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 4c3bb8c07728..873cadb5a9d9 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -220,7 +220,8 @@ public class AppOpsService extends IAppOpsService.Stub { * global Settings. Any access to this class or its fields should be done while * holding the AppOpsService lock. */ - private final class Constants extends ContentObserver { + @VisibleForTesting + final class Constants extends ContentObserver { // Key names stored in the settings value. private static final String KEY_TOP_STATE_SETTLE_TIME = "top_state_settle_time"; private static final String KEY_FG_SERVICE_STATE_SETTLE_TIME @@ -305,7 +306,8 @@ public class AppOpsService extends IAppOpsService.Stub { } } - private final Constants mConstants; + @VisibleForTesting + final Constants mConstants; @VisibleForTesting static final class UidState { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d58888a7c67b..77472ed288c3 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -90,9 +90,8 @@ import android.media.audiofx.AudioEffect; import android.media.audiopolicy.AudioMix; import android.media.audiopolicy.AudioPolicy; import android.media.audiopolicy.AudioPolicyConfig; -import android.media.audiopolicy.AudioProductStrategies; +import android.media.audiopolicy.AudioProductStrategy; import android.media.audiopolicy.AudioVolumeGroup; -import android.media.audiopolicy.AudioVolumeGroups; import android.media.audiopolicy.IAudioPolicyCallback; import android.media.projection.IMediaProjection; import android.media.projection.IMediaProjectionManager; @@ -281,11 +280,6 @@ public class AudioService extends IAudioService.Stub private SettingsObserver mSettingsObserver; - /** @see AudioProductStrategies */ - private static AudioProductStrategies sAudioProductStrategies; - /** @see AudioVolumeGroups */ - private static AudioVolumeGroups sAudioVolumeGroups; - private int mMode = AudioSystem.MODE_NORMAL; // protects mRingerMode private final Object mSettingsLock = new Object(); @@ -636,19 +630,17 @@ public class AudioService extends IAudioService.Stub mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator(); - sAudioProductStrategies = new AudioProductStrategies(); - sAudioVolumeGroups = new AudioVolumeGroups(); - // Initialize volume // Priority 1 - Android Property // Priority 2 - Audio Policy Service // Priority 3 - Default Value - if (sAudioProductStrategies.size() > 0) { + if (AudioProductStrategy.getAudioProductStrategies().size() > 0) { int numStreamTypes = AudioSystem.getNumStreamTypes(); for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { AudioAttributes attr = - sAudioProductStrategies.getAudioAttributesForLegacyStreamType(streamType); + AudioProductStrategy.getAudioAttributesForStrategyWithLegacyStreamType( + streamType); int maxVolume = AudioSystem.getMaxVolumeIndexForAttributes(attr); if (maxVolume != -1) { MAX_STREAM_VOLUME[streamType] = maxVolume; @@ -1023,19 +1015,21 @@ public class AudioService extends IAudioService.Stub } /** - * @return the {@link android.media.audiopolicy.AudioProductStrategies} discovered from the + * @return the {@link android.media.audiopolicy.AudioProductStrategy} discovered from the * platform configuration file. */ - public @NonNull AudioProductStrategies getAudioProductStrategies() { - return sAudioProductStrategies; + @NonNull + public List<AudioProductStrategy> getAudioProductStrategies() { + return AudioProductStrategy.getAudioProductStrategies(); } /** - * @return the {@link android.media.audiopolicy.AudioVolumeGroups} discovered from the + * @return the List of {@link android.media.audiopolicy.AudioVolumeGroup} discovered from the * platform configuration file. */ - public @NonNull AudioVolumeGroups listAudioVolumeGroups() { - return sAudioVolumeGroups; + @NonNull + public List<AudioVolumeGroup> getAudioVolumeGroups() { + return AudioVolumeGroup.getAudioVolumeGroups(); } private void checkAllAliasStreamVolumes() { @@ -1947,15 +1941,15 @@ public class AudioService extends IAudioService.Stub enforceModifyAudioRoutingPermission(); Preconditions.checkNotNull(attr, "attr must not be null"); // @todo not hold the caller context, post message - int stream = sAudioProductStrategies.getLegacyStreamTypeForAudioAttributes(attr); + int stream = AudioProductStrategy.getLegacyStreamTypeForStrategyWithAudioAttributes(attr); final int device = getDeviceForStream(stream); int oldIndex = AudioSystem.getVolumeIndexForAttributes(attr, device); AudioSystem.setVolumeIndexForAttributes(attr, index, device); - final int volumeGroup = sAudioProductStrategies.getVolumeGroupIdForAttributes(attr); - final AudioVolumeGroup avg = sAudioVolumeGroups.getById(volumeGroup); + final int volumeGroup = getVolumeGroupIdForAttributes(attr); + final AudioVolumeGroup avg = getAudioVolumeGroupById(volumeGroup); if (avg == null) { return; } @@ -1965,11 +1959,23 @@ public class AudioService extends IAudioService.Stub } } + @Nullable + private AudioVolumeGroup getAudioVolumeGroupById(int volumeGroupId) { + for (final AudioVolumeGroup avg : AudioVolumeGroup.getAudioVolumeGroups()) { + if (avg.getId() == volumeGroupId) { + return avg; + } + } + + Log.e(TAG, ": invalid volume group id: " + volumeGroupId + " requested"); + return null; + } + /** @see AudioManager#getVolumeIndexForAttributes(attr) */ public int getVolumeIndexForAttributes(@NonNull AudioAttributes attr) { enforceModifyAudioRoutingPermission(); Preconditions.checkNotNull(attr, "attr must not be null"); - int stream = sAudioProductStrategies.getLegacyStreamTypeForAudioAttributes(attr); + int stream = AudioProductStrategy.getLegacyStreamTypeForStrategyWithAudioAttributes(attr); final int device = getDeviceForStream(stream); return AudioSystem.getVolumeIndexForAttributes(attr, device); @@ -2144,6 +2150,32 @@ public class AudioService extends IAudioService.Stub sendVolumeUpdate(streamType, oldIndex, index, flags); } + + + private int getVolumeGroupIdForAttributes(@NonNull AudioAttributes attributes) { + Preconditions.checkNotNull(attributes, "attributes must not be null"); + int volumeGroupId = getVolumeGroupIdForAttributesInt(attributes); + if (volumeGroupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) { + return volumeGroupId; + } + // The default volume group is the one hosted by default product strategy, i.e. + // supporting Default Attributes + return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes); + } + + private int getVolumeGroupIdForAttributesInt(@NonNull AudioAttributes attributes) { + Preconditions.checkNotNull(attributes, "attributes must not be null"); + for (final AudioProductStrategy productStrategy : + AudioProductStrategy.getAudioProductStrategies()) { + int volumeGroupId = productStrategy.getVolumeGroupIdForAudioAttributes(attributes); + if (volumeGroupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP) { + return volumeGroupId; + } + } + return AudioVolumeGroup.DEFAULT_VOLUME_GROUP; + } + + // No ringer or zen muted stream volumes can be changed unless it'll exit dnd private boolean volumeAdjustmentAllowedByDnd(int streamTypeAlias, int flags) { switch (mNm.getZenMode()) { diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java index b2c5c053528e..91da7af44f0a 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java @@ -134,7 +134,8 @@ public abstract class AuthenticationClient extends ClientMonitor { + ", Owner: " + getOwnerString() + ", isBP: " + isBiometricPrompt() + ", listener: " + listener - + ", requireConfirmation: " + mRequireConfirmation); + + ", requireConfirmation: " + mRequireConfirmation + + ", user: " + getTargetUserId()); if (authenticated) { mAlreadyDone = true; diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index aa52621d044d..e218c6b399a2 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -42,14 +42,13 @@ import android.os.Binder; import android.os.Build; import android.os.Environment; import android.os.IBinder; +import android.os.NativeHandle; import android.os.RemoteException; import android.os.SELinux; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; -import android.service.restricted_image.RestrictedImageProto; -import android.service.restricted_image.RestrictedImageSetProto; -import android.service.restricted_image.RestrictedImagesDumpProto; +import android.provider.Settings; import android.util.Slog; import android.util.proto.ProtoOutputStream; @@ -70,8 +69,11 @@ import org.json.JSONObject; import java.io.File; import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -286,8 +288,8 @@ public class FaceService extends BiometricServiceBase { final long ident = Binder.clearCallingIdentity(); try { - if (args.length == 1 && "--restricted_image".equals(args[0])) { - dumpRestrictedImage(fd); + if (args.length > 1 && "--hal".equals(args[0])) { + dumpHal(fd, Arrays.copyOfRange(args, 1, args.length, args.getClass())); } else if (args.length > 0 && "--proto".equals(args[0])) { dumpProto(fd); } else { @@ -546,7 +548,8 @@ public class FaceService extends BiometricServiceBase { throws RemoteException { if (mFaceServiceReceiver != null) { if (biometric == null || biometric instanceof Face) { - mFaceServiceReceiver.onAuthenticationSucceeded(deviceId, (Face)biometric); + mFaceServiceReceiver.onAuthenticationSucceeded(deviceId, (Face) biometric, + userId); } else { Slog.e(TAG, "onAuthenticationSucceeded received non-face biometric"); } @@ -1078,7 +1081,7 @@ public class FaceService extends BiometricServiceBase { mCryptoPerformanceMap.clear(); } - private void dumpRestrictedImage(FileDescriptor fd) { + private void dumpHal(FileDescriptor fd, String[] args) { // WARNING: CDD restricts image data from leaving TEE unencrypted on // production devices: // [C-1-10] MUST not allow unencrypted access to identifiable biometric @@ -1099,59 +1102,28 @@ public class FaceService extends BiometricServiceBase { return; } - final ProtoOutputStream proto = new ProtoOutputStream(fd); - - final long setToken = proto.start(RestrictedImagesDumpProto.SETS); - - // Name of the service - proto.write(RestrictedImageSetProto.CATEGORY, "face"); - - // Individual images - for (int i = 0; i < 5; i++) { - final long imageToken = proto.start(RestrictedImageSetProto.IMAGES); - proto.write(RestrictedImageProto.MIME_TYPE, "image/png"); - proto.write(RestrictedImageProto.IMAGE_DATA, new byte[] { - // png image data - -119, 80, 78, 71, 13, 10, 26, 10, - 0, 0, 0, 13, 73, 72, 68, 82, - 0, 0, 0, 100, 0, 0, 0, 100, - 1, 3, 0, 0, 0, 74, 44, 7, - 23, 0, 0, 0, 4, 103, 65, 77, - 65, 0, 0, -79, -113, 11, -4, 97, - 5, 0, 0, 0, 1, 115, 82, 71, - 66, 0, -82, -50, 28, -23, 0, 0, - 0, 6, 80, 76, 84, 69, -1, -1, - -1, 0, 0, 0, 85, -62, -45, 126, - 0, 0, 0, -115, 73, 68, 65, 84, - 56, -53, -19, -46, -79, 17, -128, 32, - 12, 5, -48, 120, 22, -106, -116, -32, - 40, -84, 101, -121, -93, 57, 10, 35, - 88, 82, 112, 126, 3, -60, 104, 6, - -112, 70, 127, -59, -69, -53, 29, 33, - -127, -24, 79, -49, -52, -15, 41, 36, - 34, -105, 85, 124, -14, 88, 27, 6, - 28, 68, 1, 82, 62, 22, -95, -108, - 55, -95, 40, -9, -110, -12, 98, -107, - 76, -41, -105, -62, -50, 111, -60, 46, - -14, -4, 24, -89, 42, -103, 16, 63, - -72, -11, -15, 48, -62, 102, -44, 102, - -73, -56, 56, -21, -128, 92, -70, -124, - 117, -46, -67, -77, 82, 80, 121, -44, - -56, 116, 93, -45, -90, -5, -29, -24, - -83, -75, 52, -34, 55, -22, 102, -21, - -105, -124, -23, 71, 87, -7, -25, -59, - -100, -73, -92, -122, -7, -109, -49, -80, - -89, 0, 0, 0, 0, 73, 69, 78, - 68, -82, 66, 96, -126 - }); - // proto.write(RestrictedImageProto.METADATA, flattened_protobuf); - proto.end(imageToken); + // The debug method takes two file descriptors. The first is for text + // output, which we will drop. The second is for binary data, which + // will be the protobuf data. + final IBiometricsFace daemon = getFaceDaemon(); + if (daemon != null) { + FileOutputStream devnull = null; + try { + devnull = new FileOutputStream("/dev/null"); + final NativeHandle handle = new NativeHandle( + new FileDescriptor[] { devnull.getFD(), fd }, + new int[0], false); + daemon.debug(handle, new ArrayList<String>(Arrays.asList(args))); + } catch (IOException | RemoteException ex) { + Slog.d(TAG, "error while reading face debugging data", ex); + } finally { + if (devnull != null) { + try { + devnull.close(); + } catch (IOException ex) { + } + } + } } - - // Face service metadata - // proto.write(RestrictedImageSetProto.METADATA, flattened_protobuf); - - proto.end(setToken); - proto.flush(); } } diff --git a/services/core/java/com/android/server/incident/IncidentCompanionService.java b/services/core/java/com/android/server/incident/IncidentCompanionService.java index 9989c1a511ad..87fe785ca614 100644 --- a/services/core/java/com/android/server/incident/IncidentCompanionService.java +++ b/services/core/java/com/android/server/incident/IncidentCompanionService.java @@ -55,7 +55,8 @@ public class IncidentCompanionService extends SystemService { * Dump argument for proxying restricted image dumps to the services * listed in the config. */ - private static String[] RESTRICTED_IMAGE_DUMP_ARGS = new String[] { "--restricted_image" }; + private static String[] RESTRICTED_IMAGE_DUMP_ARGS = new String[] { + "--hal", "--restricted_image" }; /** * The two permissions, for sendBroadcastAsUserMultiplePermissions. diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index cec4d693ad32..75b9705e1045 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -523,11 +523,17 @@ public class InputManagerService extends IInputManager.Stub } - InputChannel[] inputChannels = InputChannel.openInputChannelPair(inputChannelName); - InputMonitorHost host = new InputMonitorHost(inputChannels[0]); - inputChannels[0].setToken(host.asBinder()); - nativeRegisterInputMonitor(mPtr, inputChannels[0], displayId, true /*isGestureMonitor*/); - return new InputMonitor(inputChannelName, inputChannels[1], host); + final long ident = Binder.clearCallingIdentity(); + try { + InputChannel[] inputChannels = InputChannel.openInputChannelPair(inputChannelName); + InputMonitorHost host = new InputMonitorHost(inputChannels[0]); + inputChannels[0].setToken(host.asBinder()); + nativeRegisterInputMonitor(mPtr, inputChannels[0], displayId, + true /*isGestureMonitor*/); + return new InputMonitor(inputChannelName, inputChannels[1], host); + } finally { + Binder.restoreCallingIdentity(ident); + } } /** diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index e28f89c59018..96fc6ec5907c 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -495,6 +495,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements @Override public void onUpdateSatelliteBlacklist(int[] constellations, int[] svids) { mHandler.post(() -> mGnssConfiguration.setSatelliteBlacklist(constellations, svids)); + mGnssMetrics.resetConstellationTypes(); } private void subscriptionOrCarrierConfigChanged(Context context) { @@ -1443,6 +1444,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) == 0 ? "" : "F")); } + + if ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) { + int constellationType = + (info.mSvidWithFlags[i] >> GnssStatus.CONSTELLATION_TYPE_SHIFT_WIDTH) + & GnssStatus.CONSTELLATION_TYPE_MASK; + mGnssMetrics.logConstellationType(constellationType); + } } if (usedInFixCount > 0) { meanCn0 /= usedInFixCount; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 7f1b25ca3ca3..ee2e4f573fb9 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -455,6 +455,7 @@ public class NotificationManagerService extends SystemService { private int mAutoGroupAtCount; private boolean mIsTelevision; private boolean mIsAutomotive; + private boolean mNotificationEffectsEnabledForAutomotive; private MetricsLogger mMetricsLogger; private TriPredicate<String, Integer, String> mAllowedManagedServicePackages; @@ -1686,6 +1687,8 @@ public class NotificationManagerService extends SystemService { mIsAutomotive = mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0); + mNotificationEffectsEnabledForAutomotive = + resources.getBoolean(R.bool.config_enableServerNotificationEffectsForAutomotive); mPreferencesHelper.lockChannelsForOEM(getContext().getResources().getStringArray( com.android.internal.R.array.config_nonBlockableNotificationPackages)); @@ -5560,6 +5563,9 @@ public class NotificationManagerService extends SystemService { @VisibleForTesting @GuardedBy("mNotificationLock") void buzzBeepBlinkLocked(NotificationRecord record) { + if (mIsAutomotive && !mNotificationEffectsEnabledForAutomotive) { + return; + } boolean buzz = false; boolean beep = false; boolean blink = false; diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index ec53e98ec547..3a84b1e18e36 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -452,10 +452,7 @@ final class OverlayManagerServiceImpl { final OverlayInfo overlayInfo = mSettings.getOverlayInfo(packageName, userId); if (mSettings.remove(packageName, userId)) { removeIdmapIfPossible(overlayInfo); - if (overlayInfo.isEnabled()) { - // Only trigger updates if the overlay was enabled. - mListener.onOverlaysChanged(overlayInfo.targetPackageName, userId); - } + mListener.onOverlaysChanged(overlayInfo.targetPackageName, userId); } } catch (OverlayManagerSettings.BadKeyException e) { Slog.e(TAG, "failed to remove overlay", e); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 7f48970b445a..e6313d9dcbe4 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -813,7 +813,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @Override public void uninstall(VersionedPackage versionedPackage, String callerPackageName, int flags, - IntentSender statusReceiver, int userId) throws RemoteException { + IntentSender statusReceiver, int userId) { final int callingUid = Binder.getCallingUid(); mPermissionManager.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { @@ -952,6 +952,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @Override public void onUserActionRequired(Intent intent) { + if (mTarget == null) { + return; + } final Intent fillIn = new Intent(); fillIn.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, mPackageName); fillIn.putExtra(PackageInstaller.EXTRA_STATUS, @@ -972,6 +975,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements SystemMessage.NOTE_PACKAGE_STATE, mNotification); } + if (mTarget == null) { + return; + } final Intent fillIn = new Intent(); fillIn.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, mPackageName); fillIn.putExtra(PackageInstaller.EXTRA_STATUS, diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c68974b30db9..c1587dc9f86f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1990,31 +1990,31 @@ public class PackageManagerService extends IPackageManager.Stub // Work that needs to happen on first install within each user if (firstUserIds != null && firstUserIds.length > 0) { - synchronized (mPackages) { - for (int userId : firstUserIds) { - // If this app is a browser and it's newly-installed for some - // users, clear any default-browser state in those users. The - // app's nature doesn't depend on the user, so we can just check - // its browser nature in any user and generalize. - if (packageIsBrowser(packageName, userId)) { - // If this browser is restored from user's backup, do not clear - // default-browser state for this user + for (int userId : firstUserIds) { + // If this app is a browser and it's newly-installed for some + // users, clear any default-browser state in those users. The + // app's nature doesn't depend on the user, so we can just check + // its browser nature in any user and generalize. + if (packageIsBrowser(packageName, userId)) { + // If this browser is restored from user's backup, do not clear + // default-browser state for this user + synchronized (mPackages) { final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting.getInstallReason(userId) != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { setDefaultBrowserAsyncLPw(null, userId); } } + } - // We may also need to apply pending (restored) runtime permission grants - // within these users. - mPermissionManager.restoreDelayedRuntimePermissions(packageName, - UserHandle.of(userId)); + // We may also need to apply pending (restored) runtime permission grants + // within these users. + mPermissionManager.restoreDelayedRuntimePermissions(packageName, + UserHandle.of(userId)); - // Persistent preferred activity might have came into effect due to this - // install. - updateDefaultHomeLPw(userId); - } + // Persistent preferred activity might have came into effect due to this + // install. + updateDefaultHomeNotLocked(userId); } } @@ -5158,7 +5158,7 @@ public class PackageManagerService extends IPackageManager.Stub getPackagesUsingSharedLibraryLPr(libInfo, flags, userId), (libInfo.getDependencies() == null ? null - : new ArrayList(libInfo.getDependencies()))); + : new ArrayList<>(libInfo.getDependencies()))); if (result == null) { result = new ArrayList<>(); @@ -6475,8 +6475,8 @@ public class PackageManagerService extends IPackageManager.Stub final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags, userId); // Find any earlier preferred or last chosen entries and nuke them - findPreferredActivity(intent, resolvedType, - flags, query, 0, false, true, false, userId); + findPreferredActivityNotLocked( + intent, resolvedType, flags, query, 0, false, true, false, userId); // Add the new activity as the last chosen for this filter addPreferredActivityInternal(filter, match, null, activity, false, userId, "Setting last chosen"); @@ -6491,8 +6491,8 @@ public class PackageManagerService extends IPackageManager.Stub if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent); final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags, userId); - return findPreferredActivity(intent, resolvedType, flags, query, 0, - false, false, false, userId); + return findPreferredActivityNotLocked( + intent, resolvedType, flags, query, 0, false, false, false, userId); } /** @@ -6605,7 +6605,7 @@ public class PackageManagerService extends IPackageManager.Stub } // If we have saved a preference for a preferred activity for // this Intent, use that. - ResolveInfo ri = findPreferredActivity(intent, resolvedType, + ResolveInfo ri = findPreferredActivityNotLocked(intent, resolvedType, flags, query, r0.priority, true, false, debug, userId); if (ri != null) { return ri; @@ -6744,9 +6744,14 @@ public class PackageManagerService extends IPackageManager.Stub } // TODO: handle preferred activities missing while user has amnesia - ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags, + /** <b>must not hold {@link #mPackages}</b> */ + ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType, int flags, List<ResolveInfo> query, int priority, boolean always, boolean removeMatches, boolean debug, int userId) { + if (Thread.holdsLock(mPackages)) { + Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() + + " is holding mPackages", new Throwable()); + } if (!sUserManager.exists(userId)) return null; final int callingUid = Binder.getCallingUid(); // Do NOT hold the packages lock; this calls up into the settings provider which @@ -18599,10 +18604,10 @@ public class PackageManagerService extends IPackageManager.Stub int removedAppId = -1; // writer - synchronized (mPackages) { - boolean installedStateChanged = false; - if (deletedPs != null) { - if ((flags&PackageManager.DELETE_KEEP_DATA) == 0) { + boolean installedStateChanged = false; + if (deletedPs != null) { + if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) { + synchronized (mPackages) { clearIntentFilterVerificationsLPw(deletedPs.name, UserHandle.USER_ALL); clearDefaultBrowserIfNeeded(packageName); mSettings.mKeySetManagerService.removeAppKeySetDataLPw(packageName); @@ -18633,26 +18638,34 @@ public class PackageManagerService extends IPackageManager.Stub } } } - clearPackagePreferredActivitiesLPw(deletedPs.name, UserHandle.USER_ALL); } - // make sure to preserve per-user disabled state if this removal was just - // a downgrade of a system app to the factory package - if (allUserHandles != null && outInfo != null && outInfo.origUsers != null) { + final SparseBooleanArray changedUsers = new SparseBooleanArray(); + clearPackagePreferredActivitiesLPw( + deletedPs.name, changedUsers, UserHandle.USER_ALL); + if (changedUsers.size() > 0) { + updateDefaultHomeNotLocked(changedUsers); + postPreferredActivityChangedBroadcast(UserHandle.USER_ALL); + } + } + // make sure to preserve per-user disabled state if this removal was just + // a downgrade of a system app to the factory package + if (allUserHandles != null && outInfo != null && outInfo.origUsers != null) { + if (DEBUG_REMOVE) { + Slog.d(TAG, "Propagating install state across downgrade"); + } + for (int userId : allUserHandles) { + final boolean installed = ArrayUtils.contains(outInfo.origUsers, userId); if (DEBUG_REMOVE) { - Slog.d(TAG, "Propagating install state across downgrade"); + Slog.d(TAG, " user " + userId + " => " + installed); } - for (int userId : allUserHandles) { - final boolean installed = ArrayUtils.contains(outInfo.origUsers, userId); - if (DEBUG_REMOVE) { - Slog.d(TAG, " user " + userId + " => " + installed); - } - if (installed != deletedPs.getInstalled(userId)) { - installedStateChanged = true; - } - deletedPs.setInstalled(installed, userId); + if (installed != deletedPs.getInstalled(userId)) { + installedStateChanged = true; } + deletedPs.setInstalled(installed, userId); } } + } + synchronized (mPackages) { // can downgrade to reader if (writeSettings) { // Save settings now @@ -19330,10 +19343,17 @@ public class PackageManagerService extends IPackageManager.Stub destroyAppDataLIF(pkg, nextUserId, StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); clearDefaultBrowserIfNeededForUser(ps.name, nextUserId); - synchronized (mPackages) { - if (clearPackagePreferredActivitiesLPw(ps.name, nextUserId)) { + removeKeystoreDataIfNeeded(nextUserId, ps.appId); + final SparseBooleanArray changedUsers = new SparseBooleanArray(); + clearPackagePreferredActivitiesLPw(ps.name, changedUsers, nextUserId); + if (changedUsers.size() > 0) { + updateDefaultHomeNotLocked(changedUsers); + postPreferredActivityChangedBroadcast(nextUserId); + synchronized (mPackages) { scheduleWritePackageRestrictionsLocked(nextUserId); } + } + synchronized (mPackages) { resetUserChangesToRuntimePermissionsAndFlagsLPw(ps, nextUserId); } // Also delete contributed media, when requested @@ -19796,33 +19816,34 @@ public class PackageManagerService extends IPackageManager.Stub int callingUid = Binder.getCallingUid(); mPermissionManager.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "add preferred activity"); + if (mContext.checkCallingOrSelfPermission( + android.Manifest.permission.SET_PREFERRED_APPLICATIONS) + != PackageManager.PERMISSION_GRANTED) { + if (getUidTargetSdkVersionLockedLPr(callingUid) + < Build.VERSION_CODES.FROYO) { + Slog.w(TAG, "Ignoring addPreferredActivity() from uid " + + callingUid); + return; + } + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); + } if (filter.countActions() == 0) { Slog.w(TAG, "Cannot set a preferred activity with no filter actions"); return; } - synchronized (mPackages) { - if (mContext.checkCallingOrSelfPermission( - android.Manifest.permission.SET_PREFERRED_APPLICATIONS) - != PackageManager.PERMISSION_GRANTED) { - if (getUidTargetSdkVersionLockedLPr(callingUid) - < Build.VERSION_CODES.FROYO) { - Slog.w(TAG, "Ignoring addPreferredActivity() from uid " - + callingUid); - return; - } - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); - } - - PreferredIntentResolver pir = mSettings.editPreferredActivitiesLPw(userId); + if (DEBUG_PREFERRED) { Slog.i(TAG, opname + " activity " + activity.flattenToShortString() + " for user " + userId + ":"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); + } + if (!updateDefaultHomeNotLocked(userId)) { + postPreferredActivityChangedBroadcast(userId); + } + synchronized (mPackages) { + final PreferredIntentResolver pir = mSettings.editPreferredActivitiesLPw(userId); pir.addFilter(new PreferredActivity(filter, match, set, activity, always)); scheduleWritePackageRestrictionsLocked(userId); - if (!updateDefaultHomeLPw(userId)) { - postPreferredActivityChangedBroadcast(userId); - } } } @@ -19963,25 +19984,24 @@ public class PackageManagerService extends IPackageManager.Stub && filterAppAccessLPr(ps, callingUid, UserHandle.getUserId(callingUid))) { return; } - int user = UserHandle.getCallingUserId(); - if (clearPackagePreferredActivitiesLPw(packageName, user)) { - scheduleWritePackageRestrictionsLocked(user); + } + int callingUserId = UserHandle.getCallingUserId(); + final SparseBooleanArray changedUsers = new SparseBooleanArray(); + clearPackagePreferredActivitiesLPw(packageName, changedUsers, callingUserId); + if (changedUsers.size() > 0) { + updateDefaultHomeNotLocked(changedUsers); + postPreferredActivityChangedBroadcast(callingUserId); + synchronized (mPackages) { + scheduleWritePackageRestrictionsLocked(callingUserId); } } } /** This method takes a specific user id as well as UserHandle.USER_ALL. */ @GuardedBy("mPackages") - boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { - return clearPackagePreferredActivitiesLPw(packageName, false, userId); - } - - /** This method takes a specific user id as well as UserHandle.USER_ALL. */ - @GuardedBy("mPackages") - private boolean clearPackagePreferredActivitiesLPw(String packageName, - boolean skipUpdateDefaultHome, int userId) { + private void clearPackagePreferredActivitiesLPw(String packageName, + @NonNull SparseBooleanArray outUserChanged, int userId) { ArrayList<PreferredActivity> removed = null; - boolean changed = false; for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { final int thisUserId = mSettings.mPreferredActivities.keyAt(i); PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); @@ -20007,16 +20027,9 @@ public class PackageManagerService extends IPackageManager.Stub PreferredActivity pa = removed.get(j); pir.removeFilter(pa); } - changed = true; - if (!skipUpdateDefaultHome) { - updateDefaultHomeLPw(thisUserId); - } + outUserChanged.setValueAt(thisUserId, true); } } - if (changed) { - postPreferredActivityChangedBroadcast(userId); - } - return changed; } /** This method takes a specific user id as well as UserHandle.USER_ALL. */ @@ -20069,21 +20082,27 @@ public class PackageManagerService extends IPackageManager.Stub final long identity = Binder.clearCallingIdentity(); // writer try { + final SparseBooleanArray changedUsers = new SparseBooleanArray(); + clearPackagePreferredActivitiesLPw(null, changedUsers, userId); + if (changedUsers.size() > 0) { + postPreferredActivityChangedBroadcast(userId); + } synchronized (mPackages) { - clearPackagePreferredActivitiesLPw(null, true, userId); mSettings.applyDefaultPreferredAppsLPw(userId); - updateDefaultHomeLPw(userId); - // TODO: We have to reset the default SMS and Phone. This requires - // significant refactoring to keep all default apps in the package - // manager (cleaner but more work) or have the services provide - // callbacks to the package manager to request a default app reset. - setDefaultBrowserPackageName(null, userId); clearIntentFilterVerificationsLPw(userId); primeDomainVerificationsLPw(userId); resetUserChangesToRuntimePermissionsAndFlagsLPw(userId); - scheduleWritePackageRestrictionsLocked(userId); } + updateDefaultHomeNotLocked(userId); + // TODO: We have to reset the default SMS and Phone. This requires + // significant refactoring to keep all default apps in the package + // manager (cleaner but more work) or have the services provide + // callbacks to the package manager to request a default app reset. + setDefaultBrowserPackageName(null, userId); resetNetworkPolicies(userId); + synchronized (mPackages) { + scheduleWritePackageRestrictionsLocked(userId); + } } finally { Binder.restoreCallingIdentity(identity); } @@ -20133,15 +20152,17 @@ public class PackageManagerService extends IPackageManager.Stub Slog.w(TAG, "Cannot set a preferred activity with no filter actions"); return; } - synchronized (mPackages) { - Slog.i(TAG, "Adding persistent preferred activity " + activity + " for user " + userId + - ":"); + if (DEBUG_PREFERRED) { + Slog.i(TAG, "Adding persistent preferred activity " + activity + + " for user " + userId + ":"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); + } + updateDefaultHomeNotLocked(userId); + postPreferredActivityChangedBroadcast(userId); + synchronized (mPackages) { mSettings.editPersistentPreferredActivitiesLPw(userId).addFilter( new PersistentPreferredActivity(filter, activity)); scheduleWritePackageRestrictionsLocked(userId); - postPreferredActivityChangedBroadcast(userId); - updateDefaultHomeLPw(userId); } } @@ -20181,11 +20202,12 @@ public class PackageManagerService extends IPackageManager.Stub changed = true; } } - - if (changed) { + } + if (changed) { + updateDefaultHomeNotLocked(userId); + postPreferredActivityChangedBroadcast(userId); + synchronized (mPackages) { scheduleWritePackageRestrictionsLocked(userId); - postPreferredActivityChangedBroadcast(userId); - updateDefaultHomeLPw(userId); } } } @@ -20273,8 +20295,8 @@ public class PackageManagerService extends IPackageManager.Stub (readParser, readUserId) -> { synchronized (mPackages) { mSettings.readPreferredActivitiesLPw(readParser, readUserId); - updateDefaultHomeLPw(readUserId); } + updateDefaultHomeNotLocked(readUserId); }); } catch (Exception e) { if (DEBUG_BACKUP) { @@ -20601,29 +20623,55 @@ public class PackageManagerService extends IPackageManager.Stub return null; } + /** <b>must not hold {@link #mPackages}</b> */ + private void updateDefaultHomeNotLocked(SparseBooleanArray userIds) { + if (Thread.holdsLock(mPackages)) { + Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() + + " is holding mPackages", new Throwable()); + } + for (int i = userIds.size() - 1; i >= 0; --i) { + final int userId = userIds.keyAt(i); + updateDefaultHomeNotLocked(userId); + } + } + /** + * <b>must not hold {@link #mPackages}</b> + * * @return Whether the ACTION_PREFERRED_ACTIVITY_CHANGED broadcast has been scheduled. */ - private boolean updateDefaultHomeLPw(int userId) { - Intent intent = getHomeIntent(); - List<ResolveInfo> resolveInfos = queryIntentActivitiesInternal(intent, null, + private boolean updateDefaultHomeNotLocked(int userId) { + if (Thread.holdsLock(mPackages)) { + Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() + + " is holding mPackages", new Throwable()); + } + final Intent intent = getHomeIntent(); + final List<ResolveInfo> resolveInfos = queryIntentActivitiesInternal(intent, null, PackageManager.GET_META_DATA, userId); - ResolveInfo preferredResolveInfo = findPreferredActivity(intent, null, 0, resolveInfos, - 0, true, false, false, userId); - String packageName = preferredResolveInfo != null + final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked( + intent, null, 0, resolveInfos, 0, true, false, false, userId); + final String packageName = preferredResolveInfo != null && preferredResolveInfo.activityInfo != null ? preferredResolveInfo.activityInfo.packageName : null; - String currentPackageName = mDefaultHomeProvider.getDefaultHome(userId); + final PackageManagerInternal.DefaultHomeProvider provider; + synchronized (mPackages) { + provider = mDefaultHomeProvider; + } + if (provider == null) { + Slog.e(TAG, "Default home provider has not been set"); + return false; + } + final String currentPackageName = provider.getDefaultHome(userId); if (TextUtils.equals(currentPackageName, packageName)) { return false; } - String[] callingPackages = getPackagesForUid(Binder.getCallingUid()); + final String[] callingPackages = getPackagesForUid(Binder.getCallingUid()); if (callingPackages != null && ArrayUtils.contains(callingPackages, mRequiredPermissionControllerPackage)) { // PermissionController manages default home directly. return false; } - mDefaultHomeProvider.setDefaultHomeAsync(packageName, userId, (successful) -> { + provider.setDefaultHomeAsync(packageName, userId, (successful) -> { if (successful) { postPreferredActivityChangedBroadcast(userId); } @@ -23720,9 +23768,7 @@ public class PackageManagerService extends IPackageManager.Stub } return ((appInfo.isSystemApp() ? IPackageManagerNative.LOCATION_SYSTEM : 0) | (appInfo.isVendor() ? IPackageManagerNative.LOCATION_VENDOR : 0) - | (appInfo.isProduct() ? IPackageManagerNative.LOCATION_PRODUCT : 0) - | (appInfo.isProductServices() - ? IPackageManagerNative.LOCATION_PRODUCT_SERVICES : 0)); + | (appInfo.isProduct() ? IPackageManagerNative.LOCATION_PRODUCT : 0)); } } diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index 96924c04e5e1..10ed88f49231 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -92,6 +92,7 @@ import android.os.UserManager; import android.os.storage.DiskInfo; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; +import android.provider.Settings; import android.stats.storage.StorageEnums; import android.telephony.ModemActivityInfo; import android.telephony.TelephonyManager; @@ -2057,6 +2058,40 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } + private void pullFaceSettings(int tagId, long elapsedNanos, long wallClockNanos, + List<StatsLogEventWrapper> pulledData) { + long callingToken = Binder.clearCallingIdentity(); + try { + List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers(); + int numUsers = users.size(); + for (int userNum = 0; userNum < numUsers; userNum++) { + int userId = users.get(userNum).getUserHandle().getIdentifier(); + + StatsLogEventWrapper e = + new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); + e.writeBoolean(Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED, 1, + userId) != 0); + e.writeBoolean(Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, + 0, userId) != 0); + e.writeBoolean(Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED, 1, + userId) != 0); + e.writeBoolean(Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.FACE_UNLOCK_APP_ENABLED, 1, + userId) != 0); + e.writeBoolean(Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, 0, + userId) != 0); + + pulledData.add(e); + } + } finally { + Binder.restoreCallingIdentity(callingToken); + } + } + /** * Pulls various data. */ @@ -2261,6 +2296,10 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pullAppsOnExternalStorageInfo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.FACE_SETTINGS: { + pullFaceSettings(tagId, elapsedNanos, wallClockNanos, ret); + break; + } default: Slog.w(TAG, "No such tagId data as " + tagId); return null; diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index d916e39c2531..10afbef12623 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -26,20 +26,6 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TR import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_REPORTED_DRAWN_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_STARTING_WINDOW_DELAY_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_FLAGS; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_FULLSCREEN; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_NO_DISPLAY; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_VISIBLE; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_IS_VISIBLE_IGNORING_KEYGUARD; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_LAUNCH_MODE; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_MILLIS_SINCE_LAST_LAUNCH; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_MILLIS_SINCE_LAST_VISIBLE; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_PROCESS_NAME; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_REAL_ACTIVITY; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_RESULT_TO_PKG_NAME; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_RESULT_TO_SHORT_COMPONENT_NAME; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_SHORT_COMPONENT_NAME; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ACTIVITY_RECORD_TARGET_ACTIVITY; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CALLING_PACKAGE_NAME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CALLING_UID; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CALLING_UID_HAS_ANY_VISIBLE_WINDOW; @@ -62,12 +48,7 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_REAL_CALLING_UID; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_REAL_CALLING_UID_HAS_ANY_VISIBLE_WINDOW; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_REAL_CALLING_UID_PROC_STATE; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_PACKAGE_NAME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_SHORT_COMPONENT_NAME; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_UID; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_UID_HAS_ANY_VISIBLE_WINDOW; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_UID_PROC_STATE; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TARGET_WHITELIST_TAG; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_FILTER; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_REASON; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH; @@ -671,6 +652,11 @@ class ActivityMetricsLogger { final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.valueAt(index); final int type = getTransitionType(info); if (type == INVALID_TRANSITION_TYPE) { + if (DEBUG_METRICS) { + Slog.i(TAG, "invalid transition type" + + " processRunning=" + info.currentTransitionProcessRunning + + " startResult=" + info.startResult); + } return; } @@ -921,7 +907,10 @@ class ActivityMetricsLogger { } else if (info.startResult == START_TASK_TO_FRONT) { return TYPE_TRANSITION_HOT_LAUNCH; } - } else if (info.startResult == START_SUCCESS) { + } else if (info.startResult == START_SUCCESS + || (info.startResult == START_TASK_TO_FRONT)) { + // TaskRecord may still exist when cold launching an activity and the start + // result will be set to START_TASK_TO_FRONT. Treat this as a COLD launch. return TYPE_TRANSITION_COLD_LAUNCH; } return INVALID_TRANSITION_TYPE; diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index f31416cdc620..432ca3387ce7 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -292,9 +292,9 @@ class TaskSnapshotController { } final boolean isWindowTranslucent = mainWindow.getAttrs().format != PixelFormat.OPAQUE; return new TaskSnapshot(appWindowToken.mActivityComponent, buffer, - appWindowToken.getConfiguration().orientation, getInsets(mainWindow), - isLowRamDevice /* reduced */, scaleFraction /* scale */, true /* isRealSnapshot */, - task.getWindowingMode(), getSystemUiVisibility(task), + screenshotBuffer.getColorSpace(), appWindowToken.getConfiguration().orientation, + getInsets(mainWindow), isLowRamDevice /* reduced */, scaleFraction /* scale */, + true /* isRealSnapshot */, task.getWindowingMode(), getSystemUiVisibility(task), !appWindowToken.fillsParent() || isWindowTranslucent); } @@ -383,10 +383,10 @@ class TaskSnapshotController { // Note, the app theme snapshot is never translucent because we enforce a non-translucent // color above return new TaskSnapshot(topChild.mActivityComponent, hwBitmap.createGraphicBufferHandle(), - topChild.getConfiguration().orientation, mainWindow.getStableInsets(), - ActivityManager.isLowRamDeviceStatic() /* reduced */, 1.0f /* scale */, - false /* isRealSnapshot */, task.getWindowingMode(), getSystemUiVisibility(task), - false); + hwBitmap.getColorSpace(), topChild.getConfiguration().orientation, + mainWindow.getStableInsets(), ActivityManager.isLowRamDeviceStatic() /* reduced */, + 1.0f /* scale */, false /* isRealSnapshot */, task.getWindowingMode(), + getSystemUiVisibility(task), false); } /** diff --git a/services/core/java/com/android/server/wm/TaskSnapshotLoader.java b/services/core/java/com/android/server/wm/TaskSnapshotLoader.java index d30843b9c589..f7b8945d9729 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotLoader.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotLoader.java @@ -89,7 +89,8 @@ class TaskSnapshotLoader { } ComponentName topActivityComponent = ComponentName.unflattenFromString( proto.topActivityComponent); - return new TaskSnapshot(topActivityComponent, buffer, proto.orientation, + return new TaskSnapshot(topActivityComponent, buffer, bitmap.getColorSpace(), + proto.orientation, new Rect(proto.insetLeft, proto.insetTop, proto.insetRight, proto.insetBottom), reducedResolution, reducedResolution ? mPersister.getReducedScale() : 1f, proto.isRealSnapshot, proto.windowingMode, proto.systemUiVisibility, diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ce496f47be54..8ed2a15b2b98 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2107,7 +2107,7 @@ public class WindowManagerService extends IWindowManager.Stub if (shouldRelayout) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "relayoutWindow: viewVisibility_1"); - result = win.relayoutVisibleWindow(result, attrChanges, oldVisibility); + result = win.relayoutVisibleWindow(result, attrChanges); try { result = createSurfaceControl(outSurfaceControl, result, win, winAnimator); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 08ade37c995c..d990e6c6c24b 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -4446,7 +4446,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return !mLastSurfaceInsets.equals(mAttrs.surfaceInsets); } - int relayoutVisibleWindow(int result, int attrChanges, int oldVisibility) { + int relayoutVisibleWindow(int result, int attrChanges) { final boolean wasVisible = isVisibleLw(); result |= (!wasVisible || !isDrawnLw()) ? RELAYOUT_RES_FIRST_TIME : 0; @@ -4466,7 +4466,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mDestroying = false; mWmService.mDestroySurface.remove(this); } - if (oldVisibility == View.GONE) { + if (!wasVisible) { mWinAnimator.mEnterAnimationPending = true; } diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 73e9bf0e1202..b470ec7a00ba 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -1693,7 +1693,7 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass // 1.1@IGnss can be paired {1.0, 1.1}@IGnssMeasurement // 1.0@IGnss is paired with 1.0@IGnssMeasurement gnssMeasurementIface = nullptr; - if (gnssHal_V2_0 != nullptr && gnssMeasurementIface == nullptr) { + if (gnssHal_V2_0 != nullptr) { auto gnssMeasurement = gnssHal_V2_0->getExtensionGnssMeasurement_2_0(); if (!gnssMeasurement.isOk()) { ALOGD("Unable to get a handle to GnssMeasurement_V2_0"); @@ -1730,6 +1730,10 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass } } + // Allow all causal combinations between IGnss.hal and IGnssDebug.hal. That means, + // 2.0@IGnss can be paired with {1.0, 2.0}@IGnssDebug + // 1.0@IGnss is paired with 1.0@IGnssDebug + gnssDebugIface = nullptr; if (gnssHal_V2_0 != nullptr) { auto gnssDebug = gnssHal_V2_0->getExtensionGnssDebug_2_0(); if (!gnssDebug.isOk()) { @@ -1738,7 +1742,8 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass gnssDebugIface_V2_0 = gnssDebug; gnssDebugIface = gnssDebugIface_V2_0; } - } else { + } + if (gnssDebugIface == nullptr) { auto gnssDebug = gnssHal->getExtensionGnssDebug(); if (!gnssDebug.isOk()) { ALOGD("Unable to get a handle to GnssDebug"); diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java index 36f84d053817..c42a71858f26 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java @@ -15,8 +15,11 @@ */ package com.android.server.appop; +import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE; +import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE_LOCATION; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_ERRORED; +import static android.app.AppOpsManager.MODE_FOREGROUND; import static android.app.AppOpsManager.OP_COARSE_LOCATION; import static android.app.AppOpsManager.OP_READ_SMS; import static android.app.AppOpsManager.OP_WIFI_SCAN; @@ -25,6 +28,7 @@ import static android.app.AppOpsManager.OP_WRITE_SMS; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; +import android.app.ActivityManager; import android.app.AppOpsManager.OpEntry; import android.app.AppOpsManager.PackageOps; import android.content.Context; @@ -37,6 +41,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.server.appop.AppOpsService; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -222,6 +227,108 @@ public class AppOpsServiceTest { assertThat(getLoggedOps()).isNull(); } + private void setupProcStateTests() { + // For the location proc state tests + mAppOpsService.setMode(OP_COARSE_LOCATION, mMyUid, mMyPackageName, MODE_FOREGROUND); + mAppOpsService.mConstants.FG_SERVICE_STATE_SETTLE_TIME = 0; + mAppOpsService.mConstants.TOP_STATE_SETTLE_TIME = 0; + mAppOpsService.mConstants.BG_STATE_SETTLE_TIME = 0; + } + + @Test + public void testUidProcStateChange_cachedToTopToCached() throws Exception { + setupProcStateTests(); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + // Second time to make sure that settle time is overcome + Thread.sleep(50); + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + } + + @Test + public void testUidProcStateChange_cachedToFgs() throws Exception { + setupProcStateTests(); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + } + + @Test + public void testUidProcStateChange_cachedToFgsLocation() throws Exception { + setupProcStateTests(); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, + PROCESS_STATE_FOREGROUND_SERVICE_LOCATION); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isEqualTo(MODE_ALLOWED); + } + + @Test + public void testUidProcStateChange_topToFgs() throws Exception { + setupProcStateTests(); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE); + // Second time to make sure that settle time is overcome + Thread.sleep(50); + mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + } + + @Test + public void testUidProcStateChange_topToFgsLocationToFgs() throws Exception { + setupProcStateTests(); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, ActivityManager.PROCESS_STATE_TOP); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE_LOCATION); + // Second time to make sure that settle time is overcome + Thread.sleep(50); + mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE_LOCATION); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isEqualTo(MODE_ALLOWED); + + mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE); + // Second time to make sure that settle time is overcome + Thread.sleep(50); + mAppOpsService.updateUidProcState(mMyUid, PROCESS_STATE_FOREGROUND_SERVICE); + assertThat(mAppOpsService.noteOperation(OP_COARSE_LOCATION, mMyUid, mMyPackageName)) + .isNotEqualTo(MODE_ALLOWED); + } + private List<PackageOps> getLoggedOps() { return mAppOpsService.getOpsForPackage(mMyUid, mMyPackageName, null /* all ops */); } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java index 6be2c2e8c59e..49ee8b3bba19 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -48,8 +48,8 @@ import android.app.Notification; import android.app.Notification.Builder; import android.app.NotificationChannel; import android.app.NotificationManager; -import android.content.Context; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.graphics.Color; import android.media.AudioAttributes; import android.media.AudioManager; @@ -63,6 +63,7 @@ import android.provider.Settings; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.test.suitebuilder.annotation.SmallTest; +import android.testing.TestableContext; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.IAccessibilityManager; @@ -70,6 +71,7 @@ import android.view.accessibility.IAccessibilityManagerClient; import androidx.test.runner.AndroidJUnit4; +import com.android.internal.R; import com.android.internal.util.IntPair; import com.android.server.UiServiceTestCase; import com.android.server.lights.Light; @@ -86,6 +88,7 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class BuzzBeepBlinkTest extends UiServiceTestCase { + private TestableContext mContext = spy(getContext()); @Mock AudioManager mAudioManager; @Mock Vibrator mVibrator; @Mock android.media.IRingtonePlayer mRingtonePlayer; @@ -96,6 +99,8 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { NotificationUsageStats mUsageStats; @Mock IAccessibilityManager mAccessibilityService; + @Mock + Resources mResources; private NotificationManagerService mService; private String mPkg = "com.android.server.notification"; @@ -145,7 +150,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { verify(mAccessibilityService).addClient(any(IAccessibilityManagerClient.class), anyInt()); assertTrue(accessibilityManager.isEnabled()); - mService = spy(new NotificationManagerService(getContext())); + mService = spy(new NotificationManagerService(mContext)); mService.setAudioManager(mAudioManager); mService.setVibrator(mVibrator); mService.setSystemReady(true); @@ -275,7 +280,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { boolean isLeanback) { NotificationChannel channel = new NotificationChannel("test", "test", IMPORTANCE_HIGH); - final Builder builder = new Builder(getContext()) + final Builder builder = new Builder(mContext) .setContentTitle("foo") .setSmallIcon(android.R.drawable.sym_def_app_icon) .setPriority(Notification.PRIORITY_HIGH) @@ -321,15 +326,14 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { n.flags |= Notification.FLAG_INSISTENT; } - Context context = spy(getContext()); - PackageManager packageManager = spy(context.getPackageManager()); - when(context.getPackageManager()).thenReturn(packageManager); + PackageManager packageManager = spy(mContext.getPackageManager()); + when(mContext.getPackageManager()).thenReturn(packageManager); when(packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) .thenReturn(isLeanback); StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id, mTag, mUid, mPid, n, mUser, null, System.currentTimeMillis()); - NotificationRecord r = new NotificationRecord(context, sbn, channel); + NotificationRecord r = new NotificationRecord(mContext, sbn, channel); mService.addNotification(r); return r; } @@ -455,7 +459,25 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { } @Test - public void testNoBeepForImportanceDefaultInAutomotive() throws Exception { + public void testNoBeepForAutomotiveIfEffectsDisabled() throws Exception { + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_enableServerNotificationEffectsForAutomotive)) + .thenReturn(false); + mService.setIsAutomotive(true); + + NotificationRecord r = getBeepyNotification(); + + mService.buzzBeepBlinkLocked(r); + + verifyNeverBeep(); + assertFalse(r.isInterruptive()); + } + + @Test + public void testNoBeepForImportanceDefaultInAutomotiveIfEffectsEnabled() throws Exception { + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_enableServerNotificationEffectsForAutomotive)) + .thenReturn(true); mService.setIsAutomotive(true); NotificationRecord r = getBeepyNotification(); @@ -468,7 +490,10 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { } @Test - public void testBeepForImportanceHighInAutomotive() throws Exception { + public void testBeepForImportanceHighInAutomotiveIfEffectsEnabled() throws Exception { + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean(R.bool.config_enableServerNotificationEffectsForAutomotive)) + .thenReturn(true); mService.setIsAutomotive(true); NotificationRecord r = getBeepyNotification(); @@ -1015,12 +1040,12 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { public void testEmptyUriSoundTreatedAsNoSound() throws Exception { NotificationChannel channel = new NotificationChannel("test", "test", IMPORTANCE_HIGH); channel.setSound(Uri.EMPTY, null); - final Notification n = new Builder(getContext(), "test") + final Notification n = new Builder(mContext, "test") .setSmallIcon(android.R.drawable.sym_def_app_icon).build(); StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid, mPid, n, mUser, null, System.currentTimeMillis()); - NotificationRecord r = new NotificationRecord(getContext(), sbn, channel); + NotificationRecord r = new NotificationRecord(mContext, sbn, channel); mService.addNotification(r); mService.buzzBeepBlinkLocked(r); @@ -1069,13 +1094,13 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { @Test public void testCrossUserSoundMuted() throws Exception { - final Notification n = new Builder(getContext(), "test") + final Notification n = new Builder(mContext, "test") .setSmallIcon(android.R.drawable.sym_def_app_icon).build(); int userId = mUser.getIdentifier() + 1; StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 0, mTag, mUid, mPid, n, UserHandle.of(userId), null, System.currentTimeMillis()); - NotificationRecord r = new NotificationRecord(getContext(), sbn, + NotificationRecord r = new NotificationRecord(mContext, sbn, new NotificationChannel("test", "test", IMPORTANCE_HIGH)); mService.buzzBeepBlinkLocked(r); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java index d29e3fa6f546..c3b0a67e2ee1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java @@ -27,6 +27,7 @@ import android.app.ActivityManager.TaskSnapshot; import android.content.ComponentName; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.ColorSpace; import android.graphics.GraphicBuffer; import android.graphics.PixelFormat; import android.graphics.Rect; @@ -127,8 +128,9 @@ class TaskSnapshotPersisterTestBase extends WindowTestsBase { Canvas c = buffer.lockCanvas(); c.drawColor(Color.RED); buffer.unlockCanvasAndPost(c); - return new TaskSnapshot(new ComponentName("", ""), buffer, ORIENTATION_PORTRAIT, - TEST_INSETS, mScale < 1f /* reducedResolution */, mScale, mIsRealSnapshot, + return new TaskSnapshot(new ComponentName("", ""), buffer, + ColorSpace.get(ColorSpace.Named.SRGB), ORIENTATION_PORTRAIT, TEST_INSETS, + mScale < 1f /* reducedResolution */, mScale, mIsRealSnapshot, mWindowingMode, mSystemUiVisibility, mIsTranslucent); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java index cb6dc6d42bd5..4ca01eca238b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java @@ -35,6 +35,7 @@ import android.app.ActivityManager.TaskSnapshot; import android.content.ComponentName; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.ColorSpace; import android.graphics.GraphicBuffer; import android.graphics.PixelFormat; import android.graphics.Rect; @@ -64,8 +65,9 @@ public class TaskSnapshotSurfaceTest extends WindowTestsBase { final GraphicBuffer buffer = GraphicBuffer.create(width, height, PixelFormat.RGBA_8888, GraphicBuffer.USAGE_SW_READ_RARELY | GraphicBuffer.USAGE_SW_WRITE_NEVER); final TaskSnapshot snapshot = new TaskSnapshot(new ComponentName("", ""), buffer, - ORIENTATION_PORTRAIT, contentInsets, false, 1.0f, true /* isRealSnapshot */, - WINDOWING_MODE_FULLSCREEN, 0 /* systemUiVisibility */, false /* isTranslucent */); + ColorSpace.get(ColorSpace.Named.SRGB), ORIENTATION_PORTRAIT, contentInsets, false, + 1.0f, true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN, + 0 /* systemUiVisibility */, false /* isTranslucent */); mSurface = new TaskSnapshotSurface(mWm, new Window(), new SurfaceControl(), snapshot, "Test", createTaskDescription(Color.WHITE, Color.RED, Color.BLUE), sysuiVis, windowFlags, 0, taskBounds, ORIENTATION_PORTRAIT); diff --git a/telephony/java/android/telephony/CarrierRestrictionRules.java b/telephony/java/android/telephony/CarrierRestrictionRules.java index 78623e74277a..950ae6cf5ed8 100644 --- a/telephony/java/android/telephony/CarrierRestrictionRules.java +++ b/telephony/java/android/telephony/CarrierRestrictionRules.java @@ -336,7 +336,6 @@ public final class CarrierRestrictionRules implements Parcelable { public static final class Builder { private final CarrierRestrictionRules mRules; - /** {@hide} */ public Builder() { mRules = new CarrierRestrictionRules(); } |