summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt292
-rw-r--r--api/removed.txt24
-rw-r--r--api/system-current.txt54
-rw-r--r--api/test-current.txt24
-rw-r--r--cmds/statsd/src/atoms.proto27
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp3
-rw-r--r--core/java/android/app/ActivityManager.java20
-rw-r--r--core/java/android/app/AppOpsManager.java46
-rw-r--r--core/java/android/app/StatsManager.java1
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java23
-rw-r--r--core/java/android/content/pm/PackageInstaller.java9
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java1
-rw-r--r--core/java/android/hardware/face/FaceManager.java57
-rw-r--r--core/java/android/hardware/face/IFaceServiceReceiver.aidl2
-rw-r--r--core/java/android/net/DnsResolver.java284
-rw-r--r--core/java/android/net/NetworkUtils.java5
-rw-r--r--core/java/android/net/ParseException.java4
-rw-r--r--core/java/android/preference/SeekBarVolumizer.java67
-rw-r--r--core/java/android/provider/MediaStore.java151
-rw-r--r--core/java/android/service/textclassifier/TextClassifierService.java1
-rw-r--r--core/java/android/util/StatsLog.java15
-rw-r--r--core/java/android/util/StatsLogAtoms.java122
-rw-r--r--core/java/android/view/InputMonitor.java7
-rw-r--r--core/java/android/view/SurfaceControl.java10
-rw-r--r--core/java/android/view/textclassifier/TextLinks.java1
-rw-r--r--core/java/android/widget/RelativeLayout.java3
-rw-r--r--core/java/com/android/internal/app/ChooserActivity.java20
-rw-r--r--core/java/com/android/internal/app/SimpleIconFactory.java71
-rw-r--r--core/java/com/android/internal/os/Zygote.java13
-rw-r--r--core/jni/AndroidRuntime.cpp11
-rw-r--r--core/jni/android_media_AudioProductStrategies.cpp24
-rw-r--r--core/jni/android_media_AudioVolumeGroups.cpp2
-rw-r--r--core/jni/android_net_NetUtils.cpp9
-rw-r--r--core/jni/android_view_SurfaceControl.cpp15
-rw-r--r--core/res/res/layout/chooser_grid_preview_text.xml1
-rw-r--r--core/res/res/values/config.xml8
-rw-r--r--core/res/res/values/public.xml4
-rw-r--r--core/res/res/values/symbols.xml6
-rw-r--r--core/tests/overlaytests/host/src/com/android/server/om/hosttest/InstallOverlayTests.java14
-rw-r--r--location/java/android/location/GnssStatus.java35
-rw-r--r--location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java40
-rw-r--r--media/apex/java/android/media/DataSourceDesc.java2
-rw-r--r--media/apex/java/android/media/FileDataSourceDesc.java2
-rw-r--r--media/apex/java/android/media/MediaPlayer2.java2
-rw-r--r--media/apex/java/android/media/UriDataSourceDesc.java2
-rw-r--r--media/java/android/media/AudioAttributes.java14
-rw-r--r--media/java/android/media/AudioManager.java16
-rw-r--r--media/java/android/media/IAudioService.aidl8
-rw-r--r--media/java/android/media/audiopolicy/AudioProductStrategies.aidl18
-rw-r--r--media/java/android/media/audiopolicy/AudioProductStrategies.java277
-rw-r--r--media/java/android/media/audiopolicy/AudioProductStrategy.java111
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroup.java45
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroups.aidl18
-rw-r--r--media/java/android/media/audiopolicy/AudioVolumeGroups.java135
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java10
-rw-r--r--packages/PackageInstaller/TEST_MAPPING24
-rwxr-xr-xpackages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java45
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java499
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java332
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java218
-rw-r--r--packages/SystemUI/res/layout/ongoing_privacy_chip.xml9
-rw-r--r--packages/SystemUI/res/values/dimens.xml2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/Dependency.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/DumpController.kt86
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java93
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java52
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/DumpControllerTest.kt90
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java13
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_clear.xml31
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_corp.xml4
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_drag_handle.xml28
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_hourglass_top.xml28
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_info_no_shadow.xml8
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_palette.xml (renamed from packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_wallpaper.xml)12
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_pin.xml29
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_remove_no_shadow.xml4
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml4
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_smartspace_preferences.xml4
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_split_screen.xml6
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_warning.xml8
-rw-r--r--packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_widget.xml10
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_clear.xml31
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_corp.xml6
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_drag_handle.xml28
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_hourglass_top.xml28
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_info_no_shadow.xml12
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_palette.xml (renamed from packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_wallpaper.xml)4
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_pin.xml26
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_remove_no_shadow.xml6
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml9
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_smartspace_preferences.xml12
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_split_screen.xml10
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_warning.xml12
-rw-r--r--packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_widget.xml18
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_clear.xml28
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_corp.xml6
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_drag_handle.xml28
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_hourglass_top.xml29
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_info_no_shadow.xml12
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_palette.xml (renamed from packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_wallpaper.xml)12
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_pin.xml29
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_remove_no_shadow.xml6
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml9
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_smartspace_preferences.xml12
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_split_screen.xml10
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_warning.xml12
-rw-r--r--packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_widget.xml18
-rw-r--r--services/core/java/com/android/server/DeviceIdleController.java38
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java6
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java76
-rw-r--r--services/core/java/com/android/server/biometrics/AuthenticationClient.java3
-rw-r--r--services/core/java/com/android/server/biometrics/face/FaceService.java92
-rw-r--r--services/core/java/com/android/server/incident/IncidentCompanionService.java3
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java16
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java8
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java6
-rw-r--r--services/core/java/com/android/server/om/OverlayManagerServiceImpl.java5
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java8
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java270
-rw-r--r--services/core/java/com/android/server/stats/StatsCompanionService.java39
-rw-r--r--services/core/java/com/android/server/wm/ActivityMetricsLogger.java29
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java14
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotLoader.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java4
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp9
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsServiceTest.java107
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java51
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java6
-rw-r--r--telephony/java/android/telephony/CarrierRestrictionRules.java1
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();
}