summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp107
-rw-r--r--api/current.txt21
-rw-r--r--api/system-current.txt29
-rw-r--r--api/test-current.txt12
-rw-r--r--cmds/hid/jni/com_android_commands_hid_Device.cpp51
-rw-r--r--cmds/hid/jni/com_android_commands_hid_Device.h6
-rw-r--r--cmds/statsd/Android.mk2
-rw-r--r--cmds/statsd/src/StatsLogProcessor.cpp41
-rw-r--r--cmds/statsd/src/StatsLogProcessor.h12
-rw-r--r--cmds/statsd/src/StatsService.cpp4
-rw-r--r--cmds/statsd/src/StatsService.h3
-rw-r--r--cmds/statsd/src/condition/condition_util.cpp6
-rw-r--r--cmds/statsd/src/config/ConfigManager.h3
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.cpp9
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.h6
-rw-r--r--cmds/statsd/src/logd/LogListener.cpp12
-rw-r--r--cmds/statsd/src/logd/LogListener.h3
-rw-r--r--cmds/statsd/src/logd/LogReader.cpp129
-rw-r--r--cmds/statsd/src/logd/LogReader.h69
-rw-r--r--cmds/statsd/src/main.cpp67
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.cpp13
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.h12
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.cpp2
-rw-r--r--cmds/statsd/src/metrics/metrics_manager_util.cpp46
-rwxr-xr-xcmds/statsd/src/socket/StatsSocketListener.cpp19
-rw-r--r--cmds/statsd/src/stats_util.h1
-rw-r--r--cmds/statsd/src/statsd_config.proto2
-rw-r--r--cmds/statsd/tests/StatsLogProcessor_test.cpp126
-rw-r--r--cmds/statsd/tests/condition/CombinationConditionTracker_test.cpp6
-rw-r--r--cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp105
-rw-r--r--config/hiddenapi-light-greylist.txt119
-rw-r--r--config/hiddenapi-vendor-list.txt12
-rw-r--r--core/java/android/app/ActivityThread.java61
-rw-r--r--core/java/android/app/Notification.java2
-rw-r--r--core/java/android/app/NotificationChannel.java7
-rw-r--r--core/java/android/appwidget/AppWidgetHost.java5
-rw-r--r--core/java/android/appwidget/AppWidgetHostView.java5
-rw-r--r--core/java/android/appwidget/AppWidgetManager.java8
-rw-r--r--core/java/android/appwidget/AppWidgetManagerInternal.java12
-rw-r--r--core/java/android/appwidget/AppWidgetProviderInfo.java2
-rw-r--r--core/java/android/companion/AssociationRequest.java3
-rw-r--r--core/java/android/companion/BluetoothDeviceFilter.java2
-rw-r--r--core/java/android/companion/BluetoothDeviceFilterUtils.java4
-rw-r--r--core/java/android/companion/BluetoothLeDeviceFilter.java2
-rw-r--r--core/java/android/companion/DeviceFilter.java3
-rw-r--r--core/java/android/content/ContentValues.java5
-rw-r--r--core/java/android/content/pm/PackageManager.java4
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java17
-rw-r--r--core/java/android/content/pm/PackageParser.java43
-rw-r--r--core/java/android/content/pm/ShortcutManager.java272
-rw-r--r--core/java/android/database/AbstractCursor.java3
-rw-r--r--core/java/android/database/AbstractWindowedCursor.java5
-rw-r--r--core/java/android/database/ContentObserver.java2
-rw-r--r--core/java/android/database/CursorWindow.java5
-rw-r--r--core/java/android/database/CursorWrapper.java2
-rw-r--r--core/java/android/database/DatabaseUtils.java3
-rw-r--r--core/java/android/database/MatrixCursor.java4
-rw-r--r--core/java/android/database/RedactingCursor.java181
-rw-r--r--core/java/android/database/sqlite/DatabaseObjectNotClosedException.java3
-rw-r--r--core/java/android/database/sqlite/SQLiteClosable.java2
-rw-r--r--core/java/android/database/sqlite/SQLiteConnection.java13
-rw-r--r--core/java/android/database/sqlite/SQLiteCursor.java4
-rw-r--r--core/java/android/database/sqlite/SQLiteCustomFunction.java5
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabase.java11
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java2
-rw-r--r--core/java/android/database/sqlite/SQLiteGlobal.java17
-rw-r--r--core/java/android/database/sqlite/SQLiteOpenHelper.java2
-rw-r--r--core/java/android/database/sqlite/SQLiteProgram.java3
-rw-r--r--core/java/android/database/sqlite/SQLiteQueryBuilder.java5
-rw-r--r--core/java/android/database/sqlite/SQLiteSession.java2
-rw-r--r--core/java/android/database/sqlite/SQLiteStatement.java2
-rw-r--r--core/java/android/database/sqlite/SqliteWrapper.java6
-rw-r--r--core/java/android/hardware/display/DisplayManager.java3
-rw-r--r--core/java/android/net/NetworkAgent.java4
-rw-r--r--core/java/android/os/BinderProxy.java3
-rw-r--r--core/java/android/os/HwBlob.java8
-rw-r--r--core/java/android/os/HwParcel.java59
-rw-r--r--core/java/android/os/Message.java2
-rw-r--r--core/java/android/os/NativeHandle.java194
-rw-r--r--core/java/android/os/storage/IStorageManager.aidl2
-rw-r--r--core/java/android/os/storage/StorageManager.java32
-rw-r--r--core/java/android/preference/PreferenceActivity.java2
-rw-r--r--core/java/android/provider/MediaStore.java6
-rw-r--r--core/java/android/provider/Settings.java17
-rw-r--r--core/java/android/service/autofill/FillRequest.java11
-rw-r--r--core/java/android/service/notification/Adjustment.java12
-rw-r--r--core/java/android/service/notification/INotificationListener.aidl2
-rw-r--r--core/java/android/service/notification/NotificationAssistantService.java28
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java3
-rw-r--r--core/java/android/service/notification/ScheduleCalendar.java4
-rw-r--r--core/java/android/service/notification/ZenModeConfig.java3
-rw-r--r--core/java/android/util/FeatureFlagUtils.java1
-rw-r--r--core/java/android/util/MemoryIntArray.java41
-rw-r--r--core/java/android/view/IWindowManager.aidl4
-rw-r--r--core/java/android/view/RemoteAnimationTarget.java20
-rw-r--r--core/java/android/view/View.java9
-rw-r--r--core/java/android/view/ViewConfiguration.java1
-rw-r--r--core/java/android/view/ViewGroup.java5
-rw-r--r--core/java/android/view/WindowManager.java16
-rw-r--r--core/java/android/view/accessibility/AccessibilityRecord.java2
-rw-r--r--core/java/android/view/autofill/AutofillManager.java9
-rw-r--r--core/java/android/widget/AbsListView.java2
-rw-r--r--core/java/com/android/internal/app/procstats/AssociationState.java52
-rw-r--r--core/java/com/android/internal/app/procstats/DumpUtils.java76
-rw-r--r--core/java/com/android/internal/app/procstats/ProcessState.java19
-rw-r--r--core/java/com/android/internal/app/procstats/ProcessStats.java55
-rw-r--r--core/java/com/android/internal/app/procstats/PssTable.java10
-rw-r--r--core/java/com/android/internal/app/procstats/ServiceState.java67
-rw-r--r--core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java33
-rw-r--r--core/jni/Android.bp1
-rw-r--r--core/jni/AndroidRuntime.cpp2
-rw-r--r--core/jni/android/graphics/fonts/FontFamily.cpp18
-rw-r--r--core/jni/android_hardware_camera2_DngCreator.cpp63
-rw-r--r--core/jni/android_os_HwBlob.cpp85
-rw-r--r--core/jni/android_os_HwBlob.h11
-rw-r--r--core/jni/android_os_HwParcel.cpp263
-rw-r--r--core/jni/android_os_NativeHandle.cpp103
-rw-r--r--core/jni/android_os_NativeHandle.h52
-rw-r--r--core/jni/android_os_Parcel.cpp16
-rw-r--r--core/jni/android_os_VintfObject.cpp6
-rw-r--r--core/jni/hwbinder/EphemeralStorage.cpp18
-rw-r--r--core/jni/hwbinder/EphemeralStorage.h3
-rw-r--r--core/proto/android/app/alarmmanager.proto2
-rw-r--r--core/proto/android/app/notification.proto1
-rw-r--r--core/proto/android/app/notification_channel.proto5
-rw-r--r--core/proto/android/app/notification_channel_group.proto6
-rw-r--r--core/proto/android/app/notificationmanager.proto1
-rw-r--r--core/proto/android/app/profilerinfo.proto3
-rw-r--r--core/proto/android/app/window_configuration.proto1
-rw-r--r--core/proto/android/content/clipdata.proto6
-rw-r--r--core/proto/android/content/component_name.proto1
-rw-r--r--core/proto/android/content/configuration.proto1
-rw-r--r--core/proto/android/content/featureinfo.proto1
-rw-r--r--core/proto/android/content/intent.proto11
-rw-r--r--core/proto/android/content/locale.proto1
-rw-r--r--core/proto/android/content/package_item_info.proto26
-rw-r--r--core/proto/android/media/audioattributes.proto1
-rw-r--r--core/proto/android/os/batterystats.proto2
-rw-r--r--core/proto/android/os/incident.proto1
-rw-r--r--core/proto/android/os/looper.proto2
-rw-r--r--core/proto/android/os/message.proto10
-rw-r--r--core/proto/android/os/messagequeue.proto2
-rw-r--r--core/proto/android/os/pagetypeinfo.proto4
-rw-r--r--core/proto/android/os/procrank.proto12
-rw-r--r--core/proto/android/os/ps.proto2
-rw-r--r--core/proto/android/os/system_properties.proto62
-rw-r--r--core/proto/android/providers/settings/global.proto8
-rw-r--r--core/proto/android/providers/settings/secure.proto4
-rw-r--r--core/proto/android/server/activitymanagerservice.proto16
-rw-r--r--core/proto/android/server/alarmmanagerservice.proto8
-rw-r--r--core/proto/android/server/forceappstandbytracker.proto2
-rw-r--r--core/proto/android/server/statlogger.proto2
-rw-r--r--core/proto/android/server/windowmanagerservice.proto35
-rw-r--r--core/proto/android/service/diskstats.proto2
-rw-r--r--core/proto/android/service/graphicsstats.proto4
-rw-r--r--core/proto/android/service/netstats.proto7
-rw-r--r--core/proto/android/service/notification.proto10
-rw-r--r--core/proto/android/service/package.proto2
-rw-r--r--core/proto/android/service/print.proto9
-rw-r--r--core/proto/android/service/procstats.proto250
-rw-r--r--core/proto/android/service/usb.proto27
-rw-r--r--core/proto/android/view/display.proto2
-rw-r--r--core/proto/android/view/displayinfo.proto7
-rw-r--r--core/proto/android/view/remote_animation_target.proto8
-rw-r--r--core/proto/android/view/windowlayoutparams.proto2
-rw-r--r--core/res/AndroidManifest.xml82
-rw-r--r--core/res/res/anim/keyguard_occlude_open_enter.xml30
-rw-r--r--core/res/res/drawable/perm_group_aural.xml24
-rw-r--r--core/res/res/drawable/perm_group_visual.xml24
-rw-r--r--core/res/res/values-af/strings.xml2
-rw-r--r--core/res/res/values-ar/strings.xml2
-rw-r--r--core/res/res/values-bn/strings.xml2
-rw-r--r--core/res/res/values-ca/strings.xml2
-rw-r--r--core/res/res/values-es/strings.xml8
-rw-r--r--core/res/res/values-fr/strings.xml2
-rw-r--r--core/res/res/values-gl/strings.xml2
-rw-r--r--core/res/res/values-hy/strings.xml2
-rw-r--r--core/res/res/values-in/strings.xml2
-rw-r--r--core/res/res/values-km/strings.xml4
-rw-r--r--core/res/res/values-kn/strings.xml2
-rw-r--r--core/res/res/values-mcc313-mnc100-as/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-az/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-b+sr+Latn/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-be/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-bn/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-bs/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-en-rAU/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-en-rCA/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-en-rIN/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-en-rXC/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-et/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-eu/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-fr-rCA/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-gl/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-gu/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-hy/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-is/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-ka/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-kk/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-km/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-kn/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-ky/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-lo/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-mk/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-ml/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-mn/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-mr/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-my/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-ne/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-or/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-pa/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-pt-rBR/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-si/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-sq/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-sw/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-ta/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-te/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-ur/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-uz/strings.xml24
-rw-r--r--core/res/res/values-mcc313-mnc100-zh-rHK/strings.xml24
-rw-r--r--core/res/res/values-my/strings.xml2
-rw-r--r--core/res/res/values-nl/strings.xml2
-rw-r--r--core/res/res/values-pl/strings.xml2
-rw-r--r--core/res/res/values-pt-rBR/strings.xml2
-rw-r--r--core/res/res/values-pt/strings.xml2
-rw-r--r--core/res/res/values-ta/strings.xml10
-rw-r--r--core/res/res/values-tr/strings.xml2
-rw-r--r--core/res/res/values-uz/strings.xml8
-rw-r--r--core/res/res/values-vi/strings.xml2
-rw-r--r--core/res/res/values/config.xml1
-rw-r--r--core/res/res/values/strings.xml67
-rw-r--r--core/res/res/values/symbols.xml6
-rw-r--r--core/tests/coretests/AndroidManifest.xml5
-rw-r--r--core/tests/coretests/src/android/content/RedactingProvider.java89
-rw-r--r--core/tests/coretests/src/android/database/RedactingCursorTest.java85
-rw-r--r--core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java15
-rw-r--r--core/tests/coretests/src/android/text/FontFallbackSetup.java7
-rw-r--r--core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp30
-rw-r--r--core/tests/utiltests/jni/registration.cpp11
-rw-r--r--core/tests/utiltests/src/android/util/MemoryIntArrayTest.java16
-rw-r--r--graphics/java/android/graphics/Typeface.java237
-rw-r--r--graphics/java/android/graphics/fonts/FontFamily.java21
-rw-r--r--graphics/java/android/graphics/fonts/SystemFonts.java260
-rw-r--r--location/java/android/location/Country.java4
-rw-r--r--location/java/android/location/CountryDetector.java5
-rw-r--r--location/java/android/location/CountryListener.java3
-rw-r--r--location/java/android/location/GeocoderParams.java3
-rw-r--r--location/java/android/location/Geofence.java2
-rw-r--r--location/java/android/location/GpsStatus.java2
-rw-r--r--location/java/android/location/Location.java4
-rw-r--r--location/java/android/location/LocationManager.java4
-rw-r--r--location/java/android/location/LocationRequest.java15
-rw-r--r--media/java/android/media/MediaPlayer2.java122
-rw-r--r--media/java/android/mtp/MtpPropertyList.java3
-rw-r--r--media/java/android/mtp/MtpStorage.java3
-rw-r--r--opengl/java/android/opengl/EGL14.java2
-rw-r--r--opengl/java/android/opengl/GLES20.java4
-rw-r--r--opengl/java/android/opengl/GLSurfaceView.java5
-rw-r--r--packages/CarSystemUI/res/values/colors.xml2
-rw-r--r--packages/CarSystemUI/res/values/dimens.xml2
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java11
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java4
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/Assistant.java67
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java104
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java220
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java51
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java14
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java190
-rw-r--r--packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java201
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml3
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java3
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java6
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java13
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java2
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java4
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java4
-rw-r--r--packages/SystemUI/Android.mk1
-rw-r--r--packages/SystemUI/docs/plugin_hooks.md4
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java47
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml38
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml17
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml17
-rw-r--r--packages/SystemUI/res/layout/menu_ime.xml1
-rw-r--r--packages/SystemUI/res/layout/navigation_layout.xml12
-rw-r--r--packages/SystemUI/res/layout/navigation_layout_rot90.xml20
-rw-r--r--packages/SystemUI/res/values-af/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-am/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ar/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-as/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-az/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml2
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-be/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-bg/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-bg/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-bn/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-bs/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ca/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-cs/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-da/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-de/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-el/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-es/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-et/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-eu/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-fa/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-fi/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-fr/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-gl/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-hr/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-hu/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-hu/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-hy/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-in/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-is/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-it/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-iw/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ja/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-ja/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ka/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-kk/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-km/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-kn/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ko/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-ko/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ky/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-lo/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-lt/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-lt/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-lv/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-mk/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ml/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-mn/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-mr/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ms/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-my/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-nb/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ne/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-nl/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-or/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-pl/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-pt/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ro/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ru/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-si/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-sk/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-sl/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-sq/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sr/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-sv/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-sw/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-sw720dp/donottranslate.xml27
-rw-r--r--packages/SystemUI/res/values-ta/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-te/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-th/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-tl/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-tr/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-tr/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-uk/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-ur/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-uz/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-vi/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rCN/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rTW/donottranslate.xml24
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings_car.xml3
-rw-r--r--packages/SystemUI/res/values-zu/strings_car.xml3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java155
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/OverviewProxyService.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorations.java193
-rw-r--r--packages/SystemUI/src/com/android/systemui/analytics/SensorLoggerSession.java40
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeLog.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java27
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java317
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java45
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java76
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java102
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java65
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java314
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java10
-rw-r--r--packages/SystemUI/tests/AndroidManifest.xml8
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java169
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java33
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java176
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java170
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java18
-rw-r--r--packages/VpnDialogs/res/values-fr/strings.xml2
-rw-r--r--packages/VpnDialogs/res/values-ru/strings.xml2
-rw-r--r--packages/VpnDialogs/res/values-ta/strings.xml2
-rw-r--r--packages/WAPPushManager/AndroidManifest.xml3
-rw-r--r--proto/src/metrics_constants.proto14
-rw-r--r--proto/src/wifi.proto6
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetService.java5
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java16
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java69
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java10
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/SaveUi.java32
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java4
-rw-r--r--services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupReporter.java411
-rw-r--r--services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java773
-rw-r--r--services/backup/java/com/android/server/backup/utils/AppBackupUtils.java9
-rw-r--r--services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java10
-rw-r--r--services/core/java/com/android/server/BatteryService.java2
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java5
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java22
-rw-r--r--services/core/java/com/android/server/PinnerService.java12
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java122
-rw-r--r--services/core/java/com/android/server/Watchdog.java1
-rw-r--r--services/core/java/com/android/server/am/ActiveInstrumentation.java4
-rw-r--r--services/core/java/com/android/server/am/RunningTasks.java6
-rw-r--r--services/core/java/com/android/server/am/TEST_MAPPING2
-rw-r--r--services/core/java/com/android/server/am/UserController.java12
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java17
-rw-r--r--services/core/java/com/android/server/dreams/DreamManagerService.java3
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java7
-rw-r--r--services/core/java/com/android/server/notification/CriticalNotificationExtractor.java93
-rw-r--r--services/core/java/com/android/server/notification/ImportanceExtractor.java2
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java185
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecord.java95
-rw-r--r--services/core/java/com/android/server/notification/RankingHelper.java5
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java33
-rw-r--r--services/core/java/com/android/server/pm/SharedUserSetting.java2
-rw-r--r--services/core/java/com/android/server/pm/UserRestrictionsUtils.java8
-rw-r--r--services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java26
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java45
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java4
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java2
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java34
-rw-r--r--services/core/java/com/android/server/wm/ForcedSeamlessRotator.java11
-rw-r--r--services/core/java/com/android/server/wm/InputConsumerImpl.java1
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java17
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java23
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java4
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp13
-rw-r--r--services/java/com/android/server/SystemServer.java5
-rw-r--r--services/robotests/README23
-rw-r--r--services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java1
-rw-r--r--services/tests/servicestests/Android.mk2
-rw-r--r--services/tests/servicestests/AndroidManifest.xml2
-rw-r--r--services/tests/servicestests/AndroidTest.xml2
-rw-r--r--services/tests/servicestests/src/com/android/server/AlarmManagerServiceTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/BatteryServiceTest.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/BootReceiverFixFsckFsStatTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java209
-rw-r--r--services/tests/servicestests/src/com/android/server/WatchdogDiagnosticsTest.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/accounts/AccountsDbTest.java17
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java29
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java21
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java30
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java35
-rw-r--r--services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java30
-rw-r--r--services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/ProcessedPackagesJournalTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/restore/PerformAdbRestoreTaskTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/BackupObserverUtilsTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/FullBackupRestoreObserverUtilsTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/FullBackupUtilsTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java22
-rw-r--r--services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/DetectTvSystemAudioModeSupportActionTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/job/JobSetTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/job/JobStoreTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/job/controllers/JobStatusTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java17
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorageTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/SecureBoxTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertUtilsTest.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertXmlTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/SigXmlTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/TestData.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java21
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorageTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/HarmfulDigestsTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/ReportEncoderTests.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistLoggingHandlerTests.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistSettingsTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/InstallerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java27
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ParallelPackageParserTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest9.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserDataPreparerTest.java21
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerServiceCreateProfileTest.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerServiceIdRecyclingTest.java17
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java17
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java53
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java29
-rw-r--r--services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/FileUpdaterTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/timezone/CheckTokenTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java24
-rw-r--r--services/tests/servicestests/src/com/android/server/timezone/PackageStatusTest.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java37
-rw-r--r--services/tests/servicestests/src/com/android/server/timezone/PackageVersionsTest.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/utils/PriorityDumpTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java22
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java29
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/DimmerTests.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/DisplaySettingsTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/PinnedStackControllerTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java31
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java25
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java30
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowContainerTraversalTests.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java22
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java28
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java41
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java5
-rw-r--r--services/tests/servicestests/test-apps/SuspendTestApp/Android.mk2
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java8
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/CriticalNotificationExtractorTest.java109
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java8
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java28
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java41
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java76
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java36
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java11
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java50
-rw-r--r--telephony/java/android/telephony/CellIdentity.java56
-rw-r--r--telephony/java/android/telephony/CellIdentityCdma.java8
-rw-r--r--telephony/java/android/telephony/CellIdentityGsm.java8
-rw-r--r--telephony/java/android/telephony/CellIdentityLte.java8
-rw-r--r--telephony/java/android/telephony/CellIdentityTdscdma.java8
-rw-r--r--telephony/java/android/telephony/CellIdentityWcdma.java8
-rw-r--r--telephony/java/android/telephony/CellInfo.java51
-rw-r--r--telephony/java/android/telephony/CellInfoTdscdma.java2
-rw-r--r--telephony/java/android/telephony/NeighboringCellInfo.java43
-rw-r--r--telephony/java/android/telephony/PreciseDisconnectCause.java2
-rw-r--r--telephony/java/android/telephony/SubscriptionInfo.java59
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java105
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java12
-rw-r--r--telephony/java/android/telephony/ims/ImsReasonInfo.java2
-rw-r--r--telephony/java/android/telephony/ims/ImsSsInfo.java57
-rwxr-xr-xtelephony/java/com/android/internal/telephony/ISub.aidl38
-rw-r--r--telephony/java/com/android/internal/telephony/TelephonyIntents.java1
-rw-r--r--tools/aapt2/SdkConstants.cpp5
-rw-r--r--tools/aapt2/cmd/Compile.cpp74
-rw-r--r--tools/aapt2/cmd/Link.cpp18
-rw-r--r--tools/aapt2/configuration/ConfigurationParser_test.cpp31
799 files changed, 10131 insertions, 5526 deletions
diff --git a/Android.bp b/Android.bp
index e825610fefb2..33b6209a6d67 100644
--- a/Android.bp
+++ b/Android.bp
@@ -906,6 +906,7 @@ java_library {
"core/java/android/os/IHwInterface.java",
"core/java/android/os/DeadObjectException.java",
"core/java/android/os/DeadSystemException.java",
+ "core/java/android/os/NativeHandle.java",
"core/java/android/os/RemoteException.java",
"core/java/android/util/AndroidException.java",
],
@@ -1062,99 +1063,6 @@ doc_defaults {
installable: false,
}
-droiddoc {
- name: "api-stubs-docs",
- defaults: ["api-stubs-default"],
- arg_files: [
- "core/res/AndroidManifest.xml",
- ":api-version-xml",
- "core/java/overview.html",
- ":current-support-api",
- "api/current.txt",
- ],
- api_filename: "public_api.txt",
- removed_api_filename: "removed.txt",
- args: framework_docs_args + " -referenceonly -nodocs",
- check_api: {
- last_released: {
- api_file: ":last-released-public-api",
- removed_api_file: "api/removed.txt",
- args: "-hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 -hide 26 -hide 27 " +
- "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
- "-error 16 -error 17 -error 18 -error 31",
- },
- current: {
- api_file: "api/current.txt",
- removed_api_file: "api/removed.txt",
- args: "-error 2 -error 3 -error 4 -error 5 -error 6 " +
- "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
- "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " +
- "-error 25 -error 26 -error 27",
- },
- },
-}
-
-droiddoc {
- name: "system-api-stubs-docs",
- defaults: ["api-stubs-default"],
- arg_files: [
- "core/res/AndroidManifest.xml",
- ":api-version-xml",
- "core/java/overview.html",
- ":current-support-api",
- "api/current.txt",
- ],
- api_tag_name: "SYSTEM",
- api_filename: "system-api.txt",
- removed_api_filename: "system-removed.txt",
- exact_api_filename: "system-exact.txt",
- args: framework_docs_args + " -referenceonly -showAnnotation android.annotation.SystemApi -nodocs",
- check_api: {
- last_released: {
- api_file: ":last-released-system-api",
- removed_api_file: "api/system-removed.txt",
- args: "-hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 -hide 26 -hide 27 " +
- "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
- "-error 16 -error 17 -error 18 -error 31",
- },
- current: {
- api_file: "api/system-current.txt",
- removed_api_file: "api/system-removed.txt",
- args: "-error 2 -error 3 -error 4 -error 5 -error 6 " +
- "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
- "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " +
- "-error 25 -error 26 -error 27",
- },
- },
-}
-
-droiddoc {
- name: "test-api-stubs-docs",
- defaults: ["api-stubs-default"],
- arg_files: [
- "core/res/AndroidManifest.xml",
- ":api-version-xml",
- "core/java/overview.html",
- ":current-support-api",
- "api/current.txt",
- ],
- api_tag_name: "TEST",
- api_filename: "test-api.txt",
- removed_api_filename: "test-removed.txt",
- exact_api_filename: "test-exact.txt",
- args: framework_docs_args + " -referenceonly -showAnnotation android.annotation.TestApi -nodocs",
- check_api: {
- current: {
- api_file: "api/test-current.txt",
- removed_api_file: "api/test-removed.txt",
- args: "-error 2 -error 3 -error 4 -error 5 -error 6 " +
- "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
- "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " +
- "-error 25 -error 26 -error 27",
- },
- },
-}
-
doc_defaults {
name: "framework-docs-default",
srcs: [
@@ -1451,6 +1359,7 @@ droiddoc {
"core/java/android/os/IHwInterface.java",
"core/java/android/os/DeadObjectException.java",
"core/java/android/os/DeadSystemException.java",
+ "core/java/android/os/NativeHandle.java",
"core/java/android/os/RemoteException.java",
"core/java/android/util/AndroidException.java",
],
@@ -1574,13 +1483,13 @@ doc_defaults {
metalava_previous_api: ":public-api-for-metalava-annotations",
metalava_merge_annotations_dirs: [
"metalava-manual",
+ "ojluni-annotated-stubs",
],
}
droiddoc {
- name: "metalava-api-stubs-docs",
+ name: "api-stubs-docs",
defaults: ["metalava-api-stubs-default"],
- api_tag_name: "METALAVA_PUBLIC",
api_filename: "public_api.txt",
private_api_filename: "private.txt",
removed_api_filename: "removed.txt",
@@ -1591,9 +1500,9 @@ droiddoc {
}
droiddoc {
- name: "metalava-system-api-stubs-docs",
+ name: "system-api-stubs-docs",
defaults: ["metalava-api-stubs-default"],
- api_tag_name: "METALAVA_SYSTEM",
+ api_tag_name: "SYSTEM",
api_filename: "system-api.txt",
private_api_filename: "system-private.txt",
private_dex_api_filename: "system-private-dex.txt",
@@ -1605,9 +1514,9 @@ droiddoc {
}
droiddoc {
- name: "metalava-test-api-stubs-docs",
+ name: "test-api-stubs-docs",
defaults: ["metalava-api-stubs-default"],
- api_tag_name: "METALAVA_TEST",
+ api_tag_name: "TEST",
api_filename: "test-api.txt",
removed_api_filename: "test-removed.txt",
arg_files: [
diff --git a/api/current.txt b/api/current.txt
index 897a8d9ab609..19a0f31136e8 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11,6 +11,7 @@ package android {
field public static final java.lang.String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
field public static final java.lang.String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
field public static final java.lang.String ACCESS_LOCATION_EXTRA_COMMANDS = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS";
+ field public static final java.lang.String ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION";
field public static final java.lang.String ACCESS_NETWORK_STATE = "android.permission.ACCESS_NETWORK_STATE";
field public static final java.lang.String ACCESS_NOTIFICATION_POLICY = "android.permission.ACCESS_NOTIFICATION_POLICY";
field public static final java.lang.String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
@@ -101,10 +102,13 @@ package android {
field public static final java.lang.String READ_CALENDAR = "android.permission.READ_CALENDAR";
field public static final java.lang.String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
field public static final java.lang.String READ_CONTACTS = "android.permission.READ_CONTACTS";
- field public static final java.lang.String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
+ field public static final deprecated java.lang.String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
field public static final java.lang.String READ_FRAME_BUFFER = "android.permission.READ_FRAME_BUFFER";
field public static final deprecated java.lang.String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
field public static final java.lang.String READ_LOGS = "android.permission.READ_LOGS";
+ field public static final java.lang.String READ_MEDIA_AUDIO = "android.permission.READ_MEDIA_AUDIO";
+ field public static final java.lang.String READ_MEDIA_IMAGES = "android.permission.READ_MEDIA_IMAGES";
+ field public static final java.lang.String READ_MEDIA_VIDEO = "android.permission.READ_MEDIA_VIDEO";
field public static final java.lang.String READ_PHONE_NUMBERS = "android.permission.READ_PHONE_NUMBERS";
field public static final java.lang.String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
field public static final java.lang.String READ_SMS = "android.permission.READ_SMS";
@@ -151,8 +155,11 @@ package android {
field public static final java.lang.String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
field public static final java.lang.String WRITE_CALL_LOG = "android.permission.WRITE_CALL_LOG";
field public static final java.lang.String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
- field public static final java.lang.String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
+ field public static final deprecated java.lang.String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
field public static final java.lang.String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
+ field public static final java.lang.String WRITE_MEDIA_AUDIO = "android.permission.WRITE_MEDIA_AUDIO";
+ field public static final java.lang.String WRITE_MEDIA_IMAGES = "android.permission.WRITE_MEDIA_IMAGES";
+ field public static final java.lang.String WRITE_MEDIA_VIDEO = "android.permission.WRITE_MEDIA_VIDEO";
field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
field public static final java.lang.String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";
@@ -166,11 +173,13 @@ package android {
field public static final java.lang.String CAMERA = "android.permission-group.CAMERA";
field public static final java.lang.String CONTACTS = "android.permission-group.CONTACTS";
field public static final java.lang.String LOCATION = "android.permission-group.LOCATION";
+ field public static final java.lang.String MEDIA_AURAL = "android.permission-group.MEDIA_AURAL";
+ field public static final java.lang.String MEDIA_VISUAL = "android.permission-group.MEDIA_VISUAL";
field public static final java.lang.String MICROPHONE = "android.permission-group.MICROPHONE";
field public static final java.lang.String PHONE = "android.permission-group.PHONE";
field public static final java.lang.String SENSORS = "android.permission-group.SENSORS";
field public static final java.lang.String SMS = "android.permission-group.SMS";
- field public static final java.lang.String STORAGE = "android.permission-group.STORAGE";
+ field public static final deprecated java.lang.String STORAGE = "android.permission-group.STORAGE";
}
public final class R {
@@ -11241,6 +11250,7 @@ package android.content.pm {
method public abstract boolean hasSystemFeature(java.lang.String, int);
method public abstract boolean isInstantApp();
method public abstract boolean isInstantApp(java.lang.String);
+ method public boolean isPackageSuspended(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public boolean isPackageSuspended();
method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
method public abstract boolean isSafeMode();
@@ -39085,6 +39095,7 @@ package android.service.autofill {
method public int getId();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.autofill.FillRequest> CREATOR;
+ field public static final int FLAG_COMPATIBILITY_MODE_REQUEST = 2; // 0x2
field public static final int FLAG_MANUAL_REQUEST = 1; // 0x1
}
@@ -42540,9 +42551,11 @@ package android.telephony {
method public deprecated int getMnc();
method public java.lang.String getMncString();
method public java.lang.String getNumber();
+ method public int getParentSubId();
method public int getSimSlotIndex();
method public int getSubscriptionId();
method public boolean isEmbedded();
+ method public boolean isOpportunistic();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.SubscriptionInfo> CREATOR;
}
@@ -42567,6 +42580,7 @@ package android.telephony {
method public void setSubscriptionOverrideCongested(int, boolean, long);
method public void setSubscriptionOverrideUnmetered(int, boolean, long);
method public void setSubscriptionPlans(int, java.util.List<android.telephony.SubscriptionPlan>);
+ method public void switchToSubscription(int, android.app.PendingIntent);
field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
field public static final java.lang.String ACTION_MANAGE_SUBSCRIPTION_PLANS = "android.telephony.action.MANAGE_SUBSCRIPTION_PLANS";
@@ -47620,6 +47634,7 @@ package android.view {
method public void forceLayout();
method public static int generateViewId();
method public java.lang.CharSequence getAccessibilityClassName();
+ method public android.view.View.AccessibilityDelegate getAccessibilityDelegate();
method public int getAccessibilityLiveRegion();
method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
method public java.lang.CharSequence getAccessibilityPaneTitle();
diff --git a/api/system-current.txt b/api/system-current.txt
index 6a00815e78a8..d9befc7eb87e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -201,6 +201,7 @@ package android {
field public static final java.lang.String WRITE_EMBEDDED_SUBSCRIPTIONS = "android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS";
field public static final java.lang.String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
field public static final java.lang.String WRITE_MEDIA_STORAGE = "android.permission.WRITE_MEDIA_STORAGE";
+ field public static final java.lang.String WRITE_OBB = "android.permission.WRITE_OBB";
field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
}
@@ -1115,7 +1116,6 @@ package android.content.pm {
method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public abstract int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method public boolean isPackageSuspended(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
method public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager.DexModuleRegisterCallback);
method public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener);
@@ -3835,6 +3835,7 @@ package android.os {
method public final void putInt64Array(long, long[]);
method public final void putInt8(long, byte);
method public final void putInt8Array(long, byte[]);
+ method public final void putNativeHandle(long, android.os.NativeHandle);
method public final void putString(long, java.lang.String);
method public static java.lang.Boolean[] wrapArray(boolean[]);
method public static java.lang.Long[] wrapArray(long[]);
@@ -3854,6 +3855,7 @@ package android.os {
method public final double readDouble();
method public final java.util.ArrayList<java.lang.Double> readDoubleVector();
method public final android.os.HwBlob readEmbeddedBuffer(long, long, long, boolean);
+ method public final android.os.NativeHandle readEmbeddedNativeHandle(long, long);
method public final float readFloat();
method public final java.util.ArrayList<java.lang.Float> readFloatVector();
method public final short readInt16();
@@ -3864,6 +3866,8 @@ package android.os {
method public final java.util.ArrayList<java.lang.Long> readInt64Vector();
method public final byte readInt8();
method public final java.util.ArrayList<java.lang.Byte> readInt8Vector();
+ method public final android.os.NativeHandle readNativeHandle();
+ method public final java.util.ArrayList<android.os.NativeHandle> readNativeHandleVector();
method public final java.lang.String readString();
method public final java.util.ArrayList<java.lang.String> readStringVector();
method public final android.os.IHwBinder readStrongBinder();
@@ -3887,6 +3891,8 @@ package android.os {
method public final void writeInt8(byte);
method public final void writeInt8Vector(java.util.ArrayList<java.lang.Byte>);
method public final void writeInterfaceToken(java.lang.String);
+ method public final void writeNativeHandle(android.os.NativeHandle);
+ method public final void writeNativeHandleVector(java.util.ArrayList<android.os.NativeHandle>);
method public final void writeStatus(int);
method public final void writeString(java.lang.String);
method public final void writeStringVector(java.util.ArrayList<java.lang.String>);
@@ -3932,6 +3938,18 @@ package android.os {
field public static final android.os.Parcelable.Creator<android.os.IncidentReportArgs> CREATOR;
}
+ public final class NativeHandle implements java.io.Closeable {
+ ctor public NativeHandle();
+ ctor public NativeHandle(java.io.FileDescriptor, boolean);
+ ctor public NativeHandle(java.io.FileDescriptor[], int[], boolean);
+ method public void close() throws java.io.IOException;
+ method public android.os.NativeHandle dup() throws java.io.IOException;
+ method public java.io.FileDescriptor getFileDescriptor();
+ method public java.io.FileDescriptor[] getFileDescriptors();
+ method public int[] getInts();
+ method public boolean hasSingleFileDescriptor();
+ }
+
public final class PowerManager {
method public void userActivity(long, int, int);
field public static final int USER_ACTIVITY_EVENT_ACCESSIBILITY = 3; // 0x3
@@ -4668,6 +4686,7 @@ package android.service.notification {
method public int getUser();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
+ field public static final java.lang.String KEY_IMPORTANCE = "key_importance";
field public static final java.lang.String KEY_PEOPLE = "key_people";
field public static final java.lang.String KEY_SMART_ACTIONS = "key_smart_actions";
field public static final java.lang.String KEY_SMART_REPLIES = "key_smart_replies";
@@ -4702,7 +4721,8 @@ package android.service.notification {
method public final void adjustNotification(android.service.notification.Adjustment);
method public final void adjustNotifications(java.util.List<android.service.notification.Adjustment>);
method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
+ method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
+ method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification, android.app.NotificationChannel);
method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap, android.service.notification.NotificationStats, int);
method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, java.lang.String);
method public final void unsnoozeNotification(java.lang.String);
@@ -5944,6 +5964,7 @@ package android.telephony.ims {
field public static final int CODE_SIP_SERVER_TIMEOUT = 353; // 0x161
field public static final int CODE_SIP_SERVICE_UNAVAILABLE = 352; // 0x160
field public static final int CODE_SIP_TEMPRARILY_UNAVAILABLE = 336; // 0x150
+ field public static final int CODE_SIP_TRANSACTION_DOES_NOT_EXIST = 343; // 0x157
field public static final int CODE_SIP_USER_REJECTED = 361; // 0x169
field public static final int CODE_SUPP_SVC_CANCELLED = 1202; // 0x4b2
field public static final int CODE_SUPP_SVC_FAILED = 1201; // 0x4b1
@@ -6042,12 +6063,16 @@ package android.telephony.ims {
ctor public ImsSsInfo(int, java.lang.String);
method public int describeContents();
method public java.lang.String getIcbNum();
+ method public int getProvisionStatus();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsInfo> CREATOR;
field public static final int DISABLED = 0; // 0x0
field public static final int ENABLED = 1; // 0x1
field public static final int NOT_REGISTERED = -1; // 0xffffffff
+ field public static final int SERVICE_NOT_PROVISIONED = 0; // 0x0
+ field public static final int SERVICE_PROVISIONED = 1; // 0x1
+ field public static final int SERVICE_PROVISIONING_UNKNOWN = -1; // 0xffffffff
}
public final class ImsStreamMediaProfile implements android.os.Parcelable {
diff --git a/api/test-current.txt b/api/test-current.txt
index 63ece406845d..3fa202f14d65 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -1047,6 +1047,7 @@ package android.service.notification {
method public int getUser();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
+ field public static final java.lang.String KEY_IMPORTANCE = "key_importance";
field public static final java.lang.String KEY_PEOPLE = "key_people";
field public static final java.lang.String KEY_SMART_ACTIONS = "key_smart_actions";
field public static final java.lang.String KEY_SMART_REPLIES = "key_smart_replies";
@@ -1063,7 +1064,8 @@ package android.service.notification {
method public final void adjustNotification(android.service.notification.Adjustment);
method public final void adjustNotifications(java.util.List<android.service.notification.Adjustment>);
method public final android.os.IBinder onBind(android.content.Intent);
- method public abstract android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
+ method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification);
+ method public android.service.notification.Adjustment onNotificationEnqueued(android.service.notification.StatusBarNotification, android.app.NotificationChannel);
method public abstract void onNotificationSnoozedUntilContext(android.service.notification.StatusBarNotification, java.lang.String);
method public final void unsnoozeNotification(java.lang.String);
field public static final java.lang.String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService";
@@ -1460,13 +1462,21 @@ package android.view {
method public android.view.View getTooltipView();
method public static boolean isDefaultFocusHighlightEnabled();
method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+ method protected void resetResolvedDrawables();
+ method public void resetResolvedLayoutDirection();
+ method public void resetResolvedPadding();
+ method public void resetResolvedTextAlignment();
+ method public void resetResolvedTextDirection();
+ method public void resetRtlProperties();
method public boolean restoreFocusInCluster(int);
method public boolean restoreFocusNotInCluster();
method public void setAutofilled(boolean);
method public final void setFocusedInCluster();
+ method public void setIsRootNamespace(boolean);
}
public class ViewConfiguration {
+ method public long getDeviceGlobalActionKeyTimeout();
method public static int getHoverTooltipHideShortTimeout();
method public static int getHoverTooltipHideTimeout();
method public static int getHoverTooltipShowTimeout();
diff --git a/cmds/hid/jni/com_android_commands_hid_Device.cpp b/cmds/hid/jni/com_android_commands_hid_Device.cpp
index 5cc4fc4c16b2..b3e287bae76a 100644
--- a/cmds/hid/jni/com_android_commands_hid_Device.cpp
+++ b/cmds/hid/jni/com_android_commands_hid_Device.cpp
@@ -42,7 +42,6 @@ namespace android {
namespace uhid {
static const char* UHID_PATH = "/dev/uhid";
-static const size_t UHID_MAX_NAME_LENGTH = 128;
static struct {
jmethodID onDeviceOpen;
@@ -90,8 +89,13 @@ JNIEnv* DeviceCallback::getJNIEnv() {
}
Device* Device::open(int32_t id, const char* name, int32_t vid, int32_t pid,
- std::unique_ptr<uint8_t[]> descriptor, size_t descriptorSize,
- std::unique_ptr<DeviceCallback> callback) {
+ std::vector<uint8_t> descriptor, std::unique_ptr<DeviceCallback> callback) {
+
+ size_t size = descriptor.size();
+ if (size > HID_MAX_DESCRIPTOR_SIZE) {
+ LOGE("Received invalid hid report with descriptor size %zu, skipping", size);
+ return nullptr;
+ }
int fd = ::open(UHID_PATH, O_RDWR | O_CLOEXEC);
if (fd < 0) {
@@ -102,10 +106,10 @@ Device* Device::open(int32_t id, const char* name, int32_t vid, int32_t pid,
struct uhid_event ev;
memset(&ev, 0, sizeof(ev));
ev.type = UHID_CREATE2;
- strncpy((char*)ev.u.create2.name, name, UHID_MAX_NAME_LENGTH);
- memcpy(&ev.u.create2.rd_data, descriptor.get(),
- descriptorSize * sizeof(ev.u.create2.rd_data[0]));
- ev.u.create2.rd_size = descriptorSize;
+ strlcpy(reinterpret_cast<char*>(ev.u.create2.name), name, sizeof(ev.u.create2.name));
+ memcpy(&ev.u.create2.rd_data, descriptor.data(),
+ size * sizeof(ev.u.create2.rd_data[0]));
+ ev.u.create2.rd_size = size;
ev.u.create2.bus = BUS_BLUETOOTH;
ev.u.create2.vendor = vid;
ev.u.create2.product = pid;
@@ -156,12 +160,17 @@ Device::~Device() {
mFd = -1;
}
-void Device::sendReport(uint8_t* report, size_t reportSize) {
+void Device::sendReport(const std::vector<uint8_t>& report) const {
+ if (report.size() > UHID_DATA_MAX) {
+ LOGE("Received invalid report of size %zu, skipping", report.size());
+ return;
+ }
+
struct uhid_event ev;
memset(&ev, 0, sizeof(ev));
ev.type = UHID_INPUT2;
- ev.u.input2.size = reportSize;
- memcpy(&ev.u.input2.data, report, reportSize);
+ ev.u.input2.size = report.size();
+ memcpy(&ev.u.input2.data, report.data(), report.size() * sizeof(ev.u.input2.data[0]));
ssize_t ret = TEMP_FAILURE_RETRY(::write(mFd, &ev, sizeof(ev)));
if (ret < 0 || ret != sizeof(ev)) {
LOGE("Failed to send hid event: %s", strerror(errno));
@@ -191,12 +200,13 @@ int Device::handleEvents(int events) {
} // namespace uhid
-std::unique_ptr<uint8_t[]> getData(JNIEnv* env, jbyteArray javaArray, size_t& outSize) {
+std::vector<uint8_t> getData(JNIEnv* env, jbyteArray javaArray) {
ScopedByteArrayRO scopedArray(env, javaArray);
- outSize = scopedArray.size();
- std::unique_ptr<uint8_t[]> data(new uint8_t[outSize]);
- for (size_t i = 0; i < outSize; i++) {
- data[i] = static_cast<uint8_t>(scopedArray[i]);
+ size_t size = scopedArray.size();
+ std::vector<uint8_t> data;
+ data.reserve(size);
+ for (size_t i = 0; i < size; i++) {
+ data.push_back(static_cast<uint8_t>(scopedArray[i]));
}
return data;
}
@@ -208,23 +218,20 @@ static jlong openDevice(JNIEnv* env, jclass /* clazz */, jstring rawName, jint i
return 0;
}
- size_t size;
- std::unique_ptr<uint8_t[]> desc = getData(env, rawDescriptor, size);
+ std::vector<uint8_t> desc = getData(env, rawDescriptor);
std::unique_ptr<uhid::DeviceCallback> cb(new uhid::DeviceCallback(env, callback));
uhid::Device* d = uhid::Device::open(
- id, reinterpret_cast<const char*>(name.c_str()), vid, pid,
- std::move(desc), size, std::move(cb));
+ id, reinterpret_cast<const char*>(name.c_str()), vid, pid, desc, std::move(cb));
return reinterpret_cast<jlong>(d);
}
static void sendReport(JNIEnv* env, jclass /* clazz */, jlong ptr, jbyteArray rawReport) {
- size_t size;
- std::unique_ptr<uint8_t[]> report = getData(env, rawReport, size);
+ std::vector<uint8_t> report = getData(env, rawReport);
uhid::Device* d = reinterpret_cast<uhid::Device*>(ptr);
if (d) {
- d->sendReport(report.get(), size);
+ d->sendReport(report);
} else {
LOGE("Could not send report, Device* is null!");
}
diff --git a/cmds/hid/jni/com_android_commands_hid_Device.h b/cmds/hid/jni/com_android_commands_hid_Device.h
index 149456d8c10d..61a1f760697f 100644
--- a/cmds/hid/jni/com_android_commands_hid_Device.h
+++ b/cmds/hid/jni/com_android_commands_hid_Device.h
@@ -15,6 +15,7 @@
*/
#include <memory>
+#include <vector>
#include <jni.h>
@@ -38,13 +39,12 @@ private:
class Device {
public:
static Device* open(int32_t id, const char* name, int32_t vid, int32_t pid,
- std::unique_ptr<uint8_t[]> descriptor, size_t descriptorSize,
- std::unique_ptr<DeviceCallback> callback);
+ std::vector<uint8_t> descriptor, std::unique_ptr<DeviceCallback> callback);
Device(int32_t id, int fd, std::unique_ptr<DeviceCallback> callback);
~Device();
- void sendReport(uint8_t* report, size_t reportSize);
+ void sendReport(const std::vector<uint8_t>& report) const;
void close();
int handleEvents(int events);
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index 61c185f7686d..ba2aaad875d0 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -45,7 +45,6 @@ statsd_common_src := \
src/external/puller_util.cpp \
src/logd/LogEvent.cpp \
src/logd/LogListener.cpp \
- src/logd/LogReader.cpp \
src/matchers/CombinationLogMatchingTracker.cpp \
src/matchers/matcher_util.cpp \
src/matchers/SimpleLogMatchingTracker.cpp \
@@ -194,7 +193,6 @@ LOCAL_SRC_FILES := \
tests/external/puller_util_test.cpp \
tests/indexed_priority_queue_test.cpp \
tests/LogEntryMatcher_test.cpp \
- tests/LogReader_test.cpp \
tests/LogEvent_test.cpp \
tests/MetricsManager_test.cpp \
tests/StatsLogProcessor_test.cpp \
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index ab0aa25103e9..8e02f9cb7628 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -161,10 +161,6 @@ void StatsLogProcessor::onIsolatedUidChangedEventLocked(const LogEvent& event) {
}
}
-void StatsLogProcessor::OnLogEvent(LogEvent* event) {
- OnLogEvent(event, false);
-}
-
void StatsLogProcessor::resetConfigs() {
std::lock_guard<std::mutex> lock(mMetricsMutex);
resetConfigsLocked(getElapsedRealtimeNs());
@@ -178,7 +174,7 @@ void StatsLogProcessor::resetConfigsLocked(const int64_t timestampNs) {
resetConfigsLocked(timestampNs, configKeys);
}
-void StatsLogProcessor::OnLogEvent(LogEvent* event, bool reconnected) {
+void StatsLogProcessor::OnLogEvent(LogEvent* event) {
std::lock_guard<std::mutex> lock(mMetricsMutex);
#ifdef VERY_VERBOSE_PRINTING
@@ -188,41 +184,6 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event, bool reconnected) {
#endif
const int64_t currentTimestampNs = event->GetElapsedTimestampNs();
- if (reconnected && mLastTimestampSeen != 0) {
- // LogReader tells us the connection has just been reset. Now we need
- // to enter reconnection state to find the last CP.
- mInReconnection = true;
- }
-
- if (mInReconnection) {
- // We see the checkpoint
- if (currentTimestampNs == mLastTimestampSeen) {
- mInReconnection = false;
- // Found the CP. ignore this event, and we will start to read from next event.
- return;
- }
- if (currentTimestampNs > mLargestTimestampSeen) {
- // We see a new log but CP has not been found yet. Give up now.
- mLogLossCount++;
- mInReconnection = false;
- StatsdStats::getInstance().noteLogLost(currentTimestampNs);
- // Persist the data before we reset. Do we want this?
- WriteDataToDiskLocked(CONFIG_RESET);
- // We see fresher event before we see the checkpoint. We might have lost data.
- // The best we can do is to reset.
- resetConfigsLocked(currentTimestampNs);
- } else {
- // Still in search of the CP. Keep going.
- return;
- }
- }
-
- mLogCount++;
- mLastTimestampSeen = currentTimestampNs;
- if (mLargestTimestampSeen < currentTimestampNs) {
- mLargestTimestampSeen = currentTimestampNs;
- }
-
resetIfConfigTtlExpiredLocked(currentTimestampNs);
StatsdStats::getInstance().noteAtomLogged(
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 05cf0c1fc764..df80b8e6e052 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -18,7 +18,6 @@
#include <gtest/gtest_prod.h>
#include "config/ConfigListener.h"
-#include "logd/LogReader.h"
#include "metrics/MetricsManager.h"
#include "packages/UidMap.h"
#include "external/StatsPullerManager.h"
@@ -52,9 +51,6 @@ public:
const std::function<bool(const ConfigKey&)>& sendBroadcast);
virtual ~StatsLogProcessor();
- void OnLogEvent(LogEvent* event, bool reconnectionStarts);
-
- // for testing only.
void OnLogEvent(LogEvent* event);
void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
@@ -174,14 +170,6 @@ private:
int64_t mLastTimestampSeen = 0;
- bool mInReconnection = false;
-
- // Processed log count
- uint64_t mLogCount = 0;
-
- // Log loss detected count
- int mLogLossCount = 0;
-
long mLastPullerCacheClearTimeSec = 0;
#ifdef VERY_VERBOSE_PRINTING
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 0c241fc92d6b..91d68ea81468 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -883,8 +883,8 @@ void StatsService::Startup() {
mConfigManager->Startup();
}
-void StatsService::OnLogEvent(LogEvent* event, bool reconnectionStarts) {
- mProcessor->OnLogEvent(event, reconnectionStarts);
+void StatsService::OnLogEvent(LogEvent* event) {
+ mProcessor->OnLogEvent(event);
}
Status StatsService::getData(int64_t key, const String16& packageName, vector<uint8_t>* output) {
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index ed90050aae0b..613f509e915a 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -22,6 +22,7 @@
#include "anomaly/AlarmMonitor.h"
#include "config/ConfigManager.h"
#include "external/StatsPullerManager.h"
+#include "logd/LogListener.h"
#include "packages/UidMap.h"
#include "statscompanion_util.h"
@@ -75,7 +76,7 @@ public:
/**
* Called by LogReader when there's a log event to process.
*/
- virtual void OnLogEvent(LogEvent* event, bool reconnectionStarts);
+ virtual void OnLogEvent(LogEvent* event);
/**
* Binder call for clients to request data for this configuration key.
diff --git a/cmds/statsd/src/condition/condition_util.cpp b/cmds/statsd/src/condition/condition_util.cpp
index 691356b5edc6..35e03e45c785 100644
--- a/cmds/statsd/src/condition/condition_util.cpp
+++ b/cmds/statsd/src/condition/condition_util.cpp
@@ -76,9 +76,9 @@ ConditionState evaluateCombinationCondition(const std::vector<int>& children,
break;
}
case LogicalOperation::NOT:
- newCondition = (conditionCache[children[0]] == ConditionState::kFalse)
- ? ConditionState::kTrue
- : ConditionState::kFalse;
+ newCondition = children.empty() ? ConditionState::kUnknown :
+ ((conditionCache[children[0]] == ConditionState::kFalse) ?
+ ConditionState::kTrue : ConditionState::kFalse);
break;
case LogicalOperation::NAND:
newCondition = hasFalse ? ConditionState::kTrue : ConditionState::kFalse;
diff --git a/cmds/statsd/src/config/ConfigManager.h b/cmds/statsd/src/config/ConfigManager.h
index 611c34250a38..122e669057b0 100644
--- a/cmds/statsd/src/config/ConfigManager.h
+++ b/cmds/statsd/src/config/ConfigManager.h
@@ -31,9 +31,6 @@ namespace android {
namespace os {
namespace statsd {
-// Util function to build a hard coded config with test metrics.
-StatsdConfig build_fake_config();
-
/**
* Keeps track of which configurations have been set from various sources.
*/
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index a955511e198c..c37d0cfdba93 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -180,12 +180,12 @@ void StatsdStats::noteConfigReset(const ConfigKey& key) {
noteConfigResetInternalLocked(key);
}
-void StatsdStats::noteLogLost(int64_t timestampNs) {
+void StatsdStats::noteLogLost(int64_t timestampNs, int32_t count) {
lock_guard<std::mutex> lock(mLock);
if (mLogLossTimestampNs.size() == kMaxLoggerErrors) {
mLogLossTimestampNs.pop_front();
}
- mLogLossTimestampNs.push_back(timestampNs);
+ mLogLossTimestampNs.push_back(std::make_pair(timestampNs, count));
}
void StatsdStats::noteBroadcastSent(const ConfigKey& key) {
@@ -529,7 +529,8 @@ void StatsdStats::dumpStats(FILE* out) const {
}
for (const auto& loss : mLogLossTimestampNs) {
- fprintf(out, "Log loss detected at %lld (elapsedRealtimeNs)\n", (long long)loss);
+ fprintf(out, "Log loss: %lld (elapsedRealtimeNs) - %d (count)\n", (long long)loss.first,
+ loss.second);
}
}
@@ -687,7 +688,7 @@ void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) {
for (const auto& loss : mLogLossTimestampNs) {
proto.write(FIELD_TYPE_INT64 | FIELD_ID_LOG_LOSS_STATS | FIELD_COUNT_REPEATED,
- (long long)loss);
+ (long long)loss.first);
}
for (const auto& restart : mSystemServerRestartSec) {
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 9fb2cd813fb8..daea027e68f9 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -284,7 +284,7 @@ public:
/**
* Records statsd skipped an event.
*/
- void noteLogLost(int64_t timestamp);
+ void noteLogLost(int64_t timestamp, int32_t count);
/**
* Reset the historical stats. Including all stats in icebox, and the tracked stats about
@@ -341,8 +341,8 @@ private:
// Logd errors. Size capped by kMaxLoggerErrors.
std::list<const std::pair<int, int>> mLoggerErrors;
- // Timestamps when we detect log loss after logd reconnect.
- std::list<int64_t> mLogLossTimestampNs;
+ // Timestamps when we detect log loss, and the number of logs lost.
+ std::list<std::pair<int64_t, int32_t>> mLogLossTimestampNs;
std::list<int32_t> mSystemServerRestartSec;
diff --git a/cmds/statsd/src/logd/LogListener.cpp b/cmds/statsd/src/logd/LogListener.cpp
index 6ac7978bbac9..ddb26f9fe565 100644
--- a/cmds/statsd/src/logd/LogListener.cpp
+++ b/cmds/statsd/src/logd/LogListener.cpp
@@ -14,17 +14,7 @@
* limitations under the License.
*/
-#include "logd/LogReader.h"
-
-#include <log/log_read.h>
-
-#include <utils/Errors.h>
-
-#include <time.h>
-#include <unistd.h>
-
-using namespace android;
-using namespace std;
+#include "logd/LogListener.h"
namespace android {
namespace os {
diff --git a/cmds/statsd/src/logd/LogListener.h b/cmds/statsd/src/logd/LogListener.h
index f924040e3a7f..d8b06e9fab92 100644
--- a/cmds/statsd/src/logd/LogListener.h
+++ b/cmds/statsd/src/logd/LogListener.h
@@ -19,7 +19,6 @@
#include "logd/LogEvent.h"
#include <utils/RefBase.h>
-#include <vector>
namespace android {
namespace os {
@@ -33,7 +32,7 @@ public:
LogListener();
virtual ~LogListener();
- virtual void OnLogEvent(LogEvent* msg, bool reconnectionStarts) = 0;
+ virtual void OnLogEvent(LogEvent* msg) = 0;
};
} // namespace statsd
diff --git a/cmds/statsd/src/logd/LogReader.cpp b/cmds/statsd/src/logd/LogReader.cpp
deleted file mode 100644
index 26ae6a3e0e2e..000000000000
--- a/cmds/statsd/src/logd/LogReader.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "logd/LogReader.h"
-
-#include "guardrail/StatsdStats.h"
-
-#include <time.h>
-#include <unistd.h>
-#include <utils/Errors.h>
-
-using namespace android;
-using namespace std;
-
-namespace android {
-namespace os {
-namespace statsd {
-
-#define SNOOZE_INITIAL_MS 100
-#define SNOOZE_MAX_MS (10 * 60 * 1000) // Ten minutes
-
-LogReader::LogReader(const sp<LogListener>& listener) : mListener(listener) {
-}
-
-LogReader::~LogReader() {
-}
-
-void LogReader::Run() {
- int nextSnoozeMs = SNOOZE_INITIAL_MS;
-
- // In an ideal world, this outer loop will only ever run one iteration, but it
- // exists to handle crashes in logd. The inner loop inside connect_and_read()
- // reads from logd forever, but if that read fails, we fall out to the outer
- // loop, do the backoff (resetting the backoff timeout if we successfully read
- // something), and then try again.
- while (true) {
- // Connect and read
- int lineCount = connect_and_read();
-
- // Figure out how long to sleep.
- if (lineCount > 0) {
- // If we managed to read at least one line, reset the backoff
- nextSnoozeMs = SNOOZE_INITIAL_MS;
- } else {
- // Otherwise, expontial backoff
- nextSnoozeMs *= 1.5f;
- if (nextSnoozeMs > 10 * 60 * 1000) {
- // Don't wait for toooo long.
- nextSnoozeMs = SNOOZE_MAX_MS;
- }
- }
-
- // Sleep
- timespec ts;
- timespec rem;
- ts.tv_sec = nextSnoozeMs / 1000;
- ts.tv_nsec = (nextSnoozeMs % 1000) * 1000000L;
- while (nanosleep(&ts, &rem) == -1) {
- if (errno == EINTR) {
- ts = rem;
- }
- // other errors are basically impossible
- }
- }
-}
-
-int LogReader::connect_and_read() {
- int lineCount = 0;
- status_t err;
- logger_list* loggers;
- logger* eventLogger;
-
- // Prepare the logging context
- loggers = android_logger_list_alloc(ANDROID_LOG_RDONLY,
- /* don't stop after N lines */ 0,
- /* no pid restriction */ 0);
-
- // Open the buffer(s)
- eventLogger = android_logger_open(loggers, LOG_ID_STATS);
-
- // Read forever
- if (eventLogger) {
- log_msg msg;
- while (true) {
- // Read a message
- err = android_logger_list_read(loggers, &msg);
- // err = 0 - no content, unexpected connection drop or EOF.
- // err = +ive number - size of retrieved data from logger
- // err = -ive number, OS supplied error _except_ for -EAGAIN
- if (err <= 0) {
- StatsdStats::getInstance().noteLoggerError(err);
- fprintf(stderr, "logcat read failure: %s\n", strerror(err));
- break;
- }
-
- // Record that we read one (used above to know how to snooze).
- lineCount++;
-
- // Wrap it in a LogEvent object
- LogEvent event(msg);
-
- // Call the listener
- mListener->OnLogEvent(&event,
- lineCount == 1 /* indicate whether it's a new connection */);
- }
- }
-
- // Free the logger list and close the individual loggers
- android_logger_list_free(loggers);
-
- return lineCount;
-}
-
-} // namespace statsd
-} // namespace os
-} // namespace android
diff --git a/cmds/statsd/src/logd/LogReader.h b/cmds/statsd/src/logd/LogReader.h
deleted file mode 100644
index c51074c19d9a..000000000000
--- a/cmds/statsd/src/logd/LogReader.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef LOGREADER_H
-#define LOGREADER_H
-
-#include "logd/LogListener.h"
-
-#include <utils/RefBase.h>
-
-#include <vector>
-
-namespace android {
-namespace os {
-namespace statsd {
-
-/**
- * Class to read logs from logd.
- */
-class LogReader : public virtual android::RefBase {
-public:
- /**
- * Construct the LogReader with the event listener. (Which is StatsService)
- */
- LogReader(const sp<LogListener>& listener);
-
- /**
- * Destructor.
- */
- virtual ~LogReader();
-
- /**
- * Run the main LogReader loop
- */
- void Run();
-
-private:
- /**
- * Who is going to get the events when they're read.
- */
- sp<LogListener> mListener;
-
- /**
- * Connect to a single instance of logd, and read until there's a read error.
- * Logd can crash, exit, be killed etc.
- *
- * Returns the number of lines that were read.
- */
- int connect_and_read();
-};
-
-} // namespace statsd
-} // namespace os
-} // namespace android
-
-#endif // LOGREADER_H
diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp
index 2f15d0fe0b71..9002f0773aaf 100644
--- a/cmds/statsd/src/main.cpp
+++ b/cmds/statsd/src/main.cpp
@@ -18,7 +18,6 @@
#include "Log.h"
#include "StatsService.h"
-#include "logd/LogReader.h"
#include "socket/StatsSocketListener.h"
#include <binder/IInterface.h>
@@ -39,9 +38,6 @@
using namespace android;
using namespace android::os::statsd;
-const bool kUseLogd = false;
-const bool kUseStatsdSocket = true;
-
/**
* Thread function data.
*/
@@ -49,58 +45,6 @@ struct log_reader_thread_data {
sp<StatsService> service;
};
-/**
- * Thread func for where the log reader runs.
- */
-static void* log_reader_thread_func(void* cookie) {
- log_reader_thread_data* data = static_cast<log_reader_thread_data*>(cookie);
- sp<LogReader> reader = new LogReader(data->service);
-
- // Run the read loop. Never returns.
- reader->Run();
-
- ALOGW("statsd LogReader.Run() is not supposed to return.");
-
- delete data;
- return NULL;
-}
-
-/**
- * Creates and starts the thread to own the LogReader.
- */
-static status_t start_log_reader_thread(const sp<StatsService>& service) {
- status_t err;
- pthread_attr_t attr;
- pthread_t thread;
-
- // Thread data.
- std::unique_ptr<log_reader_thread_data> data = std::make_unique<log_reader_thread_data>();
- data->service = service;
-
- // Create the thread
- err = pthread_attr_init(&attr);
- if (err != NO_ERROR) {
- return err;
- }
- err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (err != NO_ERROR) {
- pthread_attr_destroy(&attr);
- return err;
- }
- err = pthread_create(&thread, &attr, log_reader_thread_func,
- static_cast<void*>(data.get()));
- if (err != NO_ERROR) {
- pthread_attr_destroy(&attr);
- return err;
- }
- // Release here rather than in pthread_create, since an error creating the
- // thread leaves `data` ownerless.
- data.release();
- pthread_attr_destroy(&attr);
-
- return NO_ERROR;
-}
-
int main(int /*argc*/, char** /*argv*/) {
// Set up the looper
sp<Looper> looper(Looper::prepare(0 /* opts */));
@@ -124,22 +68,11 @@ int main(int /*argc*/, char** /*argv*/) {
sp<StatsSocketListener> socketListener = new StatsSocketListener(service);
- if (kUseLogd) {
- ALOGI("using logd");
- // Start the log reader thread
- status_t err = start_log_reader_thread(service);
- if (err != NO_ERROR) {
- return 1;
- }
- }
-
- if (kUseStatsdSocket) {
ALOGI("using statsd socket");
// Backlog and /proc/sys/net/unix/max_dgram_qlen set to large value
if (socketListener->startListener(600)) {
exit(1);
}
- }
// Loop forever -- the reports run on this thread in a handler, and the
// binder calls remain responsive in their pool of one thread.
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index fbe0b2193556..284c4511a16f 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -71,11 +71,14 @@ const int FIELD_ID_END_BUCKET_ELAPSED_MILLIS = 8;
GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& metric,
const int conditionIndex,
const sp<ConditionWizard>& wizard, const int pullTagId,
+ const int triggerAtomId, const int atomId,
const int64_t timeBaseNs, const int64_t startTimeNs,
const sp<StatsPullerManager>& pullerManager)
: MetricProducer(metric.id(), key, timeBaseNs, conditionIndex, wizard),
mPullerManager(pullerManager),
mPullTagId(pullTagId),
+ mTriggerAtomId(triggerAtomId),
+ mAtomId(atomId),
mIsPulled(pullTagId != -1),
mMinBucketSizeNs(metric.min_bucket_size_nanos()),
mDimensionSoftLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) !=
@@ -272,12 +275,12 @@ void GaugeMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
uint64_t atomsToken =
protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
FIELD_ID_ATOM);
- writeFieldValueTreeToStream(mTagId, *(atom.mFields), protoOutput);
+ writeFieldValueTreeToStream(mAtomId, *(atom.mFields), protoOutput);
protoOutput->end(atomsToken);
}
const bool truncateTimestamp =
android::util::AtomsInfo::kNotTruncatingTimestampAtomWhiteList.find(
- mTagId) ==
+ mAtomId) ==
android::util::AtomsInfo::kNotTruncatingTimestampAtomWhiteList.end();
for (const auto& atom : bucket.mGaugeAtoms) {
const int64_t elapsedTimestampNs = truncateTimestamp ?
@@ -410,7 +413,6 @@ void GaugeMetricProducer::onMatchedLogEventInternalLocked(
return;
}
int64_t eventTimeNs = event.GetElapsedTimestampNs();
- mTagId = event.GetTagId();
if (eventTimeNs < mCurrentBucketStartTimeNs) {
VLOG("Gauge Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
(long long)mCurrentBucketStartTimeNs);
@@ -418,6 +420,11 @@ void GaugeMetricProducer::onMatchedLogEventInternalLocked(
}
flushIfNeededLocked(eventTimeNs);
+ if (mTriggerAtomId == event.GetTagId()) {
+ pullLocked(eventTimeNs);
+ return;
+ }
+
// When gauge metric wants to randomly sample the output atom, we just simply use the first
// gauge in the given bucket.
if (mCurrentSlicedBucket->find(eventKey) != mCurrentSlicedBucket->end() &&
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index cc65440c9572..15be1d7c470b 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -58,7 +58,8 @@ class GaugeMetricProducer : public virtual MetricProducer, public virtual PullDa
public:
GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& gaugeMetric,
const int conditionIndex, const sp<ConditionWizard>& wizard,
- const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs,
+ const int pullTagId, const int triggerAtomId, const int atomId,
+ const int64_t timeBaseNs, const int64_t startTimeNs,
const sp<StatsPullerManager>& pullerManager);
virtual ~GaugeMetricProducer();
@@ -115,12 +116,16 @@ private:
void pullLocked(const int64_t timestampNs);
- int mTagId;
-
sp<StatsPullerManager> mPullerManager;
// tagId for pulled data. -1 if this is not pulled
const int mPullTagId;
+ // tagId for atoms that trigger the pulling, if any
+ const int mTriggerAtomId;
+
+ // tagId for output atom
+ const int mAtomId;
+
// if this is pulled metric
const bool mIsPulled;
@@ -169,6 +174,7 @@ private:
FRIEND_TEST(GaugeMetricProducerTest, TestPulledWithUpgrade);
FRIEND_TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection);
FRIEND_TEST(GaugeMetricProducerTest, TestFirstBucket);
+ FRIEND_TEST(GaugeMetricProducerTest, TestPullOnTrigger);
};
} // namespace statsd
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 16447e850cf5..192a54b7e0a3 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define DEBUG true // STOPSHIP if true
+#define DEBUG false // STOPSHIP if true
#include "Log.h"
#include "ValueMetricProducer.h"
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp
index ff48d0239059..75d6df95852d 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.cpp
+++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp
@@ -82,6 +82,28 @@ bool handleMetricWithLogTrackers(const int64_t what, const int metricIndex,
return true;
}
+bool handlePullMetricTriggerWithLogTrackers(
+ const int64_t trigger, const int metricIndex,
+ const vector<sp<LogMatchingTracker>>& allAtomMatchers,
+ const unordered_map<int64_t, int>& logTrackerMap,
+ unordered_map<int, std::vector<int>>& trackerToMetricMap, int& logTrackerIndex) {
+ auto logTrackerIt = logTrackerMap.find(trigger);
+ if (logTrackerIt == logTrackerMap.end()) {
+ ALOGW("cannot find the AtomMatcher \"%lld\" in config", (long long)trigger);
+ return false;
+ }
+ if (allAtomMatchers[logTrackerIt->second]->getAtomIds().size() > 1) {
+ ALOGE("AtomMatcher \"%lld\" has more than one tag ids."
+ "Trigger can only be one atom type.",
+ (long long)trigger);
+ return false;
+ }
+ logTrackerIndex = logTrackerIt->second;
+ auto& metric_list = trackerToMetricMap[logTrackerIndex];
+ metric_list.push_back(metricIndex);
+ return true;
+}
+
bool handleMetricWithConditions(
const int64_t condition, const int metricIndex,
const unordered_map<int64_t, int>& conditionTrackerMap,
@@ -502,13 +524,29 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t
}
sp<LogMatchingTracker> atomMatcher = allAtomMatchers.at(trackerIndex);
- // If it is pulled atom, it should be simple matcher with one tagId.
+ // For GaugeMetric atom, it should be simple matcher with one tagId.
if (atomMatcher->getAtomIds().size() != 1) {
return false;
}
int atomTagId = *(atomMatcher->getAtomIds().begin());
int pullTagId = statsPullerManager.PullerForMatcherExists(atomTagId) ? atomTagId : -1;
+ int triggerTrackerIndex;
+ int triggerAtomId = -1;
+ if (pullTagId != -1 && metric.has_trigger_event()) {
+ // event_trigger should be used with ALL_CONDITION_CHANGES
+ if (metric.sampling_type() != GaugeMetric::ALL_CONDITION_CHANGES) {
+ return false;
+ }
+ if (!handlePullMetricTriggerWithLogTrackers(metric.trigger_event(), metricIndex,
+ allAtomMatchers, logTrackerMap,
+ trackerToMetricMap, triggerTrackerIndex)) {
+ return false;
+ }
+ sp<LogMatchingTracker> triggerAtomMatcher = allAtomMatchers.at(triggerTrackerIndex);
+ triggerAtomId = *(triggerAtomMatcher->getAtomIds().begin());
+ }
+
int conditionIndex = -1;
if (metric.has_condition()) {
bool good = handleMetricWithConditions(
@@ -524,9 +562,9 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t
}
}
- sp<MetricProducer> gaugeProducer =
- new GaugeMetricProducer(key, metric, conditionIndex, wizard, pullTagId,
- timeBaseTimeNs, currentTimeNs, pullerManager);
+ sp<MetricProducer> gaugeProducer = new GaugeMetricProducer(
+ key, metric, conditionIndex, wizard, pullTagId, triggerAtomId, atomTagId,
+ timeBaseTimeNs, currentTimeNs, pullerManager);
allMetricProducers.push_back(gaugeProducer);
}
for (int i = 0; i < config.no_report_metric_size(); ++i) {
diff --git a/cmds/statsd/src/socket/StatsSocketListener.cpp b/cmds/statsd/src/socket/StatsSocketListener.cpp
index 0392d6756292..4041da7b84d2 100755
--- a/cmds/statsd/src/socket/StatsSocketListener.cpp
+++ b/cmds/statsd/src/socket/StatsSocketListener.cpp
@@ -40,6 +40,7 @@ namespace os {
namespace statsd {
static const int kLogMsgHeaderSize = 28;
+static const int kLibLogTag = 1006;
StatsSocketListener::StatsSocketListener(const sp<LogListener>& listener)
: SocketListener(getLogSocket(), false /*start listen*/), mListener(listener) {
@@ -99,6 +100,22 @@ bool StatsSocketListener::onDataAvailable(SocketClient* cli) {
char* ptr = ((char*)buffer) + sizeof(android_log_header_t);
n -= sizeof(android_log_header_t);
+ // When a log failed to write to statsd socket (e.g., due ot EBUSY), a special message would
+ // be sent to statsd when the socket communication becomes available again.
+ // The format is android_log_event_int_t with a single integer in the payload indicating the
+ // number of logs that failed. (*FORMAT MUST BE IN SYNC WITH system/core/libstats*)
+ // Note that all normal stats logs are in the format of event_list, so there won't be confusion.
+ //
+ // TODO(b/80538532): In addition to log it in StatsdStats, we should properly reset the config.
+ if (n == sizeof(android_log_event_int_t)) {
+ android_log_event_int_t* int_event = reinterpret_cast<android_log_event_int_t*>(ptr);
+ if (int_event->header.tag == kLibLogTag && int_event->payload.type == EVENT_TYPE_INT) {
+ ALOGE("Found dropped events: %d", int_event->payload.data);
+ StatsdStats::getInstance().noteLogLost(getElapsedRealtimeNs(), int_event->payload.data);
+ return true;
+ }
+ }
+
log_msg msg;
msg.entry.len = n;
@@ -111,7 +128,7 @@ bool StatsSocketListener::onDataAvailable(SocketClient* cli) {
LogEvent event(msg);
// Call the listener
- mListener->OnLogEvent(&event, false /*reconnected, N/A in statsd socket*/);
+ mListener->OnLogEvent(&event);
return true;
}
diff --git a/cmds/statsd/src/stats_util.h b/cmds/statsd/src/stats_util.h
index 5fcb16111f97..cfc411fdd25f 100644
--- a/cmds/statsd/src/stats_util.h
+++ b/cmds/statsd/src/stats_util.h
@@ -17,7 +17,6 @@
#pragma once
#include "HashableDimensionKey.h"
-#include "logd/LogReader.h"
#include <unordered_map>
diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto
index 26dfda3985d1..d19e247ae6c7 100644
--- a/cmds/statsd/src/statsd_config.proto
+++ b/cmds/statsd/src/statsd_config.proto
@@ -217,6 +217,8 @@ message GaugeMetric {
optional int64 what = 2;
+ optional int64 trigger_event = 12;
+
optional FieldFilter gauge_fields_filter = 3;
optional int64 condition = 4;
diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp
index ecc57f5c4b26..b6f635c6a0cb 100644
--- a/cmds/statsd/tests/StatsLogProcessor_test.cpp
+++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp
@@ -238,132 +238,6 @@ TEST(StatsLogProcessorTest, TestReportIncludesSubConfig) {
EXPECT_EQ(2, report.annotation(0).field_int32());
}
-TEST(StatsLogProcessorTest, TestOutOfOrderLogs) {
- // Setup simple config key corresponding to empty config.
- sp<UidMap> m = new UidMap();
- sp<StatsPullerManager> pullerManager = new StatsPullerManager();
- sp<AlarmMonitor> anomalyAlarmMonitor;
- sp<AlarmMonitor> subscriberAlarmMonitor;
- int broadcastCount = 0;
- StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [&broadcastCount](const ConfigKey& key) {
- broadcastCount++;
- return true;
- });
-
- LogEvent event1(0, 1 /*logd timestamp*/, 1001 /*elapsedRealtime*/);
- event1.init();
-
- LogEvent event2(0, 2, 1002);
- event2.init();
-
- LogEvent event3(0, 3, 1005);
- event3.init();
-
- LogEvent event4(0, 4, 1004);
- event4.init();
-
- // <----- Reconnection happens
-
- LogEvent event5(0, 5, 999);
- event5.init();
-
- LogEvent event6(0, 6, 2000);
- event6.init();
-
- // <----- Reconnection happens
-
- LogEvent event7(0, 7, 3000);
- event7.init();
-
- // first event ever
- p.OnLogEvent(&event1, true);
- EXPECT_EQ(1UL, p.mLogCount);
- EXPECT_EQ(1001LL, p.mLargestTimestampSeen);
- EXPECT_EQ(1001LL, p.mLastTimestampSeen);
-
- p.OnLogEvent(&event2, false);
- EXPECT_EQ(2UL, p.mLogCount);
- EXPECT_EQ(1002LL, p.mLargestTimestampSeen);
- EXPECT_EQ(1002LL, p.mLastTimestampSeen);
-
- p.OnLogEvent(&event3, false);
- EXPECT_EQ(3UL, p.mLogCount);
- EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
- EXPECT_EQ(1005LL, p.mLastTimestampSeen);
-
- p.OnLogEvent(&event4, false);
- EXPECT_EQ(4UL, p.mLogCount);
- EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
- EXPECT_EQ(1004LL, p.mLastTimestampSeen);
- EXPECT_FALSE(p.mInReconnection);
-
- // Reconnect happens, event1 out of buffer. Read event2
- p.OnLogEvent(&event2, true);
- EXPECT_EQ(4UL, p.mLogCount);
- EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
- EXPECT_EQ(1004LL, p.mLastTimestampSeen);
- EXPECT_TRUE(p.mInReconnection);
-
- p.OnLogEvent(&event3, false);
- EXPECT_EQ(4UL, p.mLogCount);
- EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
- EXPECT_EQ(1004LL, p.mLastTimestampSeen);
- EXPECT_TRUE(p.mInReconnection);
-
- p.OnLogEvent(&event4, false);
- EXPECT_EQ(4UL, p.mLogCount);
- EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
- EXPECT_EQ(1004LL, p.mLastTimestampSeen);
- EXPECT_FALSE(p.mInReconnection);
-
- // Fresh event comes.
- p.OnLogEvent(&event5, false);
- EXPECT_EQ(5UL, p.mLogCount);
- EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
- EXPECT_EQ(999LL, p.mLastTimestampSeen);
-
- p.OnLogEvent(&event6, false);
- EXPECT_EQ(6UL, p.mLogCount);
- EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
- EXPECT_EQ(2000LL, p.mLastTimestampSeen);
-
- // Reconnect happens, read from event4
- p.OnLogEvent(&event4, true);
- EXPECT_EQ(6UL, p.mLogCount);
- EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
- EXPECT_EQ(2000LL, p.mLastTimestampSeen);
- EXPECT_TRUE(p.mInReconnection);
-
- p.OnLogEvent(&event5, false);
- EXPECT_EQ(6UL, p.mLogCount);
- EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
- EXPECT_EQ(2000LL, p.mLastTimestampSeen);
- EXPECT_TRUE(p.mInReconnection);
-
- // Before we get out of reconnection state, it reconnects again.
- p.OnLogEvent(&event5, true);
- EXPECT_EQ(6UL, p.mLogCount);
- EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
- EXPECT_EQ(2000LL, p.mLastTimestampSeen);
- EXPECT_TRUE(p.mInReconnection);
-
- p.OnLogEvent(&event6, false);
- EXPECT_EQ(6UL, p.mLogCount);
- EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
- EXPECT_EQ(2000LL, p.mLastTimestampSeen);
- EXPECT_FALSE(p.mInReconnection);
- EXPECT_EQ(0, p.mLogLossCount);
-
- // it reconnects again. All old events are gone. We lose CP.
- p.OnLogEvent(&event7, true);
- EXPECT_EQ(7UL, p.mLogCount);
- EXPECT_EQ(3000LL, p.mLargestTimestampSeen);
- EXPECT_EQ(3000LL, p.mLastTimestampSeen);
- EXPECT_EQ(1, p.mLogLossCount);
- EXPECT_FALSE(p.mInReconnection);
-}
-
#else
GTEST_LOG_(INFO) << "This test does nothing.\n";
#endif
diff --git a/cmds/statsd/tests/condition/CombinationConditionTracker_test.cpp b/cmds/statsd/tests/condition/CombinationConditionTracker_test.cpp
index 23d69267d1c0..6529d65a5825 100644
--- a/cmds/statsd/tests/condition/CombinationConditionTracker_test.cpp
+++ b/cmds/statsd/tests/condition/CombinationConditionTracker_test.cpp
@@ -40,6 +40,7 @@ TEST(ConditionTrackerTest, TestUnknownCondition) {
EXPECT_EQ(evaluateCombinationCondition(children, operation, conditionResults),
ConditionState::kUnknown);
}
+
TEST(ConditionTrackerTest, TestAndCondition) {
// Set up the matcher
LogicalOperation operation = LogicalOperation::AND;
@@ -103,6 +104,11 @@ TEST(ConditionTrackerTest, TestNotCondition) {
conditionResults.clear();
conditionResults.push_back(ConditionState::kFalse);
EXPECT_TRUE(evaluateCombinationCondition(children, operation, conditionResults));
+
+ children.clear();
+ conditionResults.clear();
+ EXPECT_EQ(evaluateCombinationCondition(children, operation, conditionResults),
+ ConditionState::kUnknown);
}
TEST(ConditionTrackerTest, TestNandCondition) {
diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
index 2fda858db7d7..9471faa89547 100644
--- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
@@ -66,7 +66,8 @@ TEST(GaugeMetricProducerTest, TestFirstBucket) {
// statsd started long ago.
// The metric starts in the middle of the bucket
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
- -1, 5, 600 * NS_PER_SEC + NS_PER_SEC/2, pullerManager);
+ -1, -1, tagId, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2,
+ pullerManager);
EXPECT_EQ(600500000000, gaugeProducer.mCurrentBucketStartTimeNs);
EXPECT_EQ(10, gaugeProducer.mCurrentBucketNum);
@@ -100,8 +101,8 @@ TEST(GaugeMetricProducerTest, TestPulledEventsNoCondition) {
}));
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
- tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager);
- gaugeProducer.setBucketSize(60 * NS_PER_SEC);
+ tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
+ pullerManager);
vector<shared_ptr<LogEvent>> allData;
allData.clear();
@@ -176,10 +177,9 @@ TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade) {
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
- -1 /* -1 means no pulling */, bucketStartTimeNs,
+ -1 /* -1 means no pulling */, -1, tagId, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
- gaugeProducer.setBucketSize(60 * NS_PER_SEC);
sp<AnomalyTracker> anomalyTracker = gaugeProducer.addAnomalyTracker(alert, alarmMonitor);
EXPECT_TRUE(anomalyTracker != nullptr);
@@ -261,8 +261,8 @@ TEST(GaugeMetricProducerTest, TestPulledWithUpgrade) {
}));
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
- tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager);
- gaugeProducer.setBucketSize(60 * NS_PER_SEC);
+ tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
+ pullerManager);
vector<shared_ptr<LogEvent>> allData;
shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1);
@@ -328,9 +328,8 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition) {
return true;
}));
- GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
- bucketStartTimeNs, pullerManager);
- gaugeProducer.setBucketSize(60 * NS_PER_SEC);
+ GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard, tagId, -1, tagId,
+ bucketStartTimeNs, bucketStartTimeNs, pullerManager);
gaugeProducer.onConditionChanged(true, bucketStartTimeNs + 8);
EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
@@ -419,9 +418,8 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithSlicedCondition) {
return true;
}));
- GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
- bucketStartTimeNs, pullerManager);
- gaugeProducer.setBucketSize(60 * NS_PER_SEC);
+ GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard, tagId, -1, tagId,
+ bucketStartTimeNs, bucketStartTimeNs, pullerManager);
gaugeProducer.onSlicedConditionMayChange(true, bucketStartTimeNs + 8);
@@ -464,8 +462,8 @@ TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection) {
gaugeFieldMatcher->set_field(tagId);
gaugeFieldMatcher->add_child()->set_field(2);
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
- tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager);
- gaugeProducer.setBucketSize(60 * NS_PER_SEC);
+ tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs,
+ pullerManager);
Alert alert;
alert.set_id(101);
@@ -530,6 +528,83 @@ TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection) {
EXPECT_TRUE(gaugeProducer.mCurrentSlicedBucket->begin()->second.front().mFields->empty());
}
+TEST(GaugeMetricProducerTest, TestPullOnTrigger) {
+ GaugeMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.set_sampling_type(GaugeMetric::ALL_CONDITION_CHANGES);
+ metric.mutable_gauge_fields_filter()->set_include_all(false);
+ auto gaugeFieldMatcher = metric.mutable_gauge_fields_filter()->mutable_fields();
+ gaugeFieldMatcher->set_field(tagId);
+ gaugeFieldMatcher->add_child()->set_field(1);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 3);
+ event->write(3);
+ event->init();
+ data->push_back(event);
+ return true;
+ }))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event->write(4);
+ event->init();
+ data->push_back(event);
+ return true;
+ }))
+ .WillOnce(Invoke([](int tagId, int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
+ event->write(5);
+ event->init();
+ data->push_back(event);
+ return true;
+ }));
+
+ int triggerId = 5;
+ GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
+ tagId, triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs,
+ pullerManager);
+
+ vector<shared_ptr<LogEvent>> allData;
+ allData.clear();
+
+ EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
+ LogEvent trigger(triggerId, bucketStartTimeNs + 10);
+ trigger.init();
+ gaugeProducer.onMatchedLogEvent(1 /*log matcher index*/, trigger);
+ EXPECT_EQ(2UL, gaugeProducer.mCurrentSlicedBucket->begin()->second.size());
+ trigger.setElapsedTimestampNs(bucketStartTimeNs + 20);
+ gaugeProducer.onMatchedLogEvent(1 /*log matcher index*/, trigger);
+ EXPECT_EQ(3UL, gaugeProducer.mCurrentSlicedBucket->begin()->second.size());
+
+ allData.clear();
+ shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
+ event->write(10);
+ event->init();
+ allData.push_back(event);
+
+ gaugeProducer.onDataPulled(allData);
+ EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
+ auto it = gaugeProducer.mCurrentSlicedBucket->begin()->second.front().mFields->begin();
+ EXPECT_EQ(INT, it->mValue.getType());
+ EXPECT_EQ(10, it->mValue.int_value);
+ EXPECT_EQ(1UL, gaugeProducer.mPastBuckets.size());
+ EXPECT_EQ(3UL, gaugeProducer.mPastBuckets.begin()->second.back().mGaugeAtoms.size());
+ EXPECT_EQ(3, gaugeProducer.mPastBuckets.begin()->second.back().mGaugeAtoms[0].mFields->begin()->mValue.int_value);
+ EXPECT_EQ(4, gaugeProducer.mPastBuckets.begin()->second.back().mGaugeAtoms[1].mFields->begin()->mValue.int_value);
+ EXPECT_EQ(5, gaugeProducer.mPastBuckets.begin()->second.back().mGaugeAtoms[2].mFields->begin()->mValue.int_value);
+}
+
} // namespace statsd
} // namespace os
} // namespace android
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index 4f60b0c52942..5f99a71b4a55 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -964,22 +964,6 @@ Landroid/app/WallpaperManager;->openDefaultWallpaper(Landroid/content/Context;I)
Landroid/app/WallpaperManager;->setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;ZII)I
Landroid/app/WallpaperManager;->setWallpaperComponent(Landroid/content/ComponentName;I)Z
Landroid/app/WallpaperManager;->sGlobals:Landroid/app/WallpaperManager$Globals;
-Landroid/appwidget/AppWidgetHost;-><init>(Landroid/content/Context;ILandroid/widget/RemoteViews$OnClickHandler;Landroid/os/Looper;)V
-Landroid/appwidget/AppWidgetHost;->HANDLE_VIEW_DATA_CHANGED:I
-Landroid/appwidget/AppWidgetHost;->mHandler:Landroid/os/Handler;
-Landroid/appwidget/AppWidgetHost;->sService:Lcom/android/internal/appwidget/IAppWidgetService;
-Landroid/appwidget/AppWidgetHostView;->getDefaultPaddingForWidget(Landroid/content/Context;Landroid/content/pm/ApplicationInfo;Landroid/graphics/Rect;)Landroid/graphics/Rect;
-Landroid/appwidget/AppWidgetHostView;->mAppWidgetId:I
-Landroid/appwidget/AppWidgetHostView;->mInfo:Landroid/appwidget/AppWidgetProviderInfo;
-Landroid/appwidget/AppWidgetHostView;->updateAppWidgetSize(Landroid/os/Bundle;IIIIZ)V
-Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;)V
-Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;Landroid/os/Bundle;)V
-Landroid/appwidget/AppWidgetManager;->bindAppWidgetIdIfAllowed(IILandroid/content/ComponentName;Landroid/os/Bundle;)Z
-Landroid/appwidget/AppWidgetManager;->bindRemoteViewsService(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/IServiceConnection;I)Z
-Landroid/appwidget/AppWidgetManager;->getInstalledProviders(I)Ljava/util/List;
-Landroid/appwidget/AppWidgetManager;->getInstalledProvidersForProfile(ILandroid/os/UserHandle;Ljava/lang/String;)Ljava/util/List;
-Landroid/appwidget/AppWidgetManager;->mService:Lcom/android/internal/appwidget/IAppWidgetService;
-Landroid/appwidget/AppWidgetProviderInfo;->providerInfo:Landroid/content/pm/ActivityInfo;
Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAddress()Ljava/lang/String;
Landroid/bluetooth/IBluetooth$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
Landroid/bluetooth/IBluetooth$Stub;-><init>()V
@@ -1753,56 +1737,9 @@ Landroid/content/UndoOperation;-><init>(Landroid/content/UndoOwner;)V
Landroid/content/UndoOperation;-><init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V
Landroid/content/UriMatcher;->mChildren:Ljava/util/ArrayList;
Landroid/content/UriMatcher;->mText:Ljava/lang/String;
-Landroid/database/AbstractCursor;->mExtras:Landroid/os/Bundle;
-Landroid/database/AbstractCursor;->mNotifyUri:Landroid/net/Uri;
-Landroid/database/AbstractWindowedCursor;->clearOrCreateWindow(Ljava/lang/String;)V
-Landroid/database/AbstractWindowedCursor;->closeWindow()V
-Landroid/database/AbstractWindowedCursor;->onDeactivateOrClose()V
-Landroid/database/ContentObserver;->releaseContentObserver()Landroid/database/IContentObserver;
-Landroid/database/CursorWindow;->mWindowPtr:J
-Landroid/database/CursorWindow;->printStats()Ljava/lang/String;
-Landroid/database/CursorWindow;->sCursorWindowSize:I
-Landroid/database/CursorWindow;->sWindowToPidMap:Landroid/util/LongSparseArray;
-Landroid/database/CursorWrapper;->mCursor:Landroid/database/Cursor;
-Landroid/database/DatabaseUtils;->cursorPickFillWindowStartPosition(II)I
-Landroid/database/DatabaseUtils;->getTypeOfObject(Ljava/lang/Object;)I
Landroid/database/IContentObserver$Stub;-><init>()V
Landroid/database/IContentObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/database/IContentObserver;
Landroid/database/IContentObserver;->onChange(ZLandroid/net/Uri;I)V
-Landroid/database/MatrixCursor;->data:[Ljava/lang/Object;
-Landroid/database/MatrixCursor;->get(I)Ljava/lang/Object;
-Landroid/database/MatrixCursor;->rowCount:I
-Landroid/database/sqlite/DatabaseObjectNotClosedException;-><init>()V
-Landroid/database/sqlite/SQLiteClosable;->mReferenceCount:I
-Landroid/database/sqlite/SQLiteCursor;->fillWindow(I)V
-Landroid/database/sqlite/SQLiteCursor;->mEditTable:Ljava/lang/String;
-Landroid/database/sqlite/SQLiteCursor;->mQuery:Landroid/database/sqlite/SQLiteQuery;
-Landroid/database/sqlite/SQLiteCustomFunction;->dispatchCallback([Ljava/lang/String;)V
-Landroid/database/sqlite/SQLiteCustomFunction;->name:Ljava/lang/String;
-Landroid/database/sqlite/SQLiteCustomFunction;->numArgs:I
-Landroid/database/sqlite/SQLiteDatabase;->beginTransaction(Landroid/database/sqlite/SQLiteTransactionListener;Z)V
-Landroid/database/sqlite/SQLiteDatabase;->collectDbStats(Ljava/util/ArrayList;)V
-Landroid/database/sqlite/SQLiteDatabase;->CONFLICT_VALUES:[Ljava/lang/String;
-Landroid/database/sqlite/SQLiteDatabase;->getActiveDatabases()Ljava/util/ArrayList;
-Landroid/database/sqlite/SQLiteDatabase;->getThreadSession()Landroid/database/sqlite/SQLiteSession;
-Landroid/database/sqlite/SQLiteDatabase;->mConfigurationLocked:Landroid/database/sqlite/SQLiteDatabaseConfiguration;
-Landroid/database/sqlite/SQLiteDatabase;->mConnectionPoolLocked:Landroid/database/sqlite/SQLiteConnectionPool;
-Landroid/database/sqlite/SQLiteDatabase;->mThreadSession:Ljava/lang/ThreadLocal;
-Landroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;
-Landroid/database/sqlite/SQLiteDatabase;->reopenReadWrite()V
-Landroid/database/sqlite/SQLiteDatabaseConfiguration;->maxSqlCacheSize:I
-Landroid/database/sqlite/SQLiteOpenHelper;->mName:Ljava/lang/String;
-Landroid/database/sqlite/SQLiteProgram;->mBindArgs:[Ljava/lang/Object;
-Landroid/database/sqlite/SQLiteProgram;->mSql:Ljava/lang/String;
-Landroid/database/sqlite/SQLiteQueryBuilder;->computeProjection([Ljava/lang/String;)[Ljava/lang/String;
-Landroid/database/sqlite/SQLiteQueryBuilder;->mDistinct:Z
-Landroid/database/sqlite/SQLiteQueryBuilder;->mTables:Ljava/lang/String;
-Landroid/database/sqlite/SQLiteQueryBuilder;->mWhereClause:Ljava/lang/StringBuilder;
-Landroid/database/sqlite/SQLiteSession;->beginTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V
-Landroid/database/sqlite/SQLiteStatement;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V
-Landroid/database/sqlite/SqliteWrapper;->checkSQLiteException(Landroid/content/Context;Landroid/database/sqlite/SQLiteException;)V
-Landroid/database/sqlite/SqliteWrapper;->delete(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I
-Landroid/database/sqlite/SqliteWrapper;->update(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I
Landroid/hardware/biometrics/BiometricConstants;->BIOMETRIC_ERROR_VENDOR_BASE:I
Landroid/hardware/biometrics/BiometricFingerprintConstants;->FINGERPRINT_ERROR_VENDOR_BASE:I
Landroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager;
@@ -1849,18 +1786,6 @@ Landroid/icu/util/UResourceBundle;->getString()Ljava/lang/String;
Landroid/icu/util/UResourceBundle;->getType()I
Landroid/icu/util/UResourceBundleIterator;->hasNext()Z
Landroid/icu/util/UResourceBundleIterator;->next()Landroid/icu/util/UResourceBundle;
-Landroid/location/Country;-><init>(Ljava/lang/String;I)V
-Landroid/location/Country;->getCountryIso()Ljava/lang/String;
-Landroid/location/Country;->getSource()I
-Landroid/location/CountryDetector;-><init>(Landroid/location/ICountryDetector;)V
-Landroid/location/CountryDetector;->addCountryListener(Landroid/location/CountryListener;Landroid/os/Looper;)V
-Landroid/location/CountryDetector;->detectCountry()Landroid/location/Country;
-Landroid/location/CountryDetector;->removeCountryListener(Landroid/location/CountryListener;)V
-Landroid/location/CountryListener;->onCountryDetected(Landroid/location/Country;)V
-Landroid/location/GeocoderParams;->getClientPackage()Ljava/lang/String;
-Landroid/location/GeocoderParams;->getLocale()Ljava/util/Locale;
-Landroid/location/Geofence;->CREATOR:Landroid/os/Parcelable$Creator;
-Landroid/location/GpsStatus;->setTimeToFirstFix(I)V
Landroid/location/ICountryDetector$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ICountryDetector;
Landroid/location/ICountryListener$Stub;-><init>()V
Landroid/location/IGeocodeProvider$Stub;-><init>()V
@@ -1879,25 +1804,6 @@ Landroid/location/ILocationManager$Stub;-><init>()V
Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager;
Landroid/location/ILocationManager$Stub;->TRANSACTION_getAllProviders:I
Landroid/location/ILocationManager;->getAllProviders()Ljava/util/List;
-Landroid/location/Location;->mElapsedRealtimeNanos:J
-Landroid/location/Location;->mProvider:Ljava/lang/String;
-Landroid/location/LocationManager;->mService:Landroid/location/ILocationManager;
-Landroid/location/LocationManager;->requestLocationUpdates(Landroid/location/LocationRequest;Landroid/location/LocationListener;Landroid/os/Looper;Landroid/app/PendingIntent;)V
-Landroid/location/LocationManager;->sendNiResponse(II)Z
-Landroid/location/LocationRequest;->checkDisplacement(F)V
-Landroid/location/LocationRequest;->checkInterval(J)V
-Landroid/location/LocationRequest;->checkProvider(Ljava/lang/String;)V
-Landroid/location/LocationRequest;->checkQuality(I)V
-Landroid/location/LocationRequest;->mExpireAt:J
-Landroid/location/LocationRequest;->mExplicitFastestInterval:Z
-Landroid/location/LocationRequest;->mFastestInterval:J
-Landroid/location/LocationRequest;->mHideFromAppOps:Z
-Landroid/location/LocationRequest;->mInterval:J
-Landroid/location/LocationRequest;->mNumUpdates:I
-Landroid/location/LocationRequest;->mProvider:Ljava/lang/String;
-Landroid/location/LocationRequest;->mQuality:I
-Landroid/location/LocationRequest;->mSmallestDisplacement:F
-Landroid/location/LocationRequest;->mWorkSource:Landroid/os/WorkSource;
Landroid/media/AmrInputStream;-><init>(Ljava/io/InputStream;)V
Landroid/media/AsyncPlayer;->setUsesWakeLock(Landroid/content/Context;)V
Landroid/media/AudioAttributes$Builder;->addTag(Ljava/lang/String;)Landroid/media/AudioAttributes$Builder;
@@ -2366,10 +2272,6 @@ Landroid/media/VolumeShaper$State;-><init>(FF)V
Landroid/media/VolumeShaper$State;->mVolume:F
Landroid/media/VolumeShaper$State;->mXOffset:F
Landroid/media/WebVttRenderer;-><init>(Landroid/content/Context;)V
-Landroid/mtp/MtpPropertyList;->append(IIIJ)V
-Landroid/mtp/MtpPropertyList;->append(IILjava/lang/String;)V
-Landroid/mtp/MtpStorage;->getPath()Ljava/lang/String;
-Landroid/mtp/MtpStorage;->getStorageId()I
Landroid/net/ConnectivityManager;->ACTION_TETHER_STATE_CHANGED:Ljava/lang/String;
Landroid/net/ConnectivityManager;->EXTRA_ACTIVE_TETHER:Ljava/lang/String;
Landroid/net/ConnectivityManager;->EXTRA_AVAILABLE_TETHER:Ljava/lang/String;
@@ -2847,13 +2749,6 @@ Landroid/nfc/INfcAdapterExtras;->getDriverName(Ljava/lang/String;)Ljava/lang/Str
Landroid/nfc/INfcAdapterExtras;->open(Ljava/lang/String;Landroid/os/IBinder;)Landroid/os/Bundle;
Landroid/nfc/INfcAdapterExtras;->setCardEmulationRoute(Ljava/lang/String;I)V
Landroid/nfc/INfcAdapterExtras;->transceive(Ljava/lang/String;[B)Landroid/os/Bundle;
-Landroid/opengl/EGL14;->eglGetDisplay(J)Landroid/opengl/EGLDisplay;
-Landroid/opengl/GLES20;->glGetActiveAttrib(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V
-Landroid/opengl/GLES20;->glGetActiveUniform(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V
-Landroid/opengl/GLSurfaceView$EglHelper;->mEglContext:Ljavax/microedition/khronos/egl/EGLContext;
-Landroid/opengl/GLSurfaceView$GLThread;->mEglHelper:Landroid/opengl/GLSurfaceView$EglHelper;
-Landroid/opengl/GLSurfaceView;->mGLThread:Landroid/opengl/GLSurfaceView$GLThread;
-Landroid/opengl/GLSurfaceView;->mRenderer:Landroid/opengl/GLSurfaceView$Renderer;
Landroid/os/AsyncResult;->forMessage(Landroid/os/Message;)Landroid/os/AsyncResult;
Landroid/os/AsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;
Landroid/os/AsyncTask;->mStatus:Landroid/os/AsyncTask$Status;
@@ -5233,7 +5128,6 @@ Landroid/view/View;->ensureTransformationInfo()V
Landroid/view/View;->findViewByAccessibilityId(I)Landroid/view/View;
Landroid/view/View;->fitsSystemWindows()Z
Landroid/view/View;->gatherTransparentRegion(Landroid/graphics/Region;)Z
-Landroid/view/View;->getAccessibilityDelegate()Landroid/view/View$AccessibilityDelegate;
Landroid/view/View;->getAccessibilityViewId()I
Landroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;)V
Landroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;Z)V
@@ -5329,12 +5223,6 @@ Landroid/view/View;->removePerformClickCallback()V
Landroid/view/View;->requestAccessibilityFocus()Z
Landroid/view/View;->resetDisplayList()V
Landroid/view/View;->resetPaddingToInitialValues()V
-Landroid/view/View;->resetResolvedDrawables()V
-Landroid/view/View;->resetResolvedLayoutDirection()V
-Landroid/view/View;->resetResolvedPadding()V
-Landroid/view/View;->resetResolvedTextAlignment()V
-Landroid/view/View;->resetResolvedTextDirection()V
-Landroid/view/View;->resetRtlProperties()V
Landroid/view/View;->resolvePadding()V
Landroid/view/View;->setAlphaNoInvalidation(F)Z
Landroid/view/View;->setAnimationMatrix(Landroid/graphics/Matrix;)V
@@ -5342,7 +5230,6 @@ Landroid/view/View;->setAssistBlocked(Z)V
Landroid/view/View;->setDisabledSystemUiVisibility(I)V
Landroid/view/View;->setFlags(II)V
Landroid/view/View;->setFrame(IIII)Z
-Landroid/view/View;->setIsRootNamespace(Z)V
Landroid/view/View;->setLeftTopRightBottom(IIII)V
Landroid/view/View;->setTagInternal(ILjava/lang/Object;)V
Landroid/view/View;->setTransitionAlpha(F)V
@@ -5356,7 +5243,6 @@ Landroid/view/View;->toLocalMotionEvent(Landroid/view/MotionEvent;)Z
Landroid/view/View;->transformMatrixToGlobal(Landroid/graphics/Matrix;)V
Landroid/view/View;->transformMatrixToLocal(Landroid/graphics/Matrix;)V
Landroid/view/View;->updateDisplayListIfDirty()Landroid/view/RenderNode;
-Landroid/view/ViewConfiguration;->getDeviceGlobalActionKeyTimeout()J
Landroid/view/ViewConfiguration;->getDoubleTapMinTime()I
Landroid/view/ViewConfiguration;->getDoubleTapSlop()I
Landroid/view/ViewConfiguration;->getHoverTapSlop()I
@@ -5405,11 +5291,6 @@ Landroid/view/ViewGroup;->offsetChildrenTopAndBottom(I)V
Landroid/view/ViewGroup;->onChildVisibilityChanged(Landroid/view/View;II)V
Landroid/view/ViewGroup;->onInitializeAccessibilityNodeInfoInternal(Landroid/view/accessibility/AccessibilityNodeInfo;)V
Landroid/view/ViewGroup;->removeTransientView(Landroid/view/View;)V
-Landroid/view/ViewGroup;->resetResolvedDrawables()V
-Landroid/view/ViewGroup;->resetResolvedLayoutDirection()V
-Landroid/view/ViewGroup;->resetResolvedPadding()V
-Landroid/view/ViewGroup;->resetResolvedTextAlignment()V
-Landroid/view/ViewGroup;->resetResolvedTextDirection()V
Landroid/view/ViewGroup;->resolvePadding()V
Landroid/view/ViewGroup;->suppressLayout(Z)V
Landroid/view/ViewGroup;->transformPointToViewLocal([FLandroid/view/View;)V
diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt
index 4b4250d12e9c..40cec6b4065f 100644
--- a/config/hiddenapi-vendor-list.txt
+++ b/config/hiddenapi-vendor-list.txt
@@ -55,15 +55,6 @@ Landroid/app/TaskStackListener;->onTaskSnapshotChanged(ILandroid/app/ActivityMan
Landroid/app/TaskStackListener;->onTaskStackChanged()V
Landroid/app/WallpaperColors;-><init>(Landroid/graphics/Color;Landroid/graphics/Color;Landroid/graphics/Color;I)V
Landroid/bluetooth/IBluetooth;->sendConnectionStateChange(Landroid/bluetooth/BluetoothDevice;III)V
-Landroid/companion/AssociationRequest;->getDeviceFilters()Ljava/util/List;
-Landroid/companion/AssociationRequest;->isSingleDevice()Z
-Landroid/companion/BluetoothDeviceFilter;->getAddress()Ljava/lang/String;
-Landroid/companion/BluetoothDeviceFilterUtils;->getDeviceDisplayNameInternal(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
-Landroid/companion/BluetoothDeviceFilterUtils;->getDeviceDisplayNameInternal(Landroid/net/wifi/ScanResult;)Ljava/lang/String;
-Landroid/companion/BluetoothDeviceFilterUtils;->getDeviceMacAddress(Landroid/os/Parcelable;)Ljava/lang/String;
-Landroid/companion/BluetoothLeDeviceFilter;->getScanFilter()Landroid/bluetooth/le/ScanFilter;
-Landroid/companion/DeviceFilter;->getDeviceDisplayName(Landroid/os/Parcelable;)Ljava/lang/String;
-Landroid/companion/DeviceFilter;->matches(Landroid/os/Parcelable;)Z
Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V
Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelected(Ljava/lang/String;ILjava/lang/String;)V
Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelectionCancel()V
@@ -89,8 +80,6 @@ Landroid/content/pm/IPackageManager;->getApplicationInfo(Ljava/lang/String;II)La
Landroid/content/pm/IPackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
Landroid/content/pm/IPackageManager;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
Landroid/content/pm/IPackageStatsObserver;->onGetStatsCompleted(Landroid/content/pm/PackageStats;Z)V
-Landroid/database/sqlite/SqliteWrapper;->insert(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;
-Landroid/database/sqlite/SqliteWrapper;->query(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
Landroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
Landroid/location/IGeocodeProvider;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
Landroid/location/IGeocodeProvider;->getFromLocationName(Ljava/lang/String;DDDDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
@@ -99,7 +88,6 @@ Landroid/location/ILocationManager;->getNetworkProviderPackage()Ljava/lang/Strin
Landroid/location/ILocationManager;->reportLocation(Landroid/location/Location;Z)V
Landroid/location/INetInitiatedListener$Stub;-><init>()V
Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z
-Landroid/location/Location;->setExtraLocation(Ljava/lang/String;Landroid/location/Location;)V
Landroid/media/AudioManager;->registerAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
Landroid/media/AudioManager;->unregisterAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
Landroid/media/AudioSystem;->checkAudioFlinger()I
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 2a3fc04b2451..66524ed76aba 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1355,14 +1355,69 @@ public final class ActivityThread extends ClientTransactionHandler {
IoUtils.closeQuietly(pfd);
}
- private void dumpDatabaseInfo(ParcelFileDescriptor pfd, String[] args) {
+ private File getDatabasesDir(Context context) {
+ // There's no simple way to get the databases/ path, so do it this way.
+ return context.getDatabasePath("a").getParentFile();
+ }
+
+ private void dumpDatabaseInfo(ParcelFileDescriptor pfd, String[] args, boolean isSystem) {
PrintWriter pw = new FastPrintWriter(
new FileOutputStream(pfd.getFileDescriptor()));
PrintWriterPrinter printer = new PrintWriterPrinter(pw);
SQLiteDebug.dump(printer, args);
+
+ if (isSystem) {
+ dumpDatabaseFileSizes(pw, Environment.getDataSystemDirectory(), true);
+ dumpDatabaseFileSizes(pw, Environment.getDataSystemDeDirectory(), true);
+ dumpDatabaseFileSizes(pw, Environment.getDataSystemCeDirectory(), true);
+ } else {
+ Context context = getApplication();
+ if (context != null) {
+ dumpDatabaseFileSizes(pw,
+ getDatabasesDir(context.createDeviceProtectedStorageContext()),
+ false);
+ dumpDatabaseFileSizes(pw,
+ getDatabasesDir(context.createCredentialProtectedStorageContext()),
+ false);
+ }
+ }
pw.flush();
}
+ private void dumpDatabaseFileSizes(PrintWriter pw, File dir, boolean isSystem) {
+ final File[] files = dir.listFiles();
+ if (files == null || files.length == 0) {
+ return;
+ }
+ Arrays.sort(files, (a, b) -> a.getName().compareTo(b.getName()));
+
+ boolean needHeader = true;
+ for (File f : files) {
+ if (isSystem) {
+ // If it's the system server, the directory contains other files too, so
+ // filter by file extensions.
+ // (If it's an app, just print all files because they may not use *.db
+ // extension.)
+ final String name = f.getName();
+ if (!(name.endsWith(".db") || name.endsWith(".db-wal")
+ || name.endsWith(".db-journal"))) {
+ continue;
+ }
+ }
+ if (needHeader) {
+ pw.println();
+ pw.println("Database files in " + dir.getAbsolutePath() + ":");
+ needHeader = false;
+ }
+
+ pw.print(" ");
+ pw.print(f.getName());
+ pw.print(" ");
+ pw.print(f.length());
+ pw.println(" bytes");
+ }
+ }
+
@Override
public void dumpDbInfo(final ParcelFileDescriptor pfd, final String[] args) {
if (mSystemThread) {
@@ -1383,14 +1438,14 @@ public final class ActivityThread extends ClientTransactionHandler {
@Override
public void run() {
try {
- dumpDatabaseInfo(dup, args);
+ dumpDatabaseInfo(dup, args, true);
} finally {
IoUtils.closeQuietly(dup);
}
}
});
} else {
- dumpDatabaseInfo(pfd, args);
+ dumpDatabaseInfo(pfd, args, false);
IoUtils.closeQuietly(pfd);
}
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 74d3c0df87ad..a1e3aff66426 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -7860,8 +7860,8 @@ public class Notification implements Parcelable
final int N = mActionsToShowInCompact == null
? 0
: Math.min(mActionsToShowInCompact.length, MAX_MEDIA_BUTTONS_IN_COMPACT);
+ view.removeAllViews(com.android.internal.R.id.media_actions);
if (N > 0) {
- view.removeAllViews(com.android.internal.R.id.media_actions);
for (int i = 0; i < N; i++) {
if (i >= numActions) {
throw new IllegalArgumentException(String.format(
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 03fd139e12ff..09d0c5333069 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -602,6 +602,13 @@ public final class NotificationChannel implements Parcelable {
/**
* @hide
*/
+ public boolean isImportanceLocked() {
+ return (mUserLockedFields & USER_LOCKED_IMPORTANCE) != 0;
+ }
+
+ /**
+ * @hide
+ */
public void populateFromXmlForRestore(XmlPullParser parser, Context context) {
populateFromXml(parser, true, context);
}
diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java
index 49cc498cffa2..f003d4bea028 100644
--- a/core/java/android/appwidget/AppWidgetHost.java
+++ b/core/java/android/appwidget/AppWidgetHost.java
@@ -18,6 +18,7 @@ package android.appwidget;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -53,14 +54,17 @@ public class AppWidgetHost {
static final int HANDLE_UPDATE = 1;
static final int HANDLE_PROVIDER_CHANGED = 2;
static final int HANDLE_PROVIDERS_CHANGED = 3;
+ @UnsupportedAppUsage
static final int HANDLE_VIEW_DATA_CHANGED = 4;
final static Object sServiceLock = new Object();
+ @UnsupportedAppUsage
static IAppWidgetService sService;
static boolean sServiceInitialized = false;
private DisplayMetrics mDisplayMetrics;
private String mContextOpPackageName;
+ @UnsupportedAppUsage
private final Handler mHandler;
private final int mHostId;
private final Callbacks mCallbacks;
@@ -156,6 +160,7 @@ public class AppWidgetHost {
/**
* @hide
*/
+ @UnsupportedAppUsage
public AppWidgetHost(Context context, int hostId, OnClickHandler handler, Looper looper) {
mContextOpPackageName = context.getOpPackageName();
mHostId = hostId;
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index ab0eb92e1726..a9187b65a359 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -16,6 +16,7 @@
package android.appwidget;
+import android.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -70,7 +71,9 @@ public class AppWidgetHostView extends FrameLayout {
Context mContext;
Context mRemoteContext;
+ @UnsupportedAppUsage
int mAppWidgetId;
+ @UnsupportedAppUsage
AppWidgetProviderInfo mInfo;
View mView;
int mViewMode = VIEW_MODE_NOINIT;
@@ -174,6 +177,7 @@ public class AppWidgetHostView extends FrameLayout {
return getDefaultPaddingForWidget(context, appInfo, padding);
}
+ @UnsupportedAppUsage
private static Rect getDefaultPaddingForWidget(Context context, ApplicationInfo appInfo,
Rect padding) {
if (padding == null) {
@@ -284,6 +288,7 @@ public class AppWidgetHostView extends FrameLayout {
/**
* @hide
*/
+ @UnsupportedAppUsage
public void updateAppWidgetSize(Bundle newOptions, int minWidth, int minHeight, int maxWidth,
int maxHeight, boolean ignorePadding) {
if (newOptions == null) {
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 20248b90d1e9..dbc1c199cb4d 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -23,6 +23,7 @@ import android.annotation.RequiresFeature;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemService;
+import android.annotation.UnsupportedAppUsage;
import android.app.IServiceConnection;
import android.app.PendingIntent;
import android.content.ComponentName;
@@ -463,6 +464,7 @@ public class AppWidgetManager {
private final Context mContext;
private final String mPackageName;
+ @UnsupportedAppUsage
private final IAppWidgetService mService;
private final DisplayMetrics mDisplayMetrics;
@@ -816,6 +818,7 @@ public class AppWidgetManager {
*
* @hide
*/
+ @UnsupportedAppUsage
public List<AppWidgetProviderInfo> getInstalledProviders(int categoryFilter) {
if (mService == null) {
return Collections.emptyList();
@@ -842,6 +845,7 @@ public class AppWidgetManager {
*
* @hide
*/
+ @UnsupportedAppUsage
public List<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter,
@Nullable UserHandle profile, @Nullable String packageName) {
if (mService == null) {
@@ -902,6 +906,7 @@ public class AppWidgetManager {
* provider for this AppWidget.
* @hide
*/
+ @UnsupportedAppUsage
public void bindAppWidgetId(int appWidgetId, ComponentName provider) {
if (mService == null) {
return;
@@ -924,6 +929,7 @@ public class AppWidgetManager {
*
* @hide
*/
+ @UnsupportedAppUsage
public void bindAppWidgetId(int appWidgetId, ComponentName provider, Bundle options) {
if (mService == null) {
return;
@@ -1094,6 +1100,7 @@ public class AppWidgetManager {
* @see Context#getServiceDispatcher(ServiceConnection, Handler, int)
* @hide
*/
+ @UnsupportedAppUsage
public boolean bindRemoteViewsService(Context context, int appWidgetId, Intent intent,
IServiceConnection connection, @Context.BindServiceFlags int flags) {
if (mService == null) {
@@ -1139,6 +1146,7 @@ public class AppWidgetManager {
}
}
+ @UnsupportedAppUsage
private boolean bindAppWidgetIdIfAllowed(int appWidgetId, int profileId,
ComponentName provider, Bundle options) {
if (mService == null) {
diff --git a/core/java/android/appwidget/AppWidgetManagerInternal.java b/core/java/android/appwidget/AppWidgetManagerInternal.java
index 7ab3d8bdd857..5694ca860453 100644
--- a/core/java/android/appwidget/AppWidgetManagerInternal.java
+++ b/core/java/android/appwidget/AppWidgetManagerInternal.java
@@ -16,12 +16,9 @@
package android.appwidget;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.ArraySet;
-import java.util.Set;
-
/**
* App widget manager local system service interface.
*
@@ -36,4 +33,13 @@ public abstract class AppWidgetManagerInternal {
* @return Whether the UID hosts widgets from the package.
*/
public abstract @Nullable ArraySet<String> getHostedWidgetPackages(int uid);
+
+ /**
+ * Execute the widget-related work of unlocking a user. This is intentionally
+ * invoked just <em>before</em> the boot-completed broadcast is issued, after
+ * the data-related work of unlock has completed.
+ *
+ * @param userId The user that is being unlocked.
+ */
+ public abstract void unlockUser(int userId);
}
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index 6dd85caad628..53315cce82dd 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -18,6 +18,7 @@ package android.appwidget;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.UnsupportedAppUsage;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
@@ -270,6 +271,7 @@ public class AppWidgetProviderInfo implements Parcelable {
public int widgetFeatures;
/** @hide */
+ @UnsupportedAppUsage
public ActivityInfo providerInfo;
public AppWidgetProviderInfo() {
diff --git a/core/java/android/companion/AssociationRequest.java b/core/java/android/companion/AssociationRequest.java
index 922224a5d718..db54f08d815c 100644
--- a/core/java/android/companion/AssociationRequest.java
+++ b/core/java/android/companion/AssociationRequest.java
@@ -18,6 +18,7 @@ package android.companion;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.OneTimeUseBuilder;
@@ -59,12 +60,14 @@ public final class AssociationRequest implements Parcelable {
}
/** @hide */
+ @UnsupportedAppUsage
public boolean isSingleDevice() {
return mSingleDevice;
}
/** @hide */
@NonNull
+ @UnsupportedAppUsage
public List<DeviceFilter<?>> getDeviceFilters() {
return mDeviceFilters;
}
diff --git a/core/java/android/companion/BluetoothDeviceFilter.java b/core/java/android/companion/BluetoothDeviceFilter.java
index 84e15364c191..7507e174a749 100644
--- a/core/java/android/companion/BluetoothDeviceFilter.java
+++ b/core/java/android/companion/BluetoothDeviceFilter.java
@@ -25,6 +25,7 @@ import static android.companion.BluetoothDeviceFilterUtils.patternToString;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.bluetooth.BluetoothDevice;
import android.os.Parcel;
import android.os.ParcelUuid;
@@ -99,6 +100,7 @@ public final class BluetoothDeviceFilter implements DeviceFilter<BluetoothDevice
/** @hide */
@Nullable
+ @UnsupportedAppUsage
public String getAddress() {
return mAddress;
}
diff --git a/core/java/android/companion/BluetoothDeviceFilterUtils.java b/core/java/android/companion/BluetoothDeviceFilterUtils.java
index 4ee38fe4990e..bd507a6b8bcc 100644
--- a/core/java/android/companion/BluetoothDeviceFilterUtils.java
+++ b/core/java/android/companion/BluetoothDeviceFilterUtils.java
@@ -21,6 +21,7 @@ import static android.text.TextUtils.firstNotEmpty;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.ScanFilter;
import android.net.wifi.ScanResult;
@@ -124,14 +125,17 @@ public class BluetoothDeviceFilterUtils {
Log.i(LOG_TAG, getDeviceDisplayNameInternal(device) + (result ? " ~ " : " !~ ") + criteria);
}
+ @UnsupportedAppUsage
public static String getDeviceDisplayNameInternal(@NonNull BluetoothDevice device) {
return firstNotEmpty(device.getAliasName(), device.getAddress());
}
+ @UnsupportedAppUsage
public static String getDeviceDisplayNameInternal(@NonNull ScanResult device) {
return firstNotEmpty(device.SSID, device.BSSID);
}
+ @UnsupportedAppUsage
public static String getDeviceMacAddress(@NonNull Parcelable device) {
if (device instanceof BluetoothDevice) {
return ((BluetoothDevice) device).getAddress();
diff --git a/core/java/android/companion/BluetoothLeDeviceFilter.java b/core/java/android/companion/BluetoothLeDeviceFilter.java
index 7fb768c67386..1de931eeb675 100644
--- a/core/java/android/companion/BluetoothLeDeviceFilter.java
+++ b/core/java/android/companion/BluetoothLeDeviceFilter.java
@@ -25,6 +25,7 @@ import static com.android.internal.util.Preconditions.checkState;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanRecord;
@@ -92,6 +93,7 @@ public final class BluetoothLeDeviceFilter implements DeviceFilter<ScanResult> {
/** @hide */
@NonNull
+ @UnsupportedAppUsage
public ScanFilter getScanFilter() {
return mScanFilter;
}
diff --git a/core/java/android/companion/DeviceFilter.java b/core/java/android/companion/DeviceFilter.java
index 10135a451dda..dc7cf82613e6 100644
--- a/core/java/android/companion/DeviceFilter.java
+++ b/core/java/android/companion/DeviceFilter.java
@@ -19,6 +19,7 @@ package android.companion;
import android.annotation.IntDef;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.os.Parcelable;
import java.lang.annotation.Retention;
@@ -44,9 +45,11 @@ public interface DeviceFilter<D extends Parcelable> extends Parcelable {
*
* @hide
*/
+ @UnsupportedAppUsage
boolean matches(D device);
/** @hide */
+ @UnsupportedAppUsage
String getDeviceDisplayName(D device);
/** @hide */
diff --git a/core/java/android/content/ContentValues.java b/core/java/android/content/ContentValues.java
index 93fa403b760b..b06dd7ae7b32 100644
--- a/core/java/android/content/ContentValues.java
+++ b/core/java/android/content/ContentValues.java
@@ -21,9 +21,12 @@ import android.os.Parcelable;
import android.util.ArrayMap;
import android.util.Log;
+import com.android.internal.util.Preconditions;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
/**
@@ -55,6 +58,7 @@ public final class ContentValues implements Parcelable {
* @param size the initial size of the set of values
*/
public ContentValues(int size) {
+ Preconditions.checkArgumentNonnegative(size);
mMap = new ArrayMap<>(size);
}
@@ -64,6 +68,7 @@ public final class ContentValues implements Parcelable {
* @param from the values to copy
*/
public ContentValues(ContentValues from) {
+ Objects.requireNonNull(from);
mMap = new ArrayMap<>(from.mMap);
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index c0b3400d835d..272cc2820d21 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -5647,10 +5647,8 @@ public abstract class PackageManager {
* @return {@code true} if the given package is suspended, {@code false} otherwise
* @throws NameNotFoundException if the package could not be found.
*
- * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
- * @hide
+ * @see #isPackageSuspended()
*/
- @SystemApi
public boolean isPackageSuspended(String packageName) throws NameNotFoundException {
throw new UnsupportedOperationException("isPackageSuspended not implemented");
}
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index a2a483280123..823d9951862c 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -31,6 +31,7 @@ import android.util.SparseArray;
import com.android.internal.util.function.TriFunction;
+import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
@@ -680,4 +681,20 @@ public abstract class PackageManagerInternal {
* @return a SparseArray mapping from appId to it's sharedUserId.
*/
public abstract SparseArray<String> getAppsWithSharedUserIds();
+
+ /**
+ * Return if device is currently in a "core" boot environment, typically
+ * used to support full-disk encryption. Only apps marked with
+ * {@code coreApp} attribute are available.
+ */
+ public abstract boolean isOnlyCoreApps();
+
+ /**
+ * Make a best-effort attempt to provide the requested free disk space by
+ * deleting cached files.
+ *
+ * @throws IOException if the request was unable to be fulfilled.
+ */
+ public abstract void freeStorage(String volumeUuid, long bytes, int storageFlags)
+ throws IOException;
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index b4e9ad11ddfd..306e4534e0c4 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -2507,6 +2507,49 @@ public class PackageParser {
if (pkg.applicationInfo.usesCompatibilityMode()) {
adjustPackageToBeUnresizeableAndUnpipable(pkg);
}
+
+ // If the storage model feature flag is disabled, we need to fiddle
+ // around with permission definitions to return us to pre-Q behavior.
+ // STOPSHIP(b/112545973): remove once feature enabled by default
+ if (!SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
+ if ("android".equals(pkg.packageName)) {
+ final ArraySet<String> newGroups = new ArraySet<>();
+ newGroups.add(android.Manifest.permission_group.MEDIA_AURAL);
+ newGroups.add(android.Manifest.permission_group.MEDIA_VISUAL);
+
+ for (int i = pkg.permissionGroups.size() - 1; i >= 0; i--) {
+ final PermissionGroup pg = pkg.permissionGroups.get(i);
+ if (newGroups.contains(pg.info.name)) {
+ pkg.permissionGroups.remove(i);
+ }
+ }
+
+ final ArraySet<String> newPermissions = new ArraySet<>();
+ newPermissions.add(android.Manifest.permission.READ_MEDIA_AUDIO);
+ newPermissions.add(android.Manifest.permission.WRITE_MEDIA_AUDIO);
+ newPermissions.add(android.Manifest.permission.READ_MEDIA_VIDEO);
+ newPermissions.add(android.Manifest.permission.WRITE_MEDIA_VIDEO);
+ newPermissions.add(android.Manifest.permission.READ_MEDIA_IMAGES);
+ newPermissions.add(android.Manifest.permission.WRITE_MEDIA_IMAGES);
+ newPermissions.add(android.Manifest.permission.ACCESS_MEDIA_LOCATION);
+ newPermissions.add(android.Manifest.permission.WRITE_OBB);
+
+ final ArraySet<String> dangerousPermissions = new ArraySet<>();
+ dangerousPermissions.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
+ dangerousPermissions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+ for (int i = pkg.permissions.size() - 1; i >= 0; i--) {
+ final Permission p = pkg.permissions.get(i);
+ if (newPermissions.contains(p.info.name)) {
+ pkg.permissions.remove(i);
+ } else if (dangerousPermissions.contains(p.info.name)) {
+ p.info.protectionLevel &= ~PermissionInfo.PROTECTION_MASK_BASE;
+ p.info.protectionLevel |= PermissionInfo.PROTECTION_DANGEROUS;
+ }
+ }
+ }
+ }
+
return pkg;
}
diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java
index 25e0ccd8d551..36849e63eeb3 100644
--- a/core/java/android/content/pm/ShortcutManager.java
+++ b/core/java/android/content/pm/ShortcutManager.java
@@ -20,7 +20,6 @@ import android.annotation.Nullable;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.annotation.UserIdInt;
-import android.app.Activity;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.Intent;
@@ -29,256 +28,23 @@ import android.graphics.drawable.AdaptiveIconDrawable;
import android.os.Build.VERSION_CODES;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.UserHandle;
import com.android.internal.annotations.VisibleForTesting;
import java.util.List;
/**
- * The ShortcutManager performs operations on an app's set of <em>shortcuts</em>. The
- * {@link ShortcutInfo} class contains information about each of the shortcuts themselves.
+ * <p><code>ShortcutManager</code> executes operations on an app's set of <i>shortcuts</i>, which
+ * represent specific tasks and actions that users can perform within your app. This page lists
+ * components of the <code>ShortcutManager</code> class that you can use to create and manage
+ * sets of shortcuts.
*
- * <p>An app's shortcuts represent specific tasks and actions that users can perform within your
- * app. When a user selects a shortcut in the currently-active launcher, your app opens an activity
- * other than the app's starting activity, provided that the currently-active launcher supports app
- * shortcuts.</p>
+ * <p>To learn about methods that retrieve information about a single shortcut&mdash;including
+ * identifiers, type, and status&mdash;read the <code>
+ * <a href="/reference/android/content/pm/ShortcutInfo.html">ShortcutInfo</a></code> reference.
*
- * <p>The types of shortcuts that you create for your app depend on the app's key use cases. For
- * example, an email app may publish the "compose new email" shortcut, which allows the app to
- * directly open the compose activity.</p>
- *
- * <p class="note"><b>Note:</b> Only main activities&mdash;activities that handle the
- * {@link Intent#ACTION_MAIN} action and the {@link Intent#CATEGORY_LAUNCHER} category&mdash;can
- * have shortcuts. If an app has multiple main activities, you need to define the set of shortcuts
- * for <em>each</em> activity.
- *
- * <p>This page discusses the implementation details of the <code>ShortcutManager</code> class. For
- * definitions of key terms and guidance on performing operations on shortcuts within your app, see
- * the <a href="/guide/topics/ui/shortcuts.html">App Shortcuts</a> feature guide.
- *
- * <h3>Shortcut characteristics</h3>
- *
- * This section describes in-depth details about each shortcut type's usage and availability.
- *
- * <p class="note"><b>Important security note:</b> All shortcut information is stored in
- * <a href="/training/articles/direct-boot.html">credential encrypted storage</a>, so your app
- * cannot access a user's shortcuts until after they've unlocked the device.
- *
- * <h4>Static and dynamic shortcuts</h4>
- *
- * <p>Static shortcuts and dynamic shortcuts are shown in a supported launcher when the user
- * performs a specific gesture. On currently-supported launchers, the gesture is a long-press on the
- * app's launcher icon, but the actual gesture may be different on other launcher apps.
- *
- * <p>The {@link LauncherApps} class provides APIs for launcher apps to access shortcuts.
- *
- * <h4>Pinned shortcuts</h4>
- *
- * <p>Because pinned shortcuts appear in the launcher itself, they're always visible. A pinned
- * shortcut is removed from the launcher only in the following situations:
- * <ul>
- * <li>The user removes it.
- * <li>The publisher app associated with the shortcut is uninstalled.
- * <li>The user selects <b>Clear data</b> from the publisher app's <i>Storage</i> screen, within
- * the system's <b>Settings</b> app.
- * </ul>
- *
- * <p>Because the system performs
- * <a href="/guide/topics/ui/shortcuts.html#backup-and-restore">backup and restore</a> on pinned
- * shortcuts automatically, these shortcuts' IDs should contain either stable, constant strings or
- * server-side identifiers, rather than identifiers generated locally that might not make sense on
- * other devices.
- *
- * <h3>Shortcut display order</h3>
- *
- * <p>When the launcher displays an app's shortcuts, they should appear in the following order:
- *
- * <ol>
- * <li><b>Static shortcuts:</b> Shortcuts whose {@link ShortcutInfo#isDeclaredInManifest()} method
- * returns {@code true}.</li>
- * <li><b>Dynamic shortcuts:</b> Shortcuts whose {@link ShortcutInfo#isDynamic()} method returns
- * {@code true}.</li>
- * </ol>
- *
- * <p>Within each shortcut type (static and dynamic), shortcuts are sorted in order of increasing
- * rank according to {@link ShortcutInfo#getRank()}.</p>
- *
- * <h4>Shortcut ranks</h4>
- *
- * <p>Shortcut ranks are non-negative, sequential integers that determine the order in which
- * shortcuts appear, assuming that the shortcuts are all in the same category. You can update ranks
- * of existing shortcuts when you call {@link #updateShortcuts(List)},
- * {@link #addDynamicShortcuts(List)}, or {@link #setDynamicShortcuts(List)}.
- *
- * <p class="note"><b>Note:</b> Ranks are auto-adjusted so that they're unique for each type of
- * shortcut (static or dynamic). For example, if there are 3 dynamic shortcuts with ranks 0, 1 and
- * 2, adding another dynamic shortcut with a rank of 1 represents a request to place this shortcut
- * at the second position. In response, the third and fourth shortcuts move closer to the bottom of
- * the shortcut list, with their ranks changing to 2 and 3, respectively.
- *
- * <h3>Options for static shortcuts</h3>
- *
- * The following list includes descriptions for the different attributes within a static shortcut.
- * You must provide a value for {@code android:shortcutId} and {@code android:shortcutShortLabel};
- * all other values are optional.
- *
- * <dl>
- * <dt>{@code android:shortcutId}</dt>
- * <dd><p>A string literal, which represents the shortcut when a {@code ShortcutManager} object
- * performs operations on it.</p>
- * <p class="note"><b>Note: </b>You cannot set this attribute's value to a resource string, such
- * as <code>@string/foo</code>.</p>
- * </dd>
- *
- * <dt>{@code android:enabled}</dt>
- * <dd><p>Whether the user can interact with the shortcut from a supported launcher.</p>
- * <p>The default value is {@code true}. If you set it to {@code false}, you should also set
- * {@code android:shortcutDisabledMessage} to a message that explains why you've disabled the
- * shortcut. If you don't think you need to provide such a message, it's easiest to just remove
- * the shortcut from the XML file entirely, rather than changing the values of the shortcut's
- * {@code android:enabled} and {@code android:shortcutDisabledMessage} attributes.
- * </dd>
- *
- * <dt>{@code android:icon}</dt>
- * <dd><p>The <a href="/topic/performance/graphics/index.html">bitmap</a> or
- * <a href="/guide/practices/ui_guidelines/icon_design_adaptive.html">adaptive icon</a> that the
- * launcher uses when displaying the shortcut to the user. This value can be either the path to an
- * image or the resource file that contains the image. Use adaptive icons whenever possible to
- * improve performance and consistency.</p>
- * <p class="note"><b>Note: </b>Shortcut icons cannot include
- * <a href="/training/material/drawables.html#DrawableTint">tints</a>.
- * </dd>
- *
- * <dt>{@code android:shortcutShortLabel}</dt>
- * <dd><p>A concise phrase that describes the shortcut's purpose. For more information, see
- * {@link ShortcutInfo.Builder#setShortLabel(CharSequence)}.</p>
- * <p class="note"><b>Note: </b>This attribute's value must be a resource string, such as
- * <code>@string/shortcut_short_label</code>.</p>
- * </dd>
- *
- * <dt>{@code android:shortcutLongLabel}</dt>
- * <dd><p>An extended phrase that describes the shortcut's purpose. If there's enough space, the
- * launcher displays this value instead of {@code android:shortcutShortLabel}. For more
- * information, see {@link ShortcutInfo.Builder#setLongLabel(CharSequence)}.</p>
- * <p class="note"><b>Note: </b>This attribute's value must be a resource string, such as
- * <code>@string/shortcut_long_label</code>.</p>
- * </dd>
- *
- * <dt>{@code android:shortcutDisabledMessage}</dt>
- * <dd><p>The message that appears in a supported launcher when the user attempts to launch a
- * disabled shortcut. The message should explain to the user why the shortcut is now disabled.
- * This attribute's value has no effect if {@code android:enabled} is {@code true}.</p>
- * <p class="note"><b>Note: </b>This attribute's value must be a resource string, such as
- * <code>@string/shortcut_disabled_message</code>.</p>
- * </dd>
- * </dl>
- *
- * <h3>Inner elements that define static shortcuts</h3>
- *
- * <p>The XML file that lists an app's static shortcuts supports the following elements inside each
- * {@code <shortcut>} element. You must include an {@code intent} inner element for each
- * static shortcut that you define.</p>
- *
- * <dl>
- * <dt>{@code intent}</dt>
- * <dd><p>The action that the system launches when the user selects the shortcut. This intent must
- * provide a value for the {@code android:action} attribute.</p>
- * <p>You can provide multiple intents for a single shortcut. If you do so, the last defined
- * activity is launched, and the other activities are placed in the
- * <a href="/guide/components/tasks-and-back-stack.html">back stack</a>. See
- * <a href="/guide/topics/ui/shortcuts.html#static">Using Static Shortcuts</a> and the
- * {@link android.app.TaskStackBuilder} class reference for details.</p>
- * <p class="note"><b>Note:</b> This {@code intent} element cannot include string resources.</p>
- * <p>To learn more about how to configure intents, see
- * <a href="{@docRoot}guide/topics/ui/settings.html#Intents">Using intents</a>.</p>
- * </dd>
- *
- * <dt>{@code categories}</dt>
- * <dd><p>Provides a grouping for the types of actions that your app's shortcuts perform, such as
- * creating new chat messages.</p>
- * <p>For a list of supported shortcut categories, see the {@link ShortcutInfo} class reference
- * for a list of supported shortcut categories.
- * </dd>
- * </dl>
- *
- * <h3>Updating shortcuts</h3>
- *
- * <p>Each app's launcher icon can contain at most {@link #getMaxShortcutCountPerActivity()} number
- * of static and dynamic shortcuts combined. There is no limit to the number of pinned shortcuts
- * that an app can create, though.
- *
- * <p>When a dynamic shortcut is pinned, even when the publisher removes it as a dynamic shortcut,
- * the pinned shortcut is still visible and launchable. This allows an app to have more than
- * {@link #getMaxShortcutCountPerActivity()} number of shortcuts.
- *
- * <p>As an example, suppose {@link #getMaxShortcutCountPerActivity()} is 5:
- * <ol>
- * <li>A chat app publishes 5 dynamic shortcuts for the 5 most recent
- * conversations (c1, c2, ..., c5).
- *
- * <li>The user pins all 5 of the shortcuts.
- *
- * <li>Later, the user has started 3 additional conversations (c6, c7, and c8), so the publisher
- * app re-publishes its dynamic shortcuts. The new dynamic shortcut list is: c4, c5, ..., c8.
- * <p>The publisher app has to remove c1, c2, and c3 because it can't have more than 5 dynamic
- * shortcuts. However, c1, c2, and c3 are still pinned shortcuts that the user can access and
- * launch.
- * <p>At this point, the user can access a total of 8 shortcuts that link to activities in the
- * publisher app, including the 3 pinned shortcuts, even though an app can have at most 5
- * dynamic shortcuts.
- *
- * <li>The app can use {@link #updateShortcuts(List)} to update <em>any</em> of the existing
- * 8 shortcuts, when, for example, the chat peers' icons have changed.
- * <p>The {@link #addDynamicShortcuts(List)} and {@link #setDynamicShortcuts(List)} methods
- * can also be used to update existing shortcuts with the same IDs, but they <b>cannot</b> be
- * used for updating non-dynamic, pinned shortcuts because these 2 methods try to convert the
- * given lists of shortcuts to dynamic shortcuts.
- * </ol>
- *
- * <h3>Shortcut intents</h3>
- *
- * <p>
- * Dynamic shortcuts can be published with any set of {@link Intent#addFlags Intent} flags.
- * Typically, {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} is specified, possibly along with other
- * flags; otherwise, if the app is already running, the app is simply brought to
- * the foreground, and the target activity might not appear.
- *
- * <p>Static shortcuts <b>cannot</b> have custom intent flags.
- * The first intent of a static shortcut will always have {@link Intent#FLAG_ACTIVITY_NEW_TASK}
- * and {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} set. This means, when the app is already running, all
- * the existing activities in your app are destroyed when a static shortcut is launched.
- * If this behavior is not desirable, you can use a <em>trampoline activity</em>, or an invisible
- * activity that starts another activity in {@link Activity#onCreate}, then calls
- * {@link Activity#finish()}:
- * <ol>
- * <li>In the <code>AndroidManifest.xml</code> file, the trampoline activity should include the
- * attribute assignment {@code android:taskAffinity=""}.
- * <li>In the shortcuts resource file, the intent within the static shortcut should reference
- * the trampoline activity.
- * </ol>
- *
- * <h3>Rate limiting</h3>
- *
- * <p>When <a href="/guide/topics/ui/shortcuts.html#rate-limit">rate limiting</a> is active,
- * {@link #isRateLimitingActive()} returns {@code true}.
- *
- * <p>Rate limiting is reset upon certain events, so even background apps can call these APIs until
- * the rate limit is reached again. These events include the following:
- * <ul>
- * <li>An app comes to the foreground.
- * <li>The system locale changes.
- * <li>The user performs the <a href="/guide/topics/ui/notifiers/notifications.html#direct">inline
- * reply</a> action on a notification.
- * </ul>
- *
- * <h3>Handling system locale changes</h3>
- *
- * <p>Apps should update dynamic and pinned shortcuts when they receive the
- * {@link Intent#ACTION_LOCALE_CHANGED} broadcast, indicating that the system locale has changed.
- * <p>When the system locale changes, <a href="/guide/topics/ui/shortcuts.html#rate-limit">rate
- * limiting</a> is reset, so even background apps can add and update dynamic shortcuts until the
- * rate limit is reached again.
+ * <p>For guidance about using shortcuts, see
+ * <a href="/guide/topics/ui/shortcuts/index.html">App shortcuts</a>.
*
* <h3>Retrieving class instances</h3>
* <!-- Provides a heading for the content filled in by the @SystemService annotation below -->
@@ -458,8 +224,9 @@ public class ShortcutManager {
}
/**
- * Disable pinned shortcuts. For more details, see the Javadoc for the {@link ShortcutManager}
- * class.
+ * Disable pinned shortcuts. For more details, read
+ * <a href="/guide/topics/ui/shortcuts/managing-shortcuts.html#disable-shortcuts">
+ * Disable shortcuts</a>.
*
* @throws IllegalArgumentException If trying to disable immutable shortcuts.
*
@@ -498,7 +265,9 @@ public class ShortcutManager {
/**
* Disable pinned shortcuts, showing the user a custom error message when they try to select
* the disabled shortcuts.
- * For more details, see the Javadoc for the {@link ShortcutManager} class.
+ * For more details, read
+ * <a href="/guide/topics/ui/shortcuts/managing-shortcuts.html#disable-shortcuts">
+ * Disable shortcuts</a>.
*
* @throws IllegalArgumentException If trying to disable immutable shortcuts.
*
@@ -586,7 +355,8 @@ public class ShortcutManager {
/**
* Return {@code true} when rate-limiting is active for the caller app.
*
- * <p>See the class level javadoc for details.
+ * <p>For details, see <a href="/guide/topics/ui/shortcuts/managing-shortcuts#rate-limiting">
+ * Rate limiting</a>.
*
* @throws IllegalStateException when the user is locked.
*/
@@ -632,7 +402,9 @@ public class ShortcutManager {
* Apps that publish shortcuts should call this method whenever the user
* selects the shortcut containing the given ID or when the user completes
* an action in the app that is equivalent to selecting the shortcut.
- * For more details, see the Javadoc for the {@link ShortcutManager} class
+ * For more details, read about
+ * <a href="/guide/topics/ui/shortcuts/managing-shortcuts.html#track-usage">
+ * tracking shortcut usage</a>.
*
* <p>The information is accessible via {@link UsageStatsManager#queryEvents}
* Typically, launcher apps use this information to build a prediction model
@@ -700,7 +472,9 @@ public class ShortcutManager {
* @param resultIntent If not null, this intent will be sent when the shortcut is pinned.
* Use {@link android.app.PendingIntent#getIntentSender()} to create an {@link IntentSender}.
* To avoid background execution limits, use an unexported, manifest-declared receiver.
- * For more details, see the overview documentation for the {@link ShortcutManager} class.
+ * For more details, see
+ * <a href="/guide/topics/ui/shortcuts/creating-shortcuts.html#pinned">
+ * Creating pinned shortcuts</a>.
*
* @return {@code TRUE} if the launcher supports this feature. Note the API will return without
* waiting for the user to respond, so getting {@code TRUE} from this API does *not* mean
diff --git a/core/java/android/database/AbstractCursor.java b/core/java/android/database/AbstractCursor.java
index 76fa008799dd..c6c2aa57f533 100644
--- a/core/java/android/database/AbstractCursor.java
+++ b/core/java/android/database/AbstractCursor.java
@@ -16,6 +16,7 @@
package android.database;
+import android.annotation.UnsupportedAppUsage;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Bundle;
@@ -68,6 +69,7 @@ public abstract class AbstractCursor implements CrossProcessCursor {
@Deprecated
protected ContentResolver mContentResolver;
+ @UnsupportedAppUsage
private Uri mNotifyUri;
private final Object mSelfObserverLock = new Object();
@@ -77,6 +79,7 @@ public abstract class AbstractCursor implements CrossProcessCursor {
private final DataSetObservable mDataSetObservable = new DataSetObservable();
private final ContentObservable mContentObservable = new ContentObservable();
+ @UnsupportedAppUsage
private Bundle mExtras = Bundle.EMPTY;
/* -------------------------------------------------------- */
diff --git a/core/java/android/database/AbstractWindowedCursor.java b/core/java/android/database/AbstractWindowedCursor.java
index 083485facb98..a988f0684fca 100644
--- a/core/java/android/database/AbstractWindowedCursor.java
+++ b/core/java/android/database/AbstractWindowedCursor.java
@@ -16,6 +16,8 @@
package android.database;
+import android.annotation.UnsupportedAppUsage;
+
/**
* A base class for Cursors that store their data in {@link CursorWindow}s.
* <p>
@@ -179,6 +181,7 @@ public abstract class AbstractWindowedCursor extends AbstractCursor {
* Closes the cursor window and sets {@link #mWindow} to null.
* @hide
*/
+ @UnsupportedAppUsage
protected void closeWindow() {
if (mWindow != null) {
mWindow.close();
@@ -193,6 +196,7 @@ public abstract class AbstractWindowedCursor extends AbstractCursor {
* @param name The window name.
* @hide
*/
+ @UnsupportedAppUsage
protected void clearOrCreateWindow(String name) {
if (mWindow == null) {
mWindow = new CursorWindow(name);
@@ -203,6 +207,7 @@ public abstract class AbstractWindowedCursor extends AbstractCursor {
/** @hide */
@Override
+ @UnsupportedAppUsage
protected void onDeactivateOrClose() {
super.onDeactivateOrClose();
closeWindow();
diff --git a/core/java/android/database/ContentObserver.java b/core/java/android/database/ContentObserver.java
index 5f01e300bf42..798b7830ac50 100644
--- a/core/java/android/database/ContentObserver.java
+++ b/core/java/android/database/ContentObserver.java
@@ -16,6 +16,7 @@
package android.database;
+import android.annotation.UnsupportedAppUsage;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
@@ -59,6 +60,7 @@ public abstract class ContentObserver {
*
* {@hide}
*/
+ @UnsupportedAppUsage
public IContentObserver releaseContentObserver() {
synchronized (mLock) {
final Transport oldTransport = mTransport;
diff --git a/core/java/android/database/CursorWindow.java b/core/java/android/database/CursorWindow.java
index a748f4d2cbce..d9443d9a3c5f 100644
--- a/core/java/android/database/CursorWindow.java
+++ b/core/java/android/database/CursorWindow.java
@@ -17,6 +17,7 @@
package android.database;
import android.annotation.BytesLong;
+import android.annotation.UnsupportedAppUsage;
import android.content.res.Resources;
import android.database.sqlite.SQLiteClosable;
import android.database.sqlite.SQLiteException;
@@ -45,12 +46,14 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
private static final String STATS_TAG = "CursorWindowStats";
// This static member will be evaluated when first used.
+ @UnsupportedAppUsage
private static int sCursorWindowSize = -1;
/**
* The native CursorWindow object pointer. (FOR INTERNAL USE ONLY)
* @hide
*/
+ @UnsupportedAppUsage
public long mWindowPtr;
private int mStartPos;
@@ -744,6 +747,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
dispose();
}
+ @UnsupportedAppUsage
private static final LongSparseArray<Integer> sWindowToPidMap = new LongSparseArray<Integer>();
private void recordNewWindow(int pid, long window) {
@@ -765,6 +769,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
}
}
+ @UnsupportedAppUsage
private String printStats() {
StringBuilder buff = new StringBuilder();
int myPid = Process.myPid();
diff --git a/core/java/android/database/CursorWrapper.java b/core/java/android/database/CursorWrapper.java
index 63a2792dd5d3..0d27dfb872f0 100644
--- a/core/java/android/database/CursorWrapper.java
+++ b/core/java/android/database/CursorWrapper.java
@@ -16,6 +16,7 @@
package android.database;
+import android.annotation.UnsupportedAppUsage;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Bundle;
@@ -26,6 +27,7 @@ import android.os.Bundle;
*/
public class CursorWrapper implements Cursor {
/** @hide */
+ @UnsupportedAppUsage
protected final Cursor mCursor;
/**
diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java
index 7a8ab60c502d..f78b484e0491 100644
--- a/core/java/android/database/DatabaseUtils.java
+++ b/core/java/android/database/DatabaseUtils.java
@@ -17,6 +17,7 @@
package android.database;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
@@ -321,6 +322,7 @@ public class DatabaseUtils {
* @return object value type
* @hide
*/
+ @UnsupportedAppUsage
public static int getTypeOfObject(Object obj) {
if (obj == null) {
return Cursor.FIELD_TYPE_NULL;
@@ -849,6 +851,7 @@ public class DatabaseUtils {
* the requested row.
* @hide
*/
+ @UnsupportedAppUsage
public static int cursorPickFillWindowStartPosition(
int cursorPosition, int cursorWindowCapacity) {
return Math.max(cursorPosition - cursorWindowCapacity / 3, 0);
diff --git a/core/java/android/database/MatrixCursor.java b/core/java/android/database/MatrixCursor.java
index 5e107f23d3d4..5033296df9fb 100644
--- a/core/java/android/database/MatrixCursor.java
+++ b/core/java/android/database/MatrixCursor.java
@@ -16,6 +16,7 @@
package android.database;
+import android.annotation.UnsupportedAppUsage;
import java.util.ArrayList;
/**
@@ -26,7 +27,9 @@ import java.util.ArrayList;
public class MatrixCursor extends AbstractCursor {
private final String[] columnNames;
+ @UnsupportedAppUsage
private Object[] data;
+ @UnsupportedAppUsage
private int rowCount = 0;
private final int columnCount;
@@ -61,6 +64,7 @@ public class MatrixCursor extends AbstractCursor {
/**
* Gets value at the given column for the current row.
*/
+ @UnsupportedAppUsage
private Object get(int column) {
if (column < 0 || column >= columnCount) {
throw new CursorIndexOutOfBoundsException("Requested column: "
diff --git a/core/java/android/database/RedactingCursor.java b/core/java/android/database/RedactingCursor.java
new file mode 100644
index 000000000000..6322d56ee31f
--- /dev/null
+++ b/core/java/android/database/RedactingCursor.java
@@ -0,0 +1,181 @@
+/*
+ * 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.database;
+
+import android.annotation.NonNull;
+import android.util.SparseArray;
+
+import java.util.Map;
+
+/**
+ * Cursor that offers to redact values of requested columns.
+ *
+ * @hide
+ */
+public class RedactingCursor extends CrossProcessCursorWrapper {
+ private final SparseArray<Object> mRedactions;
+
+ private RedactingCursor(@NonNull Cursor cursor, SparseArray<Object> redactions) {
+ super(cursor);
+ mRedactions = redactions;
+ }
+
+ /**
+ * Create a wrapped instance of the given {@link Cursor} which redacts the
+ * requested columns so they always return specific values when accessed.
+ * <p>
+ * If a redacted column appears multiple times in the underlying cursor, all
+ * instances will be redacted. If none of the redacted columns appear in the
+ * given cursor, the given cursor will be returned untouched to improve
+ * performance.
+ */
+ public static Cursor create(@NonNull Cursor cursor, @NonNull Map<String, Object> redactions) {
+ final SparseArray<Object> internalRedactions = new SparseArray<>();
+
+ final String[] columns = cursor.getColumnNames();
+ for (int i = 0; i < columns.length; i++) {
+ if (redactions.containsKey(columns[i])) {
+ internalRedactions.put(i, redactions.get(columns[i]));
+ }
+ }
+
+ if (internalRedactions.size() == 0) {
+ return cursor;
+ } else {
+ return new RedactingCursor(cursor, internalRedactions);
+ }
+ }
+
+ @Override
+ public void fillWindow(int position, CursorWindow window) {
+ // Fill window directly to ensure data is redacted
+ DatabaseUtils.cursorFillWindow(this, position, window);
+ }
+
+ @Override
+ public CursorWindow getWindow() {
+ // Returning underlying window risks leaking redacted data
+ return null;
+ }
+
+ @Override
+ public Cursor getWrappedCursor() {
+ throw new UnsupportedOperationException(
+ "Returning underlying cursor risks leaking redacted data");
+ }
+
+ @Override
+ public double getDouble(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return (double) mRedactions.valueAt(i);
+ } else {
+ return super.getDouble(columnIndex);
+ }
+ }
+
+ @Override
+ public float getFloat(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return (float) mRedactions.valueAt(i);
+ } else {
+ return super.getFloat(columnIndex);
+ }
+ }
+
+ @Override
+ public int getInt(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return (int) mRedactions.valueAt(i);
+ } else {
+ return super.getInt(columnIndex);
+ }
+ }
+
+ @Override
+ public long getLong(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return (long) mRedactions.valueAt(i);
+ } else {
+ return super.getLong(columnIndex);
+ }
+ }
+
+ @Override
+ public short getShort(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return (short) mRedactions.valueAt(i);
+ } else {
+ return super.getShort(columnIndex);
+ }
+ }
+
+ @Override
+ public String getString(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return (String) mRedactions.valueAt(i);
+ } else {
+ return super.getString(columnIndex);
+ }
+ }
+
+ @Override
+ public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ buffer.data = ((String) mRedactions.valueAt(i)).toCharArray();
+ buffer.sizeCopied = buffer.data.length;
+ } else {
+ super.copyStringToBuffer(columnIndex, buffer);
+ }
+ }
+
+ @Override
+ public byte[] getBlob(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return (byte[]) mRedactions.valueAt(i);
+ } else {
+ return super.getBlob(columnIndex);
+ }
+ }
+
+ @Override
+ public int getType(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return DatabaseUtils.getTypeOfObject(mRedactions.valueAt(i));
+ } else {
+ return super.getType(columnIndex);
+ }
+ }
+
+ @Override
+ public boolean isNull(int columnIndex) {
+ final int i = mRedactions.indexOfKey(columnIndex);
+ if (i >= 0) {
+ return mRedactions.valueAt(i) == null;
+ } else {
+ return super.isNull(columnIndex);
+ }
+ }
+}
diff --git a/core/java/android/database/sqlite/DatabaseObjectNotClosedException.java b/core/java/android/database/sqlite/DatabaseObjectNotClosedException.java
index f28c70fe1efe..2af06e116da0 100644
--- a/core/java/android/database/sqlite/DatabaseObjectNotClosedException.java
+++ b/core/java/android/database/sqlite/DatabaseObjectNotClosedException.java
@@ -16,6 +16,8 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
+
/**
* An exception that indicates that garbage-collector is finalizing a database object
* that is not explicitly closed
@@ -25,6 +27,7 @@ public class DatabaseObjectNotClosedException extends RuntimeException {
private static final String s = "Application did not close the cursor or database object " +
"that was opened here";
+ @UnsupportedAppUsage
public DatabaseObjectNotClosedException() {
super(s);
}
diff --git a/core/java/android/database/sqlite/SQLiteClosable.java b/core/java/android/database/sqlite/SQLiteClosable.java
index adfbc6e177ac..d6a71da105dd 100644
--- a/core/java/android/database/sqlite/SQLiteClosable.java
+++ b/core/java/android/database/sqlite/SQLiteClosable.java
@@ -16,6 +16,7 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
import java.io.Closeable;
/**
@@ -24,6 +25,7 @@ import java.io.Closeable;
* This class implements a primitive reference counting scheme for database objects.
*/
public abstract class SQLiteClosable implements Closeable {
+ @UnsupportedAppUsage
private int mReferenceCount = 1;
/**
diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java
index 47a5138c1a6c..3ca852a34594 100644
--- a/core/java/android/database/sqlite/SQLiteConnection.java
+++ b/core/java/android/database/sqlite/SQLiteConnection.java
@@ -208,10 +208,15 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
}
private void open() {
- mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags,
- mConfiguration.label,
- SQLiteDebug.Consts.DEBUG_SQL_STATEMENTS, SQLiteDebug.Consts.DEBUG_SQL_TIME,
- mConfiguration.lookasideSlotSize, mConfiguration.lookasideSlotCount);
+ final int cookie = mRecentOperations.beginOperation("open", null, null);
+ try {
+ mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags,
+ mConfiguration.label,
+ SQLiteDebug.Consts.DEBUG_SQL_STATEMENTS, SQLiteDebug.Consts.DEBUG_SQL_TIME,
+ mConfiguration.lookasideSlotSize, mConfiguration.lookasideSlotCount);
+ } finally {
+ mRecentOperations.endOperation(cookie);
+ }
setPageSize();
setForeignKeyModeFromConfiguration();
setWalModeFromConfiguration();
diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java
index 13e6f7182e8a..e3c409891c54 100644
--- a/core/java/android/database/sqlite/SQLiteCursor.java
+++ b/core/java/android/database/sqlite/SQLiteCursor.java
@@ -16,6 +16,7 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
import android.database.AbstractWindowedCursor;
import android.database.CursorWindow;
import android.database.DatabaseUtils;
@@ -39,12 +40,14 @@ public class SQLiteCursor extends AbstractWindowedCursor {
static final int NO_COUNT = -1;
/** The name of the table to edit */
+ @UnsupportedAppUsage
private final String mEditTable;
/** The names of the columns in the rows */
private final String[] mColumns;
/** The query object for the cursor */
+ @UnsupportedAppUsage
private final SQLiteQuery mQuery;
/** The compiled query this cursor came from */
@@ -139,6 +142,7 @@ public class SQLiteCursor extends AbstractWindowedCursor {
return mCount;
}
+ @UnsupportedAppUsage
private void fillWindow(int requiredPos) {
clearOrCreateWindow(getDatabase().getPath());
try {
diff --git a/core/java/android/database/sqlite/SQLiteCustomFunction.java b/core/java/android/database/sqlite/SQLiteCustomFunction.java
index 02f3284b4258..ec204581aef5 100644
--- a/core/java/android/database/sqlite/SQLiteCustomFunction.java
+++ b/core/java/android/database/sqlite/SQLiteCustomFunction.java
@@ -16,13 +16,17 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
+
/**
* Describes a custom SQL function.
*
* @hide
*/
public final class SQLiteCustomFunction {
+ @UnsupportedAppUsage
public final String name;
+ @UnsupportedAppUsage
public final int numArgs;
public final SQLiteDatabase.CustomFunction callback;
@@ -47,6 +51,7 @@ public final class SQLiteCustomFunction {
// Called from native.
@SuppressWarnings("unused")
+ @UnsupportedAppUsage
private void dispatchCallback(String[] args) {
callback.callback(args);
}
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index a4b989a72492..01557c59f8ac 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -20,6 +20,7 @@ import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.app.ActivityManager;
import android.content.ContentValues;
import android.database.Cursor;
@@ -91,6 +92,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
// Thread-local for database sessions that belong to this database.
// Each thread has its own database session.
// INVARIANT: Immutable.
+ @UnsupportedAppUsage
private final ThreadLocal<SQLiteSession> mThreadSession = ThreadLocal
.withInitial(this::createSession);
@@ -124,12 +126,14 @@ public final class SQLiteDatabase extends SQLiteClosable {
// The database configuration.
// INVARIANT: Guarded by mLock.
+ @UnsupportedAppUsage
private final SQLiteDatabaseConfiguration mConfigurationLocked;
// The connection pool for the database, null when closed.
// The pool itself is thread-safe, but the reference to it can only be acquired
// when the lock is held.
// INVARIANT: Guarded by mLock.
+ @UnsupportedAppUsage
private SQLiteConnectionPool mConnectionPoolLocked;
// True if the database has attached databases.
@@ -190,6 +194,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
public static final int CONFLICT_NONE = 0;
/** {@hide} */
+ @UnsupportedAppUsage
public static final String[] CONFLICT_VALUES = new String[]
{"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};
@@ -400,6 +405,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
* @throws IllegalStateException if the thread does not yet have a session and
* the database is not open.
*/
+ @UnsupportedAppUsage
SQLiteSession getThreadSession() {
return mThreadSession.get(); // initialValue() throws if database closed
}
@@ -543,6 +549,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
beginTransaction(transactionListener, false);
}
+ @UnsupportedAppUsage
private void beginTransaction(SQLiteTransactionListener transactionListener,
boolean exclusive) {
acquireReference();
@@ -730,6 +737,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
return openDatabase(path.getPath(), openParams);
}
+ @UnsupportedAppUsage
private static SQLiteDatabase openDatabase(@NonNull String path,
@NonNull OpenParams openParams) {
Preconditions.checkArgument(openParams != null, "OpenParams cannot be null");
@@ -839,6 +847,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
* @see #isReadOnly()
* @hide
*/
+ @UnsupportedAppUsage
public void reopenReadWrite() {
synchronized (mLock) {
throwIfNotOpenLocked();
@@ -2139,6 +2148,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
return dbStatsList;
}
+ @UnsupportedAppUsage
private void collectDbStats(ArrayList<DbStats> dbStatsList) {
synchronized (mLock) {
if (mConnectionPoolLocked != null) {
@@ -2147,6 +2157,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
}
}
+ @UnsupportedAppUsage
private static ArrayList<SQLiteDatabase> getActiveDatabases() {
ArrayList<SQLiteDatabase> databases = new ArrayList<SQLiteDatabase>();
synchronized (sActiveDatabases) {
diff --git a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
index bb62268ce742..48f10219921b 100644
--- a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
+++ b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java
@@ -16,6 +16,7 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
import java.util.ArrayList;
import java.util.Locale;
import java.util.regex.Pattern;
@@ -67,6 +68,7 @@ public final class SQLiteDatabaseConfiguration {
*
* Default is 25.
*/
+ @UnsupportedAppUsage
public int maxSqlCacheSize;
/**
diff --git a/core/java/android/database/sqlite/SQLiteGlobal.java b/core/java/android/database/sqlite/SQLiteGlobal.java
index d6d9764c7c38..e6b6acf7b8ee 100644
--- a/core/java/android/database/sqlite/SQLiteGlobal.java
+++ b/core/java/android/database/sqlite/SQLiteGlobal.java
@@ -39,11 +39,18 @@ import android.os.SystemProperties;
public final class SQLiteGlobal {
private static final String TAG = "SQLiteGlobal";
+ /** @hide */
+ public static final String SYNC_MODE_FULL = "FULL";
+
private static final Object sLock = new Object();
+
private static int sDefaultPageSize;
private static native int nativeReleaseMemory();
+ /** @hide */
+ public static volatile String sDefaultSyncMode;
+
private SQLiteGlobal() {
}
@@ -103,6 +110,11 @@ public final class SQLiteGlobal {
* Gets the default database synchronization mode when WAL is not in use.
*/
public static String getDefaultSyncMode() {
+ // Use the FULL synchronous mode for system processes by default.
+ String defaultMode = sDefaultSyncMode;
+ if (defaultMode != null) {
+ return defaultMode;
+ }
return SystemProperties.get("debug.sqlite.syncmode",
Resources.getSystem().getString(
com.android.internal.R.string.db_default_sync_mode));
@@ -112,6 +124,11 @@ public final class SQLiteGlobal {
* Gets the database synchronization mode when in WAL mode.
*/
public static String getWALSyncMode() {
+ // Use the FULL synchronous mode for system processes by default.
+ String defaultMode = sDefaultSyncMode;
+ if (defaultMode != null) {
+ return defaultMode;
+ }
return SystemProperties.get("debug.sqlite.wal.syncmode",
Resources.getSystem().getString(
com.android.internal.R.string.db_wal_sync_mode));
diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java
index 7ff66358de5f..1377806cb213 100644
--- a/core/java/android/database/sqlite/SQLiteOpenHelper.java
+++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java
@@ -19,6 +19,7 @@ package android.database.sqlite;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.SQLException;
@@ -52,6 +53,7 @@ public abstract class SQLiteOpenHelper {
private static final String TAG = SQLiteOpenHelper.class.getSimpleName();
private final Context mContext;
+ @UnsupportedAppUsage
private final String mName;
private final int mNewVersion;
private final int mMinimumSupportedVersion;
diff --git a/core/java/android/database/sqlite/SQLiteProgram.java b/core/java/android/database/sqlite/SQLiteProgram.java
index 26e8c318299f..8304133cd41e 100644
--- a/core/java/android/database/sqlite/SQLiteProgram.java
+++ b/core/java/android/database/sqlite/SQLiteProgram.java
@@ -16,6 +16,7 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
import android.database.DatabaseUtils;
import android.os.CancellationSignal;
@@ -31,10 +32,12 @@ public abstract class SQLiteProgram extends SQLiteClosable {
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private final SQLiteDatabase mDatabase;
+ @UnsupportedAppUsage
private final String mSql;
private final boolean mReadOnly;
private final String[] mColumnNames;
private final int mNumParameters;
+ @UnsupportedAppUsage
private final Object[] mBindArgs;
SQLiteProgram(SQLiteDatabase db, String sql, Object[] bindArgs,
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index 06560f2e4887..b705ebb77d9b 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -18,6 +18,7 @@ package android.database.sqlite;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UnsupportedAppUsage;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.DatabaseUtils;
@@ -49,8 +50,11 @@ public class SQLiteQueryBuilder {
Pattern.compile("\\s*\\d+\\s*(,\\s*\\d+\\s*)?");
private Map<String, String> mProjectionMap = null;
+ @UnsupportedAppUsage
private String mTables = "";
+ @UnsupportedAppUsage
private StringBuilder mWhereClause = null; // lazily created
+ @UnsupportedAppUsage
private boolean mDistinct;
private SQLiteDatabase.CursorFactory mFactory;
private boolean mStrict;
@@ -782,6 +786,7 @@ public class SQLiteQueryBuilder {
return query.toString();
}
+ @UnsupportedAppUsage
private String[] computeProjection(String[] projectionIn) {
if (projectionIn != null && projectionIn.length > 0) {
if (mProjectionMap != null) {
diff --git a/core/java/android/database/sqlite/SQLiteSession.java b/core/java/android/database/sqlite/SQLiteSession.java
index d80ab1f2e867..a9ac9e7f882f 100644
--- a/core/java/android/database/sqlite/SQLiteSession.java
+++ b/core/java/android/database/sqlite/SQLiteSession.java
@@ -16,6 +16,7 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
import android.database.CursorWindow;
import android.database.DatabaseUtils;
import android.os.CancellationSignal;
@@ -291,6 +292,7 @@ public final class SQLiteSession {
* @see #yieldTransaction
* @see #endTransaction
*/
+ @UnsupportedAppUsage
public void beginTransaction(int transactionMode,
SQLiteTransactionListener transactionListener, int connectionFlags,
CancellationSignal cancellationSignal) {
diff --git a/core/java/android/database/sqlite/SQLiteStatement.java b/core/java/android/database/sqlite/SQLiteStatement.java
index b1092d765a9a..8f8f67625a33 100644
--- a/core/java/android/database/sqlite/SQLiteStatement.java
+++ b/core/java/android/database/sqlite/SQLiteStatement.java
@@ -16,6 +16,7 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
import android.os.ParcelFileDescriptor;
/**
@@ -27,6 +28,7 @@ import android.os.ParcelFileDescriptor;
* </p>
*/
public final class SQLiteStatement extends SQLiteProgram {
+ @UnsupportedAppUsage
SQLiteStatement(SQLiteDatabase db, String sql, Object[] bindArgs) {
super(db, sql, bindArgs, null);
}
diff --git a/core/java/android/database/sqlite/SqliteWrapper.java b/core/java/android/database/sqlite/SqliteWrapper.java
index b019618a0f49..e3171640a25c 100644
--- a/core/java/android/database/sqlite/SqliteWrapper.java
+++ b/core/java/android/database/sqlite/SqliteWrapper.java
@@ -17,6 +17,7 @@
package android.database.sqlite;
+import android.annotation.UnsupportedAppUsage;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
@@ -44,6 +45,7 @@ public final class SqliteWrapper {
return e.getMessage().equals(SQLITE_EXCEPTION_DETAIL_MESSAGE);
}
+ @UnsupportedAppUsage
public static void checkSQLiteException(Context context, SQLiteException e) {
if (isLowMemory(e)) {
Toast.makeText(context, com.android.internal.R.string.low_memory,
@@ -53,6 +55,7 @@ public final class SqliteWrapper {
}
}
+ @UnsupportedAppUsage
public static Cursor query(Context context, ContentResolver resolver, Uri uri,
String[] projection, String selection, String[] selectionArgs, String sortOrder) {
try {
@@ -73,6 +76,7 @@ public final class SqliteWrapper {
return false;
}
}
+ @UnsupportedAppUsage
public static int update(Context context, ContentResolver resolver, Uri uri,
ContentValues values, String where, String[] selectionArgs) {
try {
@@ -84,6 +88,7 @@ public final class SqliteWrapper {
}
}
+ @UnsupportedAppUsage
public static int delete(Context context, ContentResolver resolver, Uri uri,
String where, String[] selectionArgs) {
try {
@@ -95,6 +100,7 @@ public final class SqliteWrapper {
}
}
+ @UnsupportedAppUsage
public static Uri insert(Context context, ContentResolver resolver,
Uri uri, ContentValues values) {
try {
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index e700cac9c07a..d51e896949fc 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -797,7 +797,8 @@ public final class DisplayManager {
void onDisplayRemoved(int displayId);
/**
- * Called whenever the properties of a logical display have changed.
+ * Called whenever the properties of a logical {@link android.view.Display},
+ * such as size and density, have changed.
*
* @param displayId The id of the logical display that changed.
*/
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index 52a2354840c9..e6b3fa81777e 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -372,7 +372,7 @@ public abstract class NetworkAgent extends Handler {
if (score < 0) {
throw new IllegalArgumentException("Score must be >= 0");
}
- queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new Integer(score));
+ queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, score, 0);
}
/**
@@ -387,7 +387,7 @@ public abstract class NetworkAgent extends Handler {
* {@link #saveAcceptUnvalidated} to respect the user's choice.
*/
public void explicitlySelected(boolean acceptUnvalidated) {
- queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED, acceptUnvalidated);
+ queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED, acceptUnvalidated ? 1 : 0, 0);
}
/**
diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java
index 5752b6f54ce5..591370ff728b 100644
--- a/core/java/android/os/BinderProxy.java
+++ b/core/java/android/os/BinderProxy.java
@@ -241,6 +241,9 @@ public final class BinderProxy implements IBinder {
} else {
try {
key = bp.getInterfaceDescriptor();
+ if ((key == null || key.isEmpty()) && !bp.isBinderAlive()) {
+ key = "<proxy to dead node>";
+ }
} catch (Throwable t) {
key = "<exception during getDescriptor>";
}
diff --git a/core/java/android/os/HwBlob.java b/core/java/android/os/HwBlob.java
index 405651e992a3..6a5bb1c0a988 100644
--- a/core/java/android/os/HwBlob.java
+++ b/core/java/android/os/HwBlob.java
@@ -232,6 +232,14 @@ public class HwBlob {
* @throws IndexOutOfBoundsException when [offset, offset + sizeof(jstring)] is out of range
*/
public native final void putString(long offset, String x);
+ /**
+ * Writes a native handle (without duplicating the underlying file descriptors) at an offset.
+ *
+ * @param offset location to write value
+ * @param x a {@link NativeHandle} instance to write
+ * @throws IndexOutOfBoundsException when [offset, offset + sizeof(jobject)] is out of range
+ */
+ public native final void putNativeHandle(long offset, NativeHandle x);
/**
* Put a boolean array contiguously at an offset in the blob.
diff --git a/core/java/android/os/HwParcel.java b/core/java/android/os/HwParcel.java
index 0eb62c95ed71..7a51db2dc5f9 100644
--- a/core/java/android/os/HwParcel.java
+++ b/core/java/android/os/HwParcel.java
@@ -115,6 +115,13 @@ public class HwParcel {
* @param val to write
*/
public native final void writeString(String val);
+ /**
+ * Writes a native handle (without duplicating the underlying
+ * file descriptors) to the end of the parcel.
+ *
+ * @param val to write
+ */
+ public native final void writeNativeHandle(NativeHandle val);
/**
* Writes an array of boolean values to the end of the parcel.
@@ -159,6 +166,11 @@ public class HwParcel {
* @param val to write
*/
private native final void writeStringVector(String[] val);
+ /**
+ * Writes an array of native handles to the end of the parcel.
+ * @param val array of {@link NativeHandle} objects to write
+ */
+ private native final void writeNativeHandleVector(NativeHandle[] val);
/**
* Helper method to write a list of Booleans to val.
@@ -267,6 +279,14 @@ public class HwParcel {
}
/**
+ * Helper method to write a list of native handles to the end of the parcel.
+ * @param val list of {@link NativeHandle} objects to write
+ */
+ public final void writeNativeHandleVector(ArrayList<NativeHandle> val) {
+ writeNativeHandleVector(val.toArray(new NativeHandle[val.size()]));
+ }
+
+ /**
* Write a hwbinder object to the end of the parcel.
* @param binder value to write
*/
@@ -328,6 +348,30 @@ public class HwParcel {
* @throws IllegalArgumentException if the parcel has no more data
*/
public native final String readString();
+ /**
+ * Reads a native handle (without duplicating the underlying file
+ * descriptors) from the parcel. These file descriptors will only
+ * be open for the duration that the binder window is open. If they
+ * are needed further, you must call {@link NativeHandle#dup()}.
+ *
+ * @return a {@link NativeHandle} instance parsed from the parcel
+ * @throws IllegalArgumentException if the parcel has no more data
+ */
+ public native final NativeHandle readNativeHandle();
+ /**
+ * Reads an embedded native handle (without duplicating the underlying
+ * file descriptors) from the parcel. These file descriptors will only
+ * be open for the duration that the binder window is open. If they
+ * are needed further, you must call {@link NativeHandle#dup()}. You
+ * do not need to call close on the NativeHandle returned from this.
+ *
+ * @param parentHandle handle from which to read the embedded object
+ * @param offset offset into parent
+ * @return a {@link NativeHandle} instance parsed from the parcel
+ * @throws IllegalArgumentException if the parcel has no more data
+ */
+ public native final NativeHandle readEmbeddedNativeHandle(
+ long parentHandle, long offset);
/**
* Reads an array of boolean values from the parcel.
@@ -377,6 +421,12 @@ public class HwParcel {
* @throws IllegalArgumentException if the parcel has no more data
*/
private native final String[] readStringVectorAsArray();
+ /**
+ * Reads an array of native handles from the parcel.
+ * @return array of {@link NativeHandle} objects
+ * @throws IllegalArgumentException if the parcel has no more data
+ */
+ private native final NativeHandle[] readNativeHandleAsArray();
/**
* Convenience method to read a Boolean vector as an ArrayList.
@@ -465,6 +515,15 @@ public class HwParcel {
}
/**
+ * Convenience method to read a vector of native handles as an ArrayList.
+ * @return array of {@link NativeHandle} objects.
+ * @throws IllegalArgumentException if the parcel has no more data
+ */
+ public final ArrayList<NativeHandle> readNativeHandleVector() {
+ return new ArrayList<NativeHandle>(Arrays.asList(readNativeHandleAsArray()));
+ }
+
+ /**
* Reads a strong binder value from the parcel.
* @return binder object read from parcel or null if no binder can be read
* @throws IllegalArgumentException if the parcel has no more data
diff --git a/core/java/android/os/Message.java b/core/java/android/os/Message.java
index b303e10fa64b..455d8edd4138 100644
--- a/core/java/android/os/Message.java
+++ b/core/java/android/os/Message.java
@@ -349,7 +349,7 @@ public final class Message implements Parcelable {
}
/**
- * Retrieve the a {@link android.os.Handler Handler} implementation that
+ * Retrieve the {@link android.os.Handler Handler} implementation that
* will receive this message. The object must implement
* {@link android.os.Handler#handleMessage(android.os.Message)
* Handler.handleMessage()}. Each Handler has its own name-space for
diff --git a/core/java/android/os/NativeHandle.java b/core/java/android/os/NativeHandle.java
new file mode 100644
index 000000000000..fbecc8ec1cd9
--- /dev/null
+++ b/core/java/android/os/NativeHandle.java
@@ -0,0 +1,194 @@
+/*
+ * 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.os;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.system.ErrnoException;
+import android.system.Os;
+
+import java.io.Closeable;
+import java.io.FileDescriptor;
+
+/**
+ * Collection representing a set of open file descriptors and an opaque data stream.
+ *
+ * @hide
+ */
+@SystemApi
+public final class NativeHandle implements Closeable {
+ // whether this object owns mFds
+ private boolean mOwn = false;
+ private FileDescriptor[] mFds;
+ private int[] mInts;
+
+ /**
+ * Constructs a {@link NativeHandle} object containing
+ * zero file descriptors and an empty data stream.
+ */
+ public NativeHandle() {
+ this(new FileDescriptor[0], new int[0], false);
+ }
+
+ /**
+ * Constructs a {@link NativeHandle} object containing the given
+ * {@link FileDescriptor} object and an empty data stream.
+ */
+ public NativeHandle(@NonNull FileDescriptor descriptor, boolean own) {
+ this(new FileDescriptor[] {descriptor}, new int[0], own);
+ }
+
+ /**
+ * Convenience method for creating a list of file descriptors.
+ *
+ * @hide
+ */
+ private static FileDescriptor[] createFileDescriptorArray(@NonNull int[] fds) {
+ FileDescriptor[] list = new FileDescriptor[fds.length];
+ for (int i = 0; i < fds.length; i++) {
+ FileDescriptor descriptor = new FileDescriptor();
+ descriptor.setInt$(fds[i]);
+ list[i] = descriptor;
+ }
+ return list;
+ }
+
+ /**
+ * Convenience method for instantiating a {@link NativeHandle} from JNI. It does
+ * not take ownership of the int[] params. It does not dupe the FileDescriptors.
+ *
+ * @hide
+ */
+ private NativeHandle(@NonNull int[] fds, @NonNull int[] ints, boolean own) {
+ this(createFileDescriptorArray(fds), ints, own);
+ }
+
+ /**
+ * Instantiate an opaque {@link NativeHandle} from fds and integers.
+ *
+ * @param own whether the fds are owned by this object and should be closed
+ */
+ public NativeHandle(@NonNull FileDescriptor[] fds, @NonNull int[] ints, boolean own) {
+ mFds = fds.clone();
+ mInts = ints.clone();
+ mOwn = own;
+ }
+
+ /**
+ * Returns whether this {@link NativeHandle} object contains a single file
+ * descriptor and nothing else.
+ *
+ * @return a boolean value
+ */
+ public boolean hasSingleFileDescriptor() {
+ return mFds.length == 1 && mInts.length == 0;
+ }
+
+ /**
+ * Explicitly duplicate NativeHandle (this dups all file descritptors).
+ *
+ * If this method is called, this must also be explicitly closed with
+ * {@link #close()}.
+ */
+ public NativeHandle dup() throws java.io.IOException {
+ FileDescriptor[] fds = new FileDescriptor[mFds.length];
+ try {
+ for (int i = 0; i < mFds.length; i++) {
+ fds[i] = Os.dup(mFds[i]);
+ }
+ } catch (ErrnoException e) {
+ e.rethrowAsIOException();
+ }
+ return new NativeHandle(fds, mInts, true /*own*/);
+ }
+
+ /**
+ * Closes the file descriptors if they are owned by this object.
+ *
+ * This also invalidates the object.
+ */
+ @Override
+ public void close() throws java.io.IOException {
+ if (!mOwn) {
+ return;
+ }
+
+ try {
+ for (FileDescriptor fd : mFds) {
+ Os.close(fd);
+ }
+ } catch (ErrnoException e) {
+ e.rethrowAsIOException();
+ }
+
+ mOwn = false;
+ mFds = null;
+ mInts = null;
+ }
+
+ /**
+ * Returns the underlying lone file descriptor.
+ *
+ * @return a {@link FileDescriptor} object
+ * @throws IllegalStateException if this object contains either zero or
+ * more than one file descriptor, or a non-empty data stream.
+ */
+ public FileDescriptor getFileDescriptor() {
+ if (!hasSingleFileDescriptor()) {
+ throw new IllegalStateException(
+ "NativeHandle is not single file descriptor. Contents must"
+ + " be retreived through getFileDescriptors and getInts.");
+ }
+
+ return mFds[0];
+ }
+
+ /**
+ * Convenience method for fetching this object's file descriptors from JNI.
+ * @return a mutable copy of the underlying file descriptors (as an int[])
+ *
+ * @hide
+ */
+ private int[] getFdsAsIntArray() {
+ int numFds = mFds.length;
+ int[] fds = new int[numFds];
+
+ for (int i = 0; i < numFds; i++) {
+ fds[i] = mFds[i].getInt$();
+ }
+
+ return fds;
+ }
+
+ /**
+ * Fetch file descriptors.
+ *
+ * @return the fds.
+ */
+ public FileDescriptor[] getFileDescriptors() {
+ return mFds;
+ }
+
+ /**
+ * Fetch opaque ints. Note: This object retains ownership of the data.
+ *
+ * @return the opaque data stream.
+ */
+ public int[] getInts() {
+ return mInts;
+ }
+}
diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl
index 55a202fd3a66..5c2d41e1aebc 100644
--- a/core/java/android/os/storage/IStorageManager.aidl
+++ b/core/java/android/os/storage/IStorageManager.aidl
@@ -187,4 +187,6 @@ interface IStorageManager {
void allocateBytes(String volumeUuid, long bytes, int flags, String callingPackage) = 78;
void runIdleMaintenance() = 79;
void abortIdleMaintenance() = 80;
+ String translateAppToSystem(String path, String packageName, int userId) = 81;
+ String translateSystemToApp(String path, String packageName, int userId) = 82;
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 8b8ae1cbbc14..5a1ea68b65da 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -124,6 +124,8 @@ public class StorageManager {
public static final String PROP_SDCARDFS = "persist.sys.sdcardfs";
/** {@hide} */
public static final String PROP_VIRTUAL_DISK = "persist.sys.virtual_disk";
+ /** {@hide} */
+ public static final String PROP_ISOLATED_STORAGE = "persist.sys.isolated_storage";
/** {@hide} */
public static final String UUID_PRIVATE_INTERNAL = null;
@@ -1484,6 +1486,36 @@ public class StorageManager {
return path;
}
+ /**
+ * Translate given shared storage path from a path in an app sandbox
+ * namespace to a path in the system namespace.
+ *
+ * @hide
+ */
+ public File translateAppToSystem(File file, String packageName) {
+ try {
+ return new File(mStorageManager.translateAppToSystem(file.getAbsolutePath(),
+ packageName, mContext.getUserId()));
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Translate given shared storage path from a path in the system namespace
+ * to a path in an app sandbox namespace.
+ *
+ * @hide
+ */
+ public File translateSystemToApp(File file, String packageName) {
+ try {
+ return new File(mStorageManager.translateSystemToApp(file.getAbsolutePath(),
+ packageName, mContext.getUserId()));
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** {@hide} */
@VisibleForTesting
public @NonNull ParcelFileDescriptor openProxyFileDescriptor(
diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java
index 02fa7edb2aae..257f2cf88ea2 100644
--- a/core/java/android/preference/PreferenceActivity.java
+++ b/core/java/android/preference/PreferenceActivity.java
@@ -79,7 +79,7 @@ import java.util.List;
* <li>On a small screen it may display only the headers as a single list when first launched.
* Selecting one of the header items will only show the PreferenceFragment of that header (on
* Android N and lower a new Activity is launched).
- * <li>On a large screen in may display both the headers and current PreferenceFragment together as
+ * <li>On a large screen it may display both the headers and current PreferenceFragment together as
* panes. Selecting a header item switches to showing the correct PreferenceFragment for that item.
* </ul>
*
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 9c3a40995c77..68572dd2a52e 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -469,6 +469,12 @@ public final class MediaStore {
* The height of the image/video in pixels.
*/
public static final String HEIGHT = "height";
+
+ /**
+ * Package that contributed this media.
+ * @hide
+ */
+ public static final String OWNER_PACKAGE_NAME = "owner_package_name";
}
/**
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 350602c14ded..0b177c70614e 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7154,9 +7154,9 @@ public final class Settings {
* Whether the device should pulse on pick up gesture.
* @hide
*/
- public static final String DOZE_PULSE_ON_PICK_UP = "doze_pulse_on_pick_up";
+ public static final String DOZE_PICK_UP_GESTURE = "doze_pulse_on_pick_up";
- private static final Validator DOZE_PULSE_ON_PICK_UP_VALIDATOR = BOOLEAN_VALIDATOR;
+ private static final Validator DOZE_PICK_UP_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
/**
* Whether the device should pulse on long press gesture.
@@ -7168,9 +7168,9 @@ public final class Settings {
* Whether the device should pulse on double tap gesture.
* @hide
*/
- public static final String DOZE_PULSE_ON_DOUBLE_TAP = "doze_pulse_on_double_tap";
+ public static final String DOZE_DOUBLE_TAP_GESTURE = "doze_pulse_on_double_tap";
- private static final Validator DOZE_PULSE_ON_DOUBLE_TAP_VALIDATOR = BOOLEAN_VALIDATOR;
+ private static final Validator DOZE_DOUBLE_TAP_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
/**
* The current night mode that has been selected by the user. Owned
@@ -8064,8 +8064,8 @@ public final class Settings {
QS_TILES,
DOZE_ENABLED,
DOZE_ALWAYS_ON,
- DOZE_PULSE_ON_PICK_UP,
- DOZE_PULSE_ON_DOUBLE_TAP,
+ DOZE_PICK_UP_GESTURE,
+ DOZE_DOUBLE_TAP_GESTURE,
NFC_PAYMENT_DEFAULT_COMPONENT,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
FACE_UNLOCK_KEYGUARD_ENABLED,
@@ -8207,8 +8207,8 @@ public final class Settings {
VALIDATORS.put(QS_TILES, QS_TILES_VALIDATOR);
VALIDATORS.put(DOZE_ENABLED, DOZE_ENABLED_VALIDATOR);
VALIDATORS.put(DOZE_ALWAYS_ON, DOZE_ALWAYS_ON_VALIDATOR);
- VALIDATORS.put(DOZE_PULSE_ON_PICK_UP, DOZE_PULSE_ON_PICK_UP_VALIDATOR);
- VALIDATORS.put(DOZE_PULSE_ON_DOUBLE_TAP, DOZE_PULSE_ON_DOUBLE_TAP_VALIDATOR);
+ VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR);
+ VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR);
VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR);
VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR);
@@ -8273,7 +8273,6 @@ public final class Settings {
CLONE_TO_MANAGED_PROFILE.add(ACCESSIBILITY_ENABLED);
CLONE_TO_MANAGED_PROFILE.add(ALLOW_MOCK_LOCATION);
CLONE_TO_MANAGED_PROFILE.add(ALLOWED_GEOLOCATION_ORIGINS);
- CLONE_TO_MANAGED_PROFILE.add(AUTOFILL_SERVICE);
CLONE_TO_MANAGED_PROFILE.add(DEFAULT_INPUT_METHOD);
CLONE_TO_MANAGED_PROFILE.add(ENABLED_ACCESSIBILITY_SERVICES);
CLONE_TO_MANAGED_PROFILE.add(ENABLED_INPUT_METHODS);
diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java
index 33619ac68cf0..4bd6e5c5731a 100644
--- a/core/java/android/service/autofill/FillRequest.java
+++ b/core/java/android/service/autofill/FillRequest.java
@@ -65,12 +65,18 @@ public final class FillRequest implements Parcelable {
*/
public static final int FLAG_MANUAL_REQUEST = 0x1;
+ /**
+ * Indicates this request was made using
+ * <a href="AutofillService.html#CompatibilityMode">compatibility mode</a>.
+ */
+ public static final int FLAG_COMPATIBILITY_MODE_REQUEST = 0x2;
+
/** @hide */
public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE;
/** @hide */
@IntDef(flag = true, prefix = { "FLAG_" }, value = {
- FLAG_MANUAL_REQUEST
+ FLAG_MANUAL_REQUEST, FLAG_COMPATIBILITY_MODE_REQUEST
})
@Retention(RetentionPolicy.SOURCE)
@interface RequestFlags{}
@@ -93,7 +99,8 @@ public final class FillRequest implements Parcelable {
public FillRequest(int id, @NonNull ArrayList<FillContext> contexts,
@Nullable Bundle clientState, @RequestFlags int flags) {
mId = id;
- mFlags = Preconditions.checkFlagsArgument(flags, FLAG_MANUAL_REQUEST);
+ mFlags = Preconditions.checkFlagsArgument(flags,
+ FLAG_MANUAL_REQUEST | FLAG_COMPATIBILITY_MODE_REQUEST);
mContexts = Preconditions.checkCollectionElementsNotNull(contexts, "contexts");
mClientState = clientState;
}
diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java
index e0c354ac0f23..518f8ed11a26 100644
--- a/core/java/android/service/notification/Adjustment.java
+++ b/core/java/android/service/notification/Adjustment.java
@@ -77,6 +77,18 @@ public final class Adjustment implements Parcelable {
public static final String KEY_SMART_REPLIES = "key_smart_replies";
/**
+ * Data type: int, one of importance values e.g.
+ * {@link android.app.NotificationManager#IMPORTANCE_MIN}.
+ *
+ * If used from
+ * {@link NotificationAssistantService#onNotificationEnqueued(StatusBarNotification)}, it can
+ * block a notification from appearing or silence it. If used from
+ * {@link NotificationAssistantService#adjustNotification(Adjustment)}, it can visually
+ * demote a notification.
+ */
+ public static final String KEY_IMPORTANCE = "key_importance";
+
+ /**
* Create a notification adjustment.
*
* @param pkg The package of the notification.
diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl
index c388367649c4..2dff7161a068 100644
--- a/core/java/android/service/notification/INotificationListener.aidl
+++ b/core/java/android/service/notification/INotificationListener.aidl
@@ -43,6 +43,6 @@ oneway interface INotificationListener
void onNotificationChannelGroupModification(String pkgName, in UserHandle user, in NotificationChannelGroup group, int modificationType);
// assistants only
- void onNotificationEnqueued(in IStatusBarNotificationHolder notificationHolder);
+ void onNotificationEnqueuedWithChannel(in IStatusBarNotificationHolder notificationHolder, in NotificationChannel channel);
void onNotificationSnoozedUntilContext(in IStatusBarNotificationHolder notificationHolder, String snoozeCriterionId);
}
diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java
index 81889c11cc9c..3853fc54773f 100644
--- a/core/java/android/service/notification/NotificationAssistantService.java
+++ b/core/java/android/service/notification/NotificationAssistantService.java
@@ -19,6 +19,7 @@ package android.service.notification;
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import android.app.NotificationChannel;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
@@ -102,7 +103,22 @@ public abstract class NotificationAssistantService extends NotificationListenerS
* @param sbn the new notification
* @return an adjustment or null to take no action, within 100ms.
*/
- abstract public Adjustment onNotificationEnqueued(StatusBarNotification sbn);
+ public Adjustment onNotificationEnqueued(StatusBarNotification sbn) {
+ return null;
+ }
+
+ /**
+ * A notification was posted by an app. Called before post.
+ *
+ * @param sbn the new notification
+ * @param channel the channel the notification was posted to
+ * @return an adjustment or null to take no action, within 100ms.
+ */
+ public Adjustment onNotificationEnqueued(StatusBarNotification sbn,
+ NotificationChannel channel) {
+ return onNotificationEnqueued(sbn);
+ }
+
/**
* Implement this method to learn when notifications are removed, how they were interacted with
@@ -186,7 +202,8 @@ public abstract class NotificationAssistantService extends NotificationListenerS
private class NotificationAssistantServiceWrapper extends NotificationListenerWrapper {
@Override
- public void onNotificationEnqueued(IStatusBarNotificationHolder sbnHolder) {
+ public void onNotificationEnqueuedWithChannel(IStatusBarNotificationHolder sbnHolder,
+ NotificationChannel channel) {
StatusBarNotification sbn;
try {
sbn = sbnHolder.get();
@@ -197,14 +214,14 @@ public abstract class NotificationAssistantService extends NotificationListenerS
SomeArgs args = SomeArgs.obtain();
args.arg1 = sbn;
+ args.arg2 = channel;
mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_ENQUEUED,
args).sendToTarget();
}
@Override
public void onNotificationSnoozedUntilContext(
- IStatusBarNotificationHolder sbnHolder, String snoozeCriterionId)
- throws RemoteException {
+ IStatusBarNotificationHolder sbnHolder, String snoozeCriterionId) {
StatusBarNotification sbn;
try {
sbn = sbnHolder.get();
@@ -235,8 +252,9 @@ public abstract class NotificationAssistantService extends NotificationListenerS
case MSG_ON_NOTIFICATION_ENQUEUED: {
SomeArgs args = (SomeArgs) msg.obj;
StatusBarNotification sbn = (StatusBarNotification) args.arg1;
+ NotificationChannel channel = (NotificationChannel) args.arg2;
args.recycle();
- Adjustment adjustment = onNotificationEnqueued(sbn);
+ Adjustment adjustment = onNotificationEnqueued(sbn, channel);
if (adjustment != null) {
if (!isBound()) return;
try {
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 09eecd8e2868..4609a650ad21 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -1318,7 +1318,8 @@ public abstract class NotificationListenerService extends Service {
}
@Override
- public void onNotificationEnqueued(IStatusBarNotificationHolder notificationHolder)
+ public void onNotificationEnqueuedWithChannel(
+ IStatusBarNotificationHolder notificationHolder, NotificationChannel channel)
throws RemoteException {
// no-op in the listener
}
diff --git a/core/java/android/service/notification/ScheduleCalendar.java b/core/java/android/service/notification/ScheduleCalendar.java
index 8b7946ce7651..6ed966e0bbbd 100644
--- a/core/java/android/service/notification/ScheduleCalendar.java
+++ b/core/java/android/service/notification/ScheduleCalendar.java
@@ -70,10 +70,10 @@ public class ScheduleCalendar {
}
// only allow alarms in the future
if (nextAlarm > now) {
- // store earliest alarm
- if (mSchedule.nextAlarm == 0) {
+ if (mSchedule.nextAlarm == 0 || mSchedule.nextAlarm < now) {
mSchedule.nextAlarm = nextAlarm;
} else {
+ // store earliest alarm
mSchedule.nextAlarm = Math.min(mSchedule.nextAlarm, nextAlarm);
}
} else if (mSchedule.nextAlarm < now) {
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 5ac36afc6324..4c449852816a 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -1456,14 +1456,13 @@ public class ZenModeConfig implements Parcelable {
&& Objects.equals(other.condition, condition)
&& Objects.equals(other.component, component)
&& Objects.equals(other.id, id)
- && other.creationTime == creationTime
&& Objects.equals(other.enabler, enabler);
}
@Override
public int hashCode() {
return Objects.hash(enabled, snoozing, name, zenMode, conditionId, condition,
- component, id, creationTime, enabler);
+ component, id, enabler);
}
public boolean isAutomaticActive() {
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index c037cd062b82..887d96e2ecf1 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -40,6 +40,7 @@ public class FeatureFlagUtils {
static {
DEFAULT_FLAGS = new HashMap<>();
DEFAULT_FLAGS.put("settings_battery_display_app_list", "false");
+ DEFAULT_FLAGS.put("settings_condition_manager_v2", "false");
DEFAULT_FLAGS.put("settings_bluetooth_while_driving", "false");
DEFAULT_FLAGS.put("settings_audio_switcher", "true");
DEFAULT_FLAGS.put("settings_systemui_theme", "true");
diff --git a/core/java/android/util/MemoryIntArray.java b/core/java/android/util/MemoryIntArray.java
index bf335196edef..d5bec0fff088 100644
--- a/core/java/android/util/MemoryIntArray.java
+++ b/core/java/android/util/MemoryIntArray.java
@@ -20,9 +20,10 @@ import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
-import libcore.io.IoUtils;
import dalvik.system.CloseGuard;
+import libcore.io.IoUtils;
+
import java.io.Closeable;
import java.io.IOException;
import java.util.UUID;
@@ -56,7 +57,7 @@ public final class MemoryIntArray implements Parcelable, Closeable {
private final boolean mIsOwner;
private final long mMemoryAddr;
- private int mFd = -1;
+ private ParcelFileDescriptor mFd;
/**
* Creates a new instance.
@@ -71,8 +72,8 @@ public final class MemoryIntArray implements Parcelable, Closeable {
}
mIsOwner = true;
final String name = UUID.randomUUID().toString();
- mFd = nativeCreate(name, size);
- mMemoryAddr = nativeOpen(mFd, mIsOwner);
+ mFd = ParcelFileDescriptor.adoptFd(nativeCreate(name, size));
+ mMemoryAddr = nativeOpen(mFd.getFd(), mIsOwner);
mCloseGuard.open("close");
}
@@ -82,8 +83,8 @@ public final class MemoryIntArray implements Parcelable, Closeable {
if (pfd == null) {
throw new IOException("No backing file descriptor");
}
- mFd = pfd.detachFd();
- mMemoryAddr = nativeOpen(mFd, mIsOwner);
+ mFd = ParcelFileDescriptor.adoptFd(pfd.detachFd());
+ mMemoryAddr = nativeOpen(mFd.getFd(), mIsOwner);
mCloseGuard.open("close");
}
@@ -105,7 +106,7 @@ public final class MemoryIntArray implements Parcelable, Closeable {
public int get(int index) throws IOException {
enforceNotClosed();
enforceValidIndex(index);
- return nativeGet(mFd, mMemoryAddr, index);
+ return nativeGet(mFd.getFd(), mMemoryAddr, index);
}
/**
@@ -121,7 +122,7 @@ public final class MemoryIntArray implements Parcelable, Closeable {
enforceNotClosed();
enforceWritable();
enforceValidIndex(index);
- nativeSet(mFd, mMemoryAddr, index, value);
+ nativeSet(mFd.getFd(), mMemoryAddr, index, value);
}
/**
@@ -131,7 +132,7 @@ public final class MemoryIntArray implements Parcelable, Closeable {
*/
public int size() throws IOException {
enforceNotClosed();
- return nativeSize(mFd);
+ return nativeSize(mFd.getFd());
}
/**
@@ -142,8 +143,9 @@ public final class MemoryIntArray implements Parcelable, Closeable {
@Override
public void close() throws IOException {
if (!isClosed()) {
- nativeClose(mFd, mMemoryAddr, mIsOwner);
- mFd = -1;
+ nativeClose(mFd.getFd(), mMemoryAddr, mIsOwner);
+ mFd.close();
+ mFd = null;
mCloseGuard.close();
}
}
@@ -152,7 +154,7 @@ public final class MemoryIntArray implements Parcelable, Closeable {
* @return Whether this array is closed and shouldn't be used.
*/
public boolean isClosed() {
- return mFd == -1;
+ return mFd == null;
}
@Override
@@ -175,13 +177,8 @@ public final class MemoryIntArray implements Parcelable, Closeable {
@Override
public void writeToParcel(Parcel parcel, int flags) {
- ParcelFileDescriptor pfd = ParcelFileDescriptor.adoptFd(mFd);
- try {
- // Don't let writing to a parcel to close our fd - plz
- parcel.writeParcelable(pfd, flags & ~Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- } finally {
- pfd.detachFd();
- }
+ // Don't let writing to a parcel to close our fd - plz
+ parcel.writeParcelable(mFd, flags & ~Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
}
@Override
@@ -195,13 +192,13 @@ public final class MemoryIntArray implements Parcelable, Closeable {
if (getClass() != obj.getClass()) {
return false;
}
- MemoryIntArray other = (MemoryIntArray) obj;
- return mFd == other.mFd;
+
+ return false;
}
@Override
public int hashCode() {
- return mFd;
+ return mFd.hashCode();
}
private void enforceNotClosed() {
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 131fe1395585..092702ca30cf 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -421,8 +421,8 @@ interface IWindowManager
boolean isWindowTraceEnabled();
/**
- * Requests that the WindowManager sends WindowManagerPolicy#ACTION_USER_ACTIVITY_NOTIFICATION
- * on the next user activity.
+ * Requests that the WindowManager sends
+ * WindowManagerPolicyConstants#ACTION_USER_ACTIVITY_NOTIFICATION on the next user activity.
*/
void requestUserActivityNotification();
diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java
index 5b2cc81756c1..1c5c630b1cfb 100644
--- a/core/java/android/view/RemoteAnimationTarget.java
+++ b/core/java/android/view/RemoteAnimationTarget.java
@@ -16,16 +16,16 @@
package android.view;
-import static android.app.RemoteAnimationTargetProto.CLIP_RECT;
-import static android.app.RemoteAnimationTargetProto.CONTENT_INSETS;
-import static android.app.RemoteAnimationTargetProto.IS_TRANSLUCENT;
-import static android.app.RemoteAnimationTargetProto.LEASH;
-import static android.app.RemoteAnimationTargetProto.MODE;
-import static android.app.RemoteAnimationTargetProto.POSITION;
-import static android.app.RemoteAnimationTargetProto.PREFIX_ORDER_INDEX;
-import static android.app.RemoteAnimationTargetProto.SOURCE_CONTAINER_BOUNDS;
-import static android.app.RemoteAnimationTargetProto.TASK_ID;
-import static android.app.RemoteAnimationTargetProto.WINDOW_CONFIGURATION;
+import static android.view.RemoteAnimationTargetProto.CLIP_RECT;
+import static android.view.RemoteAnimationTargetProto.CONTENT_INSETS;
+import static android.view.RemoteAnimationTargetProto.IS_TRANSLUCENT;
+import static android.view.RemoteAnimationTargetProto.LEASH;
+import static android.view.RemoteAnimationTargetProto.MODE;
+import static android.view.RemoteAnimationTargetProto.POSITION;
+import static android.view.RemoteAnimationTargetProto.PREFIX_ORDER_INDEX;
+import static android.view.RemoteAnimationTargetProto.SOURCE_CONTAINER_BOUNDS;
+import static android.view.RemoteAnimationTargetProto.TASK_ID;
+import static android.view.RemoteAnimationTargetProto.WINDOW_CONFIGURATION;
import android.annotation.IntDef;
import android.app.WindowConfiguration;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index e2e2b000d2fd..f3e2edd514af 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -9008,8 +9008,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* composition. For more details see {@link AccessibilityDelegate}.
*
* @return The delegate, or null if none set.
- *
- * @hide
*/
public AccessibilityDelegate getAccessibilityDelegate() {
return mAccessibilityDelegate;
@@ -17873,6 +17871,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
+ @TestApi
public void resetRtlProperties() {
resetResolvedLayoutDirection();
resetResolvedTextDirection();
@@ -18054,6 +18053,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
+ @TestApi
public void resetResolvedLayoutDirection() {
// Reset the current resolved bits
mPrivateFlags2 &= ~PFLAG2_LAYOUT_DIRECTION_RESOLVED_MASK;
@@ -18153,6 +18153,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
+ @TestApi
public void resetResolvedPadding() {
resetResolvedPaddingInternal();
}
@@ -21023,6 +21024,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* @hide
*/
+ @TestApi
protected void resetResolvedDrawables() {
resetResolvedDrawablesInternal();
}
@@ -22804,6 +22806,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param isRoot true if the view belongs to the root namespace, false
* otherwise
*/
+ @TestApi
public void setIsRootNamespace(boolean isRoot) {
if (isRoot) {
mPrivateFlags |= PFLAG_IS_ROOT_NAMESPACE;
@@ -25025,6 +25028,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
+ @TestApi
public void resetResolvedTextDirection() {
// Reset any previous text direction resolution
mPrivateFlags2 &= ~(PFLAG2_TEXT_DIRECTION_RESOLVED | PFLAG2_TEXT_DIRECTION_RESOLVED_MASK);
@@ -25262,6 +25266,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
+ @TestApi
public void resetResolvedTextAlignment() {
// Reset any previous text alignment resolution
mPrivateFlags2 &= ~(PFLAG2_TEXT_ALIGNMENT_RESOLVED | PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK);
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 7a9de45cbbf8..075db8e7de59 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -857,6 +857,7 @@ public class ViewConfiguration {
* the global actions dialog.
* @hide
*/
+ @TestApi
public long getDeviceGlobalActionKeyTimeout() {
return mGlobalActionsKeyTimeout;
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index d0539ae30719..9f526ccbd656 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -7345,6 +7345,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
/**
* @hide
*/
+ @TestApi
@Override
public void resetResolvedLayoutDirection() {
super.resetResolvedLayoutDirection();
@@ -7361,6 +7362,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
/**
* @hide
*/
+ @TestApi
@Override
public void resetResolvedTextDirection() {
super.resetResolvedTextDirection();
@@ -7377,6 +7379,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
/**
* @hide
*/
+ @TestApi
@Override
public void resetResolvedTextAlignment() {
super.resetResolvedTextAlignment();
@@ -7393,6 +7396,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
/**
* @hide
*/
+ @TestApi
@Override
public void resetResolvedPadding() {
super.resetResolvedPadding();
@@ -7409,6 +7413,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
/**
* @hide
*/
+ @TestApi
@Override
protected void resetResolvedDrawables() {
super.resetResolvedDrawables();
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 8c7ac731b3e3..d7a5d68ea404 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1692,13 +1692,13 @@ public interface WindowManager extends ViewManager {
public static final int PRIVATE_FLAG_IS_SCREEN_DECOR = 0x00400000;
/**
- * Flag to indicate that the status bar window is now in an explicit expanded state, meaning
- * that status bar will not be hidden by any window with flag {@link #FLAG_FULLSCREEN} or
- * {@link View#SYSTEM_UI_FLAG_FULLSCREEN} set.
- * This can only be set by {@link LayoutParams#TYPE_STATUS_BAR}.
+ * Flag to indicate that the status bar window is in a state such that it forces showing
+ * the navigation bar unless the navigation bar window is explicitly set to
+ * {@link View#GONE}.
+ * It only takes effects if this is set by {@link LayoutParams#TYPE_STATUS_BAR}.
* @hide
*/
- public static final int PRIVATE_FLAG_STATUS_BAR_EXPANDED = 0x00800000;
+ public static final int PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION = 0x00800000;
/**
* Control flags that are private to the platform.
@@ -1790,9 +1790,9 @@ public interface WindowManager extends ViewManager {
equals = PRIVATE_FLAG_IS_SCREEN_DECOR,
name = "IS_SCREEN_DECOR"),
@ViewDebug.FlagToString(
- mask = PRIVATE_FLAG_STATUS_BAR_EXPANDED,
- equals = PRIVATE_FLAG_STATUS_BAR_EXPANDED,
- name = "STATUS_BAR_EXPANDED")
+ mask = PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION,
+ equals = PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION,
+ name = "STATUS_FORCE_SHOW_NAVIGATION")
})
@TestApi
public int privateFlags;
diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java
index 0a709f8f52d5..c2ddc927b04e 100644
--- a/core/java/android/view/accessibility/AccessibilityRecord.java
+++ b/core/java/android/view/accessibility/AccessibilityRecord.java
@@ -625,7 +625,7 @@ public class AccessibilityRecord {
}
/**
- * Sets the text before a change.
+ * Gets the text before a change.
*
* @return The text before the change.
*/
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 32b2f63f4e59..2cc175f08dc2 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -2307,7 +2307,14 @@ public final class AutofillManager {
@Override
public AccessibilityEvent onAccessibilityEvent(AccessibilityEvent event,
boolean accessibilityEnabled, int relevantEventTypes) {
- switch (event.getEventType()) {
+ final int type = event.getEventType();
+ if (sVerbose) {
+ // NOTE: this is waaay spammy, but that's life.
+ Log.v(TAG, "onAccessibilityEvent(" + AccessibilityEvent.eventTypeToString(type)
+ + "): "
+ + AccessibilityNodeInfo.getVirtualDescendantId(event.getSourceNodeId()));
+ }
+ switch (type) {
case AccessibilityEvent.TYPE_VIEW_FOCUSED: {
synchronized (mLock) {
if (mFocusedWindowId == event.getWindowId()
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index ec5fdc93b85e..1475cc9f08b0 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -781,7 +781,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
* @param firstVisibleItem the index of the first visible cell (ignore if
* visibleItemCount == 0)
* @param visibleItemCount the number of visible cells
- * @param totalItemCount the number of items in the list adaptor
+ * @param totalItemCount the number of items in the list adapter
*/
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount);
diff --git a/core/java/com/android/internal/app/procstats/AssociationState.java b/core/java/com/android/internal/app/procstats/AssociationState.java
index f63c43f6614f..115ba180ea67 100644
--- a/core/java/com/android/internal/app/procstats/AssociationState.java
+++ b/core/java/com/android/internal/app/procstats/AssociationState.java
@@ -20,9 +20,12 @@ package com.android.internal.app.procstats;
import android.os.Parcel;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.service.procstats.ProcessStatsAssociationStateProto;
+import android.service.procstats.ProcessStatsStateProto;
import android.util.ArrayMap;
import android.util.Slog;
import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -656,6 +659,55 @@ public final class AssociationState {
}
}
+ public void writeToProto(ProtoOutputStream proto, long fieldId, long now) {
+ final long token = proto.start(fieldId);
+
+ proto.write(ProcessStatsAssociationStateProto.COMPONENT_NAME, mName);
+ final int NSRC = mSources.size();
+ for (int isrc = 0; isrc < NSRC; isrc++) {
+ final SourceKey key = mSources.keyAt(isrc);
+ final SourceState src = mSources.valueAt(isrc);
+ final long sourceToken = proto.start(ProcessStatsAssociationStateProto.SOURCES);
+ proto.write(ProcessStatsAssociationStateProto.Source.PROCESS, key.mProcess);
+ proto.write(ProcessStatsAssociationStateProto.Source.UID, key.mUid);
+ proto.write(ProcessStatsAssociationStateProto.Source.TOTAL_COUNT, src.mCount);
+ long duration = src.mDuration;
+ if (src.mNesting > 0) {
+ duration += now - src.mStartUptime;
+ }
+ proto.write(ProcessStatsAssociationStateProto.Source.TOTAL_DURATION_MS, duration);
+ if (src.mActiveCount != 0) {
+ proto.write(ProcessStatsAssociationStateProto.Source.ACTIVE_COUNT,
+ src.mActiveCount);
+ }
+ final long timeNow = src.mActiveStartUptime != 0 ? (now-src.mActiveStartUptime) : 0;
+ if (src.mDurations != null) {
+ final int N = src.mDurations.getKeyCount();
+ for (int i=0; i<N; i++) {
+ final int dkey = src.mDurations.getKeyAt(i);
+ duration = src.mDurations.getValue(dkey);
+ if (dkey == src.mActiveProcState) {
+ duration += timeNow;
+ }
+ final int procState = SparseMappingTable.getIdFromKey(dkey);
+ DumpUtils.printProcStateDurationProto(proto,
+ ProcessStatsAssociationStateProto.Source.ACTIVE_STATES,
+ procState, duration);
+ }
+ } else {
+ duration = src.mActiveDuration + timeNow;
+ if (duration != 0) {
+ DumpUtils.printProcStateDurationProto(proto,
+ ProcessStatsAssociationStateProto.Source.ACTIVE_STATES,
+ src.mActiveProcState, duration);
+ }
+ }
+ proto.end(sourceToken);
+ }
+
+ proto.end(token);
+ }
+
public String toString() {
return "AssociationState{" + Integer.toHexString(System.identityHashCode(this))
+ " " + mName + " pkg=" + mPackageState.mPackageName + " proc="
diff --git a/core/java/com/android/internal/app/procstats/DumpUtils.java b/core/java/com/android/internal/app/procstats/DumpUtils.java
index e6073e58b53c..701391d9b3c5 100644
--- a/core/java/com/android/internal/app/procstats/DumpUtils.java
+++ b/core/java/com/android/internal/app/procstats/DumpUtils.java
@@ -16,32 +16,15 @@
package com.android.internal.app.procstats;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
-import android.service.procstats.ProcessStatsProto;
-import android.text.format.DateFormat;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.DebugUtils;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArray;
+import android.service.procstats.ProcessStatsStateProto;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import static com.android.internal.app.procstats.ProcessStats.*;
-import java.io.IOException;
-import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Objects;
/**
* Utilities for dumping.
@@ -124,20 +107,20 @@ public final class DumpUtils {
STATE_TAGS[STATE_CACHED_EMPTY] = "e";
STATE_PROTO_ENUMS = new int[STATE_COUNT];
- STATE_PROTO_ENUMS[STATE_PERSISTENT] = ProcessStatsProto.State.PERSISTENT;
- STATE_PROTO_ENUMS[STATE_TOP] = ProcessStatsProto.State.TOP;
- STATE_PROTO_ENUMS[STATE_IMPORTANT_FOREGROUND] = ProcessStatsProto.State.IMPORTANT_FOREGROUND;
- STATE_PROTO_ENUMS[STATE_IMPORTANT_BACKGROUND] = ProcessStatsProto.State.IMPORTANT_BACKGROUND;
- STATE_PROTO_ENUMS[STATE_BACKUP] = ProcessStatsProto.State.BACKUP;
- STATE_PROTO_ENUMS[STATE_SERVICE] = ProcessStatsProto.State.SERVICE;
- STATE_PROTO_ENUMS[STATE_SERVICE_RESTARTING] = ProcessStatsProto.State.SERVICE_RESTARTING;
- STATE_PROTO_ENUMS[STATE_RECEIVER] = ProcessStatsProto.State.RECEIVER;
- STATE_PROTO_ENUMS[STATE_HEAVY_WEIGHT] = ProcessStatsProto.State.HEAVY_WEIGHT;
- STATE_PROTO_ENUMS[STATE_HOME] = ProcessStatsProto.State.HOME;
- STATE_PROTO_ENUMS[STATE_LAST_ACTIVITY] = ProcessStatsProto.State.LAST_ACTIVITY;
- STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY] = ProcessStatsProto.State.CACHED_ACTIVITY;
- STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY_CLIENT] = ProcessStatsProto.State.CACHED_ACTIVITY_CLIENT;
- STATE_PROTO_ENUMS[STATE_CACHED_EMPTY] = ProcessStatsProto.State.CACHED_EMPTY;
+ STATE_PROTO_ENUMS[STATE_PERSISTENT] = ProcessStatsStateProto.PERSISTENT;
+ STATE_PROTO_ENUMS[STATE_TOP] = ProcessStatsStateProto.TOP;
+ STATE_PROTO_ENUMS[STATE_IMPORTANT_FOREGROUND] = ProcessStatsStateProto.IMPORTANT_FOREGROUND;
+ STATE_PROTO_ENUMS[STATE_IMPORTANT_BACKGROUND] = ProcessStatsStateProto.IMPORTANT_BACKGROUND;
+ STATE_PROTO_ENUMS[STATE_BACKUP] = ProcessStatsStateProto.BACKUP;
+ STATE_PROTO_ENUMS[STATE_SERVICE] = ProcessStatsStateProto.SERVICE;
+ STATE_PROTO_ENUMS[STATE_SERVICE_RESTARTING] = ProcessStatsStateProto.SERVICE_RESTARTING;
+ STATE_PROTO_ENUMS[STATE_RECEIVER] = ProcessStatsStateProto.RECEIVER;
+ STATE_PROTO_ENUMS[STATE_HEAVY_WEIGHT] = ProcessStatsStateProto.HEAVY_WEIGHT;
+ STATE_PROTO_ENUMS[STATE_HOME] = ProcessStatsStateProto.HOME;
+ STATE_PROTO_ENUMS[STATE_LAST_ACTIVITY] = ProcessStatsStateProto.LAST_ACTIVITY;
+ STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY] = ProcessStatsStateProto.CACHED_ACTIVITY;
+ STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY_CLIENT] = ProcessStatsStateProto.CACHED_ACTIVITY_CLIENT;
+ STATE_PROTO_ENUMS[STATE_CACHED_EMPTY] = ProcessStatsStateProto.CACHED_EMPTY;
}
public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
@@ -155,8 +138,8 @@ public final class DumpUtils {
};
static final int[] ADJ_SCREEN_PROTO_ENUMS = new int[] {
- ProcessStatsProto.State.OFF,
- ProcessStatsProto.State.ON
+ ProcessStatsStateProto.OFF,
+ ProcessStatsStateProto.ON
};
static final String[] ADJ_MEM_TAGS = new String[] {
@@ -164,10 +147,10 @@ public final class DumpUtils {
};
static final int[] ADJ_MEM_PROTO_ENUMS = new int[] {
- ProcessStatsProto.State.NORMAL,
- ProcessStatsProto.State.MODERATE,
- ProcessStatsProto.State.LOW,
- ProcessStatsProto.State.CRITICAL
+ ProcessStatsStateProto.NORMAL,
+ ProcessStatsStateProto.MODERATE,
+ ProcessStatsStateProto.LOW,
+ ProcessStatsStateProto.CRITICAL
};
static final String CSV_SEP = "\t";
@@ -281,6 +264,23 @@ public final class DumpUtils {
printArrayEntry(pw, ADJ_MEM_TAGS, state, 1);
}
+ public static void printProcStateAdjTagProto(ProtoOutputStream proto, long screenId, long memId,
+ int state) {
+ state = printProto(proto, screenId, ADJ_SCREEN_PROTO_ENUMS,
+ state, ADJ_SCREEN_MOD * STATE_COUNT);
+ printProto(proto, memId, ADJ_MEM_PROTO_ENUMS, state, STATE_COUNT);
+ }
+
+ public static void printProcStateDurationProto(ProtoOutputStream proto, long fieldId,
+ int procState, long duration) {
+ final long stateToken = proto.start(fieldId);
+ DumpUtils.printProto(proto, ProcessStatsStateProto.PROCESS_STATE,
+ DumpUtils.STATE_PROTO_ENUMS, procState, 1);
+ proto.write(ProcessStatsStateProto.DURATION_MS, duration);
+ proto.end(stateToken);
+
+ }
+
public static void printProcStateTagAndValue(PrintWriter pw, int state, long value) {
pw.print(',');
printProcStateTag(pw, state);
diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java
index 943c8bda7c91..d7f47363e4b7 100644
--- a/core/java/com/android/internal/app/procstats/ProcessState.java
+++ b/core/java/com/android/internal/app/procstats/ProcessState.java
@@ -20,6 +20,7 @@ import android.os.Parcel;
import android.os.SystemClock;
import android.os.UserHandle;
import android.service.procstats.ProcessStatsProto;
+import android.service.procstats.ProcessStatsStateProto;
import android.util.ArrayMap;
import android.util.DebugUtils;
import android.util.Log;
@@ -1377,14 +1378,14 @@ public final class ProcessState {
}
final long stateToken = proto.start(ProcessStatsProto.STATES);
DumpUtils.printProcStateTagProto(proto,
- ProcessStatsProto.State.SCREEN_STATE,
- ProcessStatsProto.State.MEMORY_STATE,
- ProcessStatsProto.State.PROCESS_STATE,
+ ProcessStatsStateProto.SCREEN_STATE,
+ ProcessStatsStateProto.MEMORY_STATE,
+ ProcessStatsStateProto.PROCESS_STATE,
type);
long duration = durationByState.get(type);
durationByState.delete(type); // remove the key since it is already being dumped.
- proto.write(ProcessStatsProto.State.DURATION_MS, duration);
+ proto.write(ProcessStatsStateProto.DURATION_MS, duration);
mPssTable.writeStatsToProtoForKey(proto, key);
@@ -1394,18 +1395,18 @@ public final class ProcessState {
for (int i = 0; i < durationByState.size(); i++) {
final long stateToken = proto.start(ProcessStatsProto.STATES);
DumpUtils.printProcStateTagProto(proto,
- ProcessStatsProto.State.SCREEN_STATE,
- ProcessStatsProto.State.MEMORY_STATE,
- ProcessStatsProto.State.PROCESS_STATE,
+ ProcessStatsStateProto.SCREEN_STATE,
+ ProcessStatsStateProto.MEMORY_STATE,
+ ProcessStatsStateProto.PROCESS_STATE,
durationByState.keyAt(i));
- proto.write(ProcessStatsProto.State.DURATION_MS, durationByState.valueAt(i));
+ proto.write(ProcessStatsStateProto.DURATION_MS, durationByState.valueAt(i));
proto.end(stateToken);
}
final long totalRunningDuration = getTotalRunningDuration(now);
if (totalRunningDuration > 0) {
final long stateToken = proto.start(ProcessStatsProto.TOTAL_RUNNING_STATE);
- proto.write(ProcessStatsProto.State.DURATION_MS, totalRunningDuration);
+ proto.write(ProcessStatsStateProto.DURATION_MS, totalRunningDuration);
if (mTotalRunningPss[PSS_SAMPLE_COUNT] != 0) {
PssTable.writeStatsToProto(proto, mTotalRunningPss, 0);
}
diff --git a/core/java/com/android/internal/app/procstats/ProcessStats.java b/core/java/com/android/internal/app/procstats/ProcessStats.java
index d088354e059d..14faf66a9424 100644
--- a/core/java/com/android/internal/app/procstats/ProcessStats.java
+++ b/core/java/com/android/internal/app/procstats/ProcessStats.java
@@ -23,6 +23,7 @@ import android.os.Parcelable;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.service.procstats.ProcessStatsPackageProto;
import android.service.procstats.ProcessStatsSectionProto;
import android.text.format.DateFormat;
import android.util.ArrayMap;
@@ -2013,10 +2014,8 @@ public final class ProcessStats implements Parcelable {
}
public void writeToProto(ProtoOutputStream proto, long fieldId, long now) {
- final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap =
- mPackages.getMap();
-
final long token = proto.start(fieldId);
+
proto.write(ProcessStatsSectionProto.START_REALTIME_MS, mTimePeriodStartRealtime);
proto.write(ProcessStatsSectionProto.END_REALTIME_MS,
mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime);
@@ -2041,16 +2040,31 @@ public final class ProcessStats implements Parcelable {
proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_PARTIAL);
}
- ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
+ final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
for (int ip=0; ip<procMap.size(); ip++) {
- String procName = procMap.keyAt(ip);
- SparseArray<ProcessState> uids = procMap.valueAt(ip);
+ final String procName = procMap.keyAt(ip);
+ final SparseArray<ProcessState> uids = procMap.valueAt(ip);
for (int iu=0; iu<uids.size(); iu++) {
final int uid = uids.keyAt(iu);
final ProcessState procState = uids.valueAt(iu);
- procState.writeToProto(proto, ProcessStatsSectionProto.PROCESS_STATS, procName, uid, now);
+ procState.writeToProto(proto, ProcessStatsSectionProto.PROCESS_STATS, procName,
+ uid, now);
}
}
+
+ final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap =
+ mPackages.getMap();
+ for (int ip = 0; ip < pkgMap.size(); ip++) {
+ final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip);
+ for (int iu = 0; iu < uids.size(); iu++) {
+ final LongSparseArray<PackageState> vers = uids.valueAt(iu);
+ for (int iv = 0; iv < vers.size(); iv++) {
+ final PackageState pkgState = vers.valueAt(iv);
+ pkgState.writeToProto(proto, ProcessStatsSectionProto.PACKAGE_STATS, now);
+ }
+ }
+ }
+
proto.end(token);
}
@@ -2095,6 +2109,33 @@ public final class ProcessStats implements Parcelable {
if (DEBUG) Slog.d(TAG, "GETASC: creating " + as + " in " + proc.getName());
return as;
}
+
+ public void writeToProto(ProtoOutputStream proto, long fieldId, long now) {
+ final long token = proto.start(fieldId);
+
+ proto.write(ProcessStatsPackageProto.PACKAGE, mPackageName);
+ proto.write(ProcessStatsPackageProto.UID, mUid);
+ proto.write(ProcessStatsPackageProto.VERSION, mVersionCode);
+
+ for (int ip = 0; ip < mProcesses.size(); ip++) {
+ final String procName = mProcesses.keyAt(ip);
+ final ProcessState procState = mProcesses.valueAt(ip);
+ procState.writeToProto(proto, ProcessStatsPackageProto.PROCESS_STATS, procName,
+ mUid, now);
+ }
+
+ for (int is = 0; is < mServices.size(); is++) {
+ final ServiceState serviceState = mServices.valueAt(is);
+ serviceState.writeToProto(proto, ProcessStatsPackageProto.PROCESS_STATS, now);
+ }
+
+ for (int ia=0; ia<mAssociations.size(); ia++) {
+ final AssociationState ascState = mAssociations.valueAt(ia);
+ ascState.writeToProto(proto, ProcessStatsPackageProto.ASSOCIATION_STATS, now);
+ }
+
+ proto.end(token);
+ }
}
public static final class ProcessDataCollection {
diff --git a/core/java/com/android/internal/app/procstats/PssTable.java b/core/java/com/android/internal/app/procstats/PssTable.java
index f858e552bada..fc93c3a0094e 100644
--- a/core/java/com/android/internal/app/procstats/PssTable.java
+++ b/core/java/com/android/internal/app/procstats/PssTable.java
@@ -28,7 +28,7 @@ import static com.android.internal.app.procstats.ProcessStats.PSS_USS_AVERAGE;
import static com.android.internal.app.procstats.ProcessStats.PSS_USS_MAXIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_COUNT;
-import android.service.procstats.ProcessStatsProto;
+import android.service.procstats.ProcessStatsStateProto;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
@@ -153,16 +153,16 @@ public class PssTable extends SparseMappingTable.Table {
public static void writeStatsToProto(ProtoOutputStream proto, final long[] stats,
final int statsIndex) {
- proto.write(ProcessStatsProto.State.SAMPLE_SIZE, stats[statsIndex + PSS_SAMPLE_COUNT]);
- ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.PSS,
+ proto.write(ProcessStatsStateProto.SAMPLE_SIZE, stats[statsIndex + PSS_SAMPLE_COUNT]);
+ ProtoUtils.toAggStatsProto(proto, ProcessStatsStateProto.PSS,
stats[statsIndex + PSS_MINIMUM],
stats[statsIndex + PSS_AVERAGE],
stats[statsIndex + PSS_MAXIMUM]);
- ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.USS,
+ ProtoUtils.toAggStatsProto(proto, ProcessStatsStateProto.USS,
stats[statsIndex + PSS_USS_MINIMUM],
stats[statsIndex + PSS_USS_AVERAGE],
stats[statsIndex + PSS_USS_MAXIMUM]);
- ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.RSS,
+ ProtoUtils.toAggStatsProto(proto, ProcessStatsStateProto.RSS,
stats[statsIndex + PSS_RSS_MINIMUM],
stats[statsIndex + PSS_RSS_AVERAGE],
stats[statsIndex + PSS_RSS_MAXIMUM]);
diff --git a/core/java/com/android/internal/app/procstats/ServiceState.java b/core/java/com/android/internal/app/procstats/ServiceState.java
index 04e61e067f53..16975a441b40 100644
--- a/core/java/com/android/internal/app/procstats/ServiceState.java
+++ b/core/java/com/android/internal/app/procstats/ServiceState.java
@@ -19,9 +19,16 @@ package com.android.internal.app.procstats;
import android.os.Parcel;
import android.os.SystemClock;
+import android.service.procstats.ProcessStatsProto;
+import android.service.procstats.ProcessStatsServiceStateProto;
+import android.service.procstats.ProcessStatsStateProto;
import android.util.Slog;
+import android.util.SparseLongArray;
import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
+import android.util.proto.ProtoUtils;
+import static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT;
import static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING;
import java.io.PrintWriter;
@@ -550,6 +557,66 @@ public final class ServiceState {
pw.println();
}
+ public void writeToProto(ProtoOutputStream proto, long fieldId, long now) {
+ final long token = proto.start(fieldId);
+ proto.write(ProcessStatsServiceStateProto.SERVICE_NAME, mName);
+ writeTypeToProto(proto, ProcessStatsServiceStateProto.RUNNING_OP,
+ ServiceState.SERVICE_RUN, mRunCount, mRunState, mRunStartTime, now);
+ writeTypeToProto(proto, ProcessStatsServiceStateProto.STARTED_OP,
+ ServiceState.SERVICE_STARTED, mStartedCount, mStartedState, mStartedStartTime, now);
+ writeTypeToProto(proto, ProcessStatsServiceStateProto.FOREGROUND_OP,
+ ServiceState.SERVICE_FOREGROUND, mForegroundCount, mForegroundState,
+ mForegroundStartTime, now);
+ writeTypeToProto(proto, ProcessStatsServiceStateProto.BOUND_OP,
+ ServiceState.SERVICE_BOUND, mBoundCount, mBoundState, mBoundStartTime, now);
+ writeTypeToProto(proto, ProcessStatsServiceStateProto.EXECUTING_OP,
+ ServiceState.SERVICE_EXEC, mExecCount, mExecState, mExecStartTime, now);
+ proto.end(token);
+ }
+
+ public void writeTypeToProto(ProtoOutputStream proto, long fieldId, int serviceType,
+ int opCount, int curState, long curStartTime, long now) {
+ if (opCount <= 0) {
+ return;
+ }
+ final long token = proto.start(fieldId);
+
+ proto.write(ProcessStatsServiceStateProto.OperationInfo.COUNT, opCount);
+ boolean didCurState = false;
+ final int N = mDurations.getKeyCount();
+ for (int i=0; i<N; i++) {
+ final int key = mDurations.getKeyAt(i);
+ long time = mDurations.getValue(key);
+ int type = SparseMappingTable.getIdFromKey(key);
+ int memFactor = type / ServiceState.SERVICE_COUNT;
+ type %= ServiceState.SERVICE_COUNT;
+ if (type != serviceType) {
+ continue;
+ }
+ if (curState == memFactor) {
+ didCurState = true;
+ time += now - curStartTime;
+ }
+ final long stateToken = proto.start(ProcessStatsServiceStateProto.OperationInfo.STATES);
+ DumpUtils.printProcStateAdjTagProto(proto,
+ ProcessStatsStateProto.SCREEN_STATE,
+ ProcessStatsStateProto.MEMORY_STATE,
+ type);
+ proto.write(ProcessStatsStateProto.DURATION_MS, time);
+ proto.end(stateToken);
+ }
+ if (!didCurState && curState != STATE_NOTHING) {
+ final long stateToken = proto.start(ProcessStatsServiceStateProto.OperationInfo.STATES);
+ DumpUtils.printProcStateAdjTagProto(proto,
+ ProcessStatsStateProto.SCREEN_STATE,
+ ProcessStatsStateProto.MEMORY_STATE,
+ curState);
+ proto.write(ProcessStatsStateProto.DURATION_MS, now - curStartTime);
+ proto.end(stateToken);
+ }
+
+ proto.end(token);
+ }
public String toString() {
return "ServiceState{" + Integer.toHexString(System.identityHashCode(this))
diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
index 07bb4533c4e0..c21159eebc75 100644
--- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
+++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -36,17 +36,10 @@ public class AmbientDisplayConfiguration {
public boolean enabled(int user) {
return pulseOnNotificationEnabled(user)
- || pulseOnPickupEnabled(user)
- || pulseOnDoubleTapEnabled(user)
|| pulseOnLongPressEnabled(user)
|| alwaysOnEnabled(user);
}
- public boolean available() {
- return pulseOnNotificationAvailable() || pulseOnPickupAvailable()
- || pulseOnDoubleTapAvailable();
- }
-
public boolean pulseOnNotificationEnabled(int user) {
return boolSettingDefaultOn(Settings.Secure.DOZE_ENABLED, user) && pulseOnNotificationAvailable();
}
@@ -55,30 +48,18 @@ public class AmbientDisplayConfiguration {
return ambientDisplayAvailable();
}
- public boolean pulseOnPickupEnabled(int user) {
- boolean settingEnabled = boolSettingDefaultOn(Settings.Secure.DOZE_PULSE_ON_PICK_UP, user);
- return (settingEnabled || alwaysOnEnabled(user)) && pulseOnPickupAvailable();
- }
-
- public boolean pulseOnPickupAvailable() {
- return dozePulsePickupSensorAvailable() && ambientDisplayAvailable();
+ public boolean pickupGestureEnabled(int user) {
+ return boolSettingDefaultOn(Settings.Secure.DOZE_PICK_UP_GESTURE, user)
+ && dozePickupSensorAvailable();
}
- public boolean dozePulsePickupSensorAvailable() {
+ public boolean dozePickupSensorAvailable() {
return mContext.getResources().getBoolean(R.bool.config_dozePulsePickup);
}
- public boolean pulseOnPickupCanBeModified(int user) {
- return !alwaysOnEnabled(user);
- }
-
- public boolean pulseOnDoubleTapEnabled(int user) {
- return boolSettingDefaultOn(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, user)
- && pulseOnDoubleTapAvailable();
- }
-
- public boolean pulseOnDoubleTapAvailable() {
- return doubleTapSensorAvailable() && ambientDisplayAvailable();
+ public boolean doubleTapGestureEnabled(int user) {
+ return boolSettingDefaultOn(Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, user)
+ && doubleTapSensorAvailable();
}
public boolean doubleTapSensorAvailable() {
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 6316da57ec21..bb8ee14e1902 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -93,6 +93,7 @@ cc_library_shared {
"android_os_HwBlob.cpp",
"android_os_HwParcel.cpp",
"android_os_HwRemoteBinder.cpp",
+ "android_os_NativeHandle.cpp",
"android_os_MemoryFile.cpp",
"android_os_MessageQueue.cpp",
"android_os_Parcel.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 7fe095bbc215..6b55ed6d2289 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -168,6 +168,7 @@ extern int register_android_os_HwBinder(JNIEnv *env);
extern int register_android_os_HwBlob(JNIEnv *env);
extern int register_android_os_HwParcel(JNIEnv *env);
extern int register_android_os_HwRemoteBinder(JNIEnv *env);
+extern int register_android_os_NativeHandle(JNIEnv *env);
extern int register_android_os_MessageQueue(JNIEnv* env);
extern int register_android_os_Parcel(JNIEnv* env);
extern int register_android_os_SELinux(JNIEnv* env);
@@ -1348,6 +1349,7 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_os_HwBlob),
REG_JNI(register_android_os_HwParcel),
REG_JNI(register_android_os_HwRemoteBinder),
+ REG_JNI(register_android_os_NativeHandle),
REG_JNI(register_android_os_VintfObject),
REG_JNI(register_android_os_VintfRuntimeInfo),
REG_JNI(register_android_nio_utils),
diff --git a/core/jni/android/graphics/fonts/FontFamily.cpp b/core/jni/android/graphics/fonts/FontFamily.cpp
index 4597386084a2..767e068381d9 100644
--- a/core/jni/android/graphics/fonts/FontFamily.cpp
+++ b/core/jni/android/graphics/fonts/FontFamily.cpp
@@ -17,11 +17,13 @@
#define LOG_TAG "Minikin"
#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedUtfChars.h>
#include <core_jni_helpers.h>
#include "FontUtils.h"
#include <minikin/FontFamily.h>
+#include <minikin/LocaleList.h>
#include <memory>
@@ -54,10 +56,18 @@ static void FontFamily_Builder_addFont(jlong builderPtr, jlong fontPtr) {
}
// Regular JNI
-static jlong FontFamily_Builder_build(JNIEnv* env, jobject clazz, jlong builderPtr) {
+static jlong FontFamily_Builder_build(JNIEnv* env, jobject clazz, jlong builderPtr,
+ jstring langTags, jint variant) {
std::unique_ptr<NativeFamilyBuilder> builder(toBuilder(builderPtr));
- std::shared_ptr<minikin::FontFamily> family =
- std::make_shared<minikin::FontFamily>(std::move(builder->fonts));
+ uint32_t localeId;
+ if (langTags == nullptr) {
+ localeId = minikin::registerLocaleList("");
+ } else {
+ ScopedUtfChars str(env, langTags);
+ localeId = minikin::registerLocaleList(str.c_str());
+ }
+ std::shared_ptr<minikin::FontFamily> family = std::make_shared<minikin::FontFamily>(
+ localeId, static_cast<minikin::FamilyVariant>(variant), std::move(builder->fonts));
if (family->getCoverage().length() == 0) {
// No coverage means minikin rejected given font for some reasons.
jniThrowException(env, "java/lang/IllegalArgumentException",
@@ -77,7 +87,7 @@ static jlong FontFamily_Builder_GetReleaseFunc() {
static const JNINativeMethod gFontFamilyBuilderMethods[] = {
{ "nInitBuilder", "()J", (void*) FontFamily_Builder_initBuilder },
{ "nAddFont", "(JJ)V", (void*) FontFamily_Builder_addFont },
- { "nBuild", "(J)J", (void*) FontFamily_Builder_build },
+ { "nBuild", "(JLjava/lang/String;I)J", (void*) FontFamily_Builder_build },
{ "nGetReleaseNativeFamily", "()J", (void*) FontFamily_Builder_GetReleaseFunc },
};
diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp
index 0ba9a8ccc9ad..c977437f7df2 100644
--- a/core/jni/android_hardware_camera2_DngCreator.cpp
+++ b/core/jni/android_hardware_camera2_DngCreator.cpp
@@ -1748,19 +1748,20 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image
}
}
-
- size_t listSize = builder.getSize();
- uint8_t opcodeListBuf[listSize];
- err = builder.buildOpList(opcodeListBuf);
- if (err == OK) {
- BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_OPCODELIST2, listSize, opcodeListBuf,
- TIFF_IFD_0), env, TAG_OPCODELIST2, writer);
- } else {
- ALOGE("%s: Could not build list of opcodes for distortion correction and lens shading"
- "map.", __FUNCTION__);
- jniThrowRuntimeException(env, "failed to construct opcode list for distortion"
- " correction and lens shading map");
- return nullptr;
+ if (builder.getCount() > 0) {
+ size_t listSize = builder.getSize();
+ uint8_t opcodeListBuf[listSize];
+ err = builder.buildOpList(opcodeListBuf);
+ if (err == OK) {
+ BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_OPCODELIST2, listSize,
+ opcodeListBuf, TIFF_IFD_0), env, TAG_OPCODELIST2, writer);
+ } else {
+ ALOGE("%s: Could not build list of opcodes for lens shading map and bad pixel "
+ "correction.", __FUNCTION__);
+ jniThrowRuntimeException(env, "failed to construct opcode list for lens shading "
+ "map and bad pixel correction");
+ return nullptr;
+ }
}
}
@@ -1846,18 +1847,20 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image
}
}
- size_t listSize = builder.getSize();
- uint8_t opcodeListBuf[listSize];
- err = builder.buildOpList(opcodeListBuf);
- if (err == OK) {
- BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_OPCODELIST3, listSize, opcodeListBuf,
- TIFF_IFD_0), env, TAG_OPCODELIST3, writer);
- } else {
- ALOGE("%s: Could not build list of opcodes for distortion correction and lens shading"
- "map.", __FUNCTION__);
- jniThrowRuntimeException(env, "failed to construct opcode list for distortion"
- " correction and lens shading map");
- return nullptr;
+ if (builder.getCount() > 0) {
+ size_t listSize = builder.getSize();
+ uint8_t opcodeListBuf[listSize];
+ err = builder.buildOpList(opcodeListBuf);
+ if (err == OK) {
+ BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_OPCODELIST3, listSize,
+ opcodeListBuf, TIFF_IFD_0), env, TAG_OPCODELIST3, writer);
+ } else {
+ ALOGE("%s: Could not build list of opcodes for distortion correction.",
+ __FUNCTION__);
+ jniThrowRuntimeException(env, "failed to construct opcode list for distortion"
+ " correction");
+ return nullptr;
+ }
}
}
@@ -1968,8 +1971,14 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image
tagsToMove.add(TAG_DEFAULTSCALE);
tagsToMove.add(TAG_DEFAULTCROPORIGIN);
tagsToMove.add(TAG_DEFAULTCROPSIZE);
- tagsToMove.add(TAG_OPCODELIST2);
- tagsToMove.add(TAG_OPCODELIST3);
+
+ if (nullptr != writer->getEntry(TAG_OPCODELIST2, TIFF_IFD_0).get()) {
+ tagsToMove.add(TAG_OPCODELIST2);
+ }
+
+ if (nullptr != writer->getEntry(TAG_OPCODELIST3, TIFF_IFD_0).get()) {
+ tagsToMove.add(TAG_OPCODELIST3);
+ }
if (moveEntries(writer, TIFF_IFD_0, TIFF_IFD_SUB1, tagsToMove) != OK) {
jniThrowException(env, "java/lang/IllegalStateException", "Failed to move entries");
diff --git a/core/jni/android_os_HwBlob.cpp b/core/jni/android_os_HwBlob.cpp
index bb916d2431c5..cb55618c685c 100644
--- a/core/jni/android_os_HwBlob.cpp
+++ b/core/jni/android_os_HwBlob.cpp
@@ -21,6 +21,7 @@
#include "android_os_HwBlob.h"
#include "android_os_HwParcel.h"
+#include "android_os_NativeHandle.h"
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
@@ -31,6 +32,7 @@
#include "core_jni_helpers.h"
using android::AndroidRuntime;
+using android::hardware::hidl_handle;
using android::hardware::hidl_string;
#define PACKAGE_PATH "android/os"
@@ -82,6 +84,7 @@ sp<JHwBlob> JHwBlob::GetNativeContext(JNIEnv *env, jobject thiz) {
JHwBlob::JHwBlob(JNIEnv *env, jobject thiz, size_t size)
: mBuffer(nullptr),
mSize(size),
+ mType(BlobType::GENERIC),
mOwnsBuffer(true),
mHandle(0) {
if (size > 0) {
@@ -159,6 +162,15 @@ size_t JHwBlob::size() const {
return mSize;
}
+void JHwBlob::specializeBlobTo(BlobType type) {
+ CHECK_EQ(static_cast<int>(mType), static_cast<int>(BlobType::GENERIC));
+ mType = type;
+}
+
+JHwBlob::BlobType JHwBlob::type() const {
+ return mType;
+}
+
status_t JHwBlob::putBlob(size_t offset, const sp<JHwBlob> &blob) {
size_t index = mSubBlobs.add();
BlobInfo *info = &mSubBlobs.editItemAt(index);
@@ -172,42 +184,52 @@ status_t JHwBlob::putBlob(size_t offset, const sp<JHwBlob> &blob) {
}
status_t JHwBlob::writeToParcel(hardware::Parcel *parcel) const {
- size_t handle;
+ CHECK_EQ(static_cast<int>(mType), static_cast<int>(BlobType::GENERIC));
+
+ size_t handle = 0;
status_t err = parcel->writeBuffer(data(), size(), &handle);
if (err != OK) {
return err;
}
- for (size_t i = 0; i < mSubBlobs.size(); ++i) {
- const BlobInfo &info = mSubBlobs[i];
-
- err = info.mBlob->writeEmbeddedToParcel(parcel, handle, info.mOffset);
-
- if (err != OK) {
- return err;
- }
- }
-
- return OK;
+ return writeSubBlobsToParcel(parcel, handle);
}
status_t JHwBlob::writeEmbeddedToParcel(
hardware::Parcel *parcel,
size_t parentHandle,
size_t parentOffset) const {
- size_t handle;
- status_t err = parcel->writeEmbeddedBuffer(
- data(), size(), &handle, parentHandle, parentOffset);
+ size_t handle = 0;
+ status_t err = OK;
+
+ switch (mType) {
+ case BlobType::GENERIC: {
+ err = parcel->writeEmbeddedBuffer(data(), size(), &handle, parentHandle, parentOffset);
+ break;
+ }
+ case BlobType::NATIVE_HANDLE: {
+ err = parcel->writeEmbeddedNativeHandle(
+ static_cast<const native_handle *>(data()), parentHandle, parentOffset);
+
+ CHECK(mSubBlobs.empty());
+ break;
+ }
+ default: { err = INVALID_OPERATION; }
+ }
if (err != OK) {
return err;
}
+ return writeSubBlobsToParcel(parcel, handle);
+}
+
+status_t JHwBlob::writeSubBlobsToParcel(hardware::Parcel *parcel,
+ size_t parentHandle) const {
for (size_t i = 0; i < mSubBlobs.size(); ++i) {
const BlobInfo &info = mSubBlobs[i];
-
- err = info.mBlob->writeEmbeddedToParcel(parcel, handle, info.mOffset);
+ status_t err = info.mBlob->writeEmbeddedToParcel(parcel, parentHandle, info.mOffset);
if (err != OK) {
return err;
@@ -252,7 +274,7 @@ static void releaseNativeContext(void *nativeContext) {
}
}
-static jlong JHwBlob_native_init(JNIEnv *env) {
+static jlong JHwBlob_native_init(JNIEnv *env, jclass /*clazz*/) {
JHwBlob::InitClass(env);
return reinterpret_cast<jlong>(&releaseNativeContext);
@@ -456,6 +478,31 @@ static void JHwBlob_native_putString(
blob->putBlob(offset + hidl_string::kOffsetOfBuffer, subBlob);
}
+static void JHwBlob_native_putNativeHandle(JNIEnv *env, jobject thiz,
+ jlong offset, jobject jHandle) {
+ std::unique_ptr<native_handle_t, int(*)(native_handle_t*)> nativeHandle(
+ JNativeHandle::MakeCppNativeHandle(env, jHandle, nullptr /* storage */),
+ native_handle_delete);
+
+ size_t size = 0;
+ if (nativeHandle != nullptr) {
+ size = sizeof(native_handle_t) + nativeHandle->numFds * sizeof(int)
+ + nativeHandle->numInts * sizeof(int);
+ }
+
+ ScopedLocalRef<jobject> subBlobObj(env, JHwBlob::NewObject(env, size));
+ sp<JHwBlob> subBlob = JHwBlob::GetNativeContext(env, subBlobObj.get());
+ subBlob->specializeBlobTo(JHwBlob::BlobType::NATIVE_HANDLE);
+ subBlob->write(0 /* offset */, nativeHandle.get(), size);
+
+ hidl_handle cppHandle;
+ cppHandle.setTo(static_cast<native_handle_t *>(subBlob->data()), false /* shouldOwn */);
+
+ sp<JHwBlob> blob = JHwBlob::GetNativeContext(env, thiz);
+ blob->write(offset, &cppHandle, sizeof(cppHandle));
+ blob->putBlob(offset + hidl_handle::kOffsetOfNativeHandle, subBlob);
+}
+
#define DEFINE_BLOB_ARRAY_PUTTER(Suffix,Type,NewType) \
static void JHwBlob_native_put ## Suffix ## Array( \
JNIEnv *env, jobject thiz, jlong offset, Type ## Array array) { \
@@ -563,6 +610,8 @@ static JNINativeMethod gMethods[] = {
{ "putFloat", "(JF)V", (void *)JHwBlob_native_putFloat },
{ "putDouble", "(JD)V", (void *)JHwBlob_native_putDouble },
{ "putString", "(JLjava/lang/String;)V", (void *)JHwBlob_native_putString },
+ { "putNativeHandle", "(JL" PACKAGE_PATH "/NativeHandle;)V",
+ (void*)JHwBlob_native_putNativeHandle },
{ "putBoolArray", "(J[Z)V", (void *)JHwBlob_native_putBoolArray },
{ "putInt8Array", "(J[B)V", (void *)JHwBlob_native_putInt8Array },
diff --git a/core/jni/android_os_HwBlob.h b/core/jni/android_os_HwBlob.h
index 6b1db639ac19..69a1b165af9a 100644
--- a/core/jni/android_os_HwBlob.h
+++ b/core/jni/android_os_HwBlob.h
@@ -27,6 +27,11 @@
namespace android {
struct JHwBlob : public RefBase {
+ enum class BlobType {
+ GENERIC,
+ NATIVE_HANDLE,
+ };
+
static void InitClass(JNIEnv *env);
static sp<JHwBlob> SetNativeContext(
@@ -54,6 +59,9 @@ struct JHwBlob : public RefBase {
size_t size() const;
+ void specializeBlobTo(BlobType type);
+ BlobType type() const;
+
status_t putBlob(size_t offset, const sp<JHwBlob> &blob);
status_t writeToParcel(hardware::Parcel *parcel) const;
@@ -74,12 +82,15 @@ private:
void *mBuffer;
size_t mSize;
+ BlobType mType;
bool mOwnsBuffer;
size_t mHandle;
Vector<BlobInfo> mSubBlobs;
+ status_t writeSubBlobsToParcel(hardware::Parcel *parcel, size_t parentHandle) const;
+
DISALLOW_COPY_AND_ASSIGN(JHwBlob);
};
diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp
index 061349aee96f..7221ca11cc00 100644
--- a/core/jni/android_os_HwParcel.cpp
+++ b/core/jni/android_os_HwParcel.cpp
@@ -22,6 +22,7 @@
#include "android_os_HwBinder.h"
#include "android_os_HwBlob.h"
+#include "android_os_NativeHandle.h"
#include "android_os_HwRemoteBinder.h"
#include <nativehelper/JNIHelp.h>
@@ -34,6 +35,7 @@
using android::AndroidRuntime;
+using ::android::hardware::hidl_handle;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
@@ -436,6 +438,18 @@ static void JHwParcel_native_writeString(
signalExceptionForError(env, err);
}
+static void JHwParcel_native_writeNativeHandle(JNIEnv *env, jobject thiz, jobject valObj) {
+ sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);
+
+ EphemeralStorage *storage = impl->getStorage();
+ native_handle_t *handle = JNativeHandle::MakeCppNativeHandle(env, valObj, storage);
+
+ hardware::Parcel *parcel = impl->getParcel();
+ status_t err = parcel->writeNativeHandleNoDup(handle);
+
+ signalExceptionForError(env, err);
+}
+
#define DEFINE_PARCEL_VECTOR_WRITER(Suffix,Type) \
static void JHwParcel_native_write ## Suffix ## Vector( \
JNIEnv *env, jobject thiz, Type ## Array valObj) { \
@@ -524,12 +538,96 @@ static void JHwParcel_native_writeBoolVector(
signalExceptionForError(env, err);
}
+template<typename T>
+static void WriteHidlVector(JNIEnv *env, jobject thiz, const hidl_vec<T> &vec) {
+ hardware::Parcel *parcel = JHwParcel::GetNativeContext(env, thiz)->getParcel();
+
+ size_t parentHandle;
+ status_t err = parcel->writeBuffer(&vec, sizeof(vec), &parentHandle);
+
+ if (err == OK) {
+ size_t childHandle;
+ err = ::android::hardware::writeEmbeddedToParcel(
+ vec,
+ parcel,
+ parentHandle,
+ 0 /* parentOffset */,
+ &childHandle);
+
+ for (size_t i = 0; (err == OK) && (i < vec.size()); ++i) {
+ err = ::android::hardware::writeEmbeddedToParcel(
+ vec[i],
+ parcel,
+ childHandle,
+ i * sizeof(T));
+ }
+ }
+
+ signalExceptionForError(env, err);
+}
+
+static void JHwParcel_native_writeStringVector(
+ JNIEnv *env, jobject thiz, jobjectArray arrayObj) {
+ if (arrayObj == nullptr) {
+ jniThrowException(env, "java/lang/NullPointerException", nullptr);
+ return;
+ }
+
+ sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);
+ EphemeralStorage *storage = impl->getStorage();
+
+ void *vecPtr = storage->allocTemporaryStorage(sizeof(hidl_vec<hidl_string>));
+ hidl_vec<hidl_string> *vec = new (vecPtr) hidl_vec<hidl_string>();
+
+ jsize len = env->GetArrayLength(arrayObj);
+ hidl_string *strings = storage->allocStringArray(len);
+ vec->setToExternal(strings, len, false /* shouldOwn */);
+
+ for (jsize i = 0; i < len; ++i) {
+ ScopedLocalRef<jstring> stringObj(env, (jstring) env->GetObjectArrayElement(arrayObj, i));
+
+ const hidl_string *s = storage->allocTemporaryString(env, stringObj.get());
+ strings[i].setToExternal(s->c_str(), s->size());
+ }
+
+ WriteHidlVector(env, thiz, *vec);
+}
+
+static void JHwParcel_native_writeNativeHandleVector(
+ JNIEnv *env, jobject thiz, jobjectArray jHandleArray) {
+ if (jHandleArray == nullptr) {
+ jniThrowException(env, "java/lang/NullPointerException", nullptr);
+ return;
+ }
+
+ sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);
+ EphemeralStorage *storage = impl->getStorage();
+
+ void *vecPtr = storage->allocTemporaryStorage(sizeof(hidl_vec<hidl_handle>));
+ hidl_vec<hidl_handle> *vec = new (vecPtr) hidl_vec<hidl_handle>();
+
+ jsize len = env->GetArrayLength(jHandleArray);
+ hidl_handle *handles = static_cast<hidl_handle *>(
+ storage->allocTemporaryStorage(len * sizeof(hidl_handle)));
+
+ vec->setToExternal(handles, len, false /* shouldOwn */);
+ for (jsize i = 0; i < len; i++) {
+ ScopedLocalRef<jobject> jHandle(env, env->GetObjectArrayElement(jHandleArray, i));
+
+ native_handle_t* handle = JNativeHandle::MakeCppNativeHandle(env, jHandle.get(), storage);
+
+ new (&(handles[i])) hidl_handle();
+ handles[i].setTo(handle, false /* shouldOwn */);
+ }
+
+ WriteHidlVector(env, thiz, *vec);
+}
+
static void JHwParcel_native_writeStrongBinder(
JNIEnv *env, jobject thiz, jobject binderObj) {
sp<hardware::IBinder> binder;
if (binderObj != NULL) {
- ScopedLocalRef<jclass> hwBinderKlass(
- env, FindClassOrDie(env, PACKAGE_PATH "/HwBinder"));
+ ScopedLocalRef<jclass> hwBinderKlass(env, FindClassOrDie(env, PACKAGE_PATH "/HwBinder"));
ScopedLocalRef<jclass> hwRemoteBinderKlass(
env, FindClassOrDie(env, PACKAGE_PATH "/HwRemoteBinder"));
@@ -587,6 +685,37 @@ static jstring JHwParcel_native_readString(JNIEnv *env, jobject thiz) {
return MakeStringObjFromHidlString(env, *s);
}
+static jobject ReadNativeHandle(JNIEnv *env, jobject thiz, jboolean embedded,
+ jlong parentHandle, jlong offset) {
+ hardware::Parcel *parcel =
+ JHwParcel::GetNativeContext(env, thiz)->getParcel();
+
+ const native_handle_t *handle = nullptr;
+ status_t err = OK;
+
+ if (embedded) {
+ err = parcel->readNullableEmbeddedNativeHandle(parentHandle, offset, &handle);
+ } else {
+ err = parcel->readNullableNativeHandleNoDup(&handle);
+ }
+
+ if (err != OK) {
+ signalExceptionForError(env, err);
+ return nullptr;
+ }
+
+ return JNativeHandle::MakeJavaNativeHandleObj(env, handle);
+}
+
+static jobject JHwParcel_native_readNativeHandle(JNIEnv *env, jobject thiz) {
+ return ReadNativeHandle(env, thiz, false /*embedded*/, 0L /*parentHandle*/, 0L /*offset*/);
+}
+
+static jobject JHwParcel_native_readEmbeddedNativeHandle(
+ JNIEnv *env, jobject thiz, jlong parentHandle, jlong offset) {
+ return ReadNativeHandle(env, thiz, true /*embedded*/, parentHandle, offset);
+}
+
#define DEFINE_PARCEL_VECTOR_READER(Suffix,Type,NewType) \
static Type ## Array JHwParcel_native_read ## Suffix ## Vector( \
JNIEnv *env, jobject thiz) { \
@@ -630,10 +759,8 @@ DEFINE_PARCEL_VECTOR_READER(Int64,jlong,Long)
DEFINE_PARCEL_VECTOR_READER(Float,jfloat,Float)
DEFINE_PARCEL_VECTOR_READER(Double,jdouble,Double)
-static jbooleanArray JHwParcel_native_readBoolVector(
- JNIEnv *env, jobject thiz) {
- hardware::Parcel *parcel =
- JHwParcel::GetNativeContext(env, thiz)->getParcel();
+static jbooleanArray JHwParcel_native_readBoolVector(JNIEnv *env, jobject thiz) {
+ hardware::Parcel *parcel = JHwParcel::GetNativeContext(env, thiz)->getParcel();
size_t parentHandle;
@@ -692,101 +819,62 @@ static jobjectArray MakeStringArray(
return arrayObj;
}
-static jobjectArray JHwParcel_native_readStringVector(
- JNIEnv *env, jobject thiz) {
- typedef hidl_vec<hidl_string> string_vec;
+template<typename T>
+static const hidl_vec<T> *ReadHidlVector(JNIEnv *env, jobject thiz) {
+ const hidl_vec<T> *vec;
- hardware::Parcel *parcel =
- JHwParcel::GetNativeContext(env, thiz)->getParcel();
+ hardware::Parcel *parcel = JHwParcel::GetNativeContext(env, thiz)->getParcel();
size_t parentHandle;
+ status_t err = parcel->readBuffer(sizeof(hidl_vec<T>),
+ &parentHandle, reinterpret_cast<const void **>(&vec));
- const string_vec *vec;
- status_t err = parcel->readBuffer(sizeof(*vec), &parentHandle,
- reinterpret_cast<const void **>(&vec));
-
- if (err != OK) {
- signalExceptionForError(env, err);
- return NULL;
- }
-
- size_t childHandle;
- err = ::android::hardware::readEmbeddedFromParcel(
- const_cast<string_vec &>(*vec),
- *parcel, parentHandle, 0 /* parentOffset */, &childHandle);
+ if (err == OK) {
+ size_t childHandle;
+ err = ::android::hardware::readEmbeddedFromParcel(
+ const_cast<hidl_vec<T> &>(*vec),
+ *parcel, parentHandle,
+ 0 /* parentOffset */,
+ &childHandle);
- for (size_t i = 0; (err == OK) && (i < vec->size()); ++i) {
- err = android::hardware::readEmbeddedFromParcel(
- const_cast<hidl_string &>((*vec)[i]),
+ for (size_t i = 0; (err == OK) && (i < vec->size()); i++) {
+ err = android::hardware::readEmbeddedFromParcel(
+ const_cast<T &>((*vec)[i]),
*parcel,
childHandle,
- i * sizeof(hidl_string) /* parentOffset */);
+ i * sizeof(T) /* parentOffset */);
+ }
}
if (err != OK) {
signalExceptionForError(env, err);
- return NULL;
+ return nullptr;
}
- return MakeStringArray(env, &(*vec)[0], vec->size());
+ return vec;
}
-static void JHwParcel_native_writeStringVector(
- JNIEnv *env, jobject thiz, jobjectArray arrayObj) {
- typedef hidl_vec<hidl_string> string_vec;
-
- if (arrayObj == NULL) {
- jniThrowException(env, "java/lang/NullPointerException", NULL);
- return;
- }
-
- jsize len = env->GetArrayLength(arrayObj);
-
- sp<JHwParcel> impl = JHwParcel::GetNativeContext(env, thiz);
-
- void *vecPtr =
- impl->getStorage()->allocTemporaryStorage(sizeof(string_vec));
-
- string_vec *vec = new (vecPtr) string_vec;
-
- hidl_string *strings = impl->getStorage()->allocStringArray(len);
- vec->setToExternal(strings, len);
-
- for (jsize i = 0; i < len; ++i) {
- ScopedLocalRef<jstring> stringObj(
- env,
- (jstring)env->GetObjectArrayElement(arrayObj, i));
-
- const hidl_string *s =
- impl->getStorage()->allocTemporaryString(env, stringObj.get());
-
- strings[i].setToExternal(s->c_str(), s->size());
- }
+static jobjectArray JHwParcel_native_readStringVector(
+ JNIEnv *env, jobject thiz) {
+ const hidl_vec<hidl_string> *vec = ReadHidlVector<hidl_string>(env, thiz);
+ return MakeStringArray(env, &(*vec)[0], vec->size());
+}
- hardware::Parcel *parcel = impl->getParcel();
+static jobjectArray JHwParcel_native_readNativeHandleVector(
+ JNIEnv *env, jobject thiz) {
+ const hidl_vec<hidl_handle> *vec = ReadHidlVector<hidl_handle>(env, thiz);
- size_t parentHandle;
- status_t err = parcel->writeBuffer(vec, sizeof(*vec), &parentHandle);
+ jsize length = vec->size();
+ jobjectArray objArray = JNativeHandle::AllocJavaNativeHandleObjArray(
+ env, length);
- if (err == OK) {
- size_t childHandle;
- err = ::android::hardware::writeEmbeddedToParcel(
- *vec,
- parcel,
- parentHandle,
- 0 /* parentOffset */,
- &childHandle);
+ for (jsize i = 0; i < length; i++) {
+ jobject jHandle = JNativeHandle::MakeJavaNativeHandleObj(env, (*vec)[i].getNativeHandle());
- for (size_t i = 0; (err == OK) && (i < vec->size()); ++i) {
- err = ::android::hardware::writeEmbeddedToParcel(
- (*vec)[i],
- parcel,
- childHandle,
- i * sizeof(hidl_string));
- }
+ env->SetObjectArrayElement(objArray, i, jHandle);
}
- signalExceptionForError(env, err);
+ return objArray;
}
static jobject JHwParcel_native_readStrongBinder(JNIEnv *env, jobject thiz) {
@@ -890,6 +978,9 @@ static JNINativeMethod gMethods[] = {
{ "writeString", "(Ljava/lang/String;)V",
(void *)JHwParcel_native_writeString },
+ { "writeNativeHandle", "(L" PACKAGE_PATH "/NativeHandle;)V",
+ (void *)JHwParcel_native_writeNativeHandle },
+
{ "writeBoolVector", "([Z)V", (void *)JHwParcel_native_writeBoolVector },
{ "writeInt8Vector", "([B)V", (void *)JHwParcel_native_writeInt8Vector },
{ "writeInt16Vector", "([S)V", (void *)JHwParcel_native_writeInt16Vector },
@@ -903,6 +994,9 @@ static JNINativeMethod gMethods[] = {
{ "writeStringVector", "([Ljava/lang/String;)V",
(void *)JHwParcel_native_writeStringVector },
+ { "writeNativeHandleVector", "([L" PACKAGE_PATH "/NativeHandle;)V",
+ (void *)JHwParcel_native_writeNativeHandleVector },
+
{ "writeStrongBinder", "(L" PACKAGE_PATH "/IHwBinder;)V",
(void *)JHwParcel_native_writeStrongBinder },
@@ -920,6 +1014,12 @@ static JNINativeMethod gMethods[] = {
{ "readString", "()Ljava/lang/String;",
(void *)JHwParcel_native_readString },
+ { "readNativeHandle", "()L" PACKAGE_PATH "/NativeHandle;",
+ (void *)JHwParcel_native_readNativeHandle },
+
+ { "readEmbeddedNativeHandle", "(JJ)L" PACKAGE_PATH "/NativeHandle;",
+ (void *)JHwParcel_native_readEmbeddedNativeHandle },
+
{ "readBoolVectorAsArray", "()[Z",
(void *)JHwParcel_native_readBoolVector },
@@ -944,6 +1044,9 @@ static JNINativeMethod gMethods[] = {
{ "readStringVectorAsArray", "()[Ljava/lang/String;",
(void *)JHwParcel_native_readStringVector },
+ { "readNativeHandleAsArray", "()[L" PACKAGE_PATH "/NativeHandle;",
+ (void *)JHwParcel_native_readNativeHandleVector },
+
{ "readStrongBinder", "()L" PACKAGE_PATH "/IHwBinder;",
(void *)JHwParcel_native_readStrongBinder },
diff --git a/core/jni/android_os_NativeHandle.cpp b/core/jni/android_os_NativeHandle.cpp
new file mode 100644
index 000000000000..770fdb0d5d20
--- /dev/null
+++ b/core/jni/android_os_NativeHandle.cpp
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ */
+
+#include "android_os_NativeHandle.h"
+
+#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedLocalRef.h>
+
+#include "core_jni_helpers.h"
+
+#define PACKAGE_PATH "android/os"
+#define CLASS_NAME "NativeHandle"
+#define CLASS_PATH PACKAGE_PATH "/" CLASS_NAME
+
+namespace android {
+
+static struct {
+ jclass clazz;
+ jmethodID constructID; // NativeHandle(int[] fds, int[] ints, boolean owns)
+
+ jmethodID getFdsID; // int[] NativeHandle.getFds()
+ jmethodID getIntsID; // int[] NativeHandle.getInts()
+} gNativeHandleFields;
+
+jobject JNativeHandle::MakeJavaNativeHandleObj(
+ JNIEnv *env, const native_handle_t *handle) {
+ if (handle == nullptr) { return nullptr; }
+
+ const int numFds = handle->numFds;
+ ScopedLocalRef<jintArray> fds(env, env->NewIntArray(numFds));
+ env->SetIntArrayRegion(fds.get(), 0, numFds, &(handle->data[0]));
+
+ const int numInts = handle->numInts;
+ ScopedLocalRef<jintArray> ints(env, env->NewIntArray(numInts));
+ env->SetIntArrayRegion(ints.get(), 0, numInts, &(handle->data[numFds]));
+
+ return env->NewObject(gNativeHandleFields.clazz,
+ gNativeHandleFields.constructID, fds.get(), ints.get(), false /*own*/);
+}
+
+native_handle_t *JNativeHandle::MakeCppNativeHandle(
+ JNIEnv *env, jobject jHandle, EphemeralStorage *storage) {
+ if (jHandle == nullptr) { return nullptr; }
+
+ if (!env->IsInstanceOf(jHandle, gNativeHandleFields.clazz)) {
+ jniThrowException(env, "java/lang/ClassCastException",
+ "jHandle must be an instance of NativeHandle.");
+ return nullptr;
+ }
+
+ ScopedLocalRef<jintArray> fds(env, (jintArray) env->CallObjectMethod(
+ jHandle, gNativeHandleFields.getFdsID));
+
+ ScopedLocalRef<jintArray> ints(env, (jintArray) env->CallObjectMethod(
+ jHandle, gNativeHandleFields.getIntsID));
+
+ const int numFds = (int) env->GetArrayLength(fds.get());
+ const int numInts = (int) env->GetArrayLength(ints.get());
+
+ native_handle_t *handle = (storage == nullptr)
+ ? native_handle_create(numFds, numInts)
+ : storage->allocTemporaryNativeHandle(numFds, numInts);
+
+ if (handle != nullptr) {
+ env->GetIntArrayRegion(fds.get(), 0, numFds, &(handle->data[0]));
+ env->GetIntArrayRegion(ints.get(), 0, numInts, &(handle->data[numFds]));
+ } else {
+ jniThrowException(env, "java/lang/OutOfMemoryError",
+ "Failed to allocate memory for native_handle_t.");
+ }
+
+ return handle;
+}
+
+jobjectArray JNativeHandle::AllocJavaNativeHandleObjArray(JNIEnv *env, jsize length) {
+ return env->NewObjectArray(length, gNativeHandleFields.clazz, nullptr);
+}
+
+int register_android_os_NativeHandle(JNIEnv *env) {
+ jclass clazz = FindClassOrDie(env, CLASS_PATH);
+ gNativeHandleFields.clazz = MakeGlobalRefOrDie(env, clazz);
+
+ gNativeHandleFields.constructID = GetMethodIDOrDie(env, clazz, "<init>", "([I[IZ)V");
+ gNativeHandleFields.getFdsID = GetMethodIDOrDie(env, clazz, "getFdsAsIntArray", "()[I");
+ gNativeHandleFields.getIntsID = GetMethodIDOrDie(env, clazz, "getInts", "()[I");
+
+ return 0;
+}
+
+}
diff --git a/core/jni/android_os_NativeHandle.h b/core/jni/android_os_NativeHandle.h
new file mode 100644
index 000000000000..bbe3ebc1dbd0
--- /dev/null
+++ b/core/jni/android_os_NativeHandle.h
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+#ifndef ANDROID_OS_NATIVE_HANDLE_H
+#define ANDROID_OS_NATIVE_HANDLE_H
+
+#include "hwbinder/EphemeralStorage.h"
+
+#include <cutils/native_handle.h>
+#include <jni.h>
+
+namespace android {
+
+struct JNativeHandle {
+
+ /**
+ * Returns a Java NativeHandle object representing the parameterized
+ * native_handle_t instance.
+ */
+ static jobject MakeJavaNativeHandleObj(JNIEnv *env, const native_handle_t *handle);
+
+ /**
+ * Returns a heap-allocated native_handle_t instance representing the
+ * parameterized Java object. Note that if no valid EphemeralStorage*
+ * parameter is supplied (storage is nullptr), the return value must
+ * be explicitly deallocated (using native_handle_delete).
+ */
+ static native_handle_t* MakeCppNativeHandle(JNIEnv *env, jobject jHandle,
+ EphemeralStorage *storage);
+
+ /**
+ * Returns an (uninitialized) array of Java NativeHandle objects.
+ */
+ static jobjectArray AllocJavaNativeHandleObjArray(JNIEnv *env, jsize length);
+};
+
+}
+
+#endif // ANDROID_OS_NATIVE_HANDLE_H
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index bed239f97951..7ef06dc54945 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -336,8 +336,13 @@ static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env, jclass clazz, j
jbyte* a2 = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0);
if (a2) {
const void* data = parcel->readInplace(len);
- memcpy(a2, data, len);
+ if (data) {
+ memcpy(a2, data, len);
+ }
env->ReleasePrimitiveArrayCritical(ret, a2, 0);
+ if (!data) {
+ ret = NULL;
+ }
}
}
}
@@ -360,9 +365,14 @@ static jboolean android_os_Parcel_readByteArray(JNIEnv* env, jclass clazz, jlong
jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)dest, 0);
if (ar) {
const void* data = parcel->readInplace(len);
- memcpy(ar, data, len);
+ if (data) {
+ memcpy(ar, data, len);
+ ret = JNI_TRUE;
+ } else {
+ ret = JNI_FALSE;
+ }
+
env->ReleasePrimitiveArrayCritical((jarray)dest, ar, 0);
- ret = JNI_TRUE;
}
}
return ret;
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index 17ab9563d372..e64d2afe7bf3 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -96,7 +96,7 @@ static jobjectArray android_os_VintfObject_report(JNIEnv* env, jclass)
return toJavaStringArray(env, cStrings);
}
-static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::DisabledChecks checks) {
+static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::CheckFlags::Type checks) {
std::vector<std::string> cPackageInfo;
if (packageInfo) {
size_t count = env->GetArrayLength(packageInfo);
@@ -116,11 +116,11 @@ static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::Disabl
}
static jint android_os_VintfObject_verify(JNIEnv* env, jclass, jobjectArray packageInfo) {
- return verify(env, packageInfo, ::android::vintf::ENABLE_ALL_CHECKS);
+ return verify(env, packageInfo, ::android::vintf::CheckFlags::ENABLE_ALL_CHECKS);
}
static jint android_os_VintfObject_verifyWithoutAvb(JNIEnv* env, jclass) {
- return verify(env, nullptr, ::android::vintf::DISABLE_AVB_CHECK);
+ return verify(env, nullptr, ::android::vintf::CheckFlags::DISABLE_AVB_CHECK);
}
static jobjectArray android_os_VintfObject_getHalNamesAndVersions(JNIEnv* env, jclass) {
diff --git a/core/jni/hwbinder/EphemeralStorage.cpp b/core/jni/hwbinder/EphemeralStorage.cpp
index 3b18f2b36b9e..95bb42ea57c6 100644
--- a/core/jni/hwbinder/EphemeralStorage.cpp
+++ b/core/jni/hwbinder/EphemeralStorage.cpp
@@ -71,6 +71,17 @@ const hidl_string *EphemeralStorage::allocTemporaryString(
return s;
}
+native_handle_t *EphemeralStorage::allocTemporaryNativeHandle(
+ int numFds, int numInts) {
+ Item item;
+ item.mType = TYPE_NATIVE_HANDLE;
+ item.mObj = nullptr;
+ item.mPtr = native_handle_create(numFds, numInts);
+ mItems.push_back(item);
+
+ return static_cast<native_handle_t*>(item.mPtr);
+}
+
#define DEFINE_ALLOC_VECTOR_METHODS(Suffix,Type,NewType) \
const hidl_vec<Type> *EphemeralStorage::allocTemporary ## Suffix ## Vector( \
JNIEnv *env, Type ## Array arrayObj) { \
@@ -145,6 +156,13 @@ void EphemeralStorage::release(JNIEnv *env) {
DEFINE_RELEASE_ARRAY_CASE(Float,jfloat,Float)
DEFINE_RELEASE_ARRAY_CASE(Double,jdouble,Double)
+ case TYPE_NATIVE_HANDLE:
+ {
+ int err = native_handle_delete(static_cast<native_handle_t *>(item.mPtr));
+ CHECK(err == 0);
+ break;
+ }
+
default:
CHECK(!"Should not be here");
}
diff --git a/core/jni/hwbinder/EphemeralStorage.h b/core/jni/hwbinder/EphemeralStorage.h
index f07c782bfdf7..55ef74169eb1 100644
--- a/core/jni/hwbinder/EphemeralStorage.h
+++ b/core/jni/hwbinder/EphemeralStorage.h
@@ -43,6 +43,8 @@ struct EphemeralStorage {
const ::android::hardware::hidl_string *allocTemporaryString(
JNIEnv *env, jstring stringObj);
+ native_handle_t *allocTemporaryNativeHandle(int numFds, int numInts);
+
DECLARE_ALLOC_METHODS(Int8,jbyte)
DECLARE_ALLOC_METHODS(Int16,jshort)
DECLARE_ALLOC_METHODS(Int32,jint)
@@ -61,6 +63,7 @@ private:
TYPE_Int64_ARRAY,
TYPE_Float_ARRAY,
TYPE_Double_ARRAY,
+ TYPE_NATIVE_HANDLE,
};
struct Item {
diff --git a/core/proto/android/app/alarmmanager.proto b/core/proto/android/app/alarmmanager.proto
index 53be1ee7a93a..58df9225bb7e 100644
--- a/core/proto/android/app/alarmmanager.proto
+++ b/core/proto/android/app/alarmmanager.proto
@@ -53,5 +53,5 @@ message AlarmClockInfoProto {
// This value is UTC wall clock time in milliseconds, as returned by
// System#currentTimeMillis() for example.
optional int64 trigger_time_ms = 1;
- optional android.app.PendingIntentProto show_intent = 2;
+ optional PendingIntentProto show_intent = 2;
}
diff --git a/core/proto/android/app/notification.proto b/core/proto/android/app/notification.proto
index c7e313aa5801..a6f13d76b9f6 100644
--- a/core/proto/android/app/notification.proto
+++ b/core/proto/android/app/notification.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.app";
option java_multiple_files = true;
package android.app;
diff --git a/core/proto/android/app/notification_channel.proto b/core/proto/android/app/notification_channel.proto
index d3808e890025..75cc18bf7a07 100644
--- a/core/proto/android/app/notification_channel.proto
+++ b/core/proto/android/app/notification_channel.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.app";
option java_multiple_files = true;
package android.app;
@@ -29,8 +28,11 @@ import "frameworks/base/libs/incident/proto/android/privacy.proto";
message NotificationChannelProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Notification Channel ID. Provided by the app.
optional string id = 1 [ (android.privacy).dest = DEST_EXPLICIT ];
+ // User-visible Notification Channel name. Provided by the app.
optional string name = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+ // User-visible Notification Channel description. Provided by the app.
optional string description = 3 [ (android.privacy).dest = DEST_EXPLICIT ];
optional int32 importance = 4;
optional bool can_bypass_dnd = 5;
@@ -49,6 +51,7 @@ message NotificationChannelProto {
optional bool show_badge = 13;
// Default is false.
optional bool is_deleted = 14;
+ // Provided by the app but will match a NotificationChannelGroup id.
optional string group = 15 [ (android.privacy).dest = DEST_EXPLICIT ];
optional android.media.AudioAttributesProto audio_attributes = 16;
// If this is a blockable system notification channel.
diff --git a/core/proto/android/app/notification_channel_group.proto b/core/proto/android/app/notification_channel_group.proto
index 7b270d74f2de..4fb27b0d6e4a 100644
--- a/core/proto/android/app/notification_channel_group.proto
+++ b/core/proto/android/app/notification_channel_group.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.app";
option java_multiple_files = true;
package android.app;
@@ -29,9 +28,12 @@ import "frameworks/base/libs/incident/proto/android/privacy.proto";
message NotificationChannelGroupProto {
option (.android.msg_privacy).dest = DEST_EXPLICIT;
+ // Notification Channel Group ID. Provided by the app.
optional string id = 1;
+ // User-visible Notification Channel Group name.
optional string name = 2;
+ // User-visible Notification Channel Group description.
optional string description = 3;
optional bool is_blocked = 4;
- repeated android.app.NotificationChannelProto channels = 5;
+ repeated NotificationChannelProto channels = 5;
}
diff --git a/core/proto/android/app/notificationmanager.proto b/core/proto/android/app/notificationmanager.proto
index 183f9d3c28f5..27204ccae0d9 100644
--- a/core/proto/android/app/notificationmanager.proto
+++ b/core/proto/android/app/notificationmanager.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.app";
option java_multiple_files = true;
package android.app;
diff --git a/core/proto/android/app/profilerinfo.proto b/core/proto/android/app/profilerinfo.proto
index 6b28318f9fb9..20fa3adbf5b9 100644
--- a/core/proto/android/app/profilerinfo.proto
+++ b/core/proto/android/app/profilerinfo.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.app";
option java_multiple_files = true;
import "frameworks/base/libs/incident/proto/android/privacy.proto";
@@ -28,10 +27,12 @@ package android.app;
message ProfilerInfoProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Name of profile output file.
optional string profile_file = 1;
optional int32 profile_fd = 2;
optional int32 sampling_interval = 3;
optional bool auto_stop_profiler = 4;
optional bool streaming_output = 5;
+ // Denotes an agent (and its parameters) to attach for profiling.
optional string agent = 6;
}
diff --git a/core/proto/android/app/window_configuration.proto b/core/proto/android/app/window_configuration.proto
index c9f3986b6004..2d1555298ffb 100644
--- a/core/proto/android/app/window_configuration.proto
+++ b/core/proto/android/app/window_configuration.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.app";
option java_multiple_files = true;
package android.app;
diff --git a/core/proto/android/content/clipdata.proto b/core/proto/android/content/clipdata.proto
index cbc00a7970c1..4f1c308f0981 100644
--- a/core/proto/android/content/clipdata.proto
+++ b/core/proto/android/content/clipdata.proto
@@ -27,7 +27,7 @@ import "frameworks/base/libs/incident/proto/android/privacy.proto";
message ClipDataProto {
option (.android.msg_privacy).dest = DEST_LOCAL;
- optional android.content.ClipDescriptionProto description = 1;
+ optional ClipDescriptionProto description = 1;
// Custom dump of an android.graphics.Bitmap object.
message Icon {
@@ -46,8 +46,8 @@ message ClipDataProto {
string html_text = 1;
string text = 2;
string uri = 3;
- android.content.IntentProto intent = 4;
- bool nothing = 5;
+ IntentProto intent = 4;
+ bool nothing = 5 [ (.android.privacy).dest = DEST_AUTOMATIC ];
}
}
repeated Item items = 3;
diff --git a/core/proto/android/content/component_name.proto b/core/proto/android/content/component_name.proto
index 4e49cf2bfcd5..232d68584335 100644
--- a/core/proto/android/content/component_name.proto
+++ b/core/proto/android/content/component_name.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.content";
option java_multiple_files = true;
package android.content;
diff --git a/core/proto/android/content/configuration.proto b/core/proto/android/content/configuration.proto
index 5755c5974a00..06f9735c3dea 100644
--- a/core/proto/android/content/configuration.proto
+++ b/core/proto/android/content/configuration.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.content";
option java_multiple_files = true;
package android.content;
diff --git a/core/proto/android/content/featureinfo.proto b/core/proto/android/content/featureinfo.proto
index 6878f0ecd84c..87bf404c6245 100644
--- a/core/proto/android/content/featureinfo.proto
+++ b/core/proto/android/content/featureinfo.proto
@@ -18,7 +18,6 @@ syntax = "proto2";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-option java_package = "android.content.pm";
option java_multiple_files = true;
package android.content.pm;
diff --git a/core/proto/android/content/intent.proto b/core/proto/android/content/intent.proto
index 3b2c4fcb64cd..99ed6875075e 100644
--- a/core/proto/android/content/intent.proto
+++ b/core/proto/android/content/intent.proto
@@ -17,7 +17,6 @@
syntax = "proto2";
package android.content;
-option java_package = "android.content";
option java_multiple_files = true;
import "frameworks/base/core/proto/android/content/component_name.proto";
@@ -58,8 +57,9 @@ message IntentProto {
optional string package = 6;
optional ComponentNameProto component = 7;
optional string source_bounds = 8;
- optional string clip_data = 9 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional string clip_data = 9 [ (.android.privacy).dest = DEST_LOCAL ];
optional string extras = 10 [ (.android.privacy).dest = DEST_LOCAL ];
+ // UserHandle value (similar to user_id in other protos).
optional int32 content_user_hint = 11;
optional string selector = 12;
}
@@ -70,6 +70,13 @@ message IntentFilterProto {
repeated string actions = 1;
repeated string categories = 2;
+ // https://developer.android.com/guide/topics/manifest/data-element#scheme:
+ // The scheme part of a URI. This is the minimal essential attribute for
+ // specifying a URI; at least one scheme attribute must be set for the filter,
+ // or none of the other URI attributes are meaningful. A scheme is specified
+ // without the trailing colon (for example, http, rather than http:). If the
+ // filter has a data type set (the mimeType attribute) but no scheme, the
+ // content: and file: schemes are assumed.
repeated string data_schemes = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
repeated android.os.PatternMatcherProto data_scheme_specs = 4;
repeated AuthorityEntryProto data_authorities = 5;
diff --git a/core/proto/android/content/locale.proto b/core/proto/android/content/locale.proto
index 87b555c315b4..86743bf6b91c 100644
--- a/core/proto/android/content/locale.proto
+++ b/core/proto/android/content/locale.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.content";
option java_multiple_files = true;
import "frameworks/base/libs/incident/proto/android/privacy.proto";
diff --git a/core/proto/android/content/package_item_info.proto b/core/proto/android/content/package_item_info.proto
index 6e99bec681a2..ebb2fa62a351 100644
--- a/core/proto/android/content/package_item_info.proto
+++ b/core/proto/android/content/package_item_info.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.content.pm";
option java_multiple_files = true;
import "frameworks/base/libs/incident/proto/android/privacy.proto";
@@ -72,20 +71,43 @@ message ApplicationInfoProto {
optional int32 requires_smallest_width_dp = 3;
optional int32 compatible_width_limit_dp = 4;
optional int32 largest_width_limit_dp = 5;
+ // String retrieved from the seinfo tag found in selinux policy. This value
+ // can be set through the mac_permissions.xml policy construct. This value
+ // is used for setting an SELinux security context on the process as well as
+ // its data directory.
optional string seinfo = 6;
+ // The seinfo tag generated per-user. This value may change based upon the
+ // user's configuration. For example, when an instant app is installed for a
+ // user. It is an error if this field is ever null when trying to
+ // start a new process.
optional string seinfo_user = 7;
+ // Full path to the device-protected directory assigned to the package for
+ // its persistent data.
optional string device_protected_data_dir = 8;
+ // Full path to the credential-protected directory assigned to the package
+ // for its persistent data.
optional string credential_protected_data_dir = 9;
+ // Paths to all shared libraries this application is linked against. This
+ // field is only set if the PackageManager.GET_SHARED_LIBRARY_FILES} flag
+ // was used when retrieving the structure.
repeated string shared_library_files = 10;
optional string manage_space_activity_name = 11;
optional int32 description_res = 12;
optional int32 ui_options = 13;
optional bool supports_rtl = 14;
oneof full_backup_content {
+ // An optional attribute that indicates the app supports automatic backup
+ // of app data. 0 is the default and means the app's entire data folder +
+ // managed external storage will be backed up; Any negative value
+ // indicates the app does not support full-data backup, though it may
+ // still want to participate via the traditional key/value backup API; A
+ // positive number specifies an xml resource in which the application has
+ // defined its backup include/exclude criteria. The data in this field is
+ // of the format "@xml/<number>".
string content = 15;
bool is_full_backup = 16;
}
- optional int32 networkSecurity_config_res = 17;
+ optional int32 network_security_config_res = 17;
optional int32 category = 18;
}
optional Detail detail = 17;
diff --git a/core/proto/android/media/audioattributes.proto b/core/proto/android/media/audioattributes.proto
index ef04720405f5..d679d9c24f73 100644
--- a/core/proto/android/media/audioattributes.proto
+++ b/core/proto/android/media/audioattributes.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.media";
option java_multiple_files = true;
package android.media;
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 0970bd5e2c27..a4167c187194 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -788,7 +788,7 @@ message UidProto {
message UserActivity {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional android.os.PowerManagerProto.UserActivityEvent name = 1;
+ optional PowerManagerProto.UserActivityEvent name = 1;
optional int32 count = 2;
};
repeated UserActivity user_activity = 23;
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index 5f6b6cc49f7e..8f289700aede 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -18,7 +18,6 @@ syntax = "proto2";
option java_multiple_files = true;
import "frameworks/base/core/proto/android/os/backtrace.proto";
-import "frameworks/base/core/proto/android/os/batterystats.proto";
import "frameworks/base/core/proto/android/os/batterytype.proto";
import "frameworks/base/core/proto/android/os/cpufreq.proto";
import "frameworks/base/core/proto/android/os/cpuinfo.proto";
diff --git a/core/proto/android/os/looper.proto b/core/proto/android/os/looper.proto
index dce65d35e516..b9b8cf584502 100644
--- a/core/proto/android/os/looper.proto
+++ b/core/proto/android/os/looper.proto
@@ -28,5 +28,5 @@ message LooperProto {
// the thread name, usually set by developers.
optional string thread_name = 1;
optional int64 thread_id = 2;
- optional android.os.MessageQueueProto queue = 3;
+ optional MessageQueueProto queue = 3;
}
diff --git a/core/proto/android/os/message.proto b/core/proto/android/os/message.proto
index 048d031f72e0..8aaec7094f6e 100644
--- a/core/proto/android/os/message.proto
+++ b/core/proto/android/os/message.proto
@@ -23,15 +23,21 @@ option java_multiple_files = true;
message MessageProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Targeted delivery time of the message.
optional int64 when = 1;
// Name of callback class.
optional string callback = 2;
- // User-defined message code so that the recipient can identify what this
+ // App-defined message code so that the recipient can identify what this
// message is about.
optional int32 what = 3;
+ // Lower-cost alternative to using setData() if the app only needs to store a few integer values.
optional int32 arg1 = 4;
+ // Lower-cost alternative to using setData() if the app only needs to store a few integer values.
optional int32 arg2 = 5;
- // String representation of an arbitrary object to send to the recipient.
+ // String representation of an arbitrary object to send to the Handler. When
+ // using android.os.Messenger to send the message across processes, this will
+ // only be populated if it contains a Parcelable of a framework class (not one
+ // implemented by the application).
optional string obj = 6 [ (.android.privacy).dest = DEST_EXPLICIT ];
// Name of target class.
optional string target = 7;
diff --git a/core/proto/android/os/messagequeue.proto b/core/proto/android/os/messagequeue.proto
index 4bfcb81d5996..61bbee709fd8 100644
--- a/core/proto/android/os/messagequeue.proto
+++ b/core/proto/android/os/messagequeue.proto
@@ -25,7 +25,7 @@ import "frameworks/base/libs/incident/proto/android/privacy.proto";
message MessageQueueProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- repeated android.os.MessageProto messages = 1;
+ repeated MessageProto messages = 1;
optional bool is_polling_locked = 2;
optional bool is_quitting = 3;
}
diff --git a/core/proto/android/os/pagetypeinfo.proto b/core/proto/android/os/pagetypeinfo.proto
index 0b8a5da44b09..65e713900ae7 100644
--- a/core/proto/android/os/pagetypeinfo.proto
+++ b/core/proto/android/os/pagetypeinfo.proto
@@ -49,8 +49,11 @@ message PageTypeInfoProto {
optional int32 node = 1;
+ // Memory zone.
optional string zone = 2;
+ // Migration type (Unmovable, Reclaimable, Movable, Reserve, CMA, and
+ // Isolate).
optional string type = 3;
// order level starts from 0 for 4KB to page_block_order defined above, e.g. 10 for 4096KB
@@ -64,6 +67,7 @@ message PageTypeInfoProto {
optional int32 node = 1;
+ // Memory zone.
optional string zone = 2;
optional int32 unmovable = 3;
diff --git a/core/proto/android/os/procrank.proto b/core/proto/android/os/procrank.proto
index ff7515e61471..f7edaf4aef20 100644
--- a/core/proto/android/os/procrank.proto
+++ b/core/proto/android/os/procrank.proto
@@ -15,18 +15,17 @@
*/
syntax = "proto2";
+package android.os;
+
option java_multiple_files = true;
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-package android.os;
-
-//Memory usage of running processes
+// Memory usage of running processes
message ProcrankProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
// Currently running process
- // Next Tag: 11
message Process {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -59,11 +58,12 @@ message ProcrankProto {
// process command
optional string cmdline = 10;
+
+ // Next Tag: 11
}
repeated Process processes = 1;
// Summary
- // Next Tag: 3
message Summary {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -83,6 +83,8 @@ message ProcrankProto {
optional string raw_text = 1;
}
optional Ram ram = 3;
+
+ // Next Tag: 4
}
optional Summary summary = 2;
}
diff --git a/core/proto/android/os/ps.proto b/core/proto/android/os/ps.proto
index 0ab92d7686c7..e032b574607f 100644
--- a/core/proto/android/os/ps.proto
+++ b/core/proto/android/os/ps.proto
@@ -52,7 +52,7 @@ message PsProto {
// and ps is not displaying threads.
optional string wchan = 8;
// Memory address of the process.
- optional string addr = 9;
+ optional string addr = 9 [ (android.privacy).dest = DEST_LOCAL ];
enum ProcessStateCode {
STATE_UNKNOWN = 0;
diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto
index c5f7d0e67f33..a41edf30f913 100644
--- a/core/proto/android/os/system_properties.proto
+++ b/core/proto/android/os/system_properties.proto
@@ -194,7 +194,7 @@ message SystemPropertiesProto {
message Log {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional string tag_WifiHAL = 1;
+ optional string tag_wifi_hal = 1;
optional string tag_stats_log = 2;
// Next Tag: 3
@@ -237,7 +237,7 @@ message SystemPropertiesProto {
optional bool adb_secure = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional string arch = 2;
optional bool audio_ignore_effects = 3;
- optional bool audio_monitorRotation = 4;
+ optional bool audio_monitor_rotation = 4;
optional string baseband = 5;
optional string board_platform = 6;
@@ -249,9 +249,13 @@ message SystemPropertiesProto {
repeated string boottime = 5;
optional string console = 6;
optional int32 fake_battery = 7;
+ // The name of the hardware (from the kernel command line or /proc). It
+ // SHOULD be reasonably human-readable.
optional string hardware = 8;
optional string hardware_color = 9;
optional string hardware_revision = 10;
+ // SKU is for small variants such as device color, targeted market,
+ // ram/rom size, etc.
optional string hardware_sku = 11;
optional string keymaster = 12;
optional string mode = 13;
@@ -292,27 +296,60 @@ message SystemPropertiesProto {
message Build {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Date of the platform build.
optional string date = 1;
+ // UTC timstamp of build data.
optional int64 date_utc = 2;
optional string description = 3;
+ // A build ID string meant for displaying to the user.
optional string display_id = 4;
+ // A string that uniquely identifies the host the build was built on, in
+ // human-readable format. Only makes sense for internal engineering
+ // builds.
optional string host = 5;
+ // Unique id of this android platform build. An identifier chosen by the
+ // device implementer to refer to a specific release, in human-readable
+ // format. This field can be the same as
+ // android.os.Build.VERSION.INCREMENTAL, but SHOULD be a value
+ // sufficiently meaningful for end users to distinguish between software
+ // builds.
optional string id = 6;
+ // Product name.
optional string product = 7;
optional bool system_root_image = 8;
+ // Tags of the buid, e.g. dev-keys, release-keys.
optional string tags = 9;
+ // Type of the build, e.g. eng, userdebug, user.
optional string type = 10;
+ // Name of the user (an engineer or a build bot) that built the image. For
+ // production builds, this is from the build bot but some OEMs might use a
+ // real username. Only makes sense for internal engineering builds.
optional string user = 11;
message Version {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // The base OS build the product is based on. A value representing the
+ // FINGERPRINT parameter of the build that is otherwise identical to
+ // this build except for the patches provided in the Android Public
+ // Security Bulletin.
optional string base_os = 1;
optional string codename = 2;
+ // A value chosen by the device implementer designating the specific
+ // build of the currently-executing Android system, in human-readable
+ // format. This value MUST NOT be reused for different builds made
+ // available to end users. A typical use of this field is to indicate
+ // which build number or source-control change identifier was used to
+ // generate the build.
optional string incremental = 3;
optional int32 preview_sdk = 4;
+ // The version of the currently-executing Android system, in
+ // human-readable format.
optional string release = 5;
+ // The version of the currently-executing Android system, in a format
+ // accessible to third-party application code.
optional int32 sdk = 6;
+ // A value indicating the security patch level of a build.
optional string security_patch = 7;
// Next Tag: 8
@@ -324,8 +361,11 @@ message SystemPropertiesProto {
optional Build build = 11;
optional bool camera_notify_nfc = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Carrier name on the phone.
optional string carrier = 13;
+ // Is dataroaming enabled.
optional bool com_android_dataroaming = 14 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // does it provide mobiledata.
optional bool com_android_prov_mobiledata = 15 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional string com_google_clientidbase = 16;
@@ -346,6 +386,7 @@ message SystemPropertiesProto {
optional string crypto_state = 21;
optional string crypto_type = 22;
optional string dalvik_vm_native_bridge = 23;
+ // Is this build debuggable.
optional bool debuggable = 24;
optional string frp_pst = 25;
optional string gfx_driver_0 = 26;
@@ -353,8 +394,8 @@ message SystemPropertiesProto {
message Hardware {
option (android.msg_privacy).dest = DEST_LOCAL;
- optional string value = 1; // value of ro.hardware itself
-
+ // value of ro.hardware itself
+ optional string value = 1;
optional string activity_recognition = 2;
optional string audio = 3;
optional string audio_policy = 4;
@@ -403,21 +444,30 @@ message SystemPropertiesProto {
optional int32 oem_unlock_supported = 30;
optional int32 opengles_version = 31;
+ // The product of the device.
message Product {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Name of the product.
optional string board = 1;
+ // Brand of the product.
optional string brand = 2;
optional string cpu_abi = 3;
repeated string cpu_abilist = 4;
repeated string cpu_abilist32 = 5;
repeated string cpu_abilist64 = 6;
+ // Device name.
optional string device = 7;
+ // The first api level when the phone is launched.
optional int32 first_api_level = 8;
+ // Manufacturer of the product.
optional string manufacturer = 9;
+ // Marketing name of the phone.
optional string model = 10;
+ // Name of the product.
optional string name = 11;
+ // Vendor related information about the product.
message Vendor {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -441,6 +491,7 @@ message SystemPropertiesProto {
message Telephony {
optional bool call_ring_multiple = 1;
+ // CDMA subscription number.
optional int32 default_cdma_sub = 2;
optional int32 default_network = 3;
}
@@ -456,6 +507,7 @@ message SystemPropertiesProto {
}
optional Vendor vendor = 41;
+ // Vendor Native Development Kit version.
optional string vndk_version = 42;
optional int32 vts_coverage = 43;
optional string zygote = 44;
@@ -492,7 +544,7 @@ message SystemPropertiesProto {
}
optional Sys sys = 24;
- optional int32 telephony_lteOnCdmaDevice = 25;
+ optional int32 telephony_lte_on_cdma_device = 25;
optional int32 tombstoned_max_tombstone_count = 26;
optional string vold_decrypt = 27;
optional int32 vold_post_fs_data_done = 28;
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index 040e36ae706c..f9f725a130ed 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -394,6 +394,8 @@ message GlobalSettingsProto {
// App allowed to load GPU debug layers.
optional SettingProto debug_app = 1;
+ // Ordered GPU debug layer list
+ // i.e. <layer1>:<layer2>:...:<layerN>
optional SettingProto debug_layers = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
}
optional Gpu gpu = 59;
@@ -921,6 +923,12 @@ message GlobalSettingsProto {
optional SettingProto connected_mac_randomization_enabled = 25 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto max_dhcp_retry_count = 26 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto mobile_data_transition_wakelock_timeout_ms = 27 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Controls whether WiFi configurations created by a Device Owner app should
+ // be locked down (that is, be editable or removable only by the Device
+ // Owner App, not even by Settings app). This setting takes integer values.
+ // Non-zero values mean that the Device Owner-created configurations are
+ // locked down. Value of zero means they are not. Default value in the
+ // absence of actual value to this setting is 0.
optional SettingProto device_owner_configs_lockdown = 28 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto frequency_band = 29 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto p2p_device_name = 30;
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index f2e8c70a5682..6e661e1ce5b2 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -144,6 +144,10 @@ message SecureSettingsProto {
optional SettingProto provisioned = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto transport = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto manager_constants = 5;
+ // Local transport parameters so we can configure it for tests.
+ // This is encoded as a key=value list, separated by commas.
+ // The following keys are supported:
+ // fake_encryption_flag (boolean)
optional SettingProto local_transport_parameters = 6;
optional SettingProto packages_to_clear_data_before_full_restore = 7;
}
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 52c76ccaa639..9d5f0bcc54d9 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -28,6 +28,7 @@ import "frameworks/base/core/proto/android/content/intent.proto";
import "frameworks/base/core/proto/android/content/package_item_info.proto";
import "frameworks/base/core/proto/android/graphics/rect.proto";
import "frameworks/base/core/proto/android/internal/processstats.proto";
+import "frameworks/base/core/proto/android/os/bundle.proto";
import "frameworks/base/core/proto/android/os/looper.proto";
import "frameworks/base/core/proto/android/os/powermanager.proto";
import "frameworks/base/core/proto/android/server/intentresolver.proto";
@@ -163,7 +164,8 @@ message ReceiverListProto {
optional BroadcastRecordProto current = 5;
optional bool linked_to_death = 6;
repeated BroadcastFilterProto filters = 7;
- optional string hex_hash = 8; // used to find this ReceiverList object in IntentResolver
+ // Used to find this ReceiverList object in IntentResolver
+ optional string hex_hash = 8;
}
message ProcessRecordProto {
@@ -190,7 +192,8 @@ message BroadcastFilterProto {
optional .android.content.IntentFilterProto intent_filter = 1;
optional string required_permission = 2;
- optional string hex_hash = 3; // used to find the BroadcastFilter object in IntentResolver
+ // Used to find the BroadcastFilter object in IntentResolver
+ optional string hex_hash = 3;
optional int32 owning_user_id = 4;
}
@@ -411,6 +414,7 @@ message StickyBroadcastProto {
message StickyAction {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ // The action of the sticky Intent.
optional string name = 1;
repeated .android.content.IntentProto intents = 2;
}
@@ -556,7 +560,7 @@ message ServiceRecordProto {
message ConnectionRecordProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- // used to find same record, e.g. AppBindRecord has the hex_hash
+ // Used to find same record, e.g. AppBindRecord has the hex_hash
optional string hex_hash = 1; // cross reference the object and avoid double logging.
optional int32 user_id = 2;
@@ -803,7 +807,11 @@ message ActiveInstrumentationProto {
optional string profile_file = 6;
optional string watcher = 7;
optional string ui_automation_connection = 8;
- optional string arguments = 9 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ // Arguments as given to the ActiveInstrumentation object in Bundle
+ // toString format.
+ reserved 9; // arguments (in String format).
+ // Arguments as given to the ActiveInstrumentation object.
+ optional .android.os.BundleProto arguments = 10;
}
// Proto definition of com.android.server.am.UidRecord.java
diff --git a/core/proto/android/server/alarmmanagerservice.proto b/core/proto/android/server/alarmmanagerservice.proto
index eef78d1aa7de..b74f28d38fa8 100644
--- a/core/proto/android/server/alarmmanagerservice.proto
+++ b/core/proto/android/server/alarmmanagerservice.proto
@@ -228,6 +228,8 @@ message ConstantsProto {
message FilterStatsProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Tag given to AlarmManager by the app or component scheduling the alarm.
+ // As some of them are app-supplied, some tags may contain PII.
optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
// The last time this filter when in flight, in terms of elapsed realtime.
optional int64 last_flight_time_realtime = 2;
@@ -248,6 +250,8 @@ message IdleDispatchEntryProto {
optional int32 uid = 1;
optional string pkg = 2;
+ // Tag given to AlarmManager by the app or component scheduling the alarm.
+ // As some of them are app-supplied, some tags may contain PII.
optional string tag = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
optional string op = 4;
// Time when this entry was created, in terms of elapsed realtime.
@@ -263,6 +267,8 @@ message InFlightProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional int32 uid = 1;
+ // Tag given to AlarmManager by the app or component scheduling the alarm.
+ // As some of them are app-supplied, some tags may contain PII.
optional string tag = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
optional int64 when_elapsed_ms = 3;
optional .android.app.AlarmManagerProto.AlarmType alarm_type = 4;
@@ -277,6 +283,8 @@ message WakeupEventProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional int32 uid = 1;
+ // The operation that caused the wakeup. May be an Intent action or a
+ // listener tag.
optional string action = 2;
optional int64 when = 3;
}
diff --git a/core/proto/android/server/forceappstandbytracker.proto b/core/proto/android/server/forceappstandbytracker.proto
index 8c71b0ba27eb..54f30c3b9106 100644
--- a/core/proto/android/server/forceappstandbytracker.proto
+++ b/core/proto/android/server/forceappstandbytracker.proto
@@ -71,7 +71,7 @@ message ForceAppStandbyTrackerProto {
message ExemptedPackage {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 userId = 1;
+ optional int32 user_id = 1;
optional string package_name = 2;
}
diff --git a/core/proto/android/server/statlogger.proto b/core/proto/android/server/statlogger.proto
index 46badc47afc4..65b1af79136b 100644
--- a/core/proto/android/server/statlogger.proto
+++ b/core/proto/android/server/statlogger.proto
@@ -29,7 +29,7 @@ message StatLoggerProto {
message Event {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 eventId = 1;
+ optional int32 event_id = 1;
// Labels are hard-coded in Android framework code.
optional string label = 2;
optional int32 count = 3;
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index 48113df0c5ff..a8b23dd9e6a4 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -48,12 +48,12 @@ message WindowManagerServiceDumpProto {
optional AppTransitionProto app_transition = 9;
}
-/* represents DisplayContent */
+/* represents RootWindowContainer object */
message RootWindowContainerProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional WindowContainerProto window_container = 1;
- repeated DisplayProto displays = 2;
+ repeated DisplayContentProto displays = 2;
/* window references in top down z order */
repeated IdentifierProto windows = 3;
}
@@ -139,8 +139,8 @@ message AppTransitionProto {
optional .android.view.TransitionTypeEnum last_used_app_transition = 2;
}
-/* represents DisplayContent */
-message DisplayProto {
+/* represents DisplayContent object */
+message DisplayContentProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
optional WindowContainerProto window_container = 1;
@@ -261,15 +261,16 @@ message WindowStateProto {
optional WindowContainerProto window_container = 1;
optional IdentifierProto identifier = 2;
+ // Unique identifier of a DisplayContent stack.
optional int32 display_id = 3;
+ // Unique identifier for the task stack.
optional int32 stack_id = 4;
optional .android.view.WindowLayoutParamsProto attributes = 5;
optional .android.graphics.RectProto given_content_insets = 6;
- reserved 7 to 10;
-// optional .android.graphics.RectProto frame = 7;
-// optional .android.graphics.RectProto containing_frame = 8;
-// optional .android.graphics.RectProto parent_frame = 9;
-// optional .android.graphics.RectProto content_frame = 10;
+ optional .android.graphics.RectProto frame = 7 [deprecated=true];
+ optional .android.graphics.RectProto containing_frame = 8 [deprecated=true];
+ optional .android.graphics.RectProto parent_frame = 9 [deprecated=true];
+ optional .android.graphics.RectProto content_frame = 10 [deprecated=true];
optional .android.graphics.RectProto content_insets = 11;
optional .android.graphics.RectProto surface_insets = 12;
optional WindowStateAnimatorProto animator = 13;
@@ -282,18 +283,16 @@ message WindowStateProto {
optional int32 system_ui_visibility = 21;
optional bool has_surface = 22;
optional bool is_ready_for_display = 23;
- reserved 24 to 28;
-// optional .android.graphics.RectProto display_frame = 24;
-// optional .android.graphics.RectProto overscan_frame = 25;
-// optional .android.graphics.RectProto visible_frame = 26;
-// optional .android.graphics.RectProto decor_frame = 27;
-// optional .android.graphics.RectProto outset_frame = 28;
+ optional .android.graphics.RectProto display_frame = 24 [deprecated=true];
+ optional .android.graphics.RectProto overscan_frame = 25 [deprecated=true];
+ optional .android.graphics.RectProto visible_frame = 26 [deprecated=true];
+ optional .android.graphics.RectProto decor_frame = 27 [deprecated=true];
+ optional .android.graphics.RectProto outset_frame = 28 [deprecated=true];
optional .android.graphics.RectProto overscan_insets = 29;
optional .android.graphics.RectProto visible_insets = 30;
optional .android.graphics.RectProto stable_insets = 31;
optional .android.graphics.RectProto outsets = 32;
- reserved 33;
-// optional .android.view.DisplayCutoutProto cutout = 33;
+ optional .android.view.DisplayCutoutProto cutout = 33 [deprecated=true];
optional bool remove_on_exit = 34;
optional bool destroying = 35;
optional bool removed = 36;
@@ -309,6 +308,8 @@ message IdentifierProto {
optional int32 hash_code = 1;
optional int32 user_id = 2;
+ // Either a component name/string (eg: "com.android.settings/.FallbackHome")
+ // or a window title ("NavigationBar").
optional string title = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
}
diff --git a/core/proto/android/service/diskstats.proto b/core/proto/android/service/diskstats.proto
index f55f0e775d78..1012eb0b17a6 100644
--- a/core/proto/android/service/diskstats.proto
+++ b/core/proto/android/service/diskstats.proto
@@ -37,7 +37,7 @@ message DiskStatsServiceDumpProto {
}
// Whether the latency test resulted in an error
optional bool has_test_error = 1;
- // If the test errored, error message is contained here, it is just IOException.
+ // If the test encountered an IOException, the error message is logged here.
optional string error_message = 2;
// 512B write latency in milliseconds, if the test was successful
optional int32 write_512b_latency_millis = 3;
diff --git a/core/proto/android/service/graphicsstats.proto b/core/proto/android/service/graphicsstats.proto
index d75f135be573..bb32495e1d30 100644
--- a/core/proto/android/service/graphicsstats.proto
+++ b/core/proto/android/service/graphicsstats.proto
@@ -46,10 +46,10 @@ message GraphicsStatsProto {
optional int64 stats_start = 3;
optional int64 stats_end = 4;
- // The aggregated statistics for the package
+ // The aggregated statistics for the package.
optional GraphicsStatsJankSummaryProto summary = 5;
- // The frame time histogram for the package
+ // The frame time histogram for the package.
repeated GraphicsStatsHistogramBucketProto histogram = 6;
}
diff --git a/core/proto/android/service/netstats.proto b/core/proto/android/service/netstats.proto
index 29fd1959fea1..02d44838e1bc 100644
--- a/core/proto/android/service/netstats.proto
+++ b/core/proto/android/service/netstats.proto
@@ -47,6 +47,7 @@ message NetworkStatsServiceDumpProto {
message NetworkInterfaceProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Name of the network interface (eg: wlan).
optional string interface = 1;
optional NetworkIdentitySetProto identities = 2;
@@ -63,11 +64,15 @@ message NetworkIdentitySetProto {
message NetworkIdentityProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- // Constats from ConnectivityManager.TYPE_*.
+ // Constants from ConnectivityManager.TYPE_*.
optional int32 type = 1;
+ // Full subscriber ID on eng builds. The IMSI is scrubbed on user & userdebug
+ // builds to only include the info about the GSM network operator (the info
+ // that uniquely identifies the subscriber is removed).
optional string subscriber_id = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+ // Name of the network (eg: MyWifi).
optional string network_id = 3 [ (android.privacy).dest = DEST_EXPLICIT ];
optional bool roaming = 4;
diff --git a/core/proto/android/service/notification.proto b/core/proto/android/service/notification.proto
index bcd7f29a2fcf..25059bea8bfd 100644
--- a/core/proto/android/service/notification.proto
+++ b/core/proto/android/service/notification.proto
@@ -59,7 +59,7 @@ message NotificationRecordProto {
}
optional State state = 2;
optional int32 flags = 3;
- optional string channelId = 4 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ optional string channel_id = 4 [ (.android.privacy).dest = DEST_EXPLICIT ];
optional string sound = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
optional .android.media.AudioAttributesProto audio_attributes = 6;
optional bool can_vibrate = 7;
@@ -88,6 +88,8 @@ message ManagedServiceInfoProto {
message ManagedServicesProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Hard-coded string identifying what the service config is for
+ // (eg: "notification assistant" or "notification listener").
optional string caption = 1;
message ServiceProto {
@@ -147,8 +149,11 @@ enum ZenMode {
message ConditionProto {
option (android.msg_privacy).dest = DEST_EXPLICIT;
+ // The URI representing the rule being updated.
optional string id = 1;
+ // A user visible description of the rule state.
optional string summary = 2;
+ // Android generated strings that detail when ZenMode will end.
optional string line_1 = 3;
optional string line_2 = 4;
optional int32 icon = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
@@ -189,7 +194,8 @@ message ZenRuleProto {
(android.privacy).dest = DEST_AUTOMATIC
];
- // Required for automatic ZenRules.
+ // Required for automatic ZenRules. The condition's ID, which is the URI
+ // representing the rule being updated.
optional string condition_id = 8;
optional ConditionProto condition = 9;
optional android.content.ComponentNameProto component = 10;
diff --git a/core/proto/android/service/package.proto b/core/proto/android/service/package.proto
index 88bb4a6f4295..4ecf52ce5012 100644
--- a/core/proto/android/service/package.proto
+++ b/core/proto/android/service/package.proto
@@ -48,7 +48,7 @@ message PackageServiceDumpProto {
message SharedUserProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- optional int32 user_id = 1;
+ optional int32 uid = 1;
// Name of the shared UID. eg: android.uid.bluetooth
optional string name = 2;
}
diff --git a/core/proto/android/service/print.proto b/core/proto/android/service/print.proto
index 994814b6053b..a44915618b04 100644
--- a/core/proto/android/service/print.proto
+++ b/core/proto/android/service/print.proto
@@ -27,7 +27,7 @@ message PrintServiceDumpProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
// Each user has a separate printer state
- repeated PrintUserStateProto userStates = 1;
+ repeated PrintUserStateProto user_states = 1;
}
message PrintUserStateProto {
@@ -74,7 +74,8 @@ message PrintSpoolerInternalStateProto {
// Print jobs
repeated PrintJobInfoProto print_jobs = 1;
- // Files used by these print jobs
+ // Files used by these print jobs. These are auto-generated UUIDs that are
+ // only valid while the print job is processed.
repeated string print_job_files = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
// Approved print services
@@ -125,7 +126,7 @@ message PrinterInfoProto {
// The status of the printer
optional Status status = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // The description of the printer
+ // The description of the printer, set by the user.
optional string description = 4;
// The capabilities of the printer
@@ -310,7 +311,7 @@ message PrintDocumentInfoProto {
// Type of content (see PrintDocumentInfo.ContentType)
optional int32 content_type = 3;
- // The size of the the document
+ // The size of the document
optional int64 data_size = 4;
}
diff --git a/core/proto/android/service/procstats.proto b/core/proto/android/service/procstats.proto
index b2a88b70905b..736871f6bd39 100644
--- a/core/proto/android/service/procstats.proto
+++ b/core/proto/android/service/procstats.proto
@@ -15,14 +15,14 @@
*/
syntax = "proto2";
+package android.service.procstats;
+
option java_multiple_files = true;
option java_outer_classname = "ProcessStatsServiceProto";
import "frameworks/base/core/proto/android/util/common.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-package android.service.procstats;
-
/**
* Data from ProcStatsService Dumpsys
*
@@ -42,7 +42,7 @@ message ProcessStatsServiceDumpProto {
* Data model from /frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
* This proto is defined based on the writeToParcel method.
*
- * Next Tag: 9
+ * Next Tag: 10
*/
message ProcessStatsSectionProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -77,9 +77,86 @@ message ProcessStatsSectionProto {
// Stats for each process.
repeated ProcessStatsProto process_stats = 8;
+
+ // Stats for each package.
+ repeated ProcessStatsPackageProto package_stats = 9;
+}
+
+// Next Tag: 10
+message ProcessStatsStateProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ enum ScreenState {
+ SCREEN_UNKNOWN = 0;
+ OFF = 1;
+ ON = 2;
+ }
+ optional ScreenState screen_state = 1;
+
+ enum MemoryState {
+ MEMORY_UNKNOWN = 0;
+ NORMAL = 1; // normal.
+ MODERATE = 2; // moderate memory pressure.
+ LOW = 3; // low memory.
+ CRITICAL = 4; // critical memory.
+ }
+ optional MemoryState memory_state = 2;
+
+ // this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
+ // and not frameworks/base/core/java/android/app/ActivityManager.java
+ enum ProcessState {
+ PROCESS_UNKNOWN = 0;
+ // Persistent system process.
+ PERSISTENT = 1;
+ // Top activity; actually any visible activity.
+ TOP = 2;
+ // Important foreground process (ime, wallpaper, etc).
+ IMPORTANT_FOREGROUND = 3;
+ // Important background process.
+ IMPORTANT_BACKGROUND = 4;
+ // Performing backup operation.
+ BACKUP = 5;
+ // Background process running a service.
+ SERVICE = 6;
+ // Process not running, but would be if there was enough RAM.
+ SERVICE_RESTARTING = 7;
+ // Process running a receiver.
+ RECEIVER = 8;
+ // Heavy-weight process (currently not used).
+ HEAVY_WEIGHT = 9;
+ // Process hosting home/launcher app when not on top.
+ HOME = 10;
+ // Process hosting the last app the user was in.
+ LAST_ACTIVITY = 11;
+ // Cached process hosting a previous activity.
+ CACHED_ACTIVITY = 12;
+ // Cached process hosting a client activity.
+ CACHED_ACTIVITY_CLIENT = 13;
+ // Cached process that is empty.
+ CACHED_EMPTY = 14;
+ }
+ optional ProcessState process_state = 3;
+
+ // Millisecond uptime duration spent in this state
+ optional int64 duration_ms = 4;
+
+ // Millisecond elapsed realtime duration spent in this state
+ optional int64 realtime_duration_ms = 9;
+
+ // # of samples taken
+ optional int32 sample_size = 5;
+
+ // PSS is memory reserved for this process
+ optional android.util.AggStats pss = 6;
+
+ // USS is memory shared between processes, divided evenly for accounting
+ optional android.util.AggStats uss = 7;
+
+ // RSS is memory resident for this process
+ optional android.util.AggStats rss = 8;
}
-// Next Tag: 6
+// Next Tag: 7
message ProcessStatsProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -104,78 +181,103 @@ message ProcessStatsProto {
}
optional Kill kill = 3;
- message State {
+ // Time and memory spent in various states.
+ repeated ProcessStatsStateProto states = 5;
+
+ // Total time process has been running... screen_state, memory_state, and process_state
+ // will not be set.
+ optional ProcessStatsStateProto total_running_state = 6;
+}
+
+// Next Tag: 7
+message ProcessStatsServiceStateProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Name of service component.
+ optional string service_name = 1;
+
+ // Information about a state the service can be in.
+ message OperationInfo {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
- enum ScreenState {
- SCREEN_UNKNOWN = 0;
- OFF = 1;
- ON = 2;
- }
- optional ScreenState screen_state = 1;
-
- enum MemoryState {
- MEMORY_UNKNOWN = 0;
- NORMAL = 1; // normal.
- MODERATE = 2; // moderate memory pressure.
- LOW = 3; // low memory.
- CRITICAL = 4; // critical memory.
- }
- optional MemoryState memory_state = 2;
-
- // this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
- // and not frameworks/base/core/java/android/app/ActivityManager.java
- enum ProcessState {
- PROCESS_UNKNOWN = 0;
- // Persistent system process.
- PERSISTENT = 1;
- // Top activity; actually any visible activity.
- TOP = 2;
- // Important foreground process (ime, wallpaper, etc).
- IMPORTANT_FOREGROUND = 3;
- // Important background process.
- IMPORTANT_BACKGROUND = 4;
- // Performing backup operation.
- BACKUP = 5;
- // Background process running a service.
- SERVICE = 6;
- // Process not running, but would be if there was enough RAM.
- SERVICE_RESTARTING = 7;
- // Process running a receiver.
- RECEIVER = 8;
- // Heavy-weight process (currently not used).
- HEAVY_WEIGHT = 9;
- // Process hosting home/launcher app when not on top.
- HOME = 10;
- // Process hosting the last app the user was in.
- LAST_ACTIVITY = 11;
- // Cached process hosting a previous activity.
- CACHED_ACTIVITY = 12;
- // Cached process hosting a client activity.
- CACHED_ACTIVITY_CLIENT = 13;
- // Cached process that is empty.
- CACHED_EMPTY = 14;
- }
- optional ProcessState process_state = 3;
-
- // Millisecond duration spent in this state
- optional int64 duration_ms = 4;
-
- // # of samples taken
- optional int32 sample_size = 5;
-
- // PSS is memory reserved for this process
- optional android.util.AggStats pss = 6;
-
- // USS is memory shared between processes, divided evenly for accounting
- optional android.util.AggStats uss = 7;
-
- // RSS is memory resident for this process
- optional android.util.AggStats rss = 8;
+ // Number of times the service was in this operation.
+ optional int32 count = 1;
+
+ // Time this operation was active in various states. process_state will not be set;
+ // includes only uptime, not memory info.
+ repeated ProcessStatsStateProto states = 2;
}
- repeated State states = 5;
- // Total time process has been running... screen_state, memory_state, and process_state
- // will not be set.
- optional State total_running_state = 6;
+ // Information about when the service was operating as running (that is how long it was
+ // running for any reason, such as the finer-grained started, bound, and executing times
+ // also reported in this proto).
+ optional OperationInfo running_op = 2;
+
+ // Information about when the service was operating as started.
+ optional OperationInfo started_op = 3;
+
+ // Information about when the service was operating as foreground.
+ optional OperationInfo foreground_op = 4;
+
+ // Information about when the service was operating as bound.
+ optional OperationInfo bound_op = 5;
+
+ // Information about when the service was operating as executing.
+ optional OperationInfo executing_op = 6;
+}
+
+// Next Tag: 7
+message ProcessStatsAssociationStateProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Name of the target component.
+ optional string component_name = 1;
+
+ // Information on one source in this association.
+ message Source {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Name of source process.
+ optional string process = 1;
+
+ // Uid of the source process.
+ optional int32 uid = 2;
+
+ // Total count of the times this association appeared.
+ optional int32 total_count = 3;
+
+ // Millisecond uptime total duration this association was around.
+ optional int64 total_duration_ms = 4;
+
+ // Total count of the times this association became actively impacting its target process.
+ optional int32 active_count = 5;
+
+ // Time association was active in various states. screen_state and memory_state will not
+ // be set; includes only uptime, not memory info.
+ repeated ProcessStatsStateProto active_states = 6;
+ }
+ repeated Source sources = 3;
+}
+
+// Next Tag: 7
+message ProcessStatsPackageProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Name of package.
+ optional string package = 1;
+
+ // Uid of the package.
+ optional int32 uid = 2;
+
+ // Version of the package.
+ optional int64 version = 3;
+
+ // Stats for each process running with the package loaded in to it.
+ repeated ProcessStatsProto process_stats = 4;
+
+ // Stats for each of the package's services.
+ repeated ProcessStatsServiceStateProto service_stats = 5;
+
+ // Stats for each association with the package.
+ repeated ProcessStatsAssociationStateProto association_stats = 6;
}
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index 9f58611397f9..ed040f43253a 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -78,16 +78,24 @@ message UsbAccessoryProto {
optional string manufacturer = 1;
optional string model = 2;
+ // For "classical" USB-accessories the manufacturer bakes this into the
+ // firmware of the device. If an Android phone is configured as accessory, the
+ // app that sets up the accessory side of the connection set this. Either way,
+ // these are part of the detection protocol, and so they cannot be user set or
+ // unique.
optional string description = 3;
optional string version = 4;
optional string uri = 5 [ (android.privacy).dest = DEST_EXPLICIT ];
- optional string serial = 6 [ (android.privacy).dest = DEST_EXPLICIT ];
+ // Non-resettable hardware ID.
+ optional string serial = 6 [ (android.privacy).dest = DEST_LOCAL ];
}
message UsbDebuggingManagerProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
optional bool connected_to_adb = 1;
+ // A workstation that connects to the phone for debugging is identified by
+ // this key.
optional string last_key_received = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
optional string user_keys = 3 [ (android.privacy).dest = DEST_LOCAL ];
optional string system_keys = 4 [ (android.privacy).dest = DEST_LOCAL ];
@@ -105,8 +113,12 @@ message UsbHostManagerProto {
message UsbDeviceProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Generic USB name, not user-provided.
optional string name = 1;
+ // ID specific to the vendor, not the device.
optional int32 vendor_id = 2;
+ // ID of this product type: Each vendor gives each product a unique ID. E.g.
+ // all mice of the same model would have the same ID.
optional int32 product_id = 3;
optional int32 class = 4;
optional int32 subclass = 5;
@@ -114,14 +126,20 @@ message UsbDeviceProto {
optional string manufacturer_name = 7;
optional string product_name = 8;
optional string version = 9;
- optional string serial_number = 10 [ (android.privacy).dest = DEST_EXPLICIT ];
+ // Non-resettable hardware ID.
+ optional string serial_number = 10 [ (android.privacy).dest = DEST_LOCAL ];
repeated UsbConfigurationProto configurations = 11;
}
message UsbConfigurationProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // A single USB device can have several configurations and the app accessing
+ // the USB device can switch between them. At any time only one can be active.
+ // Each configuration can present completely different interfaces end
+ // endpoints, i.e. a completely different behavior.
optional int32 id = 1;
+ // Hardware-defined name, not set by the user.
optional string name = 2;
optional uint32 attributes = 3;
optional int32 max_power = 4;
@@ -131,6 +149,7 @@ message UsbConfigurationProto {
message UsbInterfaceProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Hardware defined. This is the id used by the app to identify the interface.
optional int32 id = 1;
optional int32 alternate_settings = 2;
optional string name = 3;
@@ -145,6 +164,7 @@ message UsbEndPointProto {
optional int32 endpoint_number = 1;
optional android.service.UsbEndPointDirection direction = 2;
+ // The address of the endpoint. Needed to read and write to the endpoint.
optional int32 address = 3;
optional android.service.UsbEndPointType type = 4;
optional uint32 attributes = 5;
@@ -201,6 +221,7 @@ message UsbPortProto {
MODE_DEBUG_ACCESSORY = 8;
}
+ // ID of the port. A device (eg: Chromebooks) might have multiple ports.
optional string id = 1;
repeated Mode supported_modes = 2;
}
@@ -299,6 +320,7 @@ message UsbSettingsAccessoryPermissionProto {
message UsbProfileGroupSettingsManagerProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // The user id of the personal profile if the device has a work profile.
optional int32 parent_user_id = 1;
repeated UsbSettingsDevicePreferenceProto device_preferences = 2;
repeated UsbSettingsAccessoryPreferenceProto accessory_preferences = 3;
@@ -314,6 +336,7 @@ message UsbSettingsDevicePreferenceProto {
message UsbDeviceFilterProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
+ // Mirrors the vendor_id of UsbDeviceProto.
optional int32 vendor_id = 1;
optional int32 product_id = 2;
optional int32 class = 3;
diff --git a/core/proto/android/view/display.proto b/core/proto/android/view/display.proto
index 30046c3bdd81..fe8fed660dc2 100644
--- a/core/proto/android/view/display.proto
+++ b/core/proto/android/view/display.proto
@@ -22,6 +22,8 @@ option java_multiple_files = true;
message DisplayProto {
enum ColorMode {
COLOR_MODE_INVALID = -1;
+ // The default or native gamut of the display.
+ COLOR_MODE_DEFAULT = 0;
COLOR_MODE_BT601_625 = 1;
COLOR_MODE_BT601_625_UNADJUSTED = 2;
COLOR_MODE_BT601_525 = 3;
diff --git a/core/proto/android/view/displayinfo.proto b/core/proto/android/view/displayinfo.proto
index 8583955f174f..29757fc073f7 100644
--- a/core/proto/android/view/displayinfo.proto
+++ b/core/proto/android/view/displayinfo.proto
@@ -21,7 +21,8 @@ import "frameworks/base/libs/incident/proto/android/privacy.proto";
option java_multiple_files = true;
-/* represents DisplayInfo */
+// Represents DisplayInfo. Describes the characteristics of a particular
+// logical display.
message DisplayInfoProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -29,5 +30,7 @@ message DisplayInfoProto {
optional int32 logical_height = 2;
optional int32 app_width = 3;
optional int32 app_height = 4;
- optional string name = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
+ // The human-readable name of the display.
+ // Eg: "Built-in Screen"
+ optional string name = 5;
}
diff --git a/core/proto/android/view/remote_animation_target.proto b/core/proto/android/view/remote_animation_target.proto
index 9139f25c1bd3..fb4d5bdd1a7f 100644
--- a/core/proto/android/view/remote_animation_target.proto
+++ b/core/proto/android/view/remote_animation_target.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option java_package = "android.app";
option java_multiple_files = true;
package android.view;
@@ -26,7 +25,7 @@ import "frameworks/base/core/proto/android/graphics/rect.proto";
import "frameworks/base/core/proto/android/view/surfacecontrol.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";
-/** Proto representation for RemoteAnimationTarget.java class. */
+/** Proto representation for android.view.RemoteAnimationTarget.java class. */
message RemoteAnimationTargetProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -35,8 +34,11 @@ message RemoteAnimationTargetProto {
optional .android.view.SurfaceControlProto leash = 3;
optional bool is_translucent = 4;
optional .android.graphics.RectProto clip_rect = 5;
- optional .android.graphics.RectProto contentInsets = 6;
+ optional .android.graphics.RectProto content_insets = 6;
optional int32 prefix_order_index = 7;
+ // The source position of the app, in screen spaces coordinates. If the
+ // position of the leash is modified from the controlling app, any animation
+ // transform needs to be offset by this amount.
optional .android.graphics.PointProto position = 8;
optional .android.graphics.RectProto source_container_bounds = 9;
optional .android.app.WindowConfigurationProto window_configuration = 10;
diff --git a/core/proto/android/view/windowlayoutparams.proto b/core/proto/android/view/windowlayoutparams.proto
index 586321d3fd49..8a011e9067d8 100644
--- a/core/proto/android/view/windowlayoutparams.proto
+++ b/core/proto/android/view/windowlayoutparams.proto
@@ -63,7 +63,7 @@ message WindowLayoutParamsProto {
}
optional NeedsMenuState needs_menu_key = 22;
- optional .android.view.DisplayProto.ColorMode color_mode = 23;
+ optional DisplayProto.ColorMode color_mode = 23;
optional uint32 flags = 24;
optional uint32 private_flags = 26;
optional uint32 system_ui_visibility_flags = 27;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f9d81bad87df..5b36d7c3c64b 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -764,7 +764,8 @@
<!-- ====================================================================== -->
<eat-comment />
- <!-- Used for runtime permissions related to the shared external storage. -->
+ <!-- Used for runtime permissions related to the shared external storage.
+ @deprecated replaced by new strongly-typed permission groups in Q. -->
<permission-group android:name="android.permission-group.STORAGE"
android:icon="@drawable/perm_group_storage"
android:label="@string/permgrouplab_storage"
@@ -792,13 +793,13 @@
grants your app this permission. If you don't need this permission, be sure your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
targetSdkVersion}</a> is 4 or higher.
- <p>Protection level: dangerous
+ @deprecated replaced by new strongly-typed permission groups in Q.
-->
<permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:permissionGroup="android.permission-group.STORAGE"
android:label="@string/permlab_sdcardRead"
android:description="@string/permdesc_sdcardRead"
- android:protectionLevel="dangerous" />
+ android:protectionLevel="normal" />
<!-- Allows an application to write to external storage.
<p class="note"><strong>Note:</strong> If <em>both</em> your <a
@@ -813,14 +814,87 @@
read/write files in your application-specific directories returned by
{@link android.content.Context#getExternalFilesDir} and
{@link android.content.Context#getExternalCacheDir}.
- <p>Protection level: dangerous
+ @deprecated replaced by new strongly-typed permission groups in Q.
-->
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:permissionGroup="android.permission-group.STORAGE"
android:label="@string/permlab_sdcardWrite"
android:description="@string/permdesc_sdcardWrite"
+ android:protectionLevel="normal" />
+
+ <!-- Runtime permission controlling access to the user's shared aural media
+ collection. -->
+ <permission-group android:name="android.permission-group.MEDIA_AURAL"
+ android:icon="@drawable/perm_group_aural"
+ android:label="@string/permgrouplab_aural"
+ android:description="@string/permgroupdesc_aural"
+ android:request="@string/permgrouprequest_aural"
+ android:priority="910" />
+
+ <!-- Allows an application to read the user's shared audio collection. -->
+ <permission android:name="android.permission.READ_MEDIA_AUDIO"
+ android:permissionGroup="android.permission-group.MEDIA_AURAL"
+ android:label="@string/permlab_audioRead"
+ android:description="@string/permdesc_audioRead"
android:protectionLevel="dangerous" />
+ <!-- Allows an application to modify the user's shared audio collection. -->
+ <permission android:name="android.permission.WRITE_MEDIA_AUDIO"
+ android:permissionGroup="android.permission-group.MEDIA_AURAL"
+ android:label="@string/permlab_audioWrite"
+ android:description="@string/permdesc_audioWrite"
+ android:protectionLevel="dangerous" />
+
+ <!-- Runtime permission controlling access to the user's shared visual media
+ collection, including images and videos. -->
+ <permission-group android:name="android.permission-group.MEDIA_VISUAL"
+ android:icon="@drawable/perm_group_visual"
+ android:label="@string/permgrouplab_visual"
+ android:description="@string/permgroupdesc_visual"
+ android:request="@string/permgrouprequest_visual"
+ android:priority="920" />
+
+ <!-- Allows an application to read the user's shared images collection. -->
+ <permission android:name="android.permission.READ_MEDIA_IMAGES"
+ android:permissionGroup="android.permission-group.MEDIA_VISUAL"
+ android:label="@string/permlab_imagesRead"
+ android:description="@string/permdesc_imagesRead"
+ android:protectionLevel="dangerous" />
+
+ <!-- Allows an application to modify the user's shared images collection. -->
+ <permission android:name="android.permission.WRITE_MEDIA_IMAGES"
+ android:permissionGroup="android.permission-group.MEDIA_VISUAL"
+ android:label="@string/permlab_imagesWrite"
+ android:description="@string/permdesc_imagesWrite"
+ android:protectionLevel="dangerous" />
+
+ <!-- Allows an application to read the user's shared video collection. -->
+ <permission android:name="android.permission.READ_MEDIA_VIDEO"
+ android:permissionGroup="android.permission-group.MEDIA_VISUAL"
+ android:label="@string/permlab_videoRead"
+ android:description="@string/permdesc_videoRead"
+ android:protectionLevel="dangerous" />
+
+ <!-- Allows an application to modify the user's shared video collection. -->
+ <permission android:name="android.permission.WRITE_MEDIA_VIDEO"
+ android:permissionGroup="android.permission-group.MEDIA_VISUAL"
+ android:label="@string/permlab_videoWrite"
+ android:description="@string/permdesc_videoWrite"
+ android:protectionLevel="dangerous" />
+
+ <!-- Allows an application to access any geographic locations persisted in the
+ user's shared collection. -->
+ <permission android:name="android.permission.ACCESS_MEDIA_LOCATION"
+ android:permissionGroup="android.permission-group.MEDIA_VISUAL"
+ android:label="@string/permlab_mediaLocation"
+ android:description="@string/permdesc_mediaLocation"
+ android:protectionLevel="dangerous" />
+
+ <!-- @hide @SystemApi
+ Allows an application to modify OBB files visible to other apps. -->
+ <permission android:name="android.permission.WRITE_OBB"
+ android:protectionLevel="signature|privileged" />
+
<!-- ====================================================================== -->
<!-- Permissions for accessing the device location -->
<!-- ====================================================================== -->
diff --git a/core/res/res/anim/keyguard_occlude_open_enter.xml b/core/res/res/anim/keyguard_occlude_open_enter.xml
deleted file mode 100644
index e742616abec4..000000000000
--- a/core/res/res/anim/keyguard_occlude_open_enter.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ 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
- -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:shareInterpolator="false">
- <translate
- android:fromYDelta="90%"
- android:toYDelta="0%"
- android:interpolator="@interpolator/fast_out_slow_in"
- android:duration="400"/>
- <alpha
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:interpolator="@interpolator/fast_out_slow_in"
- android:duration="300"/>
-</set>
diff --git a/core/res/res/drawable/perm_group_aural.xml b/core/res/res/drawable/perm_group_aural.xml
new file mode 100644
index 000000000000..0465e98c71c0
--- /dev/null
+++ b/core/res/res/drawable/perm_group_aural.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M20,2H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zm-2,5h-3v5.5c0,1.38 -1.12,2.5 -2.5,2.5S10,13.88 10,12.5s1.12,-2.5 2.5,-2.5c0.57,0 1.08,0.19 1.5,0.51V5h4v2zM4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6z"/>
+</vector>
diff --git a/core/res/res/drawable/perm_group_visual.xml b/core/res/res/drawable/perm_group_visual.xml
new file mode 100644
index 000000000000..bf9a0b102f05
--- /dev/null
+++ b/core/res/res/drawable/perm_group_visual.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M22,16V4c0,-1.1 -0.9,-2 -2,-2H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zm-11,-4l2.03,2.71L16,11l4,5H8l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2H4V6H2z"/>
+</vector>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 73db3a1e19c9..c93d2668136a 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -133,7 +133,7 @@
<item msgid="4397097370387921767">"%s Wi-Fi-oproep"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Af"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Verkieslik Wi-Fi"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Verkies Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Verkies mobiel"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Net Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nie aangestuur nie"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 14700131ba4e..6d5ee11e4ff1 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -138,7 +138,7 @@
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"إيقاف"</string>
<string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"‏شبكة Wi-Fi مفضّلة"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"مفضَّل للجوّال"</string>
+ <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"شبكة بيانات الجوال مفضَّلة"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"‏Wi-Fi فقط"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: لم تتم إعادة التوجيه"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 949d20617063..61232e0cdd53 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1110,7 +1110,7 @@
<string name="aerr_restart" msgid="7581308074153624475">"অ্যাপ্লিকেশানটিকে আবার খুলুন"</string>
<string name="aerr_report" msgid="5371800241488400617">"মতামত জানান"</string>
<string name="aerr_close" msgid="2991640326563991340">"বন্ধ করুন"</string>
- <string name="aerr_mute" msgid="1974781923723235953">"ডিভাইসটি পুনরায় আরম্ভ না হওয়া পর্যন্ত নিঃশব্দ করুন"</string>
+ <string name="aerr_mute" msgid="1974781923723235953">"ডিভাইসটি পুনরায় আরম্ভ না হওয়া পর্যন্ত মিউট করুন"</string>
<string name="aerr_wait" msgid="3199956902437040261">"অপেক্ষা করুন"</string>
<string name="aerr_close_app" msgid="3269334853724920302">"অ্যাপ্লিকেশান বন্ধ করুন"</string>
<string name="anr_title" msgid="4351948481459135709"></string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 6f7990907cf7..da816a1e9f61 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1100,7 +1100,7 @@
<string name="alwaysUse" msgid="4583018368000610438">"Utilitza-ho de manera predeterminada per a aquesta acció."</string>
<string name="use_a_different_app" msgid="8134926230585710243">"Fes servir una altra aplicació"</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"Esborra els paràmetres predeterminats a Configuració del sistema &gt; Aplicacions &gt; Baixades."</string>
- <string name="chooseActivity" msgid="7486876147751803333">"Tria una acció"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"Selecciona una acció"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"Tria una aplicació per al dispositiu USB"</string>
<string name="noApplications" msgid="2991814273936504689">"No hi ha cap aplicació que pugui dur a terme aquesta acció."</string>
<string name="aerr_application" msgid="250320989337856518">"S\'ha aturat <xliff:g id="APPLICATION">%1$s</xliff:g>"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index c4b74af171e7..36d0eb73e6f7 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -34,7 +34,7 @@
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"Se ha producido un problema de conexión o el código MMI no es válido."</string>
<string name="mmiFdnError" msgid="5224398216385316471">"La operación solo es válida para números de marcación fija."</string>
- <string name="mmiErrorWhileRoaming" msgid="762488890299284230">"No se puede cambiar la configuración de desvío de llamada desde tu teléfono mientras estás en itinerancia."</string>
+ <string name="mmiErrorWhileRoaming" msgid="762488890299284230">"No se puede cambiar la configuración de desvío de llamadas desde tu teléfono mientras estás en itinerancia."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"El servicio se ha habilitado."</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"Se ha habilitado el servicio para:"</string>
<string name="serviceDisabled" msgid="1937553226592516411">"El servicio se ha inhabilitado."</string>
@@ -60,7 +60,7 @@
<string name="ClirMmi" msgid="7784673673446833091">"ID de emisor de llamada saliente"</string>
<string name="ColpMmi" msgid="3065121483740183974">"ID de línea conectada"</string>
<string name="ColrMmi" msgid="4996540314421889589">"Restricción de ID de línea conectada"</string>
- <string name="CfMmi" msgid="5123218989141573515">"Desvío de llamada"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"Desvío de llamadas"</string>
<string name="CwMmi" msgid="9129678056795016867">"Llamada en espera"</string>
<string name="BaMmi" msgid="455193067926770581">"Bloqueo de llamada"</string>
<string name="PwdMmi" msgid="7043715687905254199">"Cambio de contraseña"</string>
@@ -88,7 +88,7 @@
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Servicio de llamadas de emergencia no disponible"</string>
<string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"No se pueden hacer llamadas de emergencia por Wi‑Fi"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string>
- <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamadas"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string>
<string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"Estado de los datos móviles"</string>
<string name="notification_channel_sms" msgid="3441746047346135073">"Mensajes SMS"</string>
@@ -133,7 +133,7 @@
<item msgid="4397097370387921767">"Llamadas Wi-Fi de %s"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferir Wi-Fi"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Dar preferencia a Wi-Fi"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferir datos móviles"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Solo conexión Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index e69584b8d829..4e15595e1f45 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1278,7 +1278,7 @@
<string name="no_permissions" msgid="7283357728219338112">"Aucune autorisation requise"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"Cela peut engendrer des frais"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="1595122345358177163">"Rechargement via USB de cet appareil"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Appareil en charge via USB"</string>
<string name="usb_supplying_notification_title" msgid="4631045789893086181">"Rechargement via USB de l\'appareil connecté"</string>
<string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transfert de fichiers via USB activé"</string>
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB activé"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index a5327f633c15..cf558400afad 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -130,7 +130,7 @@
</string-array>
<string-array name="wfcSpnFormats">
<item msgid="6830082633573257149">"%s"</item>
- <item msgid="4397097370387921767">"Chamadas wifi de %s"</item>
+ <item msgid="4397097370387921767">"Chamadas por wifi de %s"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string>
<string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wifi preferida"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 116106297f75..96a03bfcbd06 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1097,7 +1097,7 @@
<string name="whichImageCaptureApplication" msgid="3680261417470652882">"Լուսանկարել այս հավելվածի օգնությամբ"</string>
<string name="whichImageCaptureApplicationNamed" msgid="8619384150737825003">"Լուսանկարել %1$s հավելվածի օգնությամբ"</string>
<string name="whichImageCaptureApplicationLabel" msgid="6390303445371527066">"Լուսանկարել"</string>
- <string name="alwaysUse" msgid="4583018368000610438">"Օգտագործել լռելյայն այս գործողության համար:"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"Օգտագործել ըստ կանխադրման այս գործողության համար:"</string>
<string name="use_a_different_app" msgid="8134926230585710243">"Օգտագործել այլ հավելված"</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"Մաքրել լռելյայնը Համակարգի կարգավորումներ &gt; Ծրագրեր &gt;Ներբեռնված էջից:"</string>
<string name="chooseActivity" msgid="7486876147751803333">"Ընտրել գործողություն"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 05f6ba15099b..5bc03cdb8e20 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1305,7 +1305,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap untuk memilih bahasa dan tata letak"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"Tampilkan di atas aplikasi lain"</string>
+ <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"Tampilkan di atas apl lain"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string>
<string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 22bd6c3250ef..d65e8865de9e 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -133,8 +133,8 @@
<item msgid="4397097370387921767">"ការហៅតាមរយៈ Wi-Fi %s"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"បិទ"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"គួរប្រើ Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"បាន​ជ្រើសរើសប្រើទិន្នន័យចល័ត"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ជាអាទិភាព"</string>
+ <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ទិន្នន័យទូរសព្ទចល័តជាអាទិភាព"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Wi-Fi តែប៉ុណ្ណោះ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> ៖ មិន​បាន​បញ្ជូន​បន្ត"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 58f8d56be4e2..c28e8e83e8c4 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -133,7 +133,7 @@
<item msgid="4397097370387921767">"%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"ಆಫ್"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ವೈ-ಫೈಗೆ ಆದ್ಯತೆ ನೀಡಲಾಗಿದೆ"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ವೈ-ಫೈಗೆ ಆದ್ಯತೆ"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ಮೊಬೈಲ್‌ಗೆ ಆದ್ಯತೆ"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"ವೈ-ಫೈ ಮಾತ್ರ"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ಫಾರ್ವರ್ಡ್ ಮಾಡಲಾಗಿಲ್ಲ"</string>
diff --git a/core/res/res/values-mcc313-mnc100-as/strings.xml b/core/res/res/values-mcc313-mnc100-as/strings.xml
new file mode 100644
index 000000000000..350757ca43a4
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-as/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ফ\'নৰ অনুমতি নাই MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-az/strings.xml b/core/res/res/values-mcc313-mnc100-az/strings.xml
new file mode 100644
index 000000000000..44796dfc1b95
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-az/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"MM#6 telefonu dəstəklənmir"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-b+sr+Latn/strings.xml b/core/res/res/values-mcc313-mnc100-b+sr+Latn/strings.xml
new file mode 100644
index 000000000000..d5bf39e51327
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-b+sr+Latn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Telefon nije dozvoljen MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-be/strings.xml b/core/res/res/values-mcc313-mnc100-be/strings.xml
new file mode 100644
index 000000000000..c9f4633c3ba2
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-be/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Тэлефон не дапускаецца MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-bn/strings.xml b/core/res/res/values-mcc313-mnc100-bn/strings.xml
new file mode 100644
index 000000000000..5292241b0745
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-bn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ফোন অনুমোদিত নয় MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-bs/strings.xml b/core/res/res/values-mcc313-mnc100-bs/strings.xml
new file mode 100644
index 000000000000..d5bf39e51327
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-bs/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Telefon nije dozvoljen MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-en-rAU/strings.xml b/core/res/res/values-mcc313-mnc100-en-rAU/strings.xml
new file mode 100644
index 000000000000..f1a361146a97
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-en-rAU/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Phone not allowed MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-en-rCA/strings.xml b/core/res/res/values-mcc313-mnc100-en-rCA/strings.xml
new file mode 100644
index 000000000000..f1a361146a97
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-en-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Phone not allowed MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-en-rIN/strings.xml b/core/res/res/values-mcc313-mnc100-en-rIN/strings.xml
new file mode 100644
index 000000000000..f1a361146a97
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-en-rIN/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Phone not allowed MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-en-rXC/strings.xml b/core/res/res/values-mcc313-mnc100-en-rXC/strings.xml
new file mode 100644
index 000000000000..8a8bf7e02106
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-en-rXC/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎Phone not allowed MM#6‎‏‎‎‏‎"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-et/strings.xml b/core/res/res/values-mcc313-mnc100-et/strings.xml
new file mode 100644
index 000000000000..83cfbafd87cc
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-et/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Telefon pole lubatud MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-eu/strings.xml b/core/res/res/values-mcc313-mnc100-eu/strings.xml
new file mode 100644
index 000000000000..028ca37f03ec
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-eu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Telefonoa ez da onartzen MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-fr-rCA/strings.xml b/core/res/res/values-mcc313-mnc100-fr-rCA/strings.xml
new file mode 100644
index 000000000000..89c50ea24f3c
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-fr-rCA/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Téléphone non autorisé MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-gl/strings.xml b/core/res/res/values-mcc313-mnc100-gl/strings.xml
new file mode 100644
index 000000000000..04390a0b5f84
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-gl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Non se admite o teléfono MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-gu/strings.xml b/core/res/res/values-mcc313-mnc100-gu/strings.xml
new file mode 100644
index 000000000000..6291d574c7ed
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-gu/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"MM#6 ફોનની મંજૂરી નથી"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-hy/strings.xml b/core/res/res/values-mcc313-mnc100-hy/strings.xml
new file mode 100644
index 000000000000..62acde34ced8
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-hy/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Հեռախոսի օգտագործումն արգելված է (MM#6)"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-is/strings.xml b/core/res/res/values-mcc313-mnc100-is/strings.xml
new file mode 100644
index 000000000000..3ad7b3c3d11b
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-is/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Sími ekki leyfður MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-ka/strings.xml b/core/res/res/values-mcc313-mnc100-ka/strings.xml
new file mode 100644
index 000000000000..a063fc4843da
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-ka/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ტელეფონი დაუშვებელია MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-kk/strings.xml b/core/res/res/values-mcc313-mnc100-kk/strings.xml
new file mode 100644
index 000000000000..0562a2f0024a
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-kk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Телефон пайдалануға болмайды MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-km/strings.xml b/core/res/res/values-mcc313-mnc100-km/strings.xml
new file mode 100644
index 000000000000..74e607b6045f
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-km/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"មិន​អនុញ្ញាត​ចំពោះ​ទូរសព្ទ​ទេ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-kn/strings.xml b/core/res/res/values-mcc313-mnc100-kn/strings.xml
new file mode 100644
index 000000000000..e287270ff7ba
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-kn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ಫೋನ್ MM#6 ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-ky/strings.xml b/core/res/res/values-mcc313-mnc100-ky/strings.xml
new file mode 100644
index 000000000000..8c08c4ffb73c
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-ky/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Телефонду колдонууга тыюу салынган MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-lo/strings.xml b/core/res/res/values-mcc313-mnc100-lo/strings.xml
new file mode 100644
index 000000000000..793b87bee136
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-lo/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ໂທລະສັບ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-mk/strings.xml b/core/res/res/values-mcc313-mnc100-mk/strings.xml
new file mode 100644
index 000000000000..0b403e99491c
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-mk/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Телефонот не е дозволен MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-ml/strings.xml b/core/res/res/values-mcc313-mnc100-ml/strings.xml
new file mode 100644
index 000000000000..1adc4556562b
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-ml/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ഫോൺ അനുവദനീയമല്ല MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-mn/strings.xml b/core/res/res/values-mcc313-mnc100-mn/strings.xml
new file mode 100644
index 000000000000..5d5fbff3e9d4
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-mn/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Утсыг зөвшөөрөөгүй MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-mr/strings.xml b/core/res/res/values-mcc313-mnc100-mr/strings.xml
new file mode 100644
index 000000000000..32c69463e263
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-mr/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"फोन MM#6 ला अनुमती देत नाही"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-my/strings.xml b/core/res/res/values-mcc313-mnc100-my/strings.xml
new file mode 100644
index 000000000000..7de66f763ea1
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-my/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ဖုန်းကို ခွင့်မပြုပါ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-ne/strings.xml b/core/res/res/values-mcc313-mnc100-ne/strings.xml
new file mode 100644
index 000000000000..0fb9d648c336
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-ne/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"फोनलाई अनुमति छैन MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-or/strings.xml b/core/res/res/values-mcc313-mnc100-or/strings.xml
new file mode 100644
index 000000000000..a64ee94d284c
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ଫୋନ୍‌ର ଅନୁମତି ନାହିଁ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-pa/strings.xml b/core/res/res/values-mcc313-mnc100-pa/strings.xml
new file mode 100644
index 000000000000..87b2e4742310
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-pa/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ਫ਼ੋਨ ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-pt-rBR/strings.xml b/core/res/res/values-mcc313-mnc100-pt-rBR/strings.xml
new file mode 100644
index 000000000000..f80f618e60af
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-pt-rBR/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Smartphone não permitido MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-si/strings.xml b/core/res/res/values-mcc313-mnc100-si/strings.xml
new file mode 100644
index 000000000000..9493af0bcaf0
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-si/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"දුරකථනය MM#6 ඉඩ නොදේ"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-sq/strings.xml b/core/res/res/values-mcc313-mnc100-sq/strings.xml
new file mode 100644
index 000000000000..237a4a447d00
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-sq/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Telefoni nuk lejohet MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-sw/strings.xml b/core/res/res/values-mcc313-mnc100-sw/strings.xml
new file mode 100644
index 000000000000..a7574fbbfce1
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-sw/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Simu hairuhusiwi MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-ta/strings.xml b/core/res/res/values-mcc313-mnc100-ta/strings.xml
new file mode 100644
index 000000000000..7ef5ea9cef2d
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-ta/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ஃபோன் அனுமதிக்கப்படவில்லை MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-te/strings.xml b/core/res/res/values-mcc313-mnc100-te/strings.xml
new file mode 100644
index 000000000000..8908fb72f499
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-te/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"ఫోన్ అనుమతించబడదు MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-ur/strings.xml b/core/res/res/values-mcc313-mnc100-ur/strings.xml
new file mode 100644
index 000000000000..d670d0e60858
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-ur/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"‏فون کی اجازت نہیں ہے MM#6"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-uz/strings.xml b/core/res/res/values-mcc313-mnc100-uz/strings.xml
new file mode 100644
index 000000000000..202a30ca7445
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-uz/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"Chaqiruvlar taqiqlangan (MM#6)"</string>
+</resources>
diff --git a/core/res/res/values-mcc313-mnc100-zh-rHK/strings.xml b/core/res/res/values-mcc313-mnc100-zh-rHK/strings.xml
new file mode 100644
index 000000000000..db85730e3aed
--- /dev/null
+++ b/core/res/res/values-mcc313-mnc100-zh-rHK/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="mmcc_illegal_me" msgid="7320955531336937252">"不允許手機 MM#6"</string>
+</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index f311ab372b55..f9049f55e81c 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -30,7 +30,7 @@
<string name="untitled" msgid="4638956954852782576">"&lt;ခေါင်းစဉ်မဲ့&gt;"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(ဖုန်းနံပါတ်မရှိပါ)"</string>
<string name="unknownName" msgid="6867811765370350269">"မသိရ"</string>
- <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"အသံစာပို့စနစ်"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"အသံမေးလ်"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"ဆက်သွယ်မှုဆိုင်ရာပြသနာ သို့မဟုတ် မမှန်ကန်သောMMIကုတ်"</string>
<string name="mmiFdnError" msgid="5224398216385316471">"သတ်မှတ်ခေါ်ဆိုနိုင်သောနံပါတ်များထံသာ ကန့်သတ်ထားသည်"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 99ee6d4ab715..0981442ffd0b 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1166,7 +1166,7 @@
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Stille beltoon ingesteld"</string>
<string name="volume_call" msgid="3941680041282788711">"Volume inkomend gesprek"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"Volume tijdens gesprek in Bluetooth-modus"</string>
- <string name="volume_alarm" msgid="1985191616042689100">"Alarmvolume"</string>
+ <string name="volume_alarm" msgid="1985191616042689100">"Wekkervolume"</string>
<string name="volume_notification" msgid="2422265656744276715">"Meldingsvolume"</string>
<string name="volume_unknown" msgid="1400219669770445902">"Volume"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth-volume"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 188e3e46b5e1..76e5529876bd 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -136,7 +136,7 @@
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Wył."</string>
<string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferuj Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferowane mobilne"</string>
+ <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferowane komórkowe"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Tylko Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 6c0391c0276b..1260627f7efa 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -33,7 +33,7 @@
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Correio de voz"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"Problema de conexão ou código MMI inválido."</string>
- <string name="mmiFdnError" msgid="5224398216385316471">"A operação é limitada somente a números de chamadas fixas."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"A operação é limitada somente a números de discagem fixa."</string>
<string name="mmiErrorWhileRoaming" msgid="762488890299284230">"Não é possível alterar as configurações de encaminhamento de chamada do seu smartphone em roaming."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"O serviço foi ativado."</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"O serviço foi ativado para:"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 6c0391c0276b..1260627f7efa 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -33,7 +33,7 @@
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"Correio de voz"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"Problema de conexão ou código MMI inválido."</string>
- <string name="mmiFdnError" msgid="5224398216385316471">"A operação é limitada somente a números de chamadas fixas."</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"A operação é limitada somente a números de discagem fixa."</string>
<string name="mmiErrorWhileRoaming" msgid="762488890299284230">"Não é possível alterar as configurações de encaminhamento de chamada do seu smartphone em roaming."</string>
<string name="serviceEnabled" msgid="8147278346414714315">"O serviço foi ativado."</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"O serviço foi ativado para:"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 0edf58cada67..f39044565c51 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -60,7 +60,7 @@
<string name="ClirMmi" msgid="7784673673446833091">"வெளிசெல்லும் அழைப்பாளர் ஐடி"</string>
<string name="ColpMmi" msgid="3065121483740183974">"இணைக்கப்பட்ட லைன் ஐடி"</string>
<string name="ColrMmi" msgid="4996540314421889589">"இணைக்கப்பட்ட லைன் ஐடியை வரம்பிடல்"</string>
- <string name="CfMmi" msgid="5123218989141573515">"அழைப்புப் பகிர்வு"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"அழைப்பு திருப்பிவிடுதல்"</string>
<string name="CwMmi" msgid="9129678056795016867">"அழைப்பு காத்திருப்பு"</string>
<string name="BaMmi" msgid="455193067926770581">"அழைப்புத் தவிர்ப்பு"</string>
<string name="PwdMmi" msgid="7043715687905254199">"கடவுச்சொல்லை மாற்று"</string>
@@ -88,7 +88,7 @@
<string name="EmergencyCallWarningTitle" msgid="813380189532491336">"அவசர அழைப்பைச் செய்ய முடியாது"</string>
<string name="EmergencyCallWarningSummary" msgid="1899692069750260619">"வைஃபை மூலம் அவசர அழைப்புகளைச் செய்ய முடியாது"</string>
<string name="notification_channel_network_alert" msgid="4427736684338074967">"விழிப்பூட்டல்கள்"</string>
- <string name="notification_channel_call_forward" msgid="2419697808481833249">"அழைப்புப் பகிர்வு"</string>
+ <string name="notification_channel_call_forward" msgid="2419697808481833249">"அழைப்பு திருப்பிவிடுதல்"</string>
<string name="notification_channel_emergency_callback" msgid="6686166232265733921">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string>
<string name="notification_channel_mobile_data_status" msgid="4575131690860945836">"மொபைல் டேட்டாவின் நிலை"</string>
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS செய்திகள்"</string>
@@ -272,7 +272,7 @@
<string name="permgrouprequest_contacts" msgid="6032805601881764300">"தொடர்புகளை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"இருப்பிடம்"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"இந்தச் சாதனத்தின் இருப்பிடத்தை அறிந்து கொள்ள"</string>
- <string name="permgrouprequest_location" msgid="3788275734953323491">"இந்தச் சாதனத்தின் இருப்பிடத்தை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"இந்தச் சாதனத்தின் இருப்பிடத்தை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="permgrouprequestdetail_location" msgid="1113400215566814664">"இந்த ஆப்ஸைப் பயன்படுத்தும் சமயத்தில் மட்டுமே, இது உங்கள் இருப்பிடத்தை அணுகும்."</string>
<string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"இதன் இருப்பிடத்தை எப்போதுமே &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; அணுக அனுமதிக்கவா?"</string>
<string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"இந்த ஆப்ஸைப் பயன்படுத்தாத சமயங்களில் கூட, இது உங்கள் இருப்பிடத்தை அணுகும்."</string>
@@ -281,7 +281,7 @@
<string name="permgrouprequest_calendar" msgid="289900767793189421">"கேலெண்டரை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS அனுப்பலாம், வந்த SMSகளைப் பார்க்கலாம்"</string>
- <string name="permgrouprequest_sms" msgid="7168124215838204719">"மெசேஜ்களை அனுப்பவும், அவற்றைப் பார்க்கவும் &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"மெசேஜ்களை அனுப்பவும், பார்க்கவும் &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"சேமிப்பிடம்"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"உங்கள் சாதனத்தில் உள்ள படங்கள், மீடியா மற்றும் கோப்புகளை அணுக வேண்டும்"</string>
<string name="permgrouprequest_storage" msgid="7885942926944299560">"உங்கள் சாதனத்திலுள்ள படங்கள், மீடியா, ஃபைல்கள் ஆகியவற்றை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
@@ -296,7 +296,7 @@
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"உங்கள் மொபைல் அழைப்புப் பதிவுகளை அணுக, &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ஃபோன்"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"யாரையும் தொலைபேசியில் அழைக்கலாம்"</string>
- <string name="permgrouprequest_phone" msgid="9166979577750581037">"மொபைல் அழைப்புகள் செய்யவும், அவற்றை நிர்வகிக்கவும், &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"மொபைல் அழைப்புகள் செய்யவும், அவற்றை நிர்வகிக்கவும், &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ஆப்ஸை அனுமதிக்கவா?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"உடல் சென்சார்கள்"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"உங்கள் உடல் இயக்கம் பற்றி உணர்விகள் கூறும் தகவலைப் பார்க்கலாம்"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"உங்கள் உடலியக்கக் குறிகள் பற்றிய சென்சார் தரவை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index a71bc4a29325..54f92e1a3ea8 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -133,7 +133,7 @@
<item msgid="4397097370387921767">"%s Kablosuz Çağrı"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Kapalı"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kablosuz bağlantı tercih edildi"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kablosuz bağlantı tercihli"</string>
<string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil tercihli"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Yalnızca kablosuz"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönlendirilmedi"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 577e6b9b564b..1d4c07426ccf 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -133,8 +133,8 @@
<item msgid="4397097370387921767">"%s Wi-Fi qo‘ng‘iroqlar"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chiq"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi afzal ko‘rilsin"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil internet ustivorligi"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi afzalligi"</string>
+ <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil internet afzalligi"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Faqat Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yo‘naltirilmadi"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -1161,7 +1161,7 @@
<string name="dump_heap_text" msgid="4809417337240334941">"<xliff:g id="PROC">%1$s</xliff:g> jarayoni o‘zi uchun ajratilgan <xliff:g id="SIZE">%2$s</xliff:g> xotira chegarasidan o‘tib ketdi. Ilova dasturchisi bilan ulashishingiz uchun hip-damp ma’lumotlari yig‘ilib qoldi. Ehtiyot bo\'ling: ushbu hip-dampda ilova uchun foydalanishga ruxsat berilgan shaxsiy ma’lumotlaringiz bo‘lishi mumkin."</string>
<string name="sendText" msgid="5209874571959469142">"Matn uchun amalni tanlash"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Jiringlaganda tovush balandligi"</string>
- <string name="volume_music" msgid="5421651157138628171">"Multimedia ovozi"</string>
+ <string name="volume_music" msgid="5421651157138628171">"Multimedia tovushi"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth orqali ijro etilmoqda"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Ovozsiz rejim tanlandi"</string>
<string name="volume_call" msgid="3941680041282788711">"Suhbat vaqtidagi tovush balandligi"</string>
@@ -1172,7 +1172,7 @@
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth tovushi"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"Rington balandligi"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Qo‘ng‘iroq tovushi balandligi"</string>
- <string name="volume_icon_description_media" msgid="4217311719665194215">"Multimedia ovozi"</string>
+ <string name="volume_icon_description_media" msgid="4217311719665194215">"Multimedia tovushi"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Eslatma tovushi"</string>
<string name="ringtone_default" msgid="3789758980357696936">"Standart rington"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"Standart (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 7b603fbeea82..a45118f472bd 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -134,7 +134,7 @@
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Tắt"</string>
<string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Ưu tiên Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Được ưu tiên trên thiết bị di động"</string>
+ <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Ưu tiên dữ liệu di động"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Chỉ Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Không được chuyển tiếp"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index fddb90446fb4..c8343e2c5cb1 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2491,6 +2491,7 @@
<item>com.android.server.notification.VisibilityExtractor</item>
<!-- Depends on ZenModeExtractor -->
<item>com.android.server.notification.BadgeExtractor</item>
+ <item>com.android.server.notification.CriticalNotificationExtractor</item>
</string-array>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 15331d6475c3..dfd5e8143d53 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -745,6 +745,22 @@
<string name="permgrouprequest_sensors">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access sensor data about your vital signs?</string>
+ <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permgrouplab_aural">Music</string>
+ <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permgroupdesc_aural">access your music</string>
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
+ <string name="permgrouprequest_aural">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access your music?</string>
+
+ <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permgrouplab_visual">Photos &amp; Videos</string>
+ <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permgroupdesc_visual">access your photos &amp; videos</string>
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
+ <string name="permgrouprequest_visual">Allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access your photos &amp; videos?</string>
+
<!-- Title for the capability of an accessibility service to retrieve window content. -->
<string name="capability_title_canRetrieveWindowContent">Retrieve window content</string>
<!-- Description for the capability of an accessibility service to retrieve window content. -->
@@ -1349,6 +1365,38 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_useFingerprint">Allows the app to use fingerprint hardware for authentication</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_audioRead">read your music collection</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_audioRead">Allows the app to read your music collection.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_audioWrite">modify your music collection</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_audioWrite">Allows the app to modify your music collection.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_videoRead">read your video collection</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_videoRead">Allows the app to read your video collection.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_videoWrite">modify your video collection</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_videoWrite">Allows the app to modify your video collection.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_imagesRead">read your photo collection</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_imagesRead">Allows the app to read your photo collection.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_imagesWrite">modify your photo collection</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_imagesWrite">Allows the app to modify your photo collection.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_mediaLocation">read locations from your media collection</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_mediaLocation">Allows the app to read locations from your media collection.</string>
+
<!-- Message shown during fingerprint acquisision when the fingerprint cannot be recognized -->
<string name="fingerprint_acquired_partial">Partial fingerprint detected. Please try again.</string>
<!-- Message shown during fingerprint acquisision when the fingerprint cannot be recognized -->
@@ -4936,10 +4984,29 @@
by an autofill service, and the service does knows what the activity represents, and it represents 3 types of
data (for example, username, password and credit card info) [CHAR LIMIT=NONE] -->
<string name="autofill_save_title_with_3types">Save <xliff:g id="type" example="Username">%1$s</xliff:g>, <xliff:g id="type" example="Password">%2$s</xliff:g>, and <xliff:g id="type" example="Credit Card">%3$s</xliff:g> to &lt;b><xliff:g id="label" example="MyPass">%4$s</xliff:g>&lt;/b>?</string>
+
+ <!-- Title for the autofill update dialog shown when the the contents of the activity can be updated
+ by an autofill service, but the service does not know what the activity represents [CHAR LIMIT=NONE] -->
+ <string name="autofill_update_title">Update to &lt;b><xliff:g id="label" example="MyPass">%1$s</xliff:g>&lt;/b>?</string>
+ <!-- Title for the autofill update dialog shown when the the contents of the activity can be updated
+ by an autofill service, and the service does knows what the activity represents (for example, credit card info) [CHAR LIMIT=NONE] -->
+ <string name="autofill_update_title_with_type">Update <xliff:g id="type" example="Credit Card">%1$s</xliff:g> to &lt;b><xliff:g id="label" example="MyPass">%2$s</xliff:g>&lt;/b>?</string>
+ <!-- Title for the autofill update dialog shown when the the contents of the activity can be updated
+ by an autofill service, and the service does knows what the activity represents, and it represents 2 types of
+ data (for example, password and credit card info) [CHAR LIMIT=NONE] -->
+ <string name="autofill_update_title_with_2types">Update <xliff:g id="type" example="Password">%1$s</xliff:g> and <xliff:g id="type" example="Credit Card">%2$s</xliff:g> to &lt;b><xliff:g id="label" example="MyPass">%3$s</xliff:g>&lt;/b>?</string>
+ <!-- Title for the autofill update dialog shown when the the contents of the activity can be updated
+ by an autofill service, and the service does knows what the activity represents, and it represents 3 types of
+ data (for example, username, password and credit card info) [CHAR LIMIT=NONE] -->
+ <string name="autofill_update_title_with_3types">Update <xliff:g id="type" example="Username">%1$s</xliff:g>, <xliff:g id="type" example="Password">%2$s</xliff:g>, and <xliff:g id="type" example="Credit Card">%3$s</xliff:g> to &lt;b><xliff:g id="label" example="MyPass">%4$s</xliff:g>&lt;/b>?</string>
+
+
<!-- Label for the autofill save button [CHAR LIMIT=NONE] -->
<string name="autofill_save_yes">Save</string>
<!-- Label for the autofill cancel button [CHAR LIMIT=NONE] -->
<string name="autofill_save_no">No thanks</string>
+ <!-- Label for the autofill update button [CHAR LIMIT=NONE] -->
+ <string name="autofill_update_yes">Update</string>
<!-- Label for the type of data being saved for autofill when it represent user credentials with a password [CHAR LIMIT=NONE] -->
<string name="autofill_save_type_password">password</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 140bb7d8704a..5e1109e24b36 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2156,7 +2156,6 @@
<java-symbol type="anim" name="push_down_out" />
<java-symbol type="anim" name="push_up_in" />
<java-symbol type="anim" name="push_up_out" />
- <java-symbol type="anim" name="keyguard_occlude_open_enter" />
<java-symbol type="anim" name="lock_screen_behind_enter" />
<java-symbol type="anim" name="lock_screen_behind_enter_wallpaper" />
<java-symbol type="anim" name="lock_screen_behind_enter_fade_in" />
@@ -3109,6 +3108,11 @@
<java-symbol type="plurals" name="autofill_picker_some_suggestions" />
<java-symbol type="string" name="autofill" />
<java-symbol type="string" name="autofill_picker_accessibility_title " />
+ <java-symbol type="string" name="autofill_update_title" />
+ <java-symbol type="string" name="autofill_update_title_with_type" />
+ <java-symbol type="string" name="autofill_update_title_with_2types" />
+ <java-symbol type="string" name="autofill_update_title_with_3types" />
+ <java-symbol type="string" name="autofill_update_yes" />
<java-symbol type="string" name="autofill_save_accessibility_title " />
<java-symbol type="string" name="autofill_save_title" />
<java-symbol type="string" name="autofill_save_title_with_type" />
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 2a906ae158de..d704957a7666 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -1301,6 +1301,11 @@
android:process=":MemoryFileProvider">
</provider>
+ <provider android:name="android.content.RedactingProvider"
+ android:authorities="android.content.RedactingProvider"
+ android:process=":RedactingProvider">
+ </provider>
+
<!-- Application components used for os tests -->
<service android:name="android.os.MessengerService"
diff --git a/core/tests/coretests/src/android/content/RedactingProvider.java b/core/tests/coretests/src/android/content/RedactingProvider.java
new file mode 100644
index 000000000000..e2ad44875e6c
--- /dev/null
+++ b/core/tests/coretests/src/android/content/RedactingProvider.java
@@ -0,0 +1,89 @@
+/*
+ * 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.content;
+
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.database.RedactingCursor;
+import android.net.Uri;
+import android.util.ArrayMap;
+
+public class RedactingProvider extends ContentProvider {
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ switch (uri.getLastPathSegment()) {
+ case "missing": {
+ final MatrixCursor cursor = new MatrixCursor(
+ new String[] { "name", "size", "_data" });
+ cursor.addRow(new Object[] { "foo", 10, "/path/to/foo" });
+ cursor.addRow(new Object[] { "bar", 20, "/path/to/bar" });
+
+ final ArrayMap<String, Object> redactions = new ArrayMap<>();
+ redactions.put("missing", null);
+ return RedactingCursor.create(cursor, redactions);
+ }
+ case "single": {
+ final MatrixCursor cursor = new MatrixCursor(
+ new String[] { "name", "size", "_data" });
+ cursor.addRow(new Object[] { "foo", 10, "/path/to/foo" });
+ cursor.addRow(new Object[] { "bar", 20, "/path/to/bar" });
+
+ final ArrayMap<String, Object> redactions = new ArrayMap<>();
+ redactions.put("name", null);
+ redactions.put("_data", "/dev/null");
+ return RedactingCursor.create(cursor, redactions);
+ }
+ case "multiple": {
+ final MatrixCursor cursor = new MatrixCursor(
+ new String[] { "_data", "name", "_data" });
+ cursor.addRow(new Object[] { "/path", "foo", "/path" });
+
+ final ArrayMap<String, Object> redactions = new ArrayMap<>();
+ redactions.put("_data", null);
+ return RedactingCursor.create(cursor, redactions);
+ }
+ }
+
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/core/tests/coretests/src/android/database/RedactingCursorTest.java b/core/tests/coretests/src/android/database/RedactingCursorTest.java
new file mode 100644
index 000000000000..93998f3db05f
--- /dev/null
+++ b/core/tests/coretests/src/android/database/RedactingCursorTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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.database;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RedactingCursorTest {
+ private Context getContext() {
+ return InstrumentationRegistry.getContext();
+ }
+
+ @Test
+ public void testMissing() throws Exception {
+ final Cursor redacting = getContext().getContentResolver().query(
+ Uri.parse("content://android.content.RedactingProvider/missing"), null, null, null);
+
+ redacting.moveToNext();
+ assertEquals("foo", redacting.getString(0));
+ assertEquals(10, redacting.getInt(1));
+ assertEquals("/path/to/foo", redacting.getString(2));
+ redacting.moveToNext();
+ assertEquals("bar", redacting.getString(0));
+ assertEquals(20, redacting.getInt(1));
+ assertEquals("/path/to/bar", redacting.getString(2));
+ }
+
+ @Test
+ public void testSingle() throws Exception {
+ final Cursor redacting = getContext().getContentResolver().query(
+ Uri.parse("content://android.content.RedactingProvider/single"), null, null, null);
+
+ redacting.moveToNext();
+ assertEquals(null, redacting.getString(0));
+ assertEquals(10, redacting.getInt(1));
+ assertEquals("/dev/null", redacting.getString(2));
+ assertEquals(Cursor.FIELD_TYPE_NULL, redacting.getType(0));
+ assertEquals(Cursor.FIELD_TYPE_INTEGER, redacting.getType(1));
+ assertEquals(Cursor.FIELD_TYPE_STRING, redacting.getType(2));
+ assertTrue(redacting.isNull(0));
+ assertFalse(redacting.isNull(1));
+ assertFalse(redacting.isNull(2));
+
+ redacting.moveToNext();
+ assertEquals(null, redacting.getString(0));
+ assertEquals(20, redacting.getInt(1));
+ assertEquals("/dev/null", redacting.getString(2));
+ }
+
+ @Test
+ public void testMultiple() throws Exception {
+ final Cursor redacting = getContext().getContentResolver().query(
+ Uri.parse("content://android.content.RedactingProvider/multiple"),
+ null, null, null);
+
+ redacting.moveToNext();
+ assertEquals(null, redacting.getString(0));
+ assertEquals("foo", redacting.getString(1));
+ assertEquals(null, redacting.getString(2));
+ }
+}
diff --git a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
index eaabdc8b815c..dd34f1fdde1f 100644
--- a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
+++ b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
@@ -23,9 +23,12 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.res.AssetManager;
+import android.graphics.fonts.FontFamily;
+import android.graphics.fonts.SystemFonts;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.text.FontConfig;
import android.util.ArrayMap;
import org.junit.After;
@@ -112,7 +115,9 @@ public class TypefaceSystemFallbackTest {
} catch (IOException e) {
throw new RuntimeException(e);
}
- Typeface.buildSystemFallback(TEST_FONTS_XML, TEST_FONT_DIR, fontMap, fallbackMap);
+ final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(TEST_FONTS_XML,
+ TEST_FONT_DIR, fallbackMap);
+ Typeface.initSystemDefaultTypefaces(fontMap, fallbackMap, aliases);
}
@Test
@@ -120,10 +125,14 @@ public class TypefaceSystemFallbackTest {
final ArrayMap<String, Typeface> fontMap = new ArrayMap<>();
final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
- Typeface.buildSystemFallback(SYSTEM_FONTS_XML, SYSTEM_FONT_DIR, fontMap, fallbackMap);
+ final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(SYSTEM_FONTS_XML,
+ SYSTEM_FONT_DIR, fallbackMap);
- assertFalse(fontMap.isEmpty());
+ assertNotNull(aliases);
assertFalse(fallbackMap.isEmpty());
+
+ Typeface.initSystemDefaultTypefaces(fontMap, fallbackMap, aliases);
+ assertFalse(fontMap.isEmpty());
}
@Test
diff --git a/core/tests/coretests/src/android/text/FontFallbackSetup.java b/core/tests/coretests/src/android/text/FontFallbackSetup.java
index ced74eebe47b..6c34043c1995 100644
--- a/core/tests/coretests/src/android/text/FontFallbackSetup.java
+++ b/core/tests/coretests/src/android/text/FontFallbackSetup.java
@@ -19,8 +19,9 @@ package android.text;
import android.annotation.NonNull;
import android.content.Context;
import android.content.res.AssetManager;
-import android.graphics.FontFamily;
import android.graphics.Typeface;
+import android.graphics.fonts.FontFamily;
+import android.graphics.fonts.SystemFonts;
import android.support.test.InstrumentationRegistry;
import android.util.ArrayMap;
@@ -73,7 +74,9 @@ public class FontFallbackSetup implements AutoCloseable {
}
final ArrayMap<String, FontFamily[]> fallbackMap = new ArrayMap<>();
- Typeface.buildSystemFallback(testFontsXml, mTestFontsDir, mFontMap, fallbackMap);
+ final FontConfig.Alias[] aliases = SystemFonts.buildSystemFallback(testFontsXml,
+ mTestFontsDir, fallbackMap);
+ Typeface.initSystemDefaultTypefaces(mFontMap, fallbackMap, aliases);
}
@NonNull
diff --git a/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp b/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp
index 57ee2d5f6cbb..4b14284fdea5 100644
--- a/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp
+++ b/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp
@@ -21,36 +21,6 @@
#include <sys/ioctl.h>
#include <sys/mman.h>
-jint android_util_MemoryIntArrayTest_createAshmem(__attribute__((unused)) JNIEnv* env,
- __attribute__((unused)) jobject clazz,
- jstring name, jint size)
-{
-
- if (name == NULL) {
- return -1;
- }
-
- if (size < 0) {
- return -1;
- }
-
- const char* nameStr = env->GetStringUTFChars(name, NULL);
- const int ashmemSize = sizeof(std::atomic_int) * size;
- int fd = ashmem_create_region(nameStr, ashmemSize);
- env->ReleaseStringUTFChars(name, nameStr);
-
- if (fd < 0) {
- return -1;
- }
-
- int setProtResult = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
- if (setProtResult < 0) {
- return -1;
- }
-
- return fd;
-}
-
void android_util_MemoryIntArrayTest_setAshmemSize(__attribute__((unused)) JNIEnv* env,
__attribute__((unused)) jobject clazz, jint fd, jint size)
{
diff --git a/core/tests/utiltests/jni/registration.cpp b/core/tests/utiltests/jni/registration.cpp
index 0c84d98e9de9..d4fc2fbb83fc 100644
--- a/core/tests/utiltests/jni/registration.cpp
+++ b/core/tests/utiltests/jni/registration.cpp
@@ -16,25 +16,14 @@
#include <jni.h>
-extern jint android_util_MemoryIntArrayTest_createAshmem(JNIEnv* env,
- jobject clazz, jstring name, jint size);
extern void android_util_MemoryIntArrayTest_setAshmemSize(JNIEnv* env,
jobject clazz, jint fd, jint size);
extern "C" {
- JNIEXPORT jint JNICALL Java_android_util_MemoryIntArrayTest_nativeCreateAshmem(
- JNIEnv * env, jobject obj, jstring name, jint size);
JNIEXPORT void JNICALL Java_android_util_MemoryIntArrayTest_nativeSetAshmemSize(
JNIEnv * env, jobject obj, jint fd, jint size);
};
-JNIEXPORT jint JNICALL Java_android_util_MemoryIntArrayTest_nativeCreateAshmem(
- __attribute__((unused)) JNIEnv * env,__attribute__((unused)) jobject obj,
- jstring name, jint size)
-{
- return android_util_MemoryIntArrayTest_createAshmem(env, obj, name, size);
-}
-
JNIEXPORT void JNICALL Java_android_util_MemoryIntArrayTest_nativeSetAshmemSize(
__attribute__((unused)) JNIEnv * env,__attribute__((unused)) jobject obj,
jint fd, jint size)
diff --git a/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java b/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java
index 85817bbde1bb..24b33effdb71 100644
--- a/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java
+++ b/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.os.Parcel;
+import android.os.ParcelFileDescriptor;
import android.support.test.runner.AndroidJUnit4;
import libcore.io.IoUtils;
import org.junit.Test;
@@ -251,13 +252,11 @@ public class MemoryIntArrayTest {
// Create a MemoryIntArray to muck with
MemoryIntArray array = new MemoryIntArray(1);
- // Create the fd to stuff in the MemoryIntArray
- final int fd = nativeCreateAshmem("foo", 1);
-
- // Replace the fd with our ahsmem region
- Field fdFiled = MemoryIntArray.class.getDeclaredField("mFd");
- fdFiled.setAccessible(true);
- fdFiled.set(array, fd);
+ // Grab the internal ashmem fd.
+ Field fdField = MemoryIntArray.class.getDeclaredField("mFd");
+ fdField.setAccessible(true);
+ int fd = ((ParcelFileDescriptor)fdField.get(array)).getFd();
+ assertTrue("fd must be valid", fd != -1);
CountDownLatch countDownLatch = new CountDownLatch(2);
@@ -292,10 +291,9 @@ public class MemoryIntArrayTest {
}
if (!success) {
- fail("MemoryIntArray should catch ahshmem size changing under it");
+ fail("MemoryIntArray should catch ashmem size changing under it");
}
}
- private native int nativeCreateAshmem(String name, int size);
private native void nativeSetAshmemSize(int fd, int size);
}
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 522d7a51e69b..7fa748461c2d 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -28,13 +28,13 @@ import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.content.res.AssetManager;
import android.graphics.fonts.FontVariationAxis;
+import android.graphics.fonts.SystemFonts;
import android.net.Uri;
import android.provider.FontRequest;
import android.provider.FontsContract;
import android.text.FontConfig;
import android.util.ArrayMap;
import android.util.Base64;
-import android.util.Log;
import android.util.LongSparseArray;
import android.util.LruCache;
import android.util.SparseArray;
@@ -47,12 +47,9 @@ import dalvik.annotation.optimization.CriticalNative;
import libcore.util.NativeAllocationRegistry;
-import org.xmlpull.v1.XmlPullParserException;
-
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Retention;
@@ -121,10 +118,14 @@ public class Typeface {
private static final Object sDynamicCacheLock = new Object();
static Typeface sDefaultTypeface;
+
+ // Following two fields are not used but left for hiddenapi private list
@UnsupportedAppUsage
static final Map<String, Typeface> sSystemFontMap;
+
+ // We cannot support sSystemFallbackMap since we will migrate to public FontFamily API.
@UnsupportedAppUsage
- static final Map<String, FontFamily[]> sSystemFallbackMap;
+ static final Map<String, FontFamily[]> sSystemFallbackMap = Collections.emptyMap();
/**
* @hide
@@ -566,11 +567,7 @@ public class Typeface {
return null;
}
- Typeface base = sSystemFontMap.get(mFallbackFamilyName);
- if (base == null) {
- base = sDefaultTypeface;
- }
-
+ final Typeface base = getSystemDefaultTypeface(mFallbackFamilyName);
if (mWeight == RESOLVE_BY_FONT_TABLE && mItalic == RESOLVE_BY_FONT_TABLE) {
return base;
}
@@ -687,7 +684,7 @@ public class Typeface {
* @return The best matching typeface.
*/
public static Typeface create(String familyName, @Style int style) {
- return create(sSystemFontMap.get(familyName), style);
+ return create(getSystemDefaultTypeface(familyName), style);
}
/**
@@ -897,7 +894,9 @@ public class Typeface {
* Create a new typeface from an array of font families.
*
* @param families array of font families
+ * @deprecated
*/
+ @Deprecated
@UnsupportedAppUsage
private static Typeface createFromFamilies(FontFamily[] families) {
long[] ptrArray = new long[families.length];
@@ -909,6 +908,21 @@ public class Typeface {
}
/**
+ * Create a new typeface from an array of android.graphics.fonts.FontFamily.
+ *
+ * @param families array of font families
+ */
+ private static Typeface createFromFamilies(
+ @Nullable android.graphics.fonts.FontFamily[] families) {
+ final long[] ptrArray = new long[families.length];
+ for (int i = 0; i < families.length; ++i) {
+ ptrArray[i] = families[i].getNativePtr();
+ }
+ return new Typeface(nativeCreateFromArray(ptrArray,
+ RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
+ }
+
+ /**
* This method is used by supportlib-v27.
* TODO: Remove private API use in supportlib: http://b/72665240
*/
@@ -934,16 +948,13 @@ public class Typeface {
@UnsupportedAppUsage
private static Typeface createFromFamiliesWithDefault(FontFamily[] families,
String fallbackName, int weight, int italic) {
- FontFamily[] fallback = sSystemFallbackMap.get(fallbackName);
- if (fallback == null) {
- fallback = sSystemFallbackMap.get(DEFAULT_FAMILY);
- }
+ android.graphics.fonts.FontFamily[] fallback = SystemFonts.getSystemFallback(fallbackName);
long[] ptrArray = new long[families.length + fallback.length];
for (int i = 0; i < families.length; i++) {
ptrArray[i] = families[i].mNativePtr;
}
for (int i = 0; i < fallback.length; i++) {
- ptrArray[i + families.length] = fallback[i].mNativePtr;
+ ptrArray[i + families.length] = fallback[i].getNativePtr();
}
return new Typeface(nativeCreateFromArray(ptrArray, weight, italic));
}
@@ -961,191 +972,41 @@ public class Typeface {
mWeight = nativeGetWeight(ni);
}
- private static @Nullable ByteBuffer mmap(String fullPath) {
- try (FileInputStream file = new FileInputStream(fullPath)) {
- final FileChannel fileChannel = file.getChannel();
- final long fontSize = fileChannel.size();
- return fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fontSize);
- } catch (IOException e) {
- Log.e(TAG, "Error mapping font file " + fullPath);
- return null;
- }
- }
-
- private static @Nullable FontFamily createFontFamily(
- String familyName, List<FontConfig.Font> fonts, String[] languageTags, int variant,
- Map<String, ByteBuffer> cache, String fontDir) {
- final FontFamily family = new FontFamily(languageTags, variant);
- for (int i = 0; i < fonts.size(); i++) {
- final FontConfig.Font font = fonts.get(i);
- final String fullPath = fontDir + font.getFontName();
- ByteBuffer buffer = cache.get(fullPath);
- if (buffer == null) {
- if (cache.containsKey(fullPath)) {
- continue; // Already failed to mmap. Skip it.
- }
- buffer = mmap(fullPath);
- cache.put(fullPath, buffer);
- if (buffer == null) {
- continue;
- }
- }
- if (!family.addFontFromBuffer(buffer, font.getTtcIndex(), font.getAxes(),
- font.getWeight(), font.isItalic() ? STYLE_ITALIC : STYLE_NORMAL)) {
- Log.e(TAG, "Error creating font " + fullPath + "#" + font.getTtcIndex());
- }
- }
- if (!family.freeze()) {
- Log.e(TAG, "Unable to load Family: " + familyName + " : "
- + Arrays.toString(languageTags));
- return null;
- }
- return family;
+ private static Typeface getSystemDefaultTypeface(@NonNull String familyName) {
+ Typeface tf = sSystemFontMap.get(familyName);
+ return tf == null ? Typeface.DEFAULT : tf;
}
- private static void pushFamilyToFallback(FontConfig.Family xmlFamily,
- ArrayMap<String, ArrayList<FontFamily>> fallbackMap,
- Map<String, ByteBuffer> cache,
- String fontDir) {
-
- final String[] languageTags = xmlFamily.getLanguages();
- final int variant = xmlFamily.getVariant();
-
- final ArrayList<FontConfig.Font> defaultFonts = new ArrayList<>();
- final ArrayMap<String, ArrayList<FontConfig.Font>> specificFallbackFonts = new ArrayMap<>();
-
- // Collect default fallback and specific fallback fonts.
- for (final FontConfig.Font font : xmlFamily.getFonts()) {
- final String fallbackName = font.getFallbackFor();
- if (fallbackName == null) {
- defaultFonts.add(font);
- } else {
- ArrayList<FontConfig.Font> fallback = specificFallbackFonts.get(fallbackName);
- if (fallback == null) {
- fallback = new ArrayList<>();
- specificFallbackFonts.put(fallbackName, fallback);
- }
- fallback.add(font);
- }
+ /** @hide */
+ @VisibleForTesting
+ public static void initSystemDefaultTypefaces(Map<String, Typeface> systemFontMap,
+ Map<String, android.graphics.fonts.FontFamily[]> fallbacks,
+ FontConfig.Alias[] aliases) {
+ for (Map.Entry<String, android.graphics.fonts.FontFamily[]> entry : fallbacks.entrySet()) {
+ systemFontMap.put(entry.getKey(), createFromFamilies(entry.getValue()));
}
- final FontFamily defaultFamily = defaultFonts.isEmpty() ? null : createFontFamily(
- xmlFamily.getName(), defaultFonts, languageTags, variant, cache, fontDir);
-
- // Insert family into fallback map.
- for (int i = 0; i < fallbackMap.size(); i++) {
- final ArrayList<FontConfig.Font> fallback =
- specificFallbackFonts.get(fallbackMap.keyAt(i));
- if (fallback == null) {
- if (defaultFamily != null) {
- fallbackMap.valueAt(i).add(defaultFamily);
- }
- } else {
- final FontFamily family = createFontFamily(
- xmlFamily.getName(), fallback, languageTags, variant, cache, fontDir);
- if (family != null) {
- fallbackMap.valueAt(i).add(family);
- } else if (defaultFamily != null) {
- fallbackMap.valueAt(i).add(defaultFamily);
- } else {
- // There is no valid for for default fallback. Ignore.
- }
- }
+ for (FontConfig.Alias alias : aliases) {
+ final Typeface base = systemFontMap.get(alias.getToName());
+ final int weight = alias.getWeight();
+ final Typeface newFace = weight == 400 ? base :
+ new Typeface(nativeCreateWeightAlias(base.native_instance, weight));
+ systemFontMap.put(alias.getName(), newFace);
}
}
- /**
- * Build the system fallback from xml file.
- *
- * @param xmlPath A full path string to the fonts.xml file.
- * @param fontDir A full path string to the system font directory. This must end with
- * slash('/').
- * @param fontMap An output system font map. Caller must pass empty map.
- * @param fallbackMap An output system fallback map. Caller must pass empty map.
- * @hide
- */
- @VisibleForTesting
+ // Following methods are left for layoutlib
+ // TODO: Remove once layoutlib stop calling buildSystemFallback
+ /** @hide */
public static void buildSystemFallback(String xmlPath, String fontDir,
ArrayMap<String, Typeface> fontMap, ArrayMap<String, FontFamily[]> fallbackMap) {
- try {
- final FileInputStream fontsIn = new FileInputStream(xmlPath);
- final FontConfig fontConfig = FontListParser.parse(fontsIn);
-
- final HashMap<String, ByteBuffer> bufferCache = new HashMap<String, ByteBuffer>();
- final FontConfig.Family[] xmlFamilies = fontConfig.getFamilies();
-
- final ArrayMap<String, ArrayList<FontFamily>> fallbackListMap = new ArrayMap<>();
- // First traverse families which have a 'name' attribute to create fallback map.
- for (final FontConfig.Family xmlFamily : xmlFamilies) {
- final String familyName = xmlFamily.getName();
- if (familyName == null) {
- continue;
- }
- final FontFamily family = createFontFamily(
- xmlFamily.getName(), Arrays.asList(xmlFamily.getFonts()),
- xmlFamily.getLanguages(), xmlFamily.getVariant(), bufferCache, fontDir);
- if (family == null) {
- continue;
- }
- final ArrayList<FontFamily> fallback = new ArrayList<>();
- fallback.add(family);
- fallbackListMap.put(familyName, fallback);
- }
-
- // Then, add fallback fonts to the each fallback map.
- for (int i = 0; i < xmlFamilies.length; i++) {
- final FontConfig.Family xmlFamily = xmlFamilies[i];
- // The first family (usually the sans-serif family) is always placed immediately
- // after the primary family in the fallback.
- if (i == 0 || xmlFamily.getName() == null) {
- pushFamilyToFallback(xmlFamily, fallbackListMap, bufferCache, fontDir);
- }
- }
-
- // Build the font map and fallback map.
- for (int i = 0; i < fallbackListMap.size(); i++) {
- final String fallbackName = fallbackListMap.keyAt(i);
- final List<FontFamily> familyList = fallbackListMap.valueAt(i);
- final FontFamily[] families = familyList.toArray(new FontFamily[familyList.size()]);
-
- fallbackMap.put(fallbackName, families);
- final long[] ptrArray = new long[families.length];
- for (int j = 0; j < families.length; j++) {
- ptrArray[j] = families[j].mNativePtr;
- }
- fontMap.put(fallbackName, new Typeface(nativeCreateFromArray(
- ptrArray, RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)));
- }
-
- // Insert alias to font maps.
- for (final FontConfig.Alias alias : fontConfig.getAliases()) {
- Typeface base = fontMap.get(alias.getToName());
- Typeface newFace = base;
- int weight = alias.getWeight();
- if (weight != 400) {
- newFace = new Typeface(nativeCreateWeightAlias(base.native_instance, weight));
- }
- fontMap.put(alias.getName(), newFace);
- }
- } catch (RuntimeException e) {
- Log.w(TAG, "Didn't create default family (most likely, non-Minikin build)", e);
- // TODO: normal in non-Minikin case, remove or make error when Minikin-only
- } catch (FileNotFoundException e) {
- Log.e(TAG, "Error opening " + xmlPath, e);
- } catch (IOException e) {
- Log.e(TAG, "Error reading " + xmlPath, e);
- } catch (XmlPullParserException e) {
- Log.e(TAG, "XML parse exception for " + xmlPath, e);
- }
}
static {
- final ArrayMap<String, Typeface> systemFontMap = new ArrayMap<>();
- final ArrayMap<String, FontFamily[]> systemFallbackMap = new ArrayMap<>();
- buildSystemFallback("/system/etc/fonts.xml", "/system/fonts/", systemFontMap,
- systemFallbackMap);
+ final HashMap<String, Typeface> systemFontMap = new HashMap<>();
+ initSystemDefaultTypefaces(systemFontMap, SystemFonts.getRawSystemFallbackMap(),
+ SystemFonts.getAliases());
sSystemFontMap = Collections.unmodifiableMap(systemFontMap);
- sSystemFallbackMap = Collections.unmodifiableMap(systemFallbackMap);
setDefault(sSystemFontMap.get(DEFAULT_FAMILY));
diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java
index 74b58ea76b2f..dc213ea56f99 100644
--- a/graphics/java/android/graphics/fonts/FontFamily.java
+++ b/graphics/java/android/graphics/fonts/FontFamily.java
@@ -18,6 +18,9 @@ package android.graphics.fonts;
import android.annotation.IntRange;
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.text.FontConfig;
+import android.text.TextUtils;
import com.android.internal.util.Preconditions;
@@ -107,11 +110,25 @@ public class FontFamily {
* @return a font family
*/
public @NonNull FontFamily build() {
+ return build(null, FontConfig.Family.VARIANT_DEFAULT);
+ }
+
+ /** @hide */
+ public @NonNull FontFamily build(@Nullable String[] langTags, int variant) {
final long builderPtr = nInitBuilder();
for (int i = 0; i < mFonts.size(); ++i) {
nAddFont(builderPtr, mFonts.get(i).getNativePtr());
}
- final long ptr = nBuild(builderPtr);
+ final String langString;
+ if (langTags == null || langTags.length == 0) {
+ langString = null;
+ } else if (langTags.length == 1) {
+ langString = langTags[0];
+ } else {
+ langString = TextUtils.join(",", langTags);
+ }
+
+ final long ptr = nBuild(builderPtr, langString, variant);
final FontFamily family = new FontFamily(mFonts, ptr);
sFamilyRegistory.registerNativeAllocation(family, ptr);
return family;
@@ -124,7 +141,7 @@ public class FontFamily {
private static native long nInitBuilder();
@CriticalNative
private static native void nAddFont(long builderPtr, long fontPtr);
- private static native long nBuild(long builderPtr);
+ private static native long nBuild(long builderPtr, String langTags, int variant);
@CriticalNative
private static native long nGetReleaseNativeFamily();
}
diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java
new file mode 100644
index 000000000000..bd49130c11c6
--- /dev/null
+++ b/graphics/java/android/graphics/fonts/SystemFonts.java
@@ -0,0 +1,260 @@
+/*
+ * 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.graphics.fonts;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.FontListParser;
+import android.text.FontConfig;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Provides the system font configurations.
+ * @hide
+ */
+public class SystemFonts {
+ private static final String TAG = "SystemFonts";
+ private static final String DEFAULT_FAMILY = "sans-serif";
+
+ private SystemFonts() {} // Do not instansiate.
+
+ static final Map<String, FontFamily[]> sSystemFallbackMap;
+ static final FontConfig.Alias[] sAliases;
+
+ /**
+ * Returns fallback list for the given family name.
+ *
+ * If no fallback found for the given family name, returns fallback for the default family.
+ *
+ * @param familyName family name, e.g. "serif"
+ */
+ public static @NonNull FontFamily[] getSystemFallback(@Nullable String familyName) {
+ final FontFamily[] families = sSystemFallbackMap.get(familyName);
+ return families == null ? sSystemFallbackMap.get(DEFAULT_FAMILY) : families;
+ }
+
+ /**
+ * Returns raw system fallback map.
+ *
+ * This method is intended to be used only by Typeface static initializer.
+ */
+ public static @NonNull Map<String, FontFamily[]> getRawSystemFallbackMap() {
+ return sSystemFallbackMap;
+ }
+
+ /**
+ * Returns a list of aliases.
+ *
+ * This method is intended to be used only by Typeface static initializer.
+ */
+ public static @NonNull FontConfig.Alias[] getAliases() {
+ return sAliases;
+ }
+
+ private static @Nullable ByteBuffer mmap(@NonNull String fullPath) {
+ try (FileInputStream file = new FileInputStream(fullPath)) {
+ final FileChannel fileChannel = file.getChannel();
+ final long fontSize = fileChannel.size();
+ return fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fontSize);
+ } catch (IOException e) {
+ Log.e(TAG, "Error mapping font file " + fullPath);
+ return null;
+ }
+ }
+
+ private static void pushFamilyToFallback(@NonNull FontConfig.Family xmlFamily,
+ @NonNull ArrayMap<String, ArrayList<FontFamily>> fallbackMap,
+ @NonNull Map<String, ByteBuffer> cache,
+ @NonNull String fontDir) {
+
+ final String[] languageTags = xmlFamily.getLanguages();
+ final int variant = xmlFamily.getVariant();
+
+ final ArrayList<FontConfig.Font> defaultFonts = new ArrayList<>();
+ final ArrayMap<String, ArrayList<FontConfig.Font>> specificFallbackFonts = new ArrayMap<>();
+
+ // Collect default fallback and specific fallback fonts.
+ for (final FontConfig.Font font : xmlFamily.getFonts()) {
+ final String fallbackName = font.getFallbackFor();
+ if (fallbackName == null) {
+ defaultFonts.add(font);
+ } else {
+ ArrayList<FontConfig.Font> fallback = specificFallbackFonts.get(fallbackName);
+ if (fallback == null) {
+ fallback = new ArrayList<>();
+ specificFallbackFonts.put(fallbackName, fallback);
+ }
+ fallback.add(font);
+ }
+ }
+
+ final FontFamily defaultFamily = defaultFonts.isEmpty() ? null : createFontFamily(
+ xmlFamily.getName(), defaultFonts, languageTags, variant, cache, fontDir);
+
+ // Insert family into fallback map.
+ for (int i = 0; i < fallbackMap.size(); i++) {
+ final ArrayList<FontConfig.Font> fallback =
+ specificFallbackFonts.get(fallbackMap.keyAt(i));
+ if (fallback == null) {
+ if (defaultFamily != null) {
+ fallbackMap.valueAt(i).add(defaultFamily);
+ }
+ } else {
+ final FontFamily family = createFontFamily(
+ xmlFamily.getName(), fallback, languageTags, variant, cache, fontDir);
+ if (family != null) {
+ fallbackMap.valueAt(i).add(family);
+ } else if (defaultFamily != null) {
+ fallbackMap.valueAt(i).add(defaultFamily);
+ } else {
+ // There is no valid for for default fallback. Ignore.
+ }
+ }
+ }
+ }
+
+ private static @Nullable FontFamily createFontFamily(@NonNull String familyName,
+ @NonNull List<FontConfig.Font> fonts,
+ @NonNull String[] languageTags,
+ @FontConfig.Family.Variant int variant,
+ @NonNull Map<String, ByteBuffer> cache,
+ @NonNull String fontDir) {
+ if (fonts.size() == 0) {
+ return null;
+ }
+
+ FontFamily.Builder b = null;
+ for (int i = 0; i < fonts.size(); i++) {
+ final FontConfig.Font fontConfig = fonts.get(i);
+ final String fullPath = fontDir + fontConfig.getFontName();
+ ByteBuffer buffer = cache.get(fullPath);
+ if (buffer == null) {
+ if (cache.containsKey(fullPath)) {
+ continue; // Already failed to mmap. Skip it.
+ }
+ buffer = mmap(fullPath);
+ cache.put(fullPath, buffer);
+ if (buffer == null) {
+ continue;
+ }
+ }
+
+ final Font font = new Font.Builder(buffer)
+ .setWeight(fontConfig.getWeight())
+ .setItalic(fontConfig.isItalic())
+ .setTtcIndex(fontConfig.getTtcIndex())
+ .setFontVariationSettings(fontConfig.getAxes())
+ .build();
+
+ if (b == null) {
+ b = new FontFamily.Builder(font);
+ } else {
+ b.addFont(font);
+ }
+ }
+ return b == null ? null : b.build(languageTags, variant);
+ }
+
+ /**
+ * Build the system fallback from xml file.
+ *
+ * @param xmlPath A full path string to the fonts.xml file.
+ * @param fontDir A full path string to the system font directory. This must end with
+ * slash('/').
+ * @param fallbackMap An output system fallback map. Caller must pass empty map.
+ * @return a list of aliases
+ * @hide
+ */
+ @VisibleForTesting
+ public static FontConfig.Alias[] buildSystemFallback(@NonNull String xmlPath,
+ @NonNull String fontDir,
+ @NonNull ArrayMap<String, FontFamily[]> fallbackMap) {
+ try {
+ final FileInputStream fontsIn = new FileInputStream(xmlPath);
+ final FontConfig fontConfig = FontListParser.parse(fontsIn);
+
+ final HashMap<String, ByteBuffer> bufferCache = new HashMap<String, ByteBuffer>();
+ final FontConfig.Family[] xmlFamilies = fontConfig.getFamilies();
+
+ final ArrayMap<String, ArrayList<FontFamily>> fallbackListMap = new ArrayMap<>();
+ // First traverse families which have a 'name' attribute to create fallback map.
+ for (final FontConfig.Family xmlFamily : xmlFamilies) {
+ final String familyName = xmlFamily.getName();
+ if (familyName == null) {
+ continue;
+ }
+ final FontFamily family = createFontFamily(
+ xmlFamily.getName(), Arrays.asList(xmlFamily.getFonts()),
+ xmlFamily.getLanguages(), xmlFamily.getVariant(), bufferCache, fontDir);
+ if (family == null) {
+ continue;
+ }
+ final ArrayList<FontFamily> fallback = new ArrayList<>();
+ fallback.add(family);
+ fallbackListMap.put(familyName, fallback);
+ }
+
+ // Then, add fallback fonts to the each fallback map.
+ for (int i = 0; i < xmlFamilies.length; i++) {
+ final FontConfig.Family xmlFamily = xmlFamilies[i];
+ // The first family (usually the sans-serif family) is always placed immediately
+ // after the primary family in the fallback.
+ if (i == 0 || xmlFamily.getName() == null) {
+ pushFamilyToFallback(xmlFamily, fallbackListMap, bufferCache, fontDir);
+ }
+ }
+
+ // Build the font map and fallback map.
+ for (int i = 0; i < fallbackListMap.size(); i++) {
+ final String fallbackName = fallbackListMap.keyAt(i);
+ final List<FontFamily> familyList = fallbackListMap.valueAt(i);
+ final FontFamily[] families = familyList.toArray(new FontFamily[familyList.size()]);
+
+ fallbackMap.put(fallbackName, families);
+ }
+
+ return fontConfig.getAliases();
+ } catch (IOException | XmlPullParserException e) {
+ Log.e(TAG, "Failed initialize system fallbacks.", e);
+ return null;
+ }
+ }
+
+ static {
+ final ArrayMap<String, FontFamily[]> systemFallbackMap = new ArrayMap<>();
+ sAliases = buildSystemFallback("/system/etc/fonts.xml", "/system/fonts/",
+ systemFallbackMap);
+ sSystemFallbackMap = Collections.unmodifiableMap(systemFallbackMap);
+ }
+
+}
diff --git a/location/java/android/location/Country.java b/location/java/android/location/Country.java
index 7c1485d88a3e..6f82b7849a82 100644
--- a/location/java/android/location/Country.java
+++ b/location/java/android/location/Country.java
@@ -16,6 +16,7 @@
package android.location;
+import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
@@ -78,6 +79,7 @@ public class Country implements Parcelable {
* <li>{@link #COUNTRY_SOURCE_LOCALE}</li>
* </ul>
*/
+ @UnsupportedAppUsage
public Country(final String countryIso, final int source) {
if (countryIso == null || source < COUNTRY_SOURCE_NETWORK
|| source > COUNTRY_SOURCE_LOCALE) {
@@ -107,6 +109,7 @@ public class Country implements Parcelable {
/**
* @return the ISO 3166-1 two letters country code
*/
+ @UnsupportedAppUsage
public final String getCountryIso() {
return mCountryIso;
}
@@ -121,6 +124,7 @@ public class Country implements Parcelable {
* <li>{@link #COUNTRY_SOURCE_LOCALE}</li>
* </ul>
*/
+ @UnsupportedAppUsage
public final int getSource() {
return mSource;
}
diff --git a/location/java/android/location/CountryDetector.java b/location/java/android/location/CountryDetector.java
index ec6dfb713b10..119d1e0071e5 100644
--- a/location/java/android/location/CountryDetector.java
+++ b/location/java/android/location/CountryDetector.java
@@ -19,6 +19,7 @@ package android.location;
import java.util.HashMap;
import android.annotation.SystemService;
+import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
@@ -87,6 +88,7 @@ public class CountryDetector {
* create an instance of this class is using the factory
* Context.getSystemService.
*/
+ @UnsupportedAppUsage
public CountryDetector(ICountryDetector service) {
mService = service;
mListeners = new HashMap<CountryListener, ListenerTransport>();
@@ -98,6 +100,7 @@ public class CountryDetector {
* @return the country if it is available immediately, otherwise null will
* be returned.
*/
+ @UnsupportedAppUsage
public Country detectCountry() {
try {
return mService.detectCountry();
@@ -116,6 +119,7 @@ public class CountryDetector {
* implement the callback mechanism. If looper is null then the
* callbacks will be called on the main thread.
*/
+ @UnsupportedAppUsage
public void addCountryListener(CountryListener listener, Looper looper) {
synchronized (mListeners) {
if (!mListeners.containsKey(listener)) {
@@ -133,6 +137,7 @@ public class CountryDetector {
/**
* Remove the listener
*/
+ @UnsupportedAppUsage
public void removeCountryListener(CountryListener listener) {
synchronized (mListeners) {
ListenerTransport transport = mListeners.get(listener);
diff --git a/location/java/android/location/CountryListener.java b/location/java/android/location/CountryListener.java
index e36db412eaec..70a83c5acdd9 100644
--- a/location/java/android/location/CountryListener.java
+++ b/location/java/android/location/CountryListener.java
@@ -16,6 +16,8 @@
package android.location;
+import android.annotation.UnsupportedAppUsage;
+
/**
* The listener for receiving the notification when the country is detected or
* changed
@@ -26,5 +28,6 @@ public interface CountryListener {
/**
* @param country the changed or detected country.
*/
+ @UnsupportedAppUsage
void onCountryDetected(Country country);
}
diff --git a/location/java/android/location/GeocoderParams.java b/location/java/android/location/GeocoderParams.java
index 174fe3e0af2e..d90e4b528f31 100644
--- a/location/java/android/location/GeocoderParams.java
+++ b/location/java/android/location/GeocoderParams.java
@@ -16,6 +16,7 @@
package android.location;
+import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
@@ -53,6 +54,7 @@ public class GeocoderParams implements Parcelable {
/**
* returns the Geocoder's locale
*/
+ @UnsupportedAppUsage
public Locale getLocale() {
return mLocale;
}
@@ -60,6 +62,7 @@ public class GeocoderParams implements Parcelable {
/**
* returns the package name of the Geocoder's client
*/
+ @UnsupportedAppUsage
public String getClientPackage() {
return mPackageName;
}
diff --git a/location/java/android/location/Geofence.java b/location/java/android/location/Geofence.java
index 5de779a29cdd..ed2aa64879aa 100644
--- a/location/java/android/location/Geofence.java
+++ b/location/java/android/location/Geofence.java
@@ -16,6 +16,7 @@
package android.location;
+import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
@@ -98,6 +99,7 @@ public final class Geofence implements Parcelable {
}
}
+ @UnsupportedAppUsage
public static final Parcelable.Creator<Geofence> CREATOR = new Parcelable.Creator<Geofence>() {
@Override
public Geofence createFromParcel(Parcel in) {
diff --git a/location/java/android/location/GpsStatus.java b/location/java/android/location/GpsStatus.java
index b601cde35305..d90a597b1cbb 100644
--- a/location/java/android/location/GpsStatus.java
+++ b/location/java/android/location/GpsStatus.java
@@ -16,6 +16,7 @@
package android.location;
+import android.annotation.UnsupportedAppUsage;
import android.util.SparseArray;
import java.util.Iterator;
@@ -206,6 +207,7 @@ public final class GpsStatus {
status.mAzimuths);
}
+ @UnsupportedAppUsage
void setTimeToFirstFix(int ttff) {
mTimeToFirstFix = ttff;
}
diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java
index 684cafa14005..70a97e1f7da0 100644
--- a/location/java/android/location/Location.java
+++ b/location/java/android/location/Location.java
@@ -18,6 +18,7 @@ package android.location;
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import android.annotation.UnsupportedAppUsage;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -123,8 +124,10 @@ public class Location implements Parcelable {
}
};
+ @UnsupportedAppUsage
private String mProvider;
private long mTime = 0;
+ @UnsupportedAppUsage
private long mElapsedRealtimeNanos = 0;
private double mLatitude = 0.0;
private double mLongitude = 0.0;
@@ -1156,6 +1159,7 @@ public class Location implements Parcelable {
* @param value the Location to attach
* @hide
*/
+ @UnsupportedAppUsage
public void setExtraLocation(String key, Location value) {
if (mExtras == null) {
mExtras = new Bundle();
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 30a07ef94b06..b5d94315f97f 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -29,6 +29,7 @@ import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
+import android.annotation.UnsupportedAppUsage;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -68,6 +69,7 @@ public class LocationManager {
private static final String TAG = "LocationManager";
private final Context mContext;
+ @UnsupportedAppUsage
private final ILocationManager mService;
private final GnssMeasurementCallbackTransport mGnssMeasurementCallbackTransport;
private final GnssNavigationMessageCallbackTransport mGnssNavigationMessageCallbackTransport;
@@ -1004,6 +1006,7 @@ public class LocationManager {
}
}
+ @UnsupportedAppUsage
private void requestLocationUpdates(LocationRequest request, LocationListener listener,
Looper looper, PendingIntent intent) {
@@ -2328,6 +2331,7 @@ public class LocationManager {
*
* @hide
*/
+ @UnsupportedAppUsage
public boolean sendNiResponse(int notifId, int userResponse) {
try {
return mService.sendNiResponse(notifId, userResponse);
diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java
index 96a0817ae561..2d7f7e309004 100644
--- a/location/java/android/location/LocationRequest.java
+++ b/location/java/android/location/LocationRequest.java
@@ -17,6 +17,7 @@
package android.location;
import android.annotation.SystemApi;
+import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
@@ -141,16 +142,26 @@ public final class LocationRequest implements Parcelable {
*/
private static final double FASTEST_INTERVAL_FACTOR = 6.0; // 6x
+ @UnsupportedAppUsage
private int mQuality = POWER_LOW;
+ @UnsupportedAppUsage
private long mInterval = 60 * 60 * 1000; // 60 minutes
+ @UnsupportedAppUsage
private long mFastestInterval = (long) (mInterval / FASTEST_INTERVAL_FACTOR); // 10 minutes
+ @UnsupportedAppUsage
private boolean mExplicitFastestInterval = false;
+ @UnsupportedAppUsage
private long mExpireAt = Long.MAX_VALUE; // no expiry
+ @UnsupportedAppUsage
private int mNumUpdates = Integer.MAX_VALUE; // no expiry
+ @UnsupportedAppUsage
private float mSmallestDisplacement = 0.0f; // meters
+ @UnsupportedAppUsage
private WorkSource mWorkSource = null;
+ @UnsupportedAppUsage
private boolean mHideFromAppOps = false; // True if this request shouldn't be counted by AppOps
+ @UnsupportedAppUsage
private String mProvider = LocationManager.FUSED_PROVIDER;
// for deprecated APIs that explicitly request a provider
@@ -592,12 +603,14 @@ public final class LocationRequest implements Parcelable {
return mHideFromAppOps;
}
+ @UnsupportedAppUsage
private static void checkInterval(long millis) {
if (millis < 0) {
throw new IllegalArgumentException("invalid interval: " + millis);
}
}
+ @UnsupportedAppUsage
private static void checkQuality(int quality) {
switch (quality) {
case ACCURACY_FINE:
@@ -612,12 +625,14 @@ public final class LocationRequest implements Parcelable {
}
}
+ @UnsupportedAppUsage
private static void checkDisplacement(float meters) {
if (meters < 0.0f) {
throw new IllegalArgumentException("invalid displacement: " + meters);
}
}
+ @UnsupportedAppUsage
private static void checkProvider(String name) {
if (name == null) {
throw new IllegalArgumentException("invalid provider: " + name);
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java
index bcff5bfa8428..37a0424f2e3d 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/java/android/media/MediaPlayer2.java
@@ -787,7 +787,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
* {@code EventCallback.onCommandLabelReached} will be fired with the
* given {@code label}.
*
- * @see android.media.MediaPlayer2.EventCallback#onCommandLabelReached
+ * @see EventCallback#onCommandLabelReached
*
* @param label An application specific Object used to help to identify the completeness
* of a batch of commands.
@@ -1378,7 +1378,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
/**
* Class for MediaPlayer2 to return each audio/video/subtitle track's metadata.
*
- * @see android.media.MediaPlayer2#getTrackInfo
+ * @see MediaPlayer2#getTrackInfo
*/
public abstract static class TrackInfo {
/**
@@ -1585,7 +1585,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
* each individual track can be found by calling {@link #getTrackInfo()} method.
* @throws IllegalStateException if called in an invalid state.
*
- * @see android.media.MediaPlayer2#getTrackInfo
+ * @see MediaPlayer2#getTrackInfo
*/
// This is an asynchronous call.
public abstract void selectTrack(int index);
@@ -1602,7 +1602,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
* each individual track can be found by calling {@link #getTrackInfo()} method.
* @throws IllegalStateException if called in an invalid state.
*
- * @see android.media.MediaPlayer2#getTrackInfo
+ * @see MediaPlayer2#getTrackInfo
*/
// This is an asynchronous call.
public abstract void deselectTrack(int index);
@@ -1750,14 +1750,14 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
* in include/media/mediaplayer2.h!
*/
/** Unspecified media player error.
- * @see android.media.MediaPlayer2.EventCallback#onError
+ * @see EventCallback#onError
*/
public static final int MEDIA_ERROR_UNKNOWN = 1;
/** The video is streamed and its container is not valid for progressive
* playback i.e the video's index (e.g moov atom) is not at the start of the
* file.
- * @see android.media.MediaPlayer2.EventCallback#onError
+ * @see EventCallback#onError
*/
public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;
@@ -1773,7 +1773,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
/** Unspecified low-level system error. This value originated from UNKNOWN_ERROR in
* system/core/include/utils/Errors.h
- * @see android.media.MediaPlayer2.EventCallback#onError
+ * @see EventCallback#onError
* @hide
*/
public static final int MEDIA_ERROR_SYSTEM = -2147483648;
@@ -1797,62 +1797,68 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
* in include/media/MediaPlayer2Types.h!
*/
/** Unspecified media player info.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_UNKNOWN = 1;
/** The player just started the playback of this datas source.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_DATA_SOURCE_START = 2;
/** The player just pushed the very first video frame for rendering.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3;
/** The player just rendered the very first audio sample.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_AUDIO_RENDERING_START = 4;
/** The player just completed the playback of this data source.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_DATA_SOURCE_END = 5;
/** The player just completed the playback of all data sources set by {@link #setDataSource},
* {@link #setNextDataSource} and {@link #setNextDataSources}.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_DATA_SOURCE_LIST_END = 6;
+ /** The player just completed an iteration of playback loop. This event is sent only when
+ * looping is enabled by {@link #loopCurrent}.
+ * @see EventCallback#onInfo
+ */
+ public static final int MEDIA_INFO_DATA_SOURCE_REPEAT = 7;
+
/** The player just prepared a data source.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_PREPARED = 100;
/** The video is too complex for the decoder: it can't decode frames fast
* enough. Possibly only the audio plays fine at this stage.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;
/** MediaPlayer2 is temporarily pausing playback internally in order to
* buffer more data.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_BUFFERING_START = 701;
/** MediaPlayer2 is resuming playback after filling buffers.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_BUFFERING_END = 702;
/** Estimated network bandwidth information (kbps) is available; currently this event fires
* simultaneously as {@link #MEDIA_INFO_BUFFERING_START} and {@link #MEDIA_INFO_BUFFERING_END}
* when playing network files.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
* @hide
*/
public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
@@ -1866,24 +1872,24 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
*
* The {@code extra} parameter in {@code EventCallback.onInfo} is the
* percentage (0-100) of the content that has been buffered or played thus far.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_BUFFERING_UPDATE = 704;
/** Bad interleaving means that a media has been improperly interleaved or
* not interleaved at all, e.g has all the video samples first then all the
* audio ones. Video is playing but a lot of disk seeks may be happening.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_BAD_INTERLEAVING = 800;
/** The media cannot be seeked (e.g live stream)
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_NOT_SEEKABLE = 801;
/** A new set of metadata is available.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_METADATA_UPDATE = 802;
@@ -1895,30 +1901,30 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
/** Informs that audio is not playing. Note that playback of the video
* is not interrupted.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_AUDIO_NOT_PLAYING = 804;
/** Informs that video is not playing. Note that playback of the audio
* is not interrupted.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805;
/** Failed to handle timed text track properly.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*
* {@hide}
*/
public static final int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
/** Subtitle track was not supported by the media framework.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;
/** Reading the subtitle track takes too long.
- * @see android.media.MediaPlayer2.EventCallback#onInfo
+ * @see EventCallback#onInfo
*/
public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;
@@ -1953,124 +1959,124 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
//--------------------------------------------------------------------------
/** The player just completed a call {@link #attachAuxEffect}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_ATTACH_AUX_EFFECT = 1;
/** The player just completed a call {@link #deselectTrack}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_DESELECT_TRACK = 2;
/** The player just completed a call {@link #loopCurrent}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_LOOP_CURRENT = 3;
/** The player just completed a call {@link #pause}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_PAUSE = 4;
/** The player just completed a call {@link #play}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_PLAY = 5;
/** The player just completed a call {@link #prepare}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_PREPARE = 6;
/** The player just completed a call {@link #releaseDrm}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_RELEASE_DRM = 12;
/** The player just completed a call {@link #restoreDrmKeys}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_RESTORE_DRM_KEYS = 13;
/** The player just completed a call {@link #seekTo}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SEEK_TO = 14;
/** The player just completed a call {@link #selectTrack}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SELECT_TRACK = 15;
/** The player just completed a call {@link #setAudioAttributes}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_AUDIO_ATTRIBUTES = 16;
/** The player just completed a call {@link #setAudioSessionId}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_AUDIO_SESSION_ID = 17;
/** The player just completed a call {@link #setAuxEffectSendLevel}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL = 18;
/** The player just completed a call {@link #setDataSource}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_DATA_SOURCE = 19;
/** The player just completed a call {@link #setNextDataSource}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCE = 22;
/** The player just completed a call {@link #setNextDataSources}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCES = 23;
/** The player just completed a call {@link #setPlaybackParams}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_PLAYBACK_PARAMS = 24;
/** The player just completed a call {@link #setPlayerVolume}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_PLAYER_VOLUME = 26;
/** The player just completed a call {@link #setSurface}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_SURFACE = 27;
/** The player just completed a call {@link #setSyncParams}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_SYNC_PARAMS = 28;
/** The player just completed a call {@link #skipToNext}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SKIP_TO_NEXT = 29;
/** The player just completed a call {@link #setBufferingParams}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
* @hide
*/
public static final int CALL_COMPLETED_SET_BUFFERING_PARAMS = 1001;
/** The player just completed a call {@code setVideoScalingMode}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
* @hide
*/
public static final int CALL_COMPLETED_SET_VIDEO_SCALING_MODE = 1002;
/** The player just completed a call {@code notifyWhenCommandLabelReached}.
- * @see android.media.MediaPlayer2.EventCallback#onCommandLabelReached
+ * @see EventCallback#onCommandLabelReached
* @hide
*/
public static final int CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED = 1003;
@@ -2108,32 +2114,32 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
public @interface CallCompleted {}
/** Status code represents that call is completed without an error.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_NO_ERROR = 0;
/** Status code represents that call is ended with an unknown error.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_ERROR_UNKNOWN = Integer.MIN_VALUE;
/** Status code represents that the player is not in valid state for the operation.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_INVALID_OPERATION = 1;
/** Status code represents that the argument is illegal.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_BAD_VALUE = 2;
/** Status code represents that the operation is not allowed.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_PERMISSION_DENIED = 3;
/** Status code represents a file or network related operation error.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_ERROR_IO = 4;
@@ -2145,7 +2151,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener
/** Status code represents that DRM operation is called before preparing a DRM scheme through
* {@link #prepareDrm}.
- * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
+ * @see EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_NO_DRM_SCHEME = 6;
diff --git a/media/java/android/mtp/MtpPropertyList.java b/media/java/android/mtp/MtpPropertyList.java
index ede90dac517c..557f099c25c1 100644
--- a/media/java/android/mtp/MtpPropertyList.java
+++ b/media/java/android/mtp/MtpPropertyList.java
@@ -16,6 +16,7 @@
package android.mtp;
+import android.annotation.UnsupportedAppUsage;
import java.util.ArrayList;
import java.util.List;
@@ -49,6 +50,7 @@ class MtpPropertyList {
mStringValues = new ArrayList<>();
}
+ @UnsupportedAppUsage
public void append(int handle, int property, int type, long value) {
mObjectHandles.add(handle);
mPropertyCodes.add(property);
@@ -57,6 +59,7 @@ class MtpPropertyList {
mStringValues.add(null);
}
+ @UnsupportedAppUsage
public void append(int handle, int property, String value) {
mObjectHandles.add(handle);
mPropertyCodes.add(property);
diff --git a/media/java/android/mtp/MtpStorage.java b/media/java/android/mtp/MtpStorage.java
index 2625e0cc932c..c714b3cad296 100644
--- a/media/java/android/mtp/MtpStorage.java
+++ b/media/java/android/mtp/MtpStorage.java
@@ -16,6 +16,7 @@
package android.mtp;
+import android.annotation.UnsupportedAppUsage;
import android.os.storage.StorageVolume;
/**
@@ -46,6 +47,7 @@ public class MtpStorage {
*
* @return the storage ID
*/
+ @UnsupportedAppUsage
public final int getStorageId() {
return mStorageId;
}
@@ -55,6 +57,7 @@ public class MtpStorage {
*
* @return the storage file path
*/
+ @UnsupportedAppUsage
public final String getPath() {
return mPath;
}
diff --git a/opengl/java/android/opengl/EGL14.java b/opengl/java/android/opengl/EGL14.java
index 53ec6c8980ef..728e6e18cc31 100644
--- a/opengl/java/android/opengl/EGL14.java
+++ b/opengl/java/android/opengl/EGL14.java
@@ -18,6 +18,7 @@
package android.opengl;
+import android.annotation.UnsupportedAppUsage;
import android.graphics.SurfaceTexture;
import android.view.Surface;
import android.view.SurfaceView;
@@ -163,6 +164,7 @@ public static final int EGL_CORE_NATIVE_ENGINE = 0x305B;
/**
* {@hide}
*/
+ @UnsupportedAppUsage
public static native EGLDisplay eglGetDisplay(
long display_id
);
diff --git a/opengl/java/android/opengl/GLES20.java b/opengl/java/android/opengl/GLES20.java
index 137f2f5c2c5e..d66e7ac84a3b 100644
--- a/opengl/java/android/opengl/GLES20.java
+++ b/opengl/java/android/opengl/GLES20.java
@@ -19,6 +19,8 @@
package android.opengl;
+import android.annotation.UnsupportedAppUsage;
+
/** OpenGL ES 2.0
*/
public class GLES20 {
@@ -824,6 +826,7 @@ public class GLES20 {
// C function void glGetActiveAttrib ( GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, char *name )
/** @hide Method is broken, but used to be public (b/6006380) */
+ @UnsupportedAppUsage
public static native void glGetActiveAttrib(
int program,
int index,
@@ -872,6 +875,7 @@ public class GLES20 {
// C function void glGetActiveUniform ( GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, char *name )
/** @hide Method is broken, but used to be public (b/6006380) */
+ @UnsupportedAppUsage
public static native void glGetActiveUniform(
int program,
int index,
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 0f0a7e9d1314..8a3e6a0b0fd5 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -16,6 +16,7 @@
package android.opengl;
+import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.Trace;
import android.util.AttributeSet;
@@ -1235,6 +1236,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
EGLDisplay mEglDisplay;
EGLSurface mEglSurface;
EGLConfig mEglConfig;
+ @UnsupportedAppUsage
EGLContext mEglContext;
}
@@ -1844,6 +1846,7 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
// End of member variables protected by the sGLThreadManager monitor.
+ @UnsupportedAppUsage
private EglHelper mEglHelper;
/**
@@ -1919,7 +1922,9 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
private final WeakReference<GLSurfaceView> mThisWeakRef =
new WeakReference<GLSurfaceView>(this);
+ @UnsupportedAppUsage
private GLThread mGLThread;
+ @UnsupportedAppUsage
private Renderer mRenderer;
private boolean mDetached;
private EGLConfigChooser mEGLConfigChooser;
diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml
index e9ddbaf42b8c..df8f8dba06b9 100644
--- a/packages/CarSystemUI/res/values/colors.xml
+++ b/packages/CarSystemUI/res/values/colors.xml
@@ -19,7 +19,7 @@
<color name="car_accent">#356FE5</color>
<!-- colors for user switcher -->
<color name="car_user_switcher_background_color">#000000</color>
- <color name="car_user_switcher_name_text_color">@color/car_title2_light</color>
+ <color name="car_user_switcher_name_text_color">@color/car_body1_light</color>
<color name="car_user_switcher_add_user_background_color">#131313</color>
<color name="car_nav_icon_fill_color">@color/car_grey_50</color>
<!-- colors for seekbar -->
diff --git a/packages/CarSystemUI/res/values/dimens.xml b/packages/CarSystemUI/res/values/dimens.xml
index 3829aa3685b6..07ecca201c12 100644
--- a/packages/CarSystemUI/res/values/dimens.xml
+++ b/packages/CarSystemUI/res/values/dimens.xml
@@ -29,7 +29,7 @@
<dimen name="car_primary_icon_size">36dp</dimen>
<!-- dimensions for the car user switcher -->
- <dimen name="car_user_switcher_name_text_size">@dimen/car_title2_size</dimen>
+ <dimen name="car_user_switcher_name_text_size">@dimen/car_body1_size</dimen>
<dimen name="car_user_switcher_vertical_spacing_between_users">124dp</dimen>
<!--These values represent MIN and MAX for hvac-->
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java
index 27d31064955d..6473f0d2778a 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java
@@ -23,8 +23,6 @@ import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
-import com.android.systemui.statusbar.car.hvac.TemperatureView;
-import com.android.systemui.statusbar.car.hvac.HvacController;
import android.util.AttributeSet;
import android.util.Property;
import android.view.Gravity;
@@ -36,8 +34,8 @@ import android.widget.ImageView;
import android.widget.TextSwitcher;
import android.widget.TextView;
-import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.statusbar.car.hvac.TemperatureView;
/**
* Simple text display of HVAC properties, It is designed to show mTemperature and is configured in
@@ -47,8 +45,6 @@ import com.android.systemui.R;
* hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
* hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
* hvacOrientaion = Example: left
- * <p>
- * Note: It registers itself with {@link HvacController}
*/
public class AnimatedTemperatureView extends FrameLayout implements TemperatureView {
@@ -158,12 +154,9 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV
ViewGroup.LayoutParams.MATCH_PARENT);
typedArray.recycle();
-
- // register with controller
- HvacController hvacController = Dependency.get(HvacController.class);
- hvacController.addHvacTextView(this);
}
+
private TextView generateTextView() {
TextView textView = new TextView(getContext());
textView.setTextAppearance(mTextAppearanceRes);
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java
index 0bc94b500387..3c6d623c8ff7 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java
@@ -131,7 +131,9 @@ class TemperatureBackgroundAnimator {
}
void animateOpen() {
- if (!mAnimationsReady || mCircleState == CircleState.ENTERING) {
+ if (!mAnimationsReady
+ || !mAnimatedView.isAttachedToWindow()
+ || mCircleState == CircleState.ENTERING) {
return;
}
diff --git a/packages/ExtServices/src/android/ext/services/notification/Assistant.java b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
index 9d19898dd902..a8ecec3db213 100644
--- a/packages/ExtServices/src/android/ext/services/notification/Assistant.java
+++ b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
@@ -16,14 +16,17 @@
package android.ext.services.notification;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.service.notification.NotificationListenerService.Ranking
.USER_SENTIMENT_NEGATIVE;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityThread;
import android.app.INotificationManager;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
@@ -44,6 +47,7 @@ import android.util.Log;
import android.util.Slog;
import android.util.Xml;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.XmlUtils;
@@ -84,6 +88,7 @@ public class Assistant extends NotificationAssistantService {
private float mDismissToViewRatioLimit;
private int mStreakLimit;
private SmartActionsHelper mSmartActionsHelper;
+ private NotificationCategorizer mNotificationCategorizer;
// key : impressions tracker
// TODO: prune deleted channels and apps
@@ -93,6 +98,7 @@ public class Assistant extends NotificationAssistantService {
private Ranking mFakeRanking = null;
private AtomicFile mFile = null;
+ protected SettingsObserver mSettingsObserver;
public Assistant() {
}
@@ -102,8 +108,9 @@ public class Assistant extends NotificationAssistantService {
super.onCreate();
// Contexts are correctly hooked up by the creation step, which is required for the observer
// to be hooked up/initialized.
- new SettingsObserver(mHandler);
+ mSettingsObserver = new SettingsObserver(mHandler);
mSmartActionsHelper = new SmartActionsHelper();
+ mNotificationCategorizer = new NotificationCategorizer();
}
private void loadFile() {
@@ -190,32 +197,40 @@ public class Assistant extends NotificationAssistantService {
}
@Override
- public Adjustment onNotificationEnqueued(StatusBarNotification sbn) {
- if (DEBUG) Log.i(TAG, "ENQUEUED " + sbn.getKey());
+ public Adjustment onNotificationEnqueued(StatusBarNotification sbn,
+ NotificationChannel channel) {
+ if (DEBUG) Log.i(TAG, "ENQUEUED " + sbn.getKey() + " on " + channel.getId());
+ NotificationEntry entry = new NotificationEntry(
+ ActivityThread.getPackageManager(), sbn, channel);
ArrayList<Notification.Action> actions =
- mSmartActionsHelper.suggestActions(this, sbn);
- ArrayList<CharSequence> replies = mSmartActionsHelper.suggestReplies(this, sbn);
- return createEnqueuedNotificationAdjustment(sbn, actions, replies);
+ mSmartActionsHelper.suggestActions(this, entry);
+ ArrayList<CharSequence> replies = mSmartActionsHelper.suggestReplies(this, entry);
+ return createEnqueuedNotificationAdjustment(entry, actions, replies);
}
/** A convenience helper for creating an adjustment for an SBN. */
@Nullable
private Adjustment createEnqueuedNotificationAdjustment(
- @NonNull StatusBarNotification statusBarNotification,
+ @NonNull NotificationEntry entry,
@NonNull ArrayList<Notification.Action> smartActions,
@NonNull ArrayList<CharSequence> smartReplies) {
- if (smartActions.isEmpty() && smartReplies.isEmpty()) {
- return null;
- }
Bundle signals = new Bundle();
- signals.putParcelableArrayList(Adjustment.KEY_SMART_ACTIONS, smartActions);
- signals.putCharSequenceArrayList(Adjustment.KEY_SMART_REPLIES, smartReplies);
+ if (!smartActions.isEmpty()) {
+ signals.putParcelableArrayList(Adjustment.KEY_SMART_ACTIONS, smartActions);
+ }
+ if (!smartReplies.isEmpty()) {
+ signals.putCharSequenceArrayList(Adjustment.KEY_SMART_REPLIES, smartReplies);
+ }
+ if (mNotificationCategorizer.shouldSilence(entry)) {
+ signals.putInt(Adjustment.KEY_IMPORTANCE, IMPORTANCE_LOW);
+ }
+
return new Adjustment(
- statusBarNotification.getPackageName(),
- statusBarNotification.getKey(),
+ entry.getSbn().getPackageName(),
+ entry.getSbn().getKey(),
signals,
- "smart action, reply" /* explanation */,
- statusBarNotification.getUserId());
+ "",
+ entry.getSbn().getUserId());
}
@Override
@@ -325,29 +340,35 @@ public class Assistant extends NotificationAssistantService {
// for testing
- protected void setFile(AtomicFile file) {
+ @VisibleForTesting
+ public void setFile(AtomicFile file) {
mFile = file;
}
- protected void setFakeRanking(Ranking ranking) {
+ @VisibleForTesting
+ public void setFakeRanking(Ranking ranking) {
mFakeRanking = ranking;
}
- protected void setNoMan(INotificationManager noMan) {
+ @VisibleForTesting
+ public void setNoMan(INotificationManager noMan) {
mNoMan = noMan;
}
- protected void setContext(Context context) {
+ @VisibleForTesting
+ public void setContext(Context context) {
mSystemContext = context;
}
- protected ChannelImpressions getImpressions(String key) {
+ @VisibleForTesting
+ public ChannelImpressions getImpressions(String key) {
synchronized (mkeyToImpressions) {
return mkeyToImpressions.get(key);
}
}
- protected void insertImpressions(String key, ChannelImpressions ci) {
+ @VisibleForTesting
+ public void insertImpressions(String key, ChannelImpressions ci) {
synchronized (mkeyToImpressions) {
mkeyToImpressions.put(key, ci);
}
@@ -362,7 +383,7 @@ public class Assistant extends NotificationAssistantService {
/**
* Observer for updates on blocking helper threshold values.
*/
- private final class SettingsObserver extends ContentObserver {
+ protected final class SettingsObserver extends ContentObserver {
private final Uri STREAK_LIMIT_URI =
Settings.Global.getUriFor(Settings.Global.BLOCKING_HELPER_STREAK_LIMIT);
private final Uri DISMISS_TO_VIEW_RATIO_LIMIT_URI =
diff --git a/packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java b/packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java
new file mode 100644
index 000000000000..1f4ba0150dc1
--- /dev/null
+++ b/packages/ExtServices/src/android/ext/services/notification/NotificationCategorizer.java
@@ -0,0 +1,104 @@
+/**
+ * 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.ext.services.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
+
+import android.annotation.IntDef;
+import android.app.Notification;
+import android.media.AudioAttributes;
+import android.os.Process;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Default categorizer for incoming notifications; used to determine what notifications
+ * should be silenced.
+ */
+// TODO: stop using @hide methods
+public class NotificationCategorizer {
+
+ protected static final int CATEGORY_MIN = -3;
+ protected static final int CATEGORY_EVERYTHING_ELSE = -2;
+ protected static final int CATEGORY_ONGOING = -1;
+ protected static final int CATEGORY_SYSTEM_LOW = 0;
+ protected static final int CATEGORY_EVENT = 1;
+ protected static final int CATEGORY_REMINDER = 2;
+ protected static final int CATEGORY_SYSTEM = 3;
+ protected static final int CATEGORY_PEOPLE = 4;
+ protected static final int CATEGORY_ALARM = 5;
+ protected static final int CATEGORY_CALL = 6;
+
+ /** @hide */
+ @IntDef(prefix = { "CATEGORY_" }, value = {
+ CATEGORY_MIN, CATEGORY_EVERYTHING_ELSE, CATEGORY_ONGOING, CATEGORY_CALL,
+ CATEGORY_SYSTEM_LOW, CATEGORY_EVENT, CATEGORY_REMINDER, CATEGORY_SYSTEM,
+ CATEGORY_PEOPLE, CATEGORY_ALARM
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Category {}
+
+ public boolean shouldSilence(NotificationEntry entry) {
+ return shouldSilence(getCategory(entry));
+ }
+
+ @VisibleForTesting
+ boolean shouldSilence(int category) {
+ return category < CATEGORY_EVENT;
+ }
+
+ public int getCategory(NotificationEntry entry) {
+ if (entry.getChannel() == null) {
+ return CATEGORY_EVERYTHING_ELSE;
+ }
+ if (entry.getChannel().getImportance() == IMPORTANCE_MIN) {
+ return CATEGORY_MIN;
+ }
+ if (entry.isCategory(Notification.CATEGORY_REMINDER)) {
+ return CATEGORY_REMINDER;
+ }
+ if (entry.isCategory(Notification.CATEGORY_EVENT)) {
+ return CATEGORY_EVENT;
+ }
+ if (entry.isCategory(Notification.CATEGORY_ALARM)
+ || entry.isAudioAttributesUsage(AudioAttributes.USAGE_ALARM)) {
+ return CATEGORY_ALARM;
+ }
+ // TODO: check for default phone app
+ if (entry.isCategory(Notification.CATEGORY_CALL)) {
+ return CATEGORY_CALL;
+ }
+ if (entry.involvesPeople()) {
+ return CATEGORY_PEOPLE;
+ }
+ // TODO: is from signature app
+ if (entry.getSbn().getUid() < Process.FIRST_APPLICATION_UID) {
+ if (entry.getImportance() >= IMPORTANCE_HIGH) {
+ return CATEGORY_SYSTEM;
+ } else {
+ return CATEGORY_SYSTEM_LOW;
+ }
+ }
+ if (entry.isOngoing()) {
+ return CATEGORY_ONGOING;
+ }
+ return CATEGORY_EVERYTHING_ELSE;
+ }
+}
diff --git a/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java b/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
new file mode 100644
index 000000000000..cdc09906cb82
--- /dev/null
+++ b/packages/ExtServices/src/android/ext/services/notification/NotificationEntry.java
@@ -0,0 +1,220 @@
+/*
+ * 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.ext.services.notification;
+
+import static android.app.NotificationChannel.USER_LOCKED_IMPORTANCE;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
+import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.Person;
+import android.app.RemoteInput;
+import android.content.pm.IPackageManager;
+import android.media.AudioAttributes;
+import android.media.AudioSystem;
+import android.os.Build;
+import android.os.RemoteException;
+import android.service.notification.StatusBarNotification;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+/**
+ * Holds data about notifications.
+ */
+public class NotificationEntry {
+ static final String TAG = "NotificationEntry";
+
+ private StatusBarNotification mSbn;
+ private final IPackageManager mPackageManager;
+ private int mTargetSdkVersion = Build.VERSION_CODES.N_MR1;
+ private boolean mPreChannelsNotification = true;
+ private AudioAttributes mAttributes;
+ private NotificationChannel mChannel;
+ private int mImportance;
+
+ public NotificationEntry(IPackageManager packageManager, StatusBarNotification sbn,
+ NotificationChannel channel) {
+ mSbn = sbn;
+ mChannel = channel;
+ mPackageManager = packageManager;
+ mPreChannelsNotification = isPreChannelsNotification();
+ mAttributes = calculateAudioAttributes();
+ mImportance = calculateInitialImportance();
+ }
+
+ private boolean isPreChannelsNotification() {
+ try {
+ mTargetSdkVersion = mPackageManager.getApplicationInfo(
+ mSbn.getPackageName(), 0, mSbn.getUserId()).targetSdkVersion;
+ } catch (RemoteException e) {
+ Log.w(TAG, "Couldn't look up " + mSbn.getPackageName());
+ }
+ if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(getChannel().getId())) {
+ if (mTargetSdkVersion < Build.VERSION_CODES.O) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private AudioAttributes calculateAudioAttributes() {
+ final Notification n = getNotification();
+ AudioAttributes attributes = getChannel().getAudioAttributes();
+ if (attributes == null) {
+ attributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
+ }
+
+ if (mPreChannelsNotification
+ && (getChannel().getUserLockedFields()
+ & NotificationChannel.USER_LOCKED_SOUND) == 0) {
+ if (n.audioAttributes != null) {
+ // prefer audio attributes to stream type
+ attributes = n.audioAttributes;
+ } else if (n.audioStreamType >= 0
+ && n.audioStreamType < AudioSystem.getNumStreamTypes()) {
+ // the stream type is valid, use it
+ attributes = new AudioAttributes.Builder()
+ .setInternalLegacyStreamType(n.audioStreamType)
+ .build();
+ } else if (n.audioStreamType != AudioSystem.STREAM_DEFAULT) {
+ Log.w(TAG, String.format("Invalid stream type: %d", n.audioStreamType));
+ }
+ }
+ return attributes;
+ }
+
+ private int calculateInitialImportance() {
+ final Notification n = getNotification();
+ int importance = getChannel().getImportance();
+ int requestedImportance = IMPORTANCE_DEFAULT;
+
+ // Migrate notification flags to scores
+ if ((n.flags & Notification.FLAG_HIGH_PRIORITY) != 0) {
+ n.priority = Notification.PRIORITY_MAX;
+ }
+
+ n.priority = clamp(n.priority, Notification.PRIORITY_MIN,
+ Notification.PRIORITY_MAX);
+ switch (n.priority) {
+ case Notification.PRIORITY_MIN:
+ requestedImportance = IMPORTANCE_MIN;
+ break;
+ case Notification.PRIORITY_LOW:
+ requestedImportance = IMPORTANCE_LOW;
+ break;
+ case Notification.PRIORITY_DEFAULT:
+ requestedImportance = IMPORTANCE_DEFAULT;
+ break;
+ case Notification.PRIORITY_HIGH:
+ case Notification.PRIORITY_MAX:
+ requestedImportance = IMPORTANCE_HIGH;
+ break;
+ }
+
+ if (mPreChannelsNotification
+ && (importance == IMPORTANCE_UNSPECIFIED
+ || (getChannel().getUserLockedFields()
+ & USER_LOCKED_IMPORTANCE) == 0)) {
+ if (n.fullScreenIntent != null) {
+ requestedImportance = IMPORTANCE_HIGH;
+ }
+ importance = requestedImportance;
+ }
+
+ return importance;
+ }
+
+ public boolean isCategory(String category) {
+ return Objects.equals(getNotification().category, category);
+ }
+
+ public boolean isAudioAttributesUsage(int usage) {
+ return mAttributes != null && mAttributes.getUsage() == usage;
+ }
+
+ private boolean hasPerson() {
+ // TODO: cache favorite and recent contacts to check contact affinity
+ ArrayList<Person> people = getNotification().extras.getParcelableArrayList(
+ Notification.EXTRA_PEOPLE_LIST);
+ return people != null && !people.isEmpty();
+ }
+
+ protected boolean hasStyle(Class targetStyle) {
+ Class<? extends Notification.Style> style = getNotification().getNotificationStyle();
+ return targetStyle.equals(style);
+ }
+
+ protected boolean isOngoing() {
+ return (getNotification().flags & Notification.FLAG_FOREGROUND_SERVICE) != 0;
+ }
+
+ protected boolean involvesPeople() {
+ return isMessaging()
+ || hasStyle(Notification.InboxStyle.class)
+ || hasPerson();
+ }
+
+ protected boolean isMessaging() {
+ return isCategory(Notification.CATEGORY_MESSAGE)
+ || hasStyle(Notification.MessagingStyle.class)
+ || hasInlineReply();
+ }
+
+ public boolean hasInlineReply() {
+ Notification.Action[] actions = getNotification().actions;
+ if (actions == null) {
+ return false;
+ }
+ for (Notification.Action action : actions) {
+ RemoteInput[] remoteInputs = action.getRemoteInputs();
+ if (remoteInputs == null) {
+ continue;
+ }
+ for (RemoteInput remoteInput : remoteInputs) {
+ if (remoteInput.getAllowFreeFormInput()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public StatusBarNotification getSbn() {
+ return mSbn;
+ }
+
+ public Notification getNotification() {
+ return getSbn().getNotification();
+ }
+
+ public NotificationChannel getChannel() {
+ return mChannel;
+ }
+
+ public int getImportance() {
+ return mImportance;
+ }
+
+ private int clamp(int x, int low, int high) {
+ return (x < low) ? low : ((x > high) ? high : x);
+ }
+}
diff --git a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
index 9d33bd9972f1..37a98fd1dd6c 100644
--- a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
+++ b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
@@ -65,8 +65,8 @@ public class SmartActionsHelper {
*/
@NonNull
ArrayList<Notification.Action> suggestActions(
- @Nullable Context context, @NonNull StatusBarNotification sbn) {
- if (!isEligibleForActionAdjustment(sbn)) {
+ @Nullable Context context, @NonNull NotificationEntry entry) {
+ if (!isEligibleForActionAdjustment(entry)) {
return EMPTY_ACTION_LIST;
}
if (context == null) {
@@ -76,17 +76,17 @@ public class SmartActionsHelper {
if (tcm == null) {
return EMPTY_ACTION_LIST;
}
- Notification.Action[] actions = sbn.getNotification().actions;
+ Notification.Action[] actions = entry.getNotification().actions;
int numOfExistingActions = actions == null ? 0: actions.length;
int maxSmartActions = MAX_SMART_ACTIONS - numOfExistingActions;
return suggestActionsFromText(
tcm,
- getMostSalientActionText(sbn.getNotification()), maxSmartActions);
+ getMostSalientActionText(entry.getNotification()), maxSmartActions);
}
ArrayList<CharSequence> suggestReplies(
- @Nullable Context context, @NonNull StatusBarNotification sbn) {
- if (!isEligibleForReplyAdjustment(sbn)) {
+ @Nullable Context context, @NonNull NotificationEntry entry) {
+ if (!isEligibleForReplyAdjustment(entry)) {
return EMPTY_REPLY_LIST;
}
if (context == null) {
@@ -103,56 +103,35 @@ public class SmartActionsHelper {
* to fundamental phone functionality where any error would result in a very negative user
* experience.
*/
- private boolean isEligibleForActionAdjustment(@NonNull StatusBarNotification sbn) {
- Notification notification = sbn.getNotification();
- String pkg = sbn.getPackageName();
- if (!Process.myUserHandle().equals(sbn.getUser())) {
+ private boolean isEligibleForActionAdjustment(@NonNull NotificationEntry entry) {
+ Notification notification = entry.getNotification();
+ String pkg = entry.getSbn().getPackageName();
+ if (!Process.myUserHandle().equals(entry.getSbn().getUser())) {
return false;
}
if (notification.actions != null
&& notification.actions.length >= Notification.MAX_ACTION_BUTTONS) {
return false;
}
- if (0 != (notification.flags & FLAG_MASK_INELGIBILE_FOR_ACTIONS)) {
+ if ((notification.flags & FLAG_MASK_INELGIBILE_FOR_ACTIONS) != 0) {
return false;
}
if (TextUtils.isEmpty(pkg) || pkg.equals("android")) {
return false;
}
// For now, we are only interested in messages.
- return Notification.CATEGORY_MESSAGE.equals(notification.category)
- || Notification.MessagingStyle.class.equals(notification.getNotificationStyle())
- || hasInlineReply(notification);
+ return entry.isMessaging();
}
- private boolean isEligibleForReplyAdjustment(@NonNull StatusBarNotification sbn) {
+ private boolean isEligibleForReplyAdjustment(@NonNull NotificationEntry entry) {
if (!SystemProperties.getBoolean(SYS_PROP_SMART_REPLIES_EXPERIMENT, false)) {
return false;
}
- Notification notification = sbn.getNotification();
+ Notification notification = entry.getNotification();
if (notification.actions == null) {
return false;
}
- return hasInlineReply(sbn.getNotification());
- }
-
- private boolean hasInlineReply(Notification notification) {
- Notification.Action[] actions = notification.actions;
- if (actions == null) {
- return false;
- }
- for (Notification.Action action : actions) {
- RemoteInput[] remoteInputs = action.getRemoteInputs();
- if (remoteInputs == null) {
- continue;
- }
- for (RemoteInput remoteInput : remoteInputs) {
- if (remoteInput.getAllowFreeFormInput()) {
- return true;
- }
- }
- }
- return false;
+ return entry.hasInlineReply();
}
/** Returns the text most salient for action extraction in a notification. */
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java
index a6b6a6b61581..bb68bc2b875e 100644
--- a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java
@@ -20,7 +20,6 @@ import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_MIN;
-import static junit.framework.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -33,7 +32,6 @@ import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.content.ContentResolver;
-import android.content.IContentProvider;
import android.content.Intent;
import android.os.UserHandle;
import android.provider.Settings;
@@ -47,7 +45,6 @@ import android.support.test.InstrumentationRegistry;
import android.test.ServiceTestCase;
import android.testing.TestableContext;
import android.util.AtomicFile;
-import android.util.Xml;
import com.android.internal.util.FastXmlSerializer;
@@ -57,7 +54,6 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import java.io.BufferedInputStream;
@@ -435,12 +431,10 @@ public class AssistantTest extends ServiceTestCase<Assistant> {
Settings.Global.BLOCKING_HELPER_STREAK_LIMIT, newStreakLimit);
// Notify for the settings values we updated.
- resolver.notifyChange(
- Settings.Global.getUriFor(Settings.Global.BLOCKING_HELPER_STREAK_LIMIT), null);
- resolver.notifyChange(
- Settings.Global.getUriFor(
- Settings.Global.BLOCKING_HELPER_DISMISS_TO_VIEW_RATIO_LIMIT),
- null);
+ mAssistant.mSettingsObserver.onChange(false, Settings.Global.getUriFor(
+ Settings.Global.BLOCKING_HELPER_STREAK_LIMIT));
+ mAssistant.mSettingsObserver.onChange(false, Settings.Global.getUriFor(
+ Settings.Global.BLOCKING_HELPER_DISMISS_TO_VIEW_RATIO_LIMIT));
// With the new threshold, the blocking helper should be triggered.
assertEquals(true, ci.shouldTriggerBlock());
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
new file mode 100644
index 000000000000..c37392f03260
--- /dev/null
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java
@@ -0,0 +1,190 @@
+/**
+ * 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.ext.services.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
+import static android.os.Process.FIRST_APPLICATION_UID;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.os.Process;
+import android.service.notification.StatusBarNotification;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.testing.TestableContext;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class NotificationCategorizerTest {
+ @Mock
+ private NotificationEntry mEntry;
+ @Mock
+ private StatusBarNotification mSbn;
+
+ @Rule
+ public final TestableContext mContext =
+ new TestableContext(InstrumentationRegistry.getContext(), null);
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mEntry.getSbn()).thenReturn(mSbn);
+ when(mSbn.getUid()).thenReturn(Process.myUid());
+ when(mSbn.getPackageName()).thenReturn(mContext.getPackageName());
+ }
+
+ @Test
+ public void testPeopleCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_DEFAULT));
+ when(mEntry.involvesPeople()).thenReturn(true);
+
+ assertEquals(NotificationCategorizer.CATEGORY_PEOPLE, nc.getCategory(mEntry));
+ assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_PEOPLE));
+ }
+
+ @Test
+ public void testMin() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_MIN));
+ when(mEntry.involvesPeople()).thenReturn(true);
+
+ assertEquals(NotificationCategorizer.CATEGORY_MIN, nc.getCategory(mEntry));
+ assertTrue(nc.shouldSilence(NotificationCategorizer.CATEGORY_MIN));
+ }
+
+ @Test
+ public void testOngoingCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_DEFAULT));
+ when(mEntry.isOngoing()).thenReturn(true);
+
+ assertEquals(NotificationCategorizer.CATEGORY_ONGOING, nc.getCategory(mEntry));
+ assertTrue(nc.shouldSilence(NotificationCategorizer.CATEGORY_ONGOING));
+
+ when(mEntry.isOngoing()).thenReturn(false);
+ assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ assertTrue(nc.shouldSilence(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE));
+ }
+
+ @Test
+ public void testAlarmCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_DEFAULT));
+ when(mEntry.isCategory(Notification.CATEGORY_ALARM)).thenReturn(true);
+
+ assertEquals(NotificationCategorizer.CATEGORY_ALARM, nc.getCategory(mEntry));
+ assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_ALARM));
+
+ when(mEntry.isCategory(Notification.CATEGORY_ALARM)).thenReturn(false);
+ assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ assertTrue(nc.shouldSilence(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE));
+ }
+
+ @Test
+ public void testCallCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_DEFAULT));
+ when(mEntry.isCategory(Notification.CATEGORY_CALL)).thenReturn(true);
+
+ assertEquals(NotificationCategorizer.CATEGORY_CALL, nc.getCategory(mEntry));
+ assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_CALL));
+
+ when(mEntry.isCategory(Notification.CATEGORY_CALL)).thenReturn(false);
+ assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ assertTrue(nc.shouldSilence(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE));
+ }
+
+ @Test
+ public void testReminderCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_DEFAULT));
+ when(mEntry.isCategory(Notification.CATEGORY_REMINDER)).thenReturn(true);
+
+ assertEquals(NotificationCategorizer.CATEGORY_REMINDER, nc.getCategory(mEntry));
+ assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_REMINDER));
+
+ when(mEntry.isCategory(Notification.CATEGORY_REMINDER)).thenReturn(false);
+ assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ assertTrue(nc.shouldSilence(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE));
+ }
+
+ @Test
+ public void testEventCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_DEFAULT));
+ when(mEntry.isCategory(Notification.CATEGORY_EVENT)).thenReturn(true);
+
+ assertEquals(NotificationCategorizer.CATEGORY_EVENT, nc.getCategory(mEntry));
+ assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_EVENT));
+
+ when(mEntry.isCategory(Notification.CATEGORY_EVENT)).thenReturn(false);
+ assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ }
+
+ @Test
+ public void testSystemCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_HIGH));
+ when(mEntry.getImportance()).thenReturn(IMPORTANCE_HIGH);
+ when(mSbn.getUid()).thenReturn(FIRST_APPLICATION_UID - 1);
+
+ assertEquals(NotificationCategorizer.CATEGORY_SYSTEM, nc.getCategory(mEntry));
+ assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_SYSTEM));
+
+ when(mSbn.getUid()).thenReturn(FIRST_APPLICATION_UID);
+ assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ }
+
+ @Test
+ public void testSystemLowCategory() {
+ NotificationCategorizer nc = new NotificationCategorizer();
+
+ when(mEntry.getChannel()).thenReturn(new NotificationChannel("", "", IMPORTANCE_DEFAULT));
+ when(mEntry.getImportance()).thenReturn(IMPORTANCE_DEFAULT);
+ when(mSbn.getUid()).thenReturn(FIRST_APPLICATION_UID - 1);
+
+ assertEquals(NotificationCategorizer.CATEGORY_SYSTEM_LOW, nc.getCategory(mEntry));
+ assertTrue(nc.shouldSilence(NotificationCategorizer.CATEGORY_SYSTEM_LOW));
+
+ when(mSbn.getUid()).thenReturn(FIRST_APPLICATION_UID);
+ assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry));
+ }
+}
diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java
new file mode 100644
index 000000000000..9223c3dfe2bc
--- /dev/null
+++ b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationEntryTest.java
@@ -0,0 +1,201 @@
+/**
+ * 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.ext.services.notification;
+
+import static android.app.Notification.FLAG_CAN_COLORIZE;
+import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.media.AudioAttributes.USAGE_ALARM;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.Person;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.media.AudioAttributes;
+import android.os.Build;
+import android.os.Process;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.testing.TestableContext;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+
+@RunWith(AndroidJUnit4.class)
+public class NotificationEntryTest {
+ private String mPkg = "pkg";
+ private int mUid = 2018;
+ @Mock
+ private IPackageManager mPackageManager;
+ @Mock
+ private ApplicationInfo mAppInfo;
+
+ @Rule
+ public final TestableContext mContext =
+ new TestableContext(InstrumentationRegistry.getContext(), null);
+
+ private StatusBarNotification generateSbn(String channelId) {
+ Notification n = new Notification.Builder(mContext, channelId)
+ .setContentTitle("foo")
+ .build();
+
+ return new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, mUid, n,
+ UserHandle.SYSTEM, null, 0);
+ }
+
+ private StatusBarNotification generateSbn(Notification n) {
+ return new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, mUid, n,
+ UserHandle.SYSTEM, null, 0);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mPkg = mContext.getPackageName();
+ mUid = Process.myUid();
+ when(mPackageManager.getApplicationInfo(anyString(), anyInt(), anyInt()))
+ .thenReturn(mAppInfo);
+ mAppInfo.targetSdkVersion = Build.VERSION_CODES.P;
+ }
+
+ @Test
+ public void testHasPerson() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+ StatusBarNotification sbn = generateSbn(channel.getId());
+ ArrayList<Person> people = new ArrayList<>();
+ people.add(new Person.Builder().setKey("mailto:testing@android.com").build());
+ sbn.getNotification().extras.putParcelableArrayList(Notification.EXTRA_PEOPLE_LIST, people);
+
+ NotificationEntry entry = new NotificationEntry(mPackageManager, sbn, channel);
+ assertTrue(entry.involvesPeople());
+ }
+
+ @Test
+ public void testNotPerson() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+ StatusBarNotification sbn = generateSbn(channel.getId());
+ NotificationEntry entry = new NotificationEntry(mPackageManager, sbn, channel);
+ assertFalse(entry.involvesPeople());
+ }
+
+ @Test
+ public void testIsInboxStyle() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(mContext, channel.getId())
+ .setStyle(new Notification.InboxStyle())
+ .build();
+ NotificationEntry entry = new NotificationEntry(mPackageManager, generateSbn(n), channel);
+ assertTrue(entry.hasStyle(Notification.InboxStyle.class));
+ }
+
+ @Test
+ public void testIsMessagingStyle() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(mContext, channel.getId())
+ .setStyle(new Notification.MessagingStyle(""))
+ .build();
+ NotificationEntry entry = new NotificationEntry(mPackageManager, generateSbn(n), channel);
+ assertTrue(entry.hasStyle(Notification.MessagingStyle.class));
+ }
+
+ @Test
+ public void testIsNotPersonStyle() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(mContext, channel.getId())
+ .setStyle(new Notification.BigPictureStyle())
+ .build();
+ NotificationEntry entry = new NotificationEntry(mPackageManager, generateSbn(n), channel);
+ assertFalse(entry.hasStyle(Notification.InboxStyle.class));
+ assertFalse(entry.hasStyle(Notification.MessagingStyle.class));
+ }
+
+ @Test
+ public void testIsAudioAttributes() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+ channel.setSound(null, new AudioAttributes.Builder().setUsage(USAGE_ALARM).build());
+
+ NotificationEntry entry = new NotificationEntry(
+ mPackageManager, generateSbn(channel.getId()), channel);
+
+ assertTrue(entry.isAudioAttributesUsage(USAGE_ALARM));
+ }
+
+ @Test
+ public void testIsNotAudioAttributes() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+ NotificationEntry entry = new NotificationEntry(
+ mPackageManager, generateSbn(channel.getId()), channel);
+
+ assertFalse(entry.isAudioAttributesUsage(USAGE_ALARM));
+ }
+
+ @Test
+ public void testIsCategory() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(mContext, channel.getId())
+ .setCategory(Notification.CATEGORY_EMAIL)
+ .build();
+ NotificationEntry entry = new NotificationEntry(mPackageManager, generateSbn(n), channel);
+
+ assertTrue(entry.isCategory(Notification.CATEGORY_EMAIL));
+ assertFalse(entry.isCategory(Notification.CATEGORY_MESSAGE));
+ }
+
+ @Test
+ public void testIsOngoing() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(mContext, channel.getId())
+ .setFlag(FLAG_FOREGROUND_SERVICE, true)
+ .build();
+ NotificationEntry entry = new NotificationEntry(mPackageManager, generateSbn(n), channel);
+
+ assertTrue(entry.isOngoing());
+ }
+
+ @Test
+ public void testIsNotOngoing() {
+ NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(mContext, channel.getId())
+ .setFlag(FLAG_CAN_COLORIZE, true)
+ .build();
+ NotificationEntry entry = new NotificationEntry(mPackageManager, generateSbn(n), channel);
+
+ assertFalse(entry.isOngoing());
+ }
+}
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 0887010bd3b5..296a135a9d8a 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Tydsduur"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vra elke keer"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Totdat jy dit afskakel"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sopas"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index b69618d00b67..ab52bcb0cf76 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"በ<xliff:g id="WHEN">%1$s</xliff:g> ላይ"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"የቆይታ ጊዜ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ሁልጊዜ ጠይቅ"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"እስኪያጠፉት ድረስ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ልክ አሁን"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 37e8346d4166..e8811eb6c724 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -453,7 +453,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"يوم <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"المدة"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"الطلب في كل مرة"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"إلى أن توقف الوضع يدويًا"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"للتو"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 787d4d5687e5..0adac28fc7b8 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> বজাত"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"সময়সীমা"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"প্ৰতিবাৰতে সোধক"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"আপুনি অফ নকৰা পর্যন্ত"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"এই মাত্ৰ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index e3211265c236..8f974fef7edd 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> olduqda"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Müddət"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Hər dəfə soruşun"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Deaktiv edənə qədər"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"İndicə"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index b4ea7b90b1ff..1e3eba631a19 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -450,7 +450,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Uvek pitaj"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo sada"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 630d697a3427..42fda63e9b4d 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Працягласць"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Заўсёды пытацца"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Пакуль не выключыце"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Зараз"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index aa42e0a2ac63..a309449dd744 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"в/ъв <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Времетраене"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Да се пита винаги"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"До изключване"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Току-що"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index c11b58ef5fc8..ad4ef2f94e09 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"তারিখ ও সময় <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"সময়কাল"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"প্রতিবার জিজ্ঞেস করা হবে"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"যতক্ষণ না আপনি বন্ধ করছেন"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"এখনই"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 887a74bf6597..43326823ee68 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -450,7 +450,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pitaj svaki put"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 7d350956722e..7750ef290de9 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"Data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durada"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pregunta sempre"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Fins que no ho desactivi"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ara mateix"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 1057ae014a5c..72b3389dd64c 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trvání"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pokaždé se zeptat"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Dokud tuto funkci nevypnete"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Právě teď"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 6cd185558e2c..0b7ce0d4790e 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"på <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Varighed"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spørg hver gang"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Indtil du deaktiverer"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Lige nu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index aaacc29f1022..9db490b6f5c1 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"am <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Dauer"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Jedes Mal fragen"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Bis zur Deaktivierung"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Gerade eben"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index eb8346dffc3c..2ba543e45955 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"το/τη(ν) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Διάρκεια"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Να ερωτώμαι κάθε φορά"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Μέχρι την απενεργοποίηση"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Μόλις τώρα"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index a00f018f0d3c..747fdc77cab8 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index a00f018f0d3c..747fdc77cab8 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index a00f018f0d3c..747fdc77cab8 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index a00f018f0d3c..747fdc77cab8 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duration"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ask every time"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Just now"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 0b70def9a93c..33b9f1db3d59 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎on ‎‏‎‎‏‏‎<xliff:g id="WHEN">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‏‎‏‎Duration‎‏‎‎‏‎"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎Ask every time‎‏‎‎‏‎"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎Until you turn off‎‏‎‎‏‎"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‎Just now‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 9085adbf103b..f665b77b836c 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"el <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duración"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar siempre"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Recién"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 038dfd4b309a..9cdde92ee564 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"Fecha: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duración"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar siempre"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Hasta que se desactive"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Justo ahora"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index d9a93c980e82..2b4432120ee5 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"– <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Kestus"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Küsi iga kord"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Kuni välja lülitate"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Äsja"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 739eaf0ff028..4ad60b320e65 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Iraupena"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Galdetu beti"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Desaktibatu arte"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Oraintxe"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 18fb3e2d3170..1d0882145c83 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"روز <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"مدت"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"هربار پرسیده شود"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"تا زمانی‌که آن را خاموش کنید"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"هم‌اکنون"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 38584862cfd7..7c253fc2a886 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Kesto"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Kysy aina"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Kunnes poistat sen käytöstä"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Äsken"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 36efa53d418e..99906ca3c1ad 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durée"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Toujours demander"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 9cadd3c26bdf..7a51faa87236 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durée"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Toujours demander"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"À l\'instant"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 82a56e69db6f..5bc61631abb1 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"na seguinte data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duración"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Preguntar sempre"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Ata a desactivación"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 8eb41b5a51f6..9c83640b2fd4 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -450,7 +450,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pitaj svaki put"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Upravo sad"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 5fee9339c9d0..25d11aa97b5e 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ezen a napon: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Időtartam"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Mindig kérdezzen rá"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Kikapcsolásig"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Az imént"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 8f68ac7b8206..f811312c22f6 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Տևողություն"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Հարցնել ամեն անգամ"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Մինչև չանջատեք"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Հենց նոր"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 7c18a83220c4..39a88e5e5b71 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durasi"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Selalu tanya"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Sampai Anda menonaktifkannya"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Baru saja"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 0f2d55ea8b74..afb10a9b16ba 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"á/í <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Lengd"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spyrja í hvert skipti"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Þar til þú slekkur"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Rétt í þessu"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index f44fbb3e817c..24eef7af6b13 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"il giorno <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durata"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Chiedi ogni volta"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Fino alla disattivazione"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Adesso"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index c1d858cf0546..e9c44c957f7f 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ב-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"משך"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"שאל בכל פעם"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"עד הכיבוי"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"הרגע"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index d59c611a417b..0cc2d17d4c22 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"期間"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"毎回確認"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"OFF にするまで"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"たった今"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 4418bef9bd8d..daca5b9c8322 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ხანგრძლივობა"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ყოველთვის მკითხეთ"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"გამორთვამდე"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ახლახან"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 88669a7bb28f..b95d6e9e19d1 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"Уақыты: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Ұзақтығы"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Әрдайым сұрау"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Өшірілгенге дейін"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Дәл қазір"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 509dafa1c046..5bf38c0e64ea 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"នៅ​ថ្ងៃ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"រយៈពេល"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"សួរគ្រប់ពេល"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"រហូតទាល់តែ​អ្នកបិទ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"អម្បាញ់មិញ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index f01fac786edc..923547f821bc 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> ಕ್ಕೆ"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ಅವಧಿ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ಪ್ರತಿ ಬಾರಿ ಕೇಳಿ"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ಇದೀಗ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 34fa2ae1827d..9bac29d97844 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"일시: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"지속 시간"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"항상 확인"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"사용 중지할 때까지"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"조금 전"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 0a3bd80fc9f2..523fabea585d 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Узактыгы"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Ар дайым суралсын"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Бул функция өчүрүлгөнгө чейин"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Азыр эле"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 2853fee84462..f85a69150a58 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ເວລາ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ໄລຍະເວລາ"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ຖາມທຸກເທື່ອ"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"ຈົນກວ່າທ່ານຈະປິດ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ຕອນນີ້"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 3866922877e8..fc2924f66812 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trukmė"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Klausti kaskart"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Kol išjungsite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ką tik"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 6133f7f62a66..6ce5e8e86310 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -450,7 +450,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Ilgums"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vaicāt katru reizi"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Līdz brīdim, kad izslēgsiet"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Tikko"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 0a27a06098ab..c6c508e2c12c 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"во <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Времетраење"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Секогаш прашувај"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Додека не го исклучите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Неодамнешни"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 8601d97c940e..6b6462c083b3 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ന്"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ദൈർഘ്യം"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"എപ്പോഴും ചോദിക്കുക"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"നിങ്ങൾ ഓഫാക്കുന്നത് വരെ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ഇപ്പോൾ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 62dd1e946d47..56f1cc0bc569 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-д"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Хугацаа"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Тухай бүрт асуух"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Таныг унтраах хүртэл"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Дөнгөж сая"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 9428338c527b..7485886673bf 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> रोजी"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"कालावधी"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"प्रत्येक वेळी विचारा"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"तुम्ही बंद करेपर्यंत"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"आत्ताच"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 47d4cbc1b36d..fdb8702a91e5 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Tempoh"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Tanya setiap kali"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Sehingga anda matikan"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sebentar tadi"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 40e351adbc09..dc5d924a13c4 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> တွင်"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ကြာချိန်"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"အမြဲမေးပါ"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"သင်ပိတ်လိုက်သည် အထိ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ယခုလေးတင်"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index a9637c15416a..460eb5781cb1 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Varighet"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Spør hver gang"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Til du slår av"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Nå nettopp"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 6ae6a22bf5f2..763b60c539a9 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> मा"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"अवधि"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"प्रत्येक पटक सोध्नुहोस्"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"तपाईंले निष्क्रिय नपार्दासम्म"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"अहिले भर्खरै"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index e6a7e0a0d9b6..fa30827fca4d 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duur"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Altijd vragen"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Totdat je uitschakelt"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Zojuist"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 3532e897f7fd..ecdc49e7d418 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> ବେଳେ"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ଅବଧି"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ପ୍ରତ୍ୟେକ ଥର ପଚାରନ୍ତୁ"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ DND ଅନ୍‌ ରହିବ"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ଏହିକ୍ଷଣି"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 7ff80c9308f8..7c3da214e7bb 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Czas"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Zawsze pytaj"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Dopóki nie wyłączysz"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Przed chwilą"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 585aee6e3a0d..192e532489bb 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duração"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index e41acde71a1e..01bc0fcf8443 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"no(a) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duração"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Até ser desativado"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora mesmo"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 585aee6e3a0d..192e532489bb 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Duração"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Perguntar sempre"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Agora"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 8024047e1b6e..cc74bd3d7ea6 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -450,7 +450,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Durată"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Întreabă de fiecare dată"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Până când dezactivați"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Chiar acum"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 494d107cf373..5e1869ff5a01 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Длительность"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Всегда спрашивать"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Пока вы не отключите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Только что"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 21c96f1b4ff1..1be890b0da3e 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>හිදී"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"කාල සීමාව"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"සෑම විටම ඉල්ලන්න"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"ඔබ ක්‍රියාවිරහිත කරන තුරු"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"මේ දැන්"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 4a92357518e6..d1ec450118b2 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trvanie"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vždy sa opýtať"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Dokiaľ túto funkciu nevypnete"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Teraz"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index fb17c17900b9..46325509f8db 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Trajanje"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Vedno vprašaj"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Dokler ne izklopite"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Pravkar"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index a8e9a76e9c38..24cdcb1e54ab 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"ditën <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Kohëzgjatja"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Pyet çdo herë"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Deri sa ta çaktivizosh"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Pikërisht tani"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index fe158a0645f7..ebefc65483bf 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -450,7 +450,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Трајање"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Увек питај"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Док не искључите"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Управо сада"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 99e915a0ca8b..c83438b8ece7 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"på <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Varaktighet"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Fråga varje gång"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Tills du inaktiverar funktionen"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Nyss"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index ce06a62ac28a..8be74eacf53a 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"siku ya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Muda"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Uliza kila wakati"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Hadi utakapoizima"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Sasa hivi"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 9c8a2f19ba7a..225005dc2336 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"அலாரம்: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"கால அளவு"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ஒவ்வொரு முறையும் கேள்"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"ஆஃப் செய்யும் வரை"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"சற்றுமுன்"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index cb2403c1a1ae..531001ccc481 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"వ్యవధి"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ప్రతిసారి అడుగు"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"మీరు ఆఫ్‌ చేసే వరకు"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ఇప్పుడే"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index e89a4d027e13..cf214e1878d8 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"วัน<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"ระยะเวลา"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ถามทุกครั้ง"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"จนกว่าคุณจะปิด"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"เมื่อสักครู่"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index e527eec87ba0..aee95eaa8505 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"sa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Tagal"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Magtanong palagi"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Hanggang sa i-off mo"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Ngayon lang"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 2f7f2f638b27..e4b23f96e455 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"zaman: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Süre"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Her zaman sor"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Siz kapatana kadar"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Az önce"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index cb99b5d56b5e..958a3d28a8d2 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -451,7 +451,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Тривалість"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Запитувати щоразу"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Доки ви не вимкнете"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Щойно"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index af5e83c36fd3..31f0a33b3e64 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> بجے"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"مدت"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"ہر بار پوچھیں"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"یہاں تک کہ آپ آف کر دیں"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"ابھی ابھی"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 0072db826e08..7ff458864b8c 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Davomiyligi"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Har safar so‘ralsin"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Bekor qilinmaguncha"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Hozir"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index b3b5a458f213..daa9335a3630 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"vào <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Thời lượng"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Luôn hỏi"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Cho đến khi bạn tắt"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Vừa xong"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index cdd069b1c81e..6cb27e990a3b 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"时间:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"持续时间"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都询问"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"直到您将其关闭"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"刚刚"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index f7b6fc17877f..16039c1c1a58 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"持續時間"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都詢問"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"直至您關閉為止"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 6dc0720a5062..ed6863889dd7 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"時間長度"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"每次都詢問"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"直到你關閉為止"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"剛剛"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index ae552fc4727f..957584adb73c 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -449,7 +449,6 @@
<string name="alarm_template_far" msgid="3779172822607461675">"nge-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="zen_mode_duration_settings_title" msgid="229547412251222757">"Ubude besikhathi"</string>
<string name="zen_mode_duration_always_prompt_title" msgid="6478923750878945501">"Buza njalo"</string>
- <!-- no translation found for zen_mode_forever (2704305038191592967) -->
- <skip />
+ <string name="zen_mode_forever" msgid="2704305038191592967">"Uze uvale isikrini"</string>
<string name="time_unit_just_now" msgid="6363336622778342422">"Khona manje"</string>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index b90d30711ffc..b0ff9e3faac3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -23,7 +23,6 @@ import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.content.Context;
import android.content.SharedPreferences;
-import android.media.AudioManager;
import android.os.ParcelUuid;
import android.os.SystemClock;
import android.text.TextUtils;
@@ -51,7 +50,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
private final Context mContext;
private final LocalBluetoothAdapter mLocalAdapter;
private final LocalBluetoothProfileManager mProfileManager;
- private final AudioManager mAudioManager;
private final BluetoothDevice mDevice;
//TODO: consider remove, BluetoothDevice.getName() is already cached
private String mName;
@@ -187,7 +185,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
mContext = context;
mLocalAdapter = adapter;
mProfileManager = profileManager;
- mAudioManager = context.getSystemService(AudioManager.class);
mDevice = device;
mProfileConnectionState = new HashMap<LocalBluetoothProfile, Integer>();
fillData();
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
index f39b85105b9e..e2c8ecdb2a30 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
@@ -126,6 +126,12 @@ public class TileUtils {
*/
public static final String META_DATA_PREFERENCE_ICON_BACKGROUND_HINT =
"com.android.settings.bg.hint";
+ /**
+ * Name of the meta-data item that should be set in the AndroidManifest.xml
+ * to specify the icon background color as raw ARGB.
+ */
+ public static final String META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB =
+ "com.android.settings.bg.argb";
/**
* Name of the meta-data item that should be set in the AndroidManifest.xml
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java
index 01df0ecfdb11..dddfa7a3a9b4 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java
@@ -102,17 +102,4 @@ public class BatteryMeterDrawableBaseTest {
private boolean isRectZero(Rect r) {
return r.left == 0 && r.top == 0 && r.right == 0 && r.bottom == 0;
}
-
- @Test
- public void testPlusPaint_isEqualToBoltPaint() {
- // Before setting color
- assertTrue(mBatteryDrawable.mPlusPaint.hasEqualAttributes(mBatteryDrawable.mBoltPaint));
-
- final int fakeFillColor = 123;
- final int fakeBackgrundColor = 456;
-
- // After
- mBatteryDrawable.setColors(fakeFillColor, fakeBackgrundColor);
- assertTrue(mBatteryDrawable.mPlusPaint.hasEqualAttributes(mBatteryDrawable.mBoltPaint));
- }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java
index 914d1828981e..dde17462a6f9 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java
@@ -54,7 +54,7 @@ public class SettingsLibRobolectricTestRunner extends RobolectricTestRunner {
final List<ResourcePath> paths = super.getIncludedResourcePaths();
paths.add(resourcePath("file:frameworks/base/packages/SettingsLib/res"));
paths.add(resourcePath("file:frameworks/base/core/res/res"));
- paths.add(resourcePath("file:frameworks/support/appcompat/res"));
+ paths.add(resourcePath("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.appcompat_appcompat-nodeps/android_common/aar/res/"));
return paths;
}
};
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 007e14096bf2..c6ea4807c2a9 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1791,13 +1791,13 @@ class SettingsProtoDumpUtil {
Settings.Secure.DOZE_ALWAYS_ON,
SecureSettingsProto.Doze.ALWAYS_ON);
dumpSetting(s, p,
- Settings.Secure.DOZE_PULSE_ON_PICK_UP,
+ Settings.Secure.DOZE_PICK_UP_GESTURE,
SecureSettingsProto.Doze.PULSE_ON_PICK_UP);
dumpSetting(s, p,
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
SecureSettingsProto.Doze.PULSE_ON_LONG_PRESS);
dumpSetting(s, p,
- Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
+ Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
SecureSettingsProto.Doze.PULSE_ON_DOUBLE_TAP);
p.end(dozeToken);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 1c133955f4b1..500199f7a521 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -3242,9 +3242,9 @@ public class SettingsProvider extends ContentProvider {
getSettingLocked(Settings.Secure.DOZE_ENABLED).getValue());
if (dozeExplicitlyDisabled) {
- secureSettings.insertSettingLocked(Settings.Secure.DOZE_PULSE_ON_PICK_UP,
+ secureSettings.insertSettingLocked(Settings.Secure.DOZE_PICK_UP_GESTURE,
"0", null, true, SettingsState.SYSTEM_PACKAGE_NAME);
- secureSettings.insertSettingLocked(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
+ secureSettings.insertSettingLocked(Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
"0", null, true, SettingsState.SYSTEM_PACKAGE_NAME);
}
currentVersion = 131;
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index d9ec0fd0214b..920e3b6a3343 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -7,7 +7,6 @@ LOCAL_MODULE := SystemUI-proto
LOCAL_SRC_FILES := $(call all-proto-files-under,src)
LOCAL_PROTOC_OPTIMIZE_TYPE := nano
-LOCAL_PROTO_JAVA_OUTPUT_PARAMS := optional_field_style=accessors
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/packages/SystemUI/docs/plugin_hooks.md b/packages/SystemUI/docs/plugin_hooks.md
index 5b08bfc387db..9fe2e181971a 100644
--- a/packages/SystemUI/docs/plugin_hooks.md
+++ b/packages/SystemUI/docs/plugin_hooks.md
@@ -51,6 +51,10 @@ Expected interface: [NotificationSwipeActionHelper](/packages/SystemUI/plugin/sr
Use: Control over swipes/input for notification views, can be used to control what happens when you swipe/long-press
+### Action: com.android.systemui.action.PLUGIN_CLOCK
+Expected interface: [ClockPlugin](/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java)
+
+Use: Allows replacement of the keyguard main clock.
# Global plugin dependencies
These classes can be accessed by any plugin using PluginDependency as long as they @Requires them.
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java
new file mode 100644
index 000000000000..b4fc82018303
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockPlugin.java
@@ -0,0 +1,47 @@
+/*
+ * 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.systemui.plugins;
+
+import com.android.systemui.plugins.annotations.ProvidesInterface;
+
+import android.graphics.Paint.Style;
+import android.view.View;
+
+/**
+ * This plugin is used to replace main clock in keyguard.
+ */
+@ProvidesInterface(action = ClockPlugin.ACTION, version = ClockPlugin.VERSION)
+public interface ClockPlugin extends Plugin {
+
+ String ACTION = "com.android.systemui.action.PLUGIN_CLOCK";
+ int VERSION = 1;
+
+ /**
+ * Get clock view.
+ * @return clock view from plugin.
+ */
+ View getView();
+
+ /**
+ * Set clock paint style.
+ * @param style The new style to set in the paint.
+ */
+ void setStyle(Style style);
+
+ /**
+ * Set clock text color.
+ * @param color A color value.
+ */
+ void setTextColor(int color);
+}
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
new file mode 100644
index 000000000000..89b873e7ffda
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** 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.
+*/
+-->
+
+<!-- This is a view that shows clock information in Keyguard. -->
+<com.android.keyguard.KeyguardClockSwitch
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_alignParentTop="true">
+ <TextClock
+ android:id="@+id/default_clock_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:letterSpacing="0.03"
+ android:textColor="?attr/wallpaperTextColor"
+ android:singleLine="true"
+ style="@style/widget_big_thin"
+ android:format12Hour="@string/keyguard_widget_12_hours_format"
+ android:format24Hour="@string/keyguard_widget_24_hours_format" />
+</com.android.keyguard.KeyguardClockSwitch>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml b/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml
index 87983b9186db..a795442c62f9 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml
@@ -38,19 +38,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top">
- <TextClock
- android:id="@+id/clock_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_centerHorizontal="true"
- android:layout_alignParentTop="true"
- android:letterSpacing="0.03"
- android:textColor="?attr/wallpaperTextColor"
- android:singleLine="true"
- style="@style/widget_big_thin"
- android:format12Hour="@string/keyguard_widget_12_hours_format"
- android:format24Hour="@string/keyguard_widget_24_hours_format" />
+ <include layout="@layout/keyguard_clock_switch"
+ android:id="@+id/clock_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
<View
android:id="@+id/clock_separator"
android:layout_width="@dimen/widget_separator_width"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
index ba05ccf5ce46..4ae2d4181656 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
@@ -55,19 +55,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top">
- <TextClock
- android:id="@+id/clock_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_centerHorizontal="true"
- android:layout_alignParentTop="true"
- android:letterSpacing="0.03"
- android:textColor="?attr/wallpaperTextColor"
- android:singleLine="true"
- style="@style/widget_big_thin"
- android:format12Hour="@string/keyguard_widget_12_hours_format"
- android:format24Hour="@string/keyguard_widget_24_hours_format" />
+ <include layout="@layout/keyguard_clock_switch"
+ android:id="@+id/clock_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
<View
android:id="@+id/clock_separator"
android:layout_width="@dimen/widget_separator_width"
diff --git a/packages/SystemUI/res/layout/menu_ime.xml b/packages/SystemUI/res/layout/menu_ime.xml
index 8a3a0b19c892..b047efbdc6e0 100644
--- a/packages/SystemUI/res/layout/menu_ime.xml
+++ b/packages/SystemUI/res/layout/menu_ime.xml
@@ -19,6 +19,7 @@
android:id="@+id/menu_container"
android:layout_width="@dimen/navigation_key_width"
android:layout_height="match_parent"
+ android:focusable="false"
android:importantForAccessibility="no"
>
<!-- Use nav button width & height=match_parent for parent FrameLayout and buttons because they
diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml
index baaf699c278a..d72021e27e0b 100644
--- a/packages/SystemUI/res/layout/navigation_layout.xml
+++ b/packages/SystemUI/res/layout/navigation_layout.xml
@@ -18,14 +18,16 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:layout_marginStart="@dimen/rounded_corner_content_padding"
+ android:layout_marginEnd="@dimen/rounded_corner_content_padding"
+ android:paddingStart="@dimen/nav_content_padding"
+ android:paddingEnd="@dimen/nav_content_padding">
<com.android.systemui.statusbar.phone.NearestTouchFrame
android:id="@+id/nav_buttons"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingStart="@dimen/rounded_corner_content_padding"
- android:paddingEnd="@dimen/rounded_corner_content_padding"
android:clipChildren="false"
android:clipToPadding="false">
@@ -34,8 +36,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
- android:paddingStart="@dimen/nav_content_padding"
- android:paddingEnd="@dimen/nav_content_padding"
android:clipToPadding="false"
android:clipChildren="false" />
@@ -46,8 +46,6 @@
android:layout_gravity="center"
android:gravity="center"
android:orientation="horizontal"
- android:paddingStart="@dimen/nav_content_padding"
- android:paddingEnd="@dimen/nav_content_padding"
android:clipToPadding="false"
android:clipChildren="false" />
diff --git a/packages/SystemUI/res/layout/navigation_layout_rot90.xml b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
index 6d5b77885a09..24a0c71f3bad 100644
--- a/packages/SystemUI/res/layout/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
@@ -18,14 +18,16 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:layout_marginTop="@dimen/rounded_corner_content_padding"
+ android:layout_marginBottom="@dimen/rounded_corner_content_padding"
+ android:paddingTop="@dimen/nav_content_padding"
+ android:paddingBottom="@dimen/nav_content_padding">
<com.android.systemui.statusbar.phone.NearestTouchFrame
android:id="@+id/nav_buttons"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingTop="@dimen/rounded_corner_content_padding"
- android:paddingBottom="@dimen/rounded_corner_content_padding"
android:clipChildren="false"
android:clipToPadding="false">
@@ -34,10 +36,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:paddingTop="@dimen/nav_content_padding"
- android:paddingBottom="@dimen/nav_content_padding"
- android:clipChildren="false"
- android:clipToPadding="false" />
+ android:clipToPadding="false"
+ android:clipChildren="false" />
<com.android.systemui.statusbar.phone.ReverseLinearLayout
android:id="@+id/center_group"
@@ -45,10 +45,8 @@
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
- android:paddingTop="@dimen/nav_content_padding"
- android:paddingBottom="@dimen/nav_content_padding"
- android:clipChildren="false"
- android:clipToPadding="false" />
+ android:clipToPadding="false"
+ android:clipChildren="false" />
</com.android.systemui.statusbar.phone.NearestTouchFrame>
diff --git a/packages/SystemUI/res/values-af/strings_car.xml b/packages/SystemUI/res/values-af/strings_car.xml
index 3f470625dc3d..0127af81c131 100644
--- a/packages/SystemUI/res/values-af/strings_car.xml
+++ b/packages/SystemUI/res/values-af/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gas"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gas"</string>
<string name="car_add_user" msgid="5245196248349230898">"Voeg gebruiker by"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nuwe gebruiker"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel."</string>
diff --git a/packages/SystemUI/res/values-am/strings_car.xml b/packages/SystemUI/res/values-am/strings_car.xml
index 769cb5b66af6..cc709de1729c 100644
--- a/packages/SystemUI/res/values-am/strings_car.xml
+++ b/packages/SystemUI/res/values-am/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"እንግዳ"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"እንግዳ"</string>
<string name="car_add_user" msgid="5245196248349230898">"ተጠቃሚ አክል"</string>
<string name="car_new_user" msgid="8142927244990323906">"አዲስ ተጠቃሚ"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሳቸውን ቦታ ማቀናበር አለባቸው።"</string>
diff --git a/packages/SystemUI/res/values-ar/strings_car.xml b/packages/SystemUI/res/values-ar/strings_car.xml
index deadaae3de3a..54b7e1d57c7b 100644
--- a/packages/SystemUI/res/values-ar/strings_car.xml
+++ b/packages/SystemUI/res/values-ar/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ضيف"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ضيف"</string>
<string name="car_add_user" msgid="5245196248349230898">"إضافة المستخدم"</string>
<string name="car_new_user" msgid="8142927244990323906">"مستخدم جديد"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"عند إضافة مستخدم جديد، عليه إعداد مساحته."</string>
diff --git a/packages/SystemUI/res/values-as/strings_car.xml b/packages/SystemUI/res/values-as/strings_car.xml
index ce19a03d19f9..b8031a5dcb77 100644
--- a/packages/SystemUI/res/values-as/strings_car.xml
+++ b/packages/SystemUI/res/values-as/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"অতিথি"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"অতিথি"</string>
<string name="car_add_user" msgid="5245196248349230898">"ব্যৱহাৰকাৰী যোগ কৰক"</string>
<string name="car_new_user" msgid="8142927244990323906">"নতুন ব্যৱহাৰকাৰী"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"আপুনি কোনো নতুন ব্য়ৱহাৰকাৰীক যোগ কৰিলে তেখেতে নিজৰ বাবে খালী ঠাই ছেট আপ কৰিব লাগে।"</string>
diff --git a/packages/SystemUI/res/values-az/strings_car.xml b/packages/SystemUI/res/values-az/strings_car.xml
index 02ee1771b476..d64f4c2df80c 100644
--- a/packages/SystemUI/res/values-az/strings_car.xml
+++ b/packages/SystemUI/res/values-az/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Qonaq"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Qonaq"</string>
<string name="car_add_user" msgid="5245196248349230898">"İstifadəçi əlavə edin"</string>
<string name="car_new_user" msgid="8142927244990323906">"Yeni İstifadəçi"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Yeni istifadəçi əlavə etdiyinizdə həmin şəxs öz yerini təyin etməlidir."</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 47eb26623d5e..da236a854cf9 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -375,7 +375,7 @@
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Uključi/isključi pregled"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Napunjena je"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Punjenje"</string>
- <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> dok se ne napuni"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do kraja punjenja"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"Ne puni se"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Mreža se možda\nnadgleda"</string>
<string name="description_target_search" msgid="3091587249776033139">"Pretraga"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml b/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml
index 7a2032b1e0c5..3cf7e2ed5085 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gost"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>
<string name="car_add_user" msgid="5245196248349230898">"Dodaj korisnika"</string>
<string name="car_new_user" msgid="8142927244990323906">"Novi korisnik"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kada dodate novog korisnika, ta osoba treba da podesi svoj prostor."</string>
diff --git a/packages/SystemUI/res/values-be/strings_car.xml b/packages/SystemUI/res/values-be/strings_car.xml
index 357aeeb97164..d665bf1fbd1d 100644
--- a/packages/SystemUI/res/values-be/strings_car.xml
+++ b/packages/SystemUI/res/values-be/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Госць"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Госць"</string>
<string name="car_add_user" msgid="5245196248349230898">"Дадаць карыстальніка"</string>
<string name="car_new_user" msgid="8142927244990323906">"Новы карыстальнік"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Калі вы дадаяце новага карыстальніка, яму трэба наладзіць свой профіль."</string>
diff --git a/packages/SystemUI/res/values-bg/donottranslate.xml b/packages/SystemUI/res/values-bg/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-bg/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-bg/strings_car.xml b/packages/SystemUI/res/values-bg/strings_car.xml
index c117ab4efb2e..39e19b539b95 100644
--- a/packages/SystemUI/res/values-bg/strings_car.xml
+++ b/packages/SystemUI/res/values-bg/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Гост"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Гост"</string>
<string name="car_add_user" msgid="5245196248349230898">"Добавяне на потребител"</string>
<string name="car_new_user" msgid="8142927244990323906">"Нов потребител"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Когато добавите нов потребител, той трябва да настрои работното си пространство."</string>
diff --git a/packages/SystemUI/res/values-bn/strings_car.xml b/packages/SystemUI/res/values-bn/strings_car.xml
index 2c6857d2c2ab..b40ccdd078fa 100644
--- a/packages/SystemUI/res/values-bn/strings_car.xml
+++ b/packages/SystemUI/res/values-bn/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"অতিথি"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"অতিথি"</string>
<string name="car_add_user" msgid="5245196248349230898">"ব্যবহারকারীকে যুক্ত করুন"</string>
<string name="car_new_user" msgid="8142927244990323906">"নতুন ব্যবহারকারী"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"আপনি কোনও নতুন ব্যবহারকারীকে যোগ করলে তাকে তার স্পেস সেট-আপ করে নিতে হবে।"</string>
diff --git a/packages/SystemUI/res/values-bs/strings_car.xml b/packages/SystemUI/res/values-bs/strings_car.xml
index 4d334c565cd9..cb2f4275368e 100644
--- a/packages/SystemUI/res/values-bs/strings_car.xml
+++ b/packages/SystemUI/res/values-bs/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gost"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>
<string name="car_add_user" msgid="5245196248349230898">"Dodaj korisnika"</string>
<string name="car_new_user" msgid="8142927244990323906">"Novi korisnik"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor."</string>
diff --git a/packages/SystemUI/res/values-ca/strings_car.xml b/packages/SystemUI/res/values-ca/strings_car.xml
index 8cd7d3852ff1..80df88215d4a 100644
--- a/packages/SystemUI/res/values-ca/strings_car.xml
+++ b/packages/SystemUI/res/values-ca/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Convidat"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Convidat"</string>
<string name="car_add_user" msgid="5245196248349230898">"Afegeix un usuari"</string>
<string name="car_new_user" msgid="8142927244990323906">"Usuari nou"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai."</string>
diff --git a/packages/SystemUI/res/values-cs/strings_car.xml b/packages/SystemUI/res/values-cs/strings_car.xml
index 7356fd977244..0f09aca4c1b2 100644
--- a/packages/SystemUI/res/values-cs/strings_car.xml
+++ b/packages/SystemUI/res/values-cs/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Host"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Host"</string>
<string name="car_add_user" msgid="5245196248349230898">"Přidat uživatele"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nový uživatel"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Každý nově přidaný uživatel si musí nastavit vlastní prostor."</string>
diff --git a/packages/SystemUI/res/values-da/strings_car.xml b/packages/SystemUI/res/values-da/strings_car.xml
index 4112ad9b678b..f0d14a0b8161 100644
--- a/packages/SystemUI/res/values-da/strings_car.xml
+++ b/packages/SystemUI/res/values-da/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gæst"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gæst"</string>
<string name="car_add_user" msgid="5245196248349230898">"Tilføj bruger"</string>
<string name="car_new_user" msgid="8142927244990323906">"Ny bruger"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Når du tilføjer en ny bruger, skal vedkommende konfigurere sit område."</string>
diff --git a/packages/SystemUI/res/values-de/strings_car.xml b/packages/SystemUI/res/values-de/strings_car.xml
index 7dcf6be1b66f..b55a2e552be2 100644
--- a/packages/SystemUI/res/values-de/strings_car.xml
+++ b/packages/SystemUI/res/values-de/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gast"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gast"</string>
<string name="car_add_user" msgid="5245196248349230898">"Nutzer hinzufügen"</string>
<string name="car_new_user" msgid="8142927244990323906">"Neuer Nutzer"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Wenn du einen neuen Nutzer hinzufügst, muss dieser seinen Bereich einrichten."</string>
diff --git a/packages/SystemUI/res/values-el/strings_car.xml b/packages/SystemUI/res/values-el/strings_car.xml
index b4157e72a361..7b67ed5bed3c 100644
--- a/packages/SystemUI/res/values-el/strings_car.xml
+++ b/packages/SystemUI/res/values-el/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Επισκέπτης"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Επισκέπτης"</string>
<string name="car_add_user" msgid="5245196248349230898">"Προσθήκη χρήστη"</string>
<string name="car_new_user" msgid="8142927244990323906">"Νέος χρήστης"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Όταν προσθέτετε έναν νέο χρήστη, αυτός ο χρήστης θα πρέπει να ρυθμίσει τον χώρο του."</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings_car.xml b/packages/SystemUI/res/values-en-rAU/strings_car.xml
index 4bb06c7a358e..5ff5a52d0ab5 100644
--- a/packages/SystemUI/res/values-en-rAU/strings_car.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Guest"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>
<string name="car_add_user" msgid="5245196248349230898">"Add User"</string>
<string name="car_new_user" msgid="8142927244990323906">"New User"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings_car.xml b/packages/SystemUI/res/values-en-rCA/strings_car.xml
index 4bb06c7a358e..5ff5a52d0ab5 100644
--- a/packages/SystemUI/res/values-en-rCA/strings_car.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Guest"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>
<string name="car_add_user" msgid="5245196248349230898">"Add User"</string>
<string name="car_new_user" msgid="8142927244990323906">"New User"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings_car.xml b/packages/SystemUI/res/values-en-rGB/strings_car.xml
index 4bb06c7a358e..5ff5a52d0ab5 100644
--- a/packages/SystemUI/res/values-en-rGB/strings_car.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Guest"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>
<string name="car_add_user" msgid="5245196248349230898">"Add User"</string>
<string name="car_new_user" msgid="8142927244990323906">"New User"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings_car.xml b/packages/SystemUI/res/values-en-rIN/strings_car.xml
index 4bb06c7a358e..5ff5a52d0ab5 100644
--- a/packages/SystemUI/res/values-en-rIN/strings_car.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Guest"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Guest"</string>
<string name="car_add_user" msgid="5245196248349230898">"Add User"</string>
<string name="car_new_user" msgid="8142927244990323906">"New User"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"When you add a new user, that person needs to set up their space."</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings_car.xml b/packages/SystemUI/res/values-es-rUS/strings_car.xml
index db6c93e1ce0b..7187beffc6d3 100644
--- a/packages/SystemUI/res/values-es-rUS/strings_car.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Invitado"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Invitado"</string>
<string name="car_add_user" msgid="5245196248349230898">"Agregar usuario"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nuevo usuario"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Cuando agregues un usuario nuevo, esa persona deberá configurar su espacio."</string>
diff --git a/packages/SystemUI/res/values-es/strings_car.xml b/packages/SystemUI/res/values-es/strings_car.xml
index 503788c726d8..775811369f8c 100644
--- a/packages/SystemUI/res/values-es/strings_car.xml
+++ b/packages/SystemUI/res/values-es/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Invitado"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Invitado"</string>
<string name="car_add_user" msgid="5245196248349230898">"Añadir usuario"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nuevo usuario"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Al añadir un nuevo usuario, este debe configurar su espacio."</string>
diff --git a/packages/SystemUI/res/values-et/strings_car.xml b/packages/SystemUI/res/values-et/strings_car.xml
index ac010fe50673..fd93f94ba9ac 100644
--- a/packages/SystemUI/res/values-et/strings_car.xml
+++ b/packages/SystemUI/res/values-et/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Külaline"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Külaline"</string>
<string name="car_add_user" msgid="5245196248349230898">"Kasutaja lisamine"</string>
<string name="car_new_user" msgid="8142927244990323906">"Uus kasutaja"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi."</string>
diff --git a/packages/SystemUI/res/values-eu/strings_car.xml b/packages/SystemUI/res/values-eu/strings_car.xml
index 6375ce0d6e14..3e645cea3993 100644
--- a/packages/SystemUI/res/values-eu/strings_car.xml
+++ b/packages/SystemUI/res/values-eu/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gonbidatua"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gonbidatua"</string>
<string name="car_add_user" msgid="5245196248349230898">"Gehitu erabiltzaile bat"</string>
<string name="car_new_user" msgid="8142927244990323906">"Erabiltzaile berria"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Erabiltzaile bat gehitzen duzunean, bere eremua konfiguratu beharko du."</string>
diff --git a/packages/SystemUI/res/values-fa/strings_car.xml b/packages/SystemUI/res/values-fa/strings_car.xml
index f74c33cfc987..97657b95ad0a 100644
--- a/packages/SystemUI/res/values-fa/strings_car.xml
+++ b/packages/SystemUI/res/values-fa/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"مهمان"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"مهمان"</string>
<string name="car_add_user" msgid="5245196248349230898">"افزودن کاربر"</string>
<string name="car_new_user" msgid="8142927244990323906">"کاربر جدید"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"وقتی کاربر جدیدی اضافه می‌کنید، آن فرد باید فضای خود را تنظیم کند."</string>
diff --git a/packages/SystemUI/res/values-fi/strings_car.xml b/packages/SystemUI/res/values-fi/strings_car.xml
index b2501ee2eace..d062d6780430 100644
--- a/packages/SystemUI/res/values-fi/strings_car.xml
+++ b/packages/SystemUI/res/values-fi/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Vieras"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Vieras"</string>
<string name="car_add_user" msgid="5245196248349230898">"Lisää käyttäjä"</string>
<string name="car_new_user" msgid="8142927244990323906">"Uusi käyttäjä"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kun lisäät uuden käyttäjän, hänen on määritettävä oman tilansa asetukset."</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings_car.xml b/packages/SystemUI/res/values-fr-rCA/strings_car.xml
index 8041e7ec9c54..c100828c824a 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings_car.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Invité"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Invité"</string>
<string name="car_add_user" msgid="5245196248349230898">"Ajouter un utilisateur"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nouvel utilisateur"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
diff --git a/packages/SystemUI/res/values-fr/strings_car.xml b/packages/SystemUI/res/values-fr/strings_car.xml
index 4a6bd70f75a3..0b65fa64362e 100644
--- a/packages/SystemUI/res/values-fr/strings_car.xml
+++ b/packages/SystemUI/res/values-fr/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Invité"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Invité"</string>
<string name="car_add_user" msgid="5245196248349230898">"Ajouter un utilisateur"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nouvel utilisateur"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
diff --git a/packages/SystemUI/res/values-gl/strings_car.xml b/packages/SystemUI/res/values-gl/strings_car.xml
index d897b344d173..24304dc66dbe 100644
--- a/packages/SystemUI/res/values-gl/strings_car.xml
+++ b/packages/SystemUI/res/values-gl/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Convidado"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Convidado"</string>
<string name="car_add_user" msgid="5245196248349230898">"Engadir usuario"</string>
<string name="car_new_user" msgid="8142927244990323906">"Novo usuario"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Cando engadas un usuario novo, este deberá configurar o seu espazo."</string>
diff --git a/packages/SystemUI/res/values-hr/strings_car.xml b/packages/SystemUI/res/values-hr/strings_car.xml
index a94f2357f865..44f4a093101f 100644
--- a/packages/SystemUI/res/values-hr/strings_car.xml
+++ b/packages/SystemUI/res/values-hr/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gost"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>
<string name="car_add_user" msgid="5245196248349230898">"Dodajte korisnika"</string>
<string name="car_new_user" msgid="8142927244990323906">"Novi korisnik"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor."</string>
diff --git a/packages/SystemUI/res/values-hu/donottranslate.xml b/packages/SystemUI/res/values-hu/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-hu/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-hu/strings_car.xml b/packages/SystemUI/res/values-hu/strings_car.xml
index 223b3549cefc..d0f00ba29995 100644
--- a/packages/SystemUI/res/values-hu/strings_car.xml
+++ b/packages/SystemUI/res/values-hu/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Vendég"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Vendég"</string>
<string name="car_add_user" msgid="5245196248349230898">"Felhasználó hozzáadása"</string>
<string name="car_new_user" msgid="8142927244990323906">"Új felhasználó"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját felületét."</string>
diff --git a/packages/SystemUI/res/values-hy/strings_car.xml b/packages/SystemUI/res/values-hy/strings_car.xml
index dd734f0c13dd..85af3c891911 100644
--- a/packages/SystemUI/res/values-hy/strings_car.xml
+++ b/packages/SystemUI/res/values-hy/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Հյուր"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Հյուր"</string>
<string name="car_add_user" msgid="5245196248349230898">"Ավելացնել օգտատեր"</string>
<string name="car_new_user" msgid="8142927244990323906">"Նոր օգտատեր"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Երբ դուք նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:"</string>
diff --git a/packages/SystemUI/res/values-in/strings_car.xml b/packages/SystemUI/res/values-in/strings_car.xml
index de0a1a8ef368..7423a1c17440 100644
--- a/packages/SystemUI/res/values-in/strings_car.xml
+++ b/packages/SystemUI/res/values-in/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Tamu"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Tamu"</string>
<string name="car_add_user" msgid="5245196248349230898">"Tambahkan Pengguna"</string>
<string name="car_new_user" msgid="8142927244990323906">"Pengguna Baru"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri."</string>
diff --git a/packages/SystemUI/res/values-is/strings_car.xml b/packages/SystemUI/res/values-is/strings_car.xml
index f962765d94f0..9300e368a4d6 100644
--- a/packages/SystemUI/res/values-is/strings_car.xml
+++ b/packages/SystemUI/res/values-is/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gestur"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gestur"</string>
<string name="car_add_user" msgid="5245196248349230898">"Bæta notanda við"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nýr notandi"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Þegar þú bætir nýjum notanda við þarf viðkomandi að setja upp sitt eigið svæði."</string>
diff --git a/packages/SystemUI/res/values-it/strings_car.xml b/packages/SystemUI/res/values-it/strings_car.xml
index 5121eb709bb5..e79addab1797 100644
--- a/packages/SystemUI/res/values-it/strings_car.xml
+++ b/packages/SystemUI/res/values-it/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Ospite"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Ospite"</string>
<string name="car_add_user" msgid="5245196248349230898">"Aggiungi utente"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nuovo utente"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Il nuovo utente, una volta aggiunto, dovrà configurare il proprio spazio."</string>
diff --git a/packages/SystemUI/res/values-iw/strings_car.xml b/packages/SystemUI/res/values-iw/strings_car.xml
index 8b77940b675f..19bd19dbc943 100644
--- a/packages/SystemUI/res/values-iw/strings_car.xml
+++ b/packages/SystemUI/res/values-iw/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"אורח"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"אורח"</string>
<string name="car_add_user" msgid="5245196248349230898">"הוספת משתמש"</string>
<string name="car_new_user" msgid="8142927244990323906">"משתמש חדש"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את המרחב שלו."</string>
diff --git a/packages/SystemUI/res/values-ja/donottranslate.xml b/packages/SystemUI/res/values-ja/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-ja/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-ja/strings_car.xml b/packages/SystemUI/res/values-ja/strings_car.xml
index fddd512183aa..7aa438910377 100644
--- a/packages/SystemUI/res/values-ja/strings_car.xml
+++ b/packages/SystemUI/res/values-ja/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ゲスト"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ゲスト"</string>
<string name="car_add_user" msgid="5245196248349230898">"ユーザーを追加"</string>
<string name="car_new_user" msgid="8142927244990323906">"新しいユーザー"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。"</string>
diff --git a/packages/SystemUI/res/values-ka/strings_car.xml b/packages/SystemUI/res/values-ka/strings_car.xml
index b7292555a7d0..4a6dfbd795b8 100644
--- a/packages/SystemUI/res/values-ka/strings_car.xml
+++ b/packages/SystemUI/res/values-ka/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"სტუმარი"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"სტუმარი"</string>
<string name="car_add_user" msgid="5245196248349230898">"მომხმარებლის დამატება"</string>
<string name="car_new_user" msgid="8142927244990323906">"ახალი მომხმარებელი"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს."</string>
diff --git a/packages/SystemUI/res/values-kk/strings_car.xml b/packages/SystemUI/res/values-kk/strings_car.xml
index 4d1f9cf9f898..9915d98e3aa4 100644
--- a/packages/SystemUI/res/values-kk/strings_car.xml
+++ b/packages/SystemUI/res/values-kk/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Қонақ"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Қонақ"</string>
<string name="car_add_user" msgid="5245196248349230898">"Пайдаланушыны енгізу"</string>
<string name="car_new_user" msgid="8142927244990323906">"Жаңа пайдаланушы"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Енгізілген жаңа пайдаланушы өз профилін реттеуі керек."</string>
diff --git a/packages/SystemUI/res/values-km/strings_car.xml b/packages/SystemUI/res/values-km/strings_car.xml
index a897dba08634..cae300d61e53 100644
--- a/packages/SystemUI/res/values-km/strings_car.xml
+++ b/packages/SystemUI/res/values-km/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ភ្ញៀវ"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ភ្ញៀវ"</string>
<string name="car_add_user" msgid="5245196248349230898">"បញ្ចូល​អ្នក​ប្រើប្រាស់"</string>
<string name="car_new_user" msgid="8142927244990323906">"អ្នក​ប្រើប្រាស់​ថ្មី"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"នៅពេលដែល​អ្នក​បញ្ចូល​អ្នក​ប្រើប្រាស់​ថ្មី បុគ្គល​នោះ​ត្រូវតែ​រៀបចំ​ទំហំ​ផ្ទុក​របស់គេ។"</string>
diff --git a/packages/SystemUI/res/values-kn/strings_car.xml b/packages/SystemUI/res/values-kn/strings_car.xml
index 53cdc32cf69b..2b07ac28f661 100644
--- a/packages/SystemUI/res/values-kn/strings_car.xml
+++ b/packages/SystemUI/res/values-kn/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ಅತಿಥಿ"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ಅತಿಥಿ"</string>
<string name="car_add_user" msgid="5245196248349230898">"ಬಳಕೆದಾರ ಸೇರಿಸು"</string>
<string name="car_new_user" msgid="8142927244990323906">"ಹೊಸ ಬಳಕೆದಾರ"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"ನೀವು ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
diff --git a/packages/SystemUI/res/values-ko/donottranslate.xml b/packages/SystemUI/res/values-ko/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-ko/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-ko/strings_car.xml b/packages/SystemUI/res/values-ko/strings_car.xml
index 9cfaa7f5bfc2..31cb38f11e4f 100644
--- a/packages/SystemUI/res/values-ko/strings_car.xml
+++ b/packages/SystemUI/res/values-ko/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"게스트"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"게스트"</string>
<string name="car_add_user" msgid="5245196248349230898">"사용자 추가"</string>
<string name="car_new_user" msgid="8142927244990323906">"신규 사용자"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다."</string>
diff --git a/packages/SystemUI/res/values-ky/strings_car.xml b/packages/SystemUI/res/values-ky/strings_car.xml
index 67ffdbe4ee94..237e6385d214 100644
--- a/packages/SystemUI/res/values-ky/strings_car.xml
+++ b/packages/SystemUI/res/values-ky/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Конок"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Конок"</string>
<string name="car_add_user" msgid="5245196248349230898">"Колдонуучу кошуу"</string>
<string name="car_new_user" msgid="8142927244990323906">"Жаңы колдонуучу"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Жаңы колдонуучу кошулганда, ал өзүнүн профилин жөндөп алышы керек."</string>
diff --git a/packages/SystemUI/res/values-lo/strings_car.xml b/packages/SystemUI/res/values-lo/strings_car.xml
index a41700985c64..43067f5c1093 100644
--- a/packages/SystemUI/res/values-lo/strings_car.xml
+++ b/packages/SystemUI/res/values-lo/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ແຂກ"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ແຂກ"</string>
<string name="car_add_user" msgid="5245196248349230898">"ເພີ່ມຜູ້ໃຊ້"</string>
<string name="car_new_user" msgid="8142927244990323906">"ຜູ້ໃຊ້ໃໝ່"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ບຸກຄົນນັ້ນຈຳເປັນຕ້ອງຕັ້ງຄ່າພື້ນທີ່ຂອງເຂົາເຈົ້າ."</string>
diff --git a/packages/SystemUI/res/values-lt/donottranslate.xml b/packages/SystemUI/res/values-lt/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-lt/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-lt/strings_car.xml b/packages/SystemUI/res/values-lt/strings_car.xml
index 704184c9057b..ae9f24ab3388 100644
--- a/packages/SystemUI/res/values-lt/strings_car.xml
+++ b/packages/SystemUI/res/values-lt/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Svečias"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Svečias"</string>
<string name="car_add_user" msgid="5245196248349230898">"Pridėti naudotoją"</string>
<string name="car_new_user" msgid="8142927244990323906">"Naujas naudotojas"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo vietą."</string>
diff --git a/packages/SystemUI/res/values-lv/strings_car.xml b/packages/SystemUI/res/values-lv/strings_car.xml
index 8f5c28316269..b8846142013e 100644
--- a/packages/SystemUI/res/values-lv/strings_car.xml
+++ b/packages/SystemUI/res/values-lv/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Viesis"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Viesis"</string>
<string name="car_add_user" msgid="5245196248349230898">"Lietotāja pievienošana"</string>
<string name="car_new_user" msgid="8142927244990323906">"Jauns lietotājs"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils."</string>
diff --git a/packages/SystemUI/res/values-mk/strings_car.xml b/packages/SystemUI/res/values-mk/strings_car.xml
index 772f8cfd8190..8372fb50cb48 100644
--- a/packages/SystemUI/res/values-mk/strings_car.xml
+++ b/packages/SystemUI/res/values-mk/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Гостин"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Гостин"</string>
<string name="car_add_user" msgid="5245196248349230898">"Додај корисник"</string>
<string name="car_new_user" msgid="8142927244990323906">"Нов корисник"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Кога додавате нов корисник, тоа лице треба да го постави својот простор."</string>
diff --git a/packages/SystemUI/res/values-ml/strings_car.xml b/packages/SystemUI/res/values-ml/strings_car.xml
index 10e28ab56d9a..26afb0d591dc 100644
--- a/packages/SystemUI/res/values-ml/strings_car.xml
+++ b/packages/SystemUI/res/values-ml/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"അതിഥി"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"അതിഥി"</string>
<string name="car_add_user" msgid="5245196248349230898">"ഉപയോക്താവിനെ ചേര്‍ക്കുക"</string>
<string name="car_new_user" msgid="8142927244990323906">"പുതിയ ഉപയോക്താവ്"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"നിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തി സ്വന്തം ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string>
diff --git a/packages/SystemUI/res/values-mn/strings_car.xml b/packages/SystemUI/res/values-mn/strings_car.xml
index 0b46d3f3f7ae..5bc1f57d3af9 100644
--- a/packages/SystemUI/res/values-mn/strings_car.xml
+++ b/packages/SystemUI/res/values-mn/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Зочин"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Зочин"</string>
<string name="car_add_user" msgid="5245196248349230898">"Хэрэглэгч нэмэх"</string>
<string name="car_new_user" msgid="8142927244990323906">"Шинэ хэрэглэгч"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Таныг шинэ хэрэглэгч нэмэх үед тухайн хэрэглэгч хувийн орон зайгаа тохируулах шаардлагатай."</string>
diff --git a/packages/SystemUI/res/values-mr/strings_car.xml b/packages/SystemUI/res/values-mr/strings_car.xml
index 5e2328727f8b..f8b9627f44fd 100644
--- a/packages/SystemUI/res/values-mr/strings_car.xml
+++ b/packages/SystemUI/res/values-mr/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"अतिथी"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"अतिथी"</string>
<string name="car_add_user" msgid="5245196248349230898">"वापरकर्ता जोडा"</string>
<string name="car_new_user" msgid="8142927244990323906">"नवीन वापरकर्ता"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"तुम्ही नवीन वापरकर्त्याला जोडल्यावर, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते."</string>
diff --git a/packages/SystemUI/res/values-ms/strings_car.xml b/packages/SystemUI/res/values-ms/strings_car.xml
index 8c002c8ef426..a41eacf608db 100644
--- a/packages/SystemUI/res/values-ms/strings_car.xml
+++ b/packages/SystemUI/res/values-ms/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Tetamu"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Tetamu"</string>
<string name="car_add_user" msgid="5245196248349230898">"Tambah Pengguna"</string>
<string name="car_new_user" msgid="8142927244990323906">"Pengguna Baharu"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Apabila anda menambahkan pengguna baharu, orang itu perlu menyediakan ruang mereka."</string>
diff --git a/packages/SystemUI/res/values-my/strings_car.xml b/packages/SystemUI/res/values-my/strings_car.xml
index 778a82e36fff..fdb499872cde 100644
--- a/packages/SystemUI/res/values-my/strings_car.xml
+++ b/packages/SystemUI/res/values-my/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ဧည့်သည်"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ဧည့်သည်"</string>
<string name="car_add_user" msgid="5245196248349230898">"အသုံးပြုသူ ထည့်ရန်"</string>
<string name="car_new_user" msgid="8142927244990323906">"အသုံးပြုသူ အသစ်"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"အသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ နေရာကို စီစဉ်သတ်မှတ်ရပါမည်။"</string>
diff --git a/packages/SystemUI/res/values-nb/strings_car.xml b/packages/SystemUI/res/values-nb/strings_car.xml
index 9db879d263c0..09593f10f9cd 100644
--- a/packages/SystemUI/res/values-nb/strings_car.xml
+++ b/packages/SystemUI/res/values-nb/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gjest"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gjest"</string>
<string name="car_add_user" msgid="5245196248349230898">"Legg til bruker"</string>
<string name="car_new_user" msgid="8142927244990323906">"Ny bruker"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område."</string>
diff --git a/packages/SystemUI/res/values-ne/strings_car.xml b/packages/SystemUI/res/values-ne/strings_car.xml
index a435c2f7657e..40d6f7d5e8a2 100644
--- a/packages/SystemUI/res/values-ne/strings_car.xml
+++ b/packages/SystemUI/res/values-ne/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"अतिथि"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"अतिथि"</string>
<string name="car_add_user" msgid="5245196248349230898">"प्रयोगकर्ता थप्नुहोस्"</string>
<string name="car_new_user" msgid="8142927244990323906">"नयाँ प्रयोगकर्ता"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"तपाईंले नयाँ प्रयोगकर्ता थप्दा ती व्यक्तिले आफ्नो स्थान सेटअप गर्नु पर्छ।"</string>
diff --git a/packages/SystemUI/res/values-nl/strings_car.xml b/packages/SystemUI/res/values-nl/strings_car.xml
index a3fc561641c5..86da41365755 100644
--- a/packages/SystemUI/res/values-nl/strings_car.xml
+++ b/packages/SystemUI/res/values-nl/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gast"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gast"</string>
<string name="car_add_user" msgid="5245196248349230898">"Gebruiker toevoegen"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nieuwe gebruiker"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Wanneer je een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen."</string>
diff --git a/packages/SystemUI/res/values-or/strings_car.xml b/packages/SystemUI/res/values-or/strings_car.xml
index aedec96d3f22..a9be075818aa 100644
--- a/packages/SystemUI/res/values-or/strings_car.xml
+++ b/packages/SystemUI/res/values-or/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ଅତିଥି"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ଅତିଥି"</string>
<string name="car_add_user" msgid="5245196248349230898">"ୟୁଜର୍‍ଙ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string>
<string name="car_new_user" msgid="8142927244990323906">"ନୂଆ ୟୁଜର୍‍"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"ଯେତେବେଳେ ଆପଣ ଜଣେ ନୂଆ ୟୁଜର୍‍ଙ୍କୁ ଯୋଡ଼ିବେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ନିଜ ପାଇଁ ସ୍ପେସ୍‍ ସେଟ‍ଅପ୍ କରିବାକୁ ପଡ଼ିବ।"</string>
diff --git a/packages/SystemUI/res/values-pl/strings_car.xml b/packages/SystemUI/res/values-pl/strings_car.xml
index c6f4c4df9c49..92c5f05c2476 100644
--- a/packages/SystemUI/res/values-pl/strings_car.xml
+++ b/packages/SystemUI/res/values-pl/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gość"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gość"</string>
<string name="car_add_user" msgid="5245196248349230898">"Dodaj użytkownika"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nowy użytkownik"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil."</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings_car.xml b/packages/SystemUI/res/values-pt-rBR/strings_car.xml
index 5e6bab747341..e252e8d80c7f 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings_car.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Visitante"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Visitante"</string>
<string name="car_add_user" msgid="5245196248349230898">"Adicionar usuário"</string>
<string name="car_new_user" msgid="8142927244990323906">"Novo usuário"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings_car.xml b/packages/SystemUI/res/values-pt-rPT/strings_car.xml
index 5850c50980dc..386496debc9c 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings_car.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Convidado"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Convidado"</string>
<string name="car_add_user" msgid="5245196248349230898">"Adicionar utilizador"</string>
<string name="car_new_user" msgid="8142927244990323906">"Novo utilizador"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço."</string>
diff --git a/packages/SystemUI/res/values-pt/strings_car.xml b/packages/SystemUI/res/values-pt/strings_car.xml
index 5e6bab747341..e252e8d80c7f 100644
--- a/packages/SystemUI/res/values-pt/strings_car.xml
+++ b/packages/SystemUI/res/values-pt/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Visitante"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Visitante"</string>
<string name="car_add_user" msgid="5245196248349230898">"Adicionar usuário"</string>
<string name="car_new_user" msgid="8142927244990323906">"Novo usuário"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>
diff --git a/packages/SystemUI/res/values-ro/strings_car.xml b/packages/SystemUI/res/values-ro/strings_car.xml
index 41713d1edb71..ba23df633771 100644
--- a/packages/SystemUI/res/values-ro/strings_car.xml
+++ b/packages/SystemUI/res/values-ro/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Invitat"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Invitat"</string>
<string name="car_add_user" msgid="5245196248349230898">"Adăugați un utilizator"</string>
<string name="car_new_user" msgid="8142927244990323906">"Utilizator nou"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul."</string>
diff --git a/packages/SystemUI/res/values-ru/strings_car.xml b/packages/SystemUI/res/values-ru/strings_car.xml
index f8418ac9eaca..0ccf16eabca3 100644
--- a/packages/SystemUI/res/values-ru/strings_car.xml
+++ b/packages/SystemUI/res/values-ru/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Гость"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Гость"</string>
<string name="car_add_user" msgid="5245196248349230898">"Добавить пользователя"</string>
<string name="car_new_user" msgid="8142927244990323906">"Новый пользователь"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Когда вы добавите пользователя, ему потребуется настроить профиль."</string>
diff --git a/packages/SystemUI/res/values-si/strings_car.xml b/packages/SystemUI/res/values-si/strings_car.xml
index 656696cda96b..0796d27f6318 100644
--- a/packages/SystemUI/res/values-si/strings_car.xml
+++ b/packages/SystemUI/res/values-si/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"අමුත්තා"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"අමුත්තා"</string>
<string name="car_add_user" msgid="5245196248349230898">"පරිශීලක එක් කරන්න"</string>
<string name="car_new_user" msgid="8142927244990323906">"නව පරිශීලක"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"ඔබ අලුත් පරිශීලකයෙක් එක් කරන විට, එම පුද්ගලයාට තමන්ගේ ඉඩ සකසා ගැනීමට අවශ්‍ය වේ."</string>
diff --git a/packages/SystemUI/res/values-sk/strings_car.xml b/packages/SystemUI/res/values-sk/strings_car.xml
index 2d5c2ba17a57..408c55c35dd6 100644
--- a/packages/SystemUI/res/values-sk/strings_car.xml
+++ b/packages/SystemUI/res/values-sk/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Hosť"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Hosť"</string>
<string name="car_add_user" msgid="5245196248349230898">"Pridať používateľa"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nový používateľ"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string>
diff --git a/packages/SystemUI/res/values-sl/strings_car.xml b/packages/SystemUI/res/values-sl/strings_car.xml
index bb122b43b966..1efe69fa2b8a 100644
--- a/packages/SystemUI/res/values-sl/strings_car.xml
+++ b/packages/SystemUI/res/values-sl/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gost"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gost"</string>
<string name="car_add_user" msgid="5245196248349230898">"Dodaj uporabnika"</string>
<string name="car_new_user" msgid="8142927244990323906">"Nov uporabnik"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor."</string>
diff --git a/packages/SystemUI/res/values-sq/strings_car.xml b/packages/SystemUI/res/values-sq/strings_car.xml
index 7dc7dd56a9c2..e2bfc00c471f 100644
--- a/packages/SystemUI/res/values-sq/strings_car.xml
+++ b/packages/SystemUI/res/values-sq/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"I ftuar"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"I ftuar"</string>
<string name="car_add_user" msgid="5245196248349230898">"Shto përdorues"</string>
<string name="car_new_user" msgid="8142927244990323906">"Përdorues i ri"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet."</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index da303921b881..2ecac356e6e1 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -375,7 +375,7 @@
<string name="quick_step_accessibility_toggle_overview" msgid="7171470775439860480">"Укључи/искључи преглед"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Напуњена је"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Пуњење"</string>
- <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> док се не напуни"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> до краја пуњења"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"Не пуни се"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Мрежа се можда\nнадгледа"</string>
<string name="description_target_search" msgid="3091587249776033139">"Претрага"</string>
diff --git a/packages/SystemUI/res/values-sr/strings_car.xml b/packages/SystemUI/res/values-sr/strings_car.xml
index 801114dd5ac9..2ee8b0125adf 100644
--- a/packages/SystemUI/res/values-sr/strings_car.xml
+++ b/packages/SystemUI/res/values-sr/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Гост"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Гост"</string>
<string name="car_add_user" msgid="5245196248349230898">"Додај корисника"</string>
<string name="car_new_user" msgid="8142927244990323906">"Нови корисник"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Када додате новог корисника, та особа треба да подеси свој простор."</string>
diff --git a/packages/SystemUI/res/values-sv/strings_car.xml b/packages/SystemUI/res/values-sv/strings_car.xml
index fb801ad24abd..754d62866839 100644
--- a/packages/SystemUI/res/values-sv/strings_car.xml
+++ b/packages/SystemUI/res/values-sv/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Gäst"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Gäst"</string>
<string name="car_add_user" msgid="5245196248349230898">"Lägg till användare"</string>
<string name="car_new_user" msgid="8142927244990323906">"Ny användare"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme."</string>
diff --git a/packages/SystemUI/res/values-sw/strings_car.xml b/packages/SystemUI/res/values-sw/strings_car.xml
index bf7fb5b99b0f..0c664acf127e 100644
--- a/packages/SystemUI/res/values-sw/strings_car.xml
+++ b/packages/SystemUI/res/values-sw/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Mgeni"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Mgeni"</string>
<string name="car_add_user" msgid="5245196248349230898">"Ongeza Mtumiaji"</string>
<string name="car_new_user" msgid="8142927244990323906">"Mtumiaji Mpya"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Ukiongeza mtumiaji mpya, ni lazima aweke kikundi chake."</string>
diff --git a/packages/SystemUI/res/values-sw720dp/donottranslate.xml b/packages/SystemUI/res/values-sw720dp/donottranslate.xml
deleted file mode 100644
index 09960673a53e..000000000000
--- a/packages/SystemUI/res/values-sw720dp/donottranslate.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. %1$s is DOW, %2$s is date.
- We show both (DOW on one line, then the date) but this can be overridden for locales as
- necessary.
- -->
- <string name="status_bar_date_formatter">%1$s\n%2$s</string>
-
-</resources>
-
diff --git a/packages/SystemUI/res/values-ta/strings_car.xml b/packages/SystemUI/res/values-ta/strings_car.xml
index 731c275591f7..226e3d950b46 100644
--- a/packages/SystemUI/res/values-ta/strings_car.xml
+++ b/packages/SystemUI/res/values-ta/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"விருந்தினர்"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"விருந்தினர்"</string>
<string name="car_add_user" msgid="5245196248349230898">"பயனரைச் சேர்க்கவும்"</string>
<string name="car_new_user" msgid="8142927244990323906">"புதிய பயனர்"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்."</string>
diff --git a/packages/SystemUI/res/values-te/strings_car.xml b/packages/SystemUI/res/values-te/strings_car.xml
index ec7a779fedae..0fc29bc10321 100644
--- a/packages/SystemUI/res/values-te/strings_car.xml
+++ b/packages/SystemUI/res/values-te/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"అతిథి"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"అతిథి"</string>
<string name="car_add_user" msgid="5245196248349230898">"వినియోగదారును జోడించండి"</string>
<string name="car_new_user" msgid="8142927244990323906">"కొత్త వినియోగదారు"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"మీరు కొత్త వినియోగదారును జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి."</string>
diff --git a/packages/SystemUI/res/values-th/strings_car.xml b/packages/SystemUI/res/values-th/strings_car.xml
index 17f9b8f8e725..44b2e622e886 100644
--- a/packages/SystemUI/res/values-th/strings_car.xml
+++ b/packages/SystemUI/res/values-th/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"ผู้มาเยือน"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"ผู้มาเยือน"</string>
<string name="car_add_user" msgid="5245196248349230898">"เพิ่มผู้ใช้"</string>
<string name="car_new_user" msgid="8142927244990323906">"ผู้ใช้ใหม่"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง"</string>
diff --git a/packages/SystemUI/res/values-tl/strings_car.xml b/packages/SystemUI/res/values-tl/strings_car.xml
index 0707b2c5d6ab..7458f28492ac 100644
--- a/packages/SystemUI/res/values-tl/strings_car.xml
+++ b/packages/SystemUI/res/values-tl/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Bisita"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Bisita"</string>
<string name="car_add_user" msgid="5245196248349230898">"Magdagdag ng User"</string>
<string name="car_new_user" msgid="8142927244990323906">"Bagong User"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo."</string>
diff --git a/packages/SystemUI/res/values-tr/donottranslate.xml b/packages/SystemUI/res/values-tr/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-tr/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-tr/strings_car.xml b/packages/SystemUI/res/values-tr/strings_car.xml
index 6dc7e5d17778..1ccb206cbe8c 100644
--- a/packages/SystemUI/res/values-tr/strings_car.xml
+++ b/packages/SystemUI/res/values-tr/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Misafir"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Misafir"</string>
<string name="car_add_user" msgid="5245196248349230898">"Kullanıcı Ekle"</string>
<string name="car_new_user" msgid="8142927244990323906">"Yeni Kullanıcı"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Yeni kullanıcı eklediğinizde, bu kişinin kendi alanını ayarlaması gerekir."</string>
diff --git a/packages/SystemUI/res/values-uk/strings_car.xml b/packages/SystemUI/res/values-uk/strings_car.xml
index 2d36a4b1ddb4..d0f99549602c 100644
--- a/packages/SystemUI/res/values-uk/strings_car.xml
+++ b/packages/SystemUI/res/values-uk/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Гість"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Гість"</string>
<string name="car_add_user" msgid="5245196248349230898">"Додати користувача"</string>
<string name="car_new_user" msgid="8142927244990323906">"Новий користувач"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Коли ви додаєте нового користувача, він має налаштувати свій профіль."</string>
diff --git a/packages/SystemUI/res/values-ur/strings_car.xml b/packages/SystemUI/res/values-ur/strings_car.xml
index 6a85f5612e6a..557c2322932d 100644
--- a/packages/SystemUI/res/values-ur/strings_car.xml
+++ b/packages/SystemUI/res/values-ur/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"مہمان"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"مہمان"</string>
<string name="car_add_user" msgid="5245196248349230898">"صارف شامل کریں"</string>
<string name="car_new_user" msgid="8142927244990323906">"نیا صارف"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔"</string>
diff --git a/packages/SystemUI/res/values-uz/strings_car.xml b/packages/SystemUI/res/values-uz/strings_car.xml
index ad4faf66c71b..2916a00456ae 100644
--- a/packages/SystemUI/res/values-uz/strings_car.xml
+++ b/packages/SystemUI/res/values-uz/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Mehmon"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Mehmon"</string>
<string name="car_add_user" msgid="5245196248349230898">"Foydalanuvchi qo‘shish"</string>
<string name="car_new_user" msgid="8142927244990323906">"Yangi foydalanuvchi"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Yangi profil qo‘shilgach, uni sozlash lozim."</string>
diff --git a/packages/SystemUI/res/values-vi/strings_car.xml b/packages/SystemUI/res/values-vi/strings_car.xml
index ad9bc9e085cc..f3f8d5f2211a 100644
--- a/packages/SystemUI/res/values-vi/strings_car.xml
+++ b/packages/SystemUI/res/values-vi/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Khách"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Khách"</string>
<string name="car_add_user" msgid="5245196248349230898">"Thêm người dùng"</string>
<string name="car_new_user" msgid="8142927244990323906">"Người dùng mới"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Khi bạn thêm một người dùng mới, người đó cần thiết lập không gian của họ."</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/donottranslate.xml b/packages/SystemUI/res/values-zh-rCN/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-zh-rCN/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings_car.xml b/packages/SystemUI/res/values-zh-rCN/strings_car.xml
index 8dbb846a5acb..a600429d8403 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings_car.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"访客"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"访客"</string>
<string name="car_add_user" msgid="5245196248349230898">"添加用户"</string>
<string name="car_new_user" msgid="8142927244990323906">"新用户"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"当您添加新用户时,该用户必须设置自己的空间。"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings_car.xml b/packages/SystemUI/res/values-zh-rHK/strings_car.xml
index ea8836f213fa..7c4bf30d3cd1 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings_car.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"訪客"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"訪客"</string>
<string name="car_add_user" msgid="5245196248349230898">"新增使用者"</string>
<string name="car_new_user" msgid="8142927244990323906">"新使用者"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"新增的使用者需要自行設定個人空間。"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/donottranslate.xml b/packages/SystemUI/res/values-zh-rTW/donottranslate.xml
deleted file mode 100644
index dcf434db111b..000000000000
--- a/packages/SystemUI/res/values-zh-rTW/donottranslate.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- For formatting day of week and date in DateView. Day of week precedes date by default,
- but this may be overridden on a per-locale basis if necessary. -->
- <string name="status_bar_date_formatter">%2$s\n%1$s</string>
-
-</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings_car.xml b/packages/SystemUI/res/values-zh-rTW/strings_car.xml
index 2779c7b16f98..41b72224a688 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings_car.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"訪客"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"訪客"</string>
<string name="car_add_user" msgid="5245196248349230898">"新增使用者"</string>
<string name="car_new_user" msgid="8142927244990323906">"新使用者"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"新增的使用者需要自行設定個人空間。"</string>
diff --git a/packages/SystemUI/res/values-zu/strings_car.xml b/packages/SystemUI/res/values-zu/strings_car.xml
index dc0fec2366fb..c82c3b8488ca 100644
--- a/packages/SystemUI/res/values-zu/strings_car.xml
+++ b/packages/SystemUI/res/values-zu/strings_car.xml
@@ -20,8 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="car_guest" msgid="3738772168718508650">"Isivakashi"</string>
- <!-- no translation found for start_guest_session (7055742120180595689) -->
- <skip />
+ <string name="start_guest_session" msgid="7055742120180595689">"Isivakashi"</string>
<string name="car_add_user" msgid="5245196248349230898">"Engeza umsebenzisi"</string>
<string name="car_new_user" msgid="8142927244990323906">"Umsebenzisi omusha"</string>
<string name="user_add_user_message_setup" msgid="1791011504259527329">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha izikhala zakhe."</string>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
new file mode 100644
index 000000000000..5bbbc52f4cbc
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -0,0 +1,155 @@
+package com.android.keyguard;
+
+import android.content.Context;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextClock;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.plugins.ClockPlugin;
+import com.android.systemui.plugins.PluginListener;
+import com.android.systemui.plugins.PluginManager;
+
+/**
+ * Switch to show plugin clock when plugin is connected, otherwise it will show default clock.
+ */
+public class KeyguardClockSwitch extends FrameLayout {
+ /**
+ * Optional/alternative clock injected via plugin.
+ */
+ private ClockPlugin mClockPlugin;
+ /**
+ * Default clock.
+ */
+ private TextClock mClockView;
+
+ private final PluginListener<ClockPlugin> mClockPluginListener =
+ new PluginListener<ClockPlugin>() {
+ @Override
+ public void onPluginConnected(ClockPlugin plugin, Context pluginContext) {
+ View view = plugin.getView();
+ if (view != null) {
+ mClockPlugin = plugin;
+ addView(view, -1,
+ new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ initPluginParams();
+ mClockView.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onPluginDisconnected(ClockPlugin plugin) {
+ View view = plugin.getView();
+ if (view != null) {
+ mClockPlugin = null;
+ removeView(view);
+ mClockView.setVisibility(View.VISIBLE);
+ }
+ }
+ };
+
+ public KeyguardClockSwitch(Context context) {
+ this(context, null);
+ }
+
+ public KeyguardClockSwitch(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mClockView = findViewById(R.id.default_clock_view);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ Dependency.get(PluginManager.class).addPluginListener(mClockPluginListener,
+ ClockPlugin.class);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ Dependency.get(PluginManager.class).removePluginListener(mClockPluginListener);
+ }
+
+ /**
+ * It will also update plugin setStyle if plugin is connected.
+ */
+ public void setStyle(Style style) {
+ mClockView.getPaint().setStyle(style);
+ if (mClockPlugin != null) {
+ mClockPlugin.setStyle(style);
+ }
+ }
+
+ /**
+ * It will also update plugin setTextColor if plugin is connected.
+ */
+ public void setTextColor(int color) {
+ mClockView.setTextColor(color);
+ if (mClockPlugin != null) {
+ mClockPlugin.setTextColor(color);
+ }
+ }
+
+ public void setShowCurrentUserTime(boolean showCurrentUserTime) {
+ mClockView.setShowCurrentUserTime(showCurrentUserTime);
+ }
+
+ public void setElegantTextHeight(boolean elegant) {
+ mClockView.setElegantTextHeight(elegant);
+ }
+
+ public void setTextSize(int unit, float size) {
+ mClockView.setTextSize(unit, size);
+ }
+
+ public void setFormat12Hour(CharSequence format) {
+ mClockView.setFormat12Hour(format);
+ }
+
+ public void setFormat24Hour(CharSequence format) {
+ mClockView.setFormat24Hour(format);
+ }
+
+ public Paint getPaint() {
+ return mClockView.getPaint();
+ }
+
+ public int getCurrentTextColor() {
+ return mClockView.getCurrentTextColor();
+ }
+
+ public float getTextSize() {
+ return mClockView.getTextSize();
+ }
+
+ public void refresh() {
+ mClockView.refresh();
+ }
+
+ /**
+ * When plugin changes, set all kept parameters into newer plugin.
+ */
+ private void initPluginParams() {
+ if (mClockPlugin != null) {
+ mClockPlugin.setStyle(getPaint().getStyle());
+ mClockPlugin.setTextColor(getCurrentTextColor());
+ }
+ }
+
+ @VisibleForTesting (otherwise = VisibleForTesting.NONE)
+ PluginListener getClockPluginListener() {
+ return mClockPluginListener;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 6da143c0e083..6d1313c15106 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -39,7 +39,6 @@ import android.util.TypedValue;
import android.view.View;
import android.widget.GridLayout;
import android.widget.RelativeLayout;
-import android.widget.TextClock;
import android.widget.TextView;
import com.android.internal.widget.LockPatternUtils;
@@ -64,7 +63,7 @@ public class KeyguardStatusView extends GridLayout implements
private final float mSmallClockScale;
private TextView mLogoutView;
- private TextClock mClockView;
+ private KeyguardClockSwitch mClockView;
private View mClockSeparator;
private TextView mOwnerInfo;
private KeyguardSliceView mKeyguardSlice;
@@ -248,7 +247,7 @@ public class KeyguardStatusView extends GridLayout implements
.scaleX(clockScale)
.scaleY(clockScale)
.withEndAction(() -> {
- mClockView.getPaint().setStyle(style);
+ mClockView.setStyle(style);
mClockView.invalidate();
})
.start();
@@ -256,7 +255,7 @@ public class KeyguardStatusView extends GridLayout implements
mClockView.setY(top);
mClockView.setScaleX(clockScale);
mClockView.setScaleY(clockScale);
- mClockView.getPaint().setStyle(style);
+ mClockView.setStyle(style);
mClockView.invalidate();
}
} else if (view == mClockSeparator) {
diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
index 3c44eb42ffca..0864ff03a9db 100644
--- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
@@ -55,6 +55,7 @@ import java.util.List;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP;
+import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON;
import static com.android.systemui.shared.system.NavigationBarCompat.InteractionType;
/**
@@ -69,6 +70,10 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
private static final long BACKOFF_MILLIS = 1000;
private static final long DEFERRED_CALLBACK_MILLIS = 5000;
+ // Default interaction flags if swipe up is disabled before connecting to launcher
+ private static final int DEFAULT_DISABLE_SWIPE_UP_STATE = FLAG_DISABLE_SWIPE_UP
+ | FLAG_SHOW_OVERVIEW_BUTTON;
+
private final Context mContext;
private final Handler mHandler;
private final Runnable mConnectionRunnable = this::internalConnectToCurrentUser;
@@ -220,7 +225,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
// When launcher service is disabled, reset interaction flags because it is inactive
if (!isEnabled()) {
- mInteractionFlags = 0;
+ mInteractionFlags = getDefaultInteractionFlags();
Prefs.remove(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS);
}
@@ -300,7 +305,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
com.android.internal.R.string.config_recentsComponentName));
mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
.setPackage(mRecentsComponentName.getPackageName());
- mInteractionFlags = Prefs.getInt(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS, 0);
+ mInteractionFlags = Prefs.getInt(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS,
+ getDefaultInteractionFlags());
// Listen for the package update changes.
if (SystemServicesProxy.getInstance(context)
@@ -397,6 +403,15 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
}
+ private int getDefaultInteractionFlags() {
+ // If there is no settings available use device default or get it from settings
+ final boolean defaultState = getSwipeUpDefaultValue();
+ final boolean swipeUpEnabled = getSwipeUpSettingAvailable()
+ ? getSwipeUpEnabledFromSettings(defaultState)
+ : defaultState;
+ return swipeUpEnabled ? 0 : DEFAULT_DISABLE_SWIPE_UP_STATE;
+ }
+
private void notifyBackButtonAlphaChanged(float alpha, boolean animate) {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
mConnectionCallbacks.get(i).onBackButtonAlphaChanged(alpha, animate);
@@ -427,6 +442,21 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;
}
+ private boolean getSwipeUpDefaultValue() {
+ return mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_swipe_up_gesture_default);
+ }
+
+ private boolean getSwipeUpSettingAvailable() {
+ return mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_swipe_up_gesture_setting_available);
+ }
+
+ private boolean getSwipeUpEnabledFromSettings(boolean defaultValue) {
+ return Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.SWIPE_UP_TO_SWITCH_APPS_ENABLED, defaultValue ? 1 : 0) == 1;
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(TAG_OPS + " state:");
@@ -440,12 +470,10 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
pw.print(" quickStepIntent="); pw.println(mQuickStepIntent);
pw.print(" quickStepIntentResolved="); pw.println(isEnabled());
- final int swipeUpDefaultValue = mContext.getResources()
- .getBoolean(com.android.internal.R.bool.config_swipe_up_gesture_default) ? 1 : 0;
- final int swipeUpEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.SWIPE_UP_TO_SWITCH_APPS_ENABLED, swipeUpDefaultValue);
- pw.print(" swipeUpSetting="); pw.println(swipeUpEnabled != 0);
- pw.print(" swipeUpSettingDefault="); pw.println(swipeUpDefaultValue != 0);
+ final boolean swipeUpDefaultValue = getSwipeUpDefaultValue();
+ final boolean swipeUpEnabled = getSwipeUpEnabledFromSettings(swipeUpDefaultValue);
+ pw.print(" swipeUpSetting="); pw.println(swipeUpEnabled);
+ pw.print(" swipeUpSettingDefault="); pw.println(swipeUpDefaultValue);
}
public interface OverviewProxyListener {
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 68d77eb8a9ac..520e40aa1e56 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -43,12 +43,9 @@ import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.Region;
import android.hardware.display.DisplayManager;
-import android.os.Handler;
-import android.os.HandlerThread;
import android.os.SystemProperties;
import android.provider.Settings.Secure;
import android.util.DisplayMetrics;
-import android.util.Log;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
import android.view.Gravity;
@@ -63,7 +60,6 @@ import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import com.android.internal.util.Preconditions;
import com.android.systemui.RegionInterceptingFrameLayout.RegionInterceptableView;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
@@ -83,9 +79,6 @@ import androidx.annotation.VisibleForTesting;
* for antialiasing and emulation purposes.
*/
public class ScreenDecorations extends SystemUI implements Tunable {
- private static final boolean DEBUG = false;
- private static final String TAG = "ScreenDecorations";
-
public static final String SIZE = "sysui_rounded_size";
public static final String PADDING = "sysui_rounded_content_padding";
private static final boolean DEBUG_SCREENSHOT_ROUNDED_CORNERS =
@@ -106,23 +99,9 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private DisplayCutoutView mCutoutBottom;
private SecureSetting mColorInversionSetting;
private boolean mPendingRotationChange;
- private Handler mHandler;
@Override
public void start() {
- mHandler = startHandlerThread();
- mHandler.post(this::startOnScreenDecorationsThread);
- setupStatusBarPaddingIfNeeded();
- }
-
- @VisibleForTesting
- Handler startHandlerThread() {
- HandlerThread thread = new HandlerThread("ScreenDecorations");
- thread.start();
- return thread.getThreadHandler();
- }
-
- private void startOnScreenDecorationsThread() {
mWindowManager = mContext.getSystemService(WindowManager.class);
mRoundedDefault = mContext.getResources().getDimensionPixelSize(
R.dimen.rounded_corner_radius);
@@ -134,6 +113,12 @@ public class ScreenDecorations extends SystemUI implements Tunable {
setupDecorations();
}
+ int padding = mContext.getResources().getDimensionPixelSize(
+ R.dimen.rounded_corner_content_padding);
+ if (padding != 0) {
+ setupPadding(padding);
+ }
+
mDisplayListener = new DisplayManager.DisplayListener() {
@Override
public void onDisplayAdded(int displayId) {
@@ -147,8 +132,8 @@ public class ScreenDecorations extends SystemUI implements Tunable {
@Override
public void onDisplayChanged(int displayId) {
- final int newRotation = RotationUtils.getExactRotation(mContext);
- if (mOverlay != null && mBottomOverlay != null && mRotation != newRotation) {
+ if ((hasRoundedCorners() || shouldDrawCutout()) &&
+ mRotation != RotationUtils.getExactRotation(mContext)) {
// We cannot immediately update the orientation. Otherwise
// WindowManager is still deferring layout until it has finished dispatching
// the config changes, which may cause divergence between what we draw
@@ -157,15 +142,10 @@ public class ScreenDecorations extends SystemUI implements Tunable {
// - we are trying to redraw. This because WM resized our window and told us to.
// - the config change has been dispatched, so WM is no longer deferring layout.
mPendingRotationChange = true;
- if (DEBUG) {
- Log.i(TAG, "Rotation changed, deferring " + newRotation + ", staying at "
- + mRotation);
- }
-
mOverlay.getViewTreeObserver().addOnPreDrawListener(
- new RestartingPreDrawListener(mOverlay, newRotation));
+ new RestartingPreDrawListener(mOverlay));
mBottomOverlay.getViewTreeObserver().addOnPreDrawListener(
- new RestartingPreDrawListener(mBottomOverlay, newRotation));
+ new RestartingPreDrawListener(mBottomOverlay));
}
updateOrientation();
}
@@ -174,7 +154,7 @@ public class ScreenDecorations extends SystemUI implements Tunable {
mRotation = -1;
mDisplayManager = (DisplayManager) mContext.getSystemService(
Context.DISPLAY_SERVICE);
- mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);
+ mDisplayManager.registerDisplayListener(mDisplayListener, null);
}
private void setupDecorations() {
@@ -204,11 +184,10 @@ public class ScreenDecorations extends SystemUI implements Tunable {
mWindowManager.getDefaultDisplay().getMetrics(metrics);
mDensity = metrics.density;
- Dependency.get(Dependency.MAIN_HANDLER).post(
- () -> Dependency.get(TunerService.class).addTunable(this, SIZE));
+ Dependency.get(TunerService.class).addTunable(this, SIZE);
// Watch color inversion and invert the overlay as needed.
- mColorInversionSetting = new SecureSetting(mContext, mHandler,
+ mColorInversionSetting = new SecureSetting(mContext, Dependency.get(Dependency.MAIN_HANDLER),
Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED) {
@Override
protected void handleValueChanged(int value, boolean observedChange) {
@@ -220,7 +199,7 @@ public class ScreenDecorations extends SystemUI implements Tunable {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_SWITCHED);
- mContext.registerReceiver(mIntentReceiver, filter, null /* permission */, mHandler);
+ mContext.registerReceiver(mIntentReceiver, filter);
mOverlay.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
@@ -238,11 +217,6 @@ public class ScreenDecorations extends SystemUI implements Tunable {
.start();
}
});
-
- mOverlay.getViewTreeObserver().addOnPreDrawListener(
- new ValidatingPreDrawListener(mOverlay));
- mBottomOverlay.getViewTreeObserver().addOnPreDrawListener(
- new ValidatingPreDrawListener(mBottomOverlay));
}
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@@ -272,28 +246,14 @@ public class ScreenDecorations extends SystemUI implements Tunable {
@Override
protected void onConfigurationChanged(Configuration newConfig) {
- mHandler.post(() -> {
- int oldRotation = mRotation;
- mPendingRotationChange = false;
- updateOrientation();
- if (DEBUG) Log.i(TAG, "onConfigChanged from rot " + oldRotation + " to " + mRotation);
- if (shouldDrawCutout() && mOverlay == null) {
- setupDecorations();
- }
- if (mOverlay != null) {
- // Updating the layout params ensures that ViewRootImpl will call relayoutWindow(),
- // which ensures that the forced seamless rotation will end, even if we updated
- // the rotation before window manager was ready (and was still waiting for sending
- // the updated rotation).
- updateLayoutParams();
- }
- });
+ mPendingRotationChange = false;
+ updateOrientation();
+ if (shouldDrawCutout() && mOverlay == null) {
+ setupDecorations();
+ }
}
- private void updateOrientation() {
- Preconditions.checkState(mHandler.getLooper().getThread() == Thread.currentThread(),
- "must call on " + mHandler.getLooper().getThread()
- + ", but was " + Thread.currentThread());
+ protected void updateOrientation() {
if (mPendingRotationChange) {
return;
}
@@ -373,19 +333,7 @@ public class ScreenDecorations extends SystemUI implements Tunable {
com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout);
}
-
- private void setupStatusBarPaddingIfNeeded() {
- // TODO: This should be moved to a more appropriate place, as it is not related to the
- // screen decorations overlay.
- int padding = mContext.getResources().getDimensionPixelSize(
- R.dimen.rounded_corner_content_padding);
- if (padding != 0) {
- setupStatusBarPadding(padding);
- }
-
- }
-
- private void setupStatusBarPadding(int padding) {
+ private void setupPadding(int padding) {
// Add some padding to all the content near the edge of the screen.
StatusBar sb = getComponent(StatusBar.class);
View statusBar = (sb != null ? sb.getStatusBarWindow() : null);
@@ -454,32 +402,30 @@ public class ScreenDecorations extends SystemUI implements Tunable {
@Override
public void onTuningChanged(String key, String newValue) {
- mHandler.post(() -> {
- if (mOverlay == null) return;
- if (SIZE.equals(key)) {
- int size = mRoundedDefault;
- int sizeTop = mRoundedDefaultTop;
- int sizeBottom = mRoundedDefaultBottom;
- if (newValue != null) {
- try {
- size = (int) (Integer.parseInt(newValue) * mDensity);
- } catch (Exception e) {
- }
- }
-
- if (sizeTop == 0) {
- sizeTop = size;
- }
- if (sizeBottom == 0) {
- sizeBottom = size;
+ if (mOverlay == null) return;
+ if (SIZE.equals(key)) {
+ int size = mRoundedDefault;
+ int sizeTop = mRoundedDefaultTop;
+ int sizeBottom = mRoundedDefaultBottom;
+ if (newValue != null) {
+ try {
+ size = (int) (Integer.parseInt(newValue) * mDensity);
+ } catch (Exception e) {
}
+ }
- setSize(mOverlay.findViewById(R.id.left), sizeTop);
- setSize(mOverlay.findViewById(R.id.right), sizeTop);
- setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom);
- setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom);
+ if (sizeTop == 0) {
+ sizeTop = size;
}
- });
+ if (sizeBottom == 0) {
+ sizeBottom = size;
+ }
+
+ setSize(mOverlay.findViewById(R.id.left), sizeTop);
+ setSize(mOverlay.findViewById(R.id.right), sizeTop);
+ setSize(mBottomOverlay.findViewById(R.id.left), sizeBottom);
+ setSize(mBottomOverlay.findViewById(R.id.right), sizeBottom);
+ }
}
private void setSize(View view, int pixelSize) {
@@ -538,11 +484,6 @@ public class ScreenDecorations extends SystemUI implements Tunable {
mVisibilityChangedListener = visibilityChangedListener;
mDecorations = decorations;
setId(R.id.display_cutout);
- if (DEBUG) {
- getViewTreeObserver().addOnDrawListener(() -> Log.i(TAG,
- (mInitialStart ? "OverlayTop" : "OverlayBottom")
- + " drawn in rot " + mRotation));
- }
}
public void setColor(int color) {
@@ -778,66 +719,20 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private class RestartingPreDrawListener implements ViewTreeObserver.OnPreDrawListener {
private final View mView;
- private final int mTargetRotation;
- private RestartingPreDrawListener(View view, int targetRotation) {
+ private RestartingPreDrawListener(View view) {
mView = view;
- mTargetRotation = targetRotation;
}
@Override
public boolean onPreDraw() {
- mView.getViewTreeObserver().removeOnPreDrawListener(this);
-
- if (mTargetRotation == mRotation) {
- if (DEBUG) {
- Log.i(TAG, (mView == mOverlay ? "OverlayTop" : "OverlayBottom")
- + " already in target rot "
- + mTargetRotation + ", allow draw without restarting it");
- }
- return true;
- }
-
mPendingRotationChange = false;
+ mView.getViewTreeObserver().removeOnPreDrawListener(this);
// This changes the window attributes - we need to restart the traversal for them to
// take effect.
updateOrientation();
- if (DEBUG) {
- Log.i(TAG, (mView == mOverlay ? "OverlayTop" : "OverlayBottom")
- + " restarting listener fired, restarting draw for rot " + mRotation);
- }
mView.invalidate();
return false;
}
}
-
- /**
- * A pre-draw listener, that validates that the rotation we draw in matches the displays
- * rotation before continuing the draw.
- *
- * This is to prevent a race condition, where we have not received the display changed event
- * yet, and would thus draw in an old orientation.
- */
- private class ValidatingPreDrawListener implements ViewTreeObserver.OnPreDrawListener {
-
- private final View mView;
-
- public ValidatingPreDrawListener(View view) {
- mView = view;
- }
-
- @Override
- public boolean onPreDraw() {
- final int displayRotation = RotationUtils.getExactRotation(mContext);
- if (displayRotation != mRotation && !mPendingRotationChange) {
- if (DEBUG) {
- Log.i(TAG, "Drawing rot " + mRotation + ", but display is at rot "
- + displayRotation + ". Restarting draw");
- }
- mView.invalidate();
- return false;
- }
- return true;
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/analytics/SensorLoggerSession.java b/packages/SystemUI/src/com/android/systemui/analytics/SensorLoggerSession.java
index f8b73a172516..d6472b7ddbb9 100644
--- a/packages/SystemUI/src/com/android/systemui/analytics/SensorLoggerSession.java
+++ b/packages/SystemUI/src/com/android/systemui/analytics/SensorLoggerSession.java
@@ -101,31 +101,31 @@ public class SensorLoggerSession {
public Session toProto() {
Session proto = new Session();
- proto.setStartTimestampMillis(mStartTimestampMillis);
- proto.setDurationMillis(mEndTimestampMillis - mStartTimestampMillis);
- proto.setBuild(Build.FINGERPRINT);
- proto.setResult(mResult);
- proto.setType(mType);
+ proto.startTimestampMillis = mStartTimestampMillis;
+ proto.durationMillis = mEndTimestampMillis - mStartTimestampMillis;
+ proto.build = Build.FINGERPRINT;
+ proto.result = mResult;
+ proto.type = mType;
proto.sensorEvents = mSensorEvents.toArray(proto.sensorEvents);
proto.touchEvents = mMotionEvents.toArray(proto.touchEvents);
proto.phoneEvents = mPhoneEvents.toArray(proto.phoneEvents);
- proto.setTouchAreaWidth(mTouchAreaWidth);
- proto.setTouchAreaHeight(mTouchAreaHeight);
+ proto.touchAreaWidth = mTouchAreaWidth;
+ proto.touchAreaHeight = mTouchAreaHeight;
return proto;
}
private PhoneEvent phoneEventToProto(int eventType, long sysTimeNanos) {
PhoneEvent proto = new PhoneEvent();
- proto.setType(eventType);
- proto.setTimeOffsetNanos(sysTimeNanos - mStartSystemTimeNanos);
+ proto.type = eventType;
+ proto.timeOffsetNanos = sysTimeNanos - mStartSystemTimeNanos;
return proto;
}
private SensorEvent sensorEventToProto(android.hardware.SensorEvent ev, long sysTimeNanos) {
SensorEvent proto = new SensorEvent();
- proto.setType(ev.sensor.getType());
- proto.setTimeOffsetNanos(sysTimeNanos - mStartSystemTimeNanos);
- proto.setTimestamp(ev.timestamp);
+ proto.type = ev.sensor.getType();
+ proto.timeOffsetNanos = sysTimeNanos - mStartSystemTimeNanos;
+ proto.timestamp = ev.timestamp;
proto.values = ev.values.clone();
return proto;
}
@@ -133,17 +133,17 @@ public class SensorLoggerSession {
private TouchEvent motionEventToProto(MotionEvent ev) {
int count = ev.getPointerCount();
TouchEvent proto = new TouchEvent();
- proto.setTimeOffsetNanos(ev.getEventTimeNano() - mStartSystemTimeNanos);
- proto.setAction(ev.getActionMasked());
- proto.setActionIndex(ev.getActionIndex());
+ proto.timeOffsetNanos = ev.getEventTimeNano() - mStartSystemTimeNanos;
+ proto.action = ev.getActionMasked();
+ proto.actionIndex = ev.getActionIndex();
proto.pointers = new TouchEvent.Pointer[count];
for (int i = 0; i < count; i++) {
TouchEvent.Pointer p = new TouchEvent.Pointer();
- p.setX(ev.getX(i));
- p.setY(ev.getY(i));
- p.setSize(ev.getSize(i));
- p.setPressure(ev.getPressure(i));
- p.setId(ev.getPointerId(i));
+ p.x = ev.getX(i);
+ p.y = ev.getY(i);
+ p.size = ev.getSize(i);
+ p.pressure = ev.getPressure(i);
+ p.id = ev.getPointerId(i);
proto.pointers[i] = p;
}
return proto;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 79de48a17423..1cacdb595be1 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -62,10 +62,10 @@ public class DozeLog {
private static SummaryStats sEmergencyCallStats;
private static SummaryStats[][] sProxStats; // [reason][near/far]
- public static void tracePickupPulse(Context context, boolean withinVibrationThreshold) {
+ public static void tracePickupWakeUp(Context context, boolean withinVibrationThreshold) {
if (!ENABLED) return;
init(context);
- log("pickupPulse withinVibrationThreshold=" + withinVibrationThreshold);
+ log("pickupWakeUp withinVibrationThreshold=" + withinVibrationThreshold);
(withinVibrationThreshold ? sPickupPulseNearVibrationStats
: sPickupPulseNotNearVibrationStats).append();
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index e87bd09561e4..18dffa705f2c 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -91,13 +91,13 @@ public class DozeSensors {
false /* touchscreen */),
mPickupSensor = new TriggerSensor(
mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
- Settings.Secure.DOZE_PULSE_ON_PICK_UP,
- config.pulseOnPickupAvailable(),
+ Settings.Secure.DOZE_PICK_UP_GESTURE,
+ config.dozePickupSensorAvailable(),
DozeLog.PULSE_REASON_SENSOR_PICKUP, false /* touchCoords */,
false /* touchscreen */),
new TriggerSensor(
findSensorWithType(config.doubleTapSensorType()),
- Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
+ Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
true /* configured */,
DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP,
dozeParameters.doubleTapReportsTouchCoordinates(),
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index be3e322f598f..4391a44f9904 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -129,7 +129,9 @@ public class DozeTriggers implements DozeMachine.Part {
boolean isPickup = pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP;
boolean isLongPress = pulseReason == DozeLog.PULSE_REASON_SENSOR_LONG_PRESS;
- if (mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT) && !isLongPress) {
+ if (isLongPress) {
+ requestPulse(pulseReason, sensorPerformedProxCheck);
+ } else {
proximityCheckThenCall((result) -> {
if (result == ProximityCheck.RESULT_NEAR) {
// In pocket, drop event.
@@ -138,13 +140,13 @@ public class DozeTriggers implements DozeMachine.Part {
if (isDoubleTap) {
mDozeHost.onDoubleTap(screenX, screenY);
mMachine.wakeUp();
+ } else if (isPickup) {
+ mMachine.wakeUp();
} else {
mDozeHost.extendPulse();
}
}, sensorPerformedProxCheck, pulseReason);
return;
- } else {
- requestPulse(pulseReason, sensorPerformedProxCheck);
}
if (isPickup) {
@@ -152,7 +154,7 @@ public class DozeTriggers implements DozeMachine.Part {
SystemClock.elapsedRealtime() - mNotificationPulseTime;
final boolean withinVibrationThreshold =
timeSinceNotification < mDozeParameters.getPickupVibrationThreshold();
- DozeLog.tracePickupPulse(mContext, withinVibrationThreshold);
+ DozeLog.tracePickupWakeUp(mContext, withinVibrationThreshold);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
index fe8ea34f34c5..c96aa7303236 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
@@ -45,6 +45,7 @@ import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
+import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice;
import androidx.slice.SliceProvider;
import androidx.slice.builders.ListBuilder;
@@ -127,8 +128,8 @@ public class KeyguardSliceProvider extends SliceProvider implements
@Override
public Slice onBindSlice(Uri sliceUri) {
- ListBuilder builder = new ListBuilder(getContext(), mSliceUri);
- builder.addRow(new RowBuilder(builder, mDateUri).setTitle(mLastText));
+ ListBuilder builder = new ListBuilder(getContext(), mSliceUri, ListBuilder.INFINITY);
+ builder.addRow(new RowBuilder(mDateUri).setTitle(mLastText));
addNextAlarm(builder);
addZenMode(builder);
addPrimaryAction(builder);
@@ -139,11 +140,13 @@ public class KeyguardSliceProvider extends SliceProvider implements
// Add simple action because API requires it; Keyguard handles presenting
// its own slices so this action + icon are actually never used.
PendingIntent pi = PendingIntent.getActivity(getContext(), 0, new Intent(), 0);
- Icon icon = Icon.createWithResource(getContext(), R.drawable.ic_access_alarms_big);
- SliceAction action = new SliceAction(pi, icon, mLastText);
+ IconCompat icon = IconCompat.createWithResource(getContext(),
+ R.drawable.ic_access_alarms_big);
+ SliceAction action = SliceAction.createDeeplink(pi, icon,
+ ListBuilder.ICON_IMAGE, mLastText);
- RowBuilder primaryActionRow = new RowBuilder(builder, Uri.parse(KEYGUARD_ACTION_URI))
- .setPrimaryAction(action);
+ RowBuilder primaryActionRow = new RowBuilder(Uri.parse(KEYGUARD_ACTION_URI))
+ .setPrimaryAction(action);
builder.addRow(primaryActionRow);
}
@@ -152,10 +155,11 @@ public class KeyguardSliceProvider extends SliceProvider implements
return;
}
- Icon alarmIcon = Icon.createWithResource(getContext(), R.drawable.ic_access_alarms_big);
- RowBuilder alarmRowBuilder = new RowBuilder(builder, mAlarmUri)
+ IconCompat alarmIcon = IconCompat.createWithResource(getContext(),
+ R.drawable.ic_access_alarms_big);
+ RowBuilder alarmRowBuilder = new RowBuilder(mAlarmUri)
.setTitle(mNextAlarm)
- .addEndItem(alarmIcon);
+ .addEndItem(alarmIcon, ListBuilder.ICON_IMAGE);
builder.addRow(alarmRowBuilder);
}
@@ -167,10 +171,11 @@ public class KeyguardSliceProvider extends SliceProvider implements
if (!isDndSuppressingNotifications()) {
return;
}
- RowBuilder dndBuilder = new RowBuilder(builder, mDndUri)
+ RowBuilder dndBuilder = new RowBuilder(mDndUri)
.setContentDescription(getContext().getResources()
.getString(R.string.accessibility_quick_settings_dnd))
- .addEndItem(Icon.createWithResource(getContext(), R.drawable.stat_sys_dnd));
+ .addEndItem(IconCompat.createWithResource(getContext(), R.drawable.stat_sys_dnd),
+ ListBuilder.ICON_IMAGE);
builder.addRow(dndBuilder);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java b/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java
index a1c25772234e..87c64c78edc8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PseudoGridView.java
@@ -47,16 +47,12 @@ public class PseudoGridView extends ViewGroup {
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);
- switch (attr) {
- case R.styleable.PseudoGridView_numColumns:
- mNumColumns = a.getInt(attr, 3);
- break;
- case R.styleable.PseudoGridView_verticalSpacing:
- mVerticalSpacing = a.getDimensionPixelSize(attr, 0);
- break;
- case R.styleable.PseudoGridView_horizontalSpacing:
- mHorizontalSpacing = a.getDimensionPixelSize(attr, 0);
- break;
+ if (attr == R.styleable.PseudoGridView_numColumns) {
+ mNumColumns = a.getInt(attr, 3);
+ } else if (attr == R.styleable.PseudoGridView_verticalSpacing) {
+ mVerticalSpacing = a.getDimensionPixelSize(attr, 0);
+ } else if (attr == R.styleable.PseudoGridView_horizontalSpacing) {
+ mHorizontalSpacing = a.getDimensionPixelSize(attr, 0);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java
index 1e9a618c3324..ad7d1b6b4689 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java
@@ -69,13 +69,10 @@ public class UserDetailItemView extends LinearLayout {
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);
- switch (attr) {
- case R.styleable.UserDetailItemView_regularFontFamily:
- mRegularTypeface = Typeface.create(a.getString(attr), 0 /* style */);
- break;
- case R.styleable.UserDetailItemView_activatedFontFamily:
- mActivatedTypeface = Typeface.create(a.getString(attr), 0 /* style */);
- break;
+ if (attr == R.styleable.UserDetailItemView_regularFontFamily) {
+ mRegularTypeface = Typeface.create(a.getString(attr), 0 /* style */);
+ } else if (attr == R.styleable.UserDetailItemView_activatedFontFamily) {
+ mActivatedTypeface = Typeface.create(a.getString(attr), 0 /* style */);
}
}
a.recycle();
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index 3eb3160b028f..98925b9ba9e5 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -226,22 +226,16 @@ public class DividerView extends FrameLayout implements OnTouchListener,
public boolean performAccessibilityAction(View host, int action, Bundle args) {
int currentPosition = getCurrentPosition();
SnapTarget nextTarget = null;
- switch (action) {
- case R.id.action_move_tl_full:
- nextTarget = mSnapAlgorithm.getDismissEndTarget();
- break;
- case R.id.action_move_tl_70:
- nextTarget = mSnapAlgorithm.getLastSplitTarget();
- break;
- case R.id.action_move_tl_50:
- nextTarget = mSnapAlgorithm.getMiddleTarget();
- break;
- case R.id.action_move_tl_30:
- nextTarget = mSnapAlgorithm.getFirstSplitTarget();
- break;
- case R.id.action_move_rb_full:
- nextTarget = mSnapAlgorithm.getDismissStartTarget();
- break;
+ if (action == R.id.action_move_tl_full) {
+ nextTarget = mSnapAlgorithm.getDismissEndTarget();
+ } else if (action == R.id.action_move_tl_70) {
+ nextTarget = mSnapAlgorithm.getLastSplitTarget();
+ } else if (action == R.id.action_move_tl_50) {
+ nextTarget = mSnapAlgorithm.getMiddleTarget();
+ } else if (action == R.id.action_move_tl_30) {
+ nextTarget = mSnapAlgorithm.getFirstSplitTarget();
+ } else if (action == R.id.action_move_rb_full) {
+ nextTarget = mSnapAlgorithm.getDismissStartTarget();
}
if (nextTarget != null) {
startDragging(true /* animate */, false /* touching */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
new file mode 100644
index 000000000000..c0171048e974
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
@@ -0,0 +1,317 @@
+/*
+ * 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.systemui.statusbar;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
+import android.view.accessibility.AccessibilityEvent;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.statusbar.notification.NotificationData;
+
+import java.util.stream.Stream;
+
+/**
+ * A manager which contains notification alerting functionality, providing methods to add and
+ * remove notifications that appear on screen for a period of time and dismiss themselves at the
+ * appropriate time. These include heads up notifications and ambient pulses.
+ */
+public abstract class AlertingNotificationManager {
+ private static final String TAG = "AlertNotifManager";
+ protected final Clock mClock = new Clock();
+ protected final ArrayMap<String, AlertEntry> mAlertEntries = new ArrayMap<>();
+ protected int mMinimumDisplayTime;
+ protected int mAutoDismissNotificationDecay;
+ @VisibleForTesting
+ public Handler mHandler = new Handler(Looper.getMainLooper());
+
+ /**
+ * Called when posting a new notification that should alert the user and appear on screen.
+ * Adds the notification to be managed.
+ * @param entry entry to show
+ */
+ public void showNotification(@NonNull NotificationData.Entry entry) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "showNotification");
+ }
+ addAlertEntry(entry);
+ updateNotification(entry.key, true /* alert */);
+ entry.setInterruption();
+ }
+
+ /**
+ * Try to remove the notification. May not succeed if the notification has not been shown long
+ * enough and needs to be kept around.
+ * @param key the key of the notification to remove
+ * @param releaseImmediately force a remove regardless of earliest removal time
+ * @return true if notification is removed, false otherwise
+ */
+ public boolean removeNotification(@NonNull String key, boolean releaseImmediately) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "removeNotification");
+ }
+ AlertEntry alertEntry = mAlertEntries.get(key);
+ if (alertEntry == null) {
+ return true;
+ }
+ if (releaseImmediately || alertEntry.wasShownLongEnough()) {
+ removeAlertEntry(key);
+ } else {
+ alertEntry.removeAsSoonAsPossible();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Called when the notification state has been updated.
+ * @param key the key of the entry that was updated
+ * @param alert whether the notification should alert again and force reevaluation of
+ * removal time
+ */
+ public void updateNotification(@NonNull String key, boolean alert) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "updateNotification");
+ }
+
+ AlertEntry alertEntry = mAlertEntries.get(key);
+ if (alertEntry == null) {
+ // the entry was released before this update (i.e by a listener) This can happen
+ // with the groupmanager
+ return;
+ }
+
+ alertEntry.mEntry.row.sendAccessibilityEvent(
+ AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ if (alert) {
+ alertEntry.updateEntry(true /* updatePostTime */);
+ }
+ }
+
+ /**
+ * Clears all managed notifications.
+ */
+ public void releaseAllImmediately() {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "releaseAllImmediately");
+ }
+ // A copy is necessary here as we are changing the underlying map. This would cause
+ // undefined behavior if we iterated over the key set directly.
+ ArraySet<String> keysToRemove = new ArraySet<>(mAlertEntries.keySet());
+ for (String key : keysToRemove) {
+ removeAlertEntry(key);
+ }
+ }
+
+ /**
+ * Returns the entry if it is managed by this manager.
+ * @param key key of notification
+ * @return the entry
+ */
+ @Nullable
+ public NotificationData.Entry getEntry(@NonNull String key) {
+ AlertEntry entry = mAlertEntries.get(key);
+ return entry != null ? entry.mEntry : null;
+ }
+
+ /**
+ * Returns the stream of all current notifications managed by this manager.
+ * @return all entries
+ */
+ @NonNull
+ public Stream<NotificationData.Entry> getAllEntries() {
+ return mAlertEntries.values().stream().map(headsUpEntry -> headsUpEntry.mEntry);
+ }
+
+ /**
+ * Whether or not there are any active alerting notifications.
+ * @return true if there is an alert, false otherwise
+ */
+ public boolean hasNotifications() {
+ return !mAlertEntries.isEmpty();
+ }
+
+ /**
+ * Whether or not the given notification is alerting and managed by this manager.
+ * @return true if the notification is alerting
+ */
+ public boolean contains(@NonNull String key) {
+ return mAlertEntries.containsKey(key);
+ }
+
+ /**
+ * Add a new entry and begin managing it.
+ * @param entry the entry to add
+ */
+ protected final void addAlertEntry(@NonNull NotificationData.Entry entry) {
+ AlertEntry alertEntry = createAlertEntry();
+ alertEntry.setEntry(entry);
+ mAlertEntries.put(entry.key, alertEntry);
+ onAlertEntryAdded(alertEntry);
+ entry.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ }
+
+ /**
+ * Manager-specific logic that should occur when an entry is added.
+ * @param alertEntry alert entry added
+ */
+ protected abstract void onAlertEntryAdded(@NonNull AlertEntry alertEntry);
+
+ /**
+ * Remove a notification and reset the alert entry.
+ * @param key key of notification to remove
+ */
+ protected final void removeAlertEntry(@NonNull String key) {
+ AlertEntry alertEntry = mAlertEntries.get(key);
+ if (alertEntry == null) {
+ return;
+ }
+ NotificationData.Entry entry = alertEntry.mEntry;
+ mAlertEntries.remove(key);
+ onAlertEntryRemoved(alertEntry);
+ entry.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ alertEntry.reset();
+ }
+
+ /**
+ * Manager-specific logic that should occur when an alert entry is removed.
+ * @param alertEntry alert entry removed
+ */
+ protected abstract void onAlertEntryRemoved(@NonNull AlertEntry alertEntry);
+
+ /**
+ * Returns a new alert entry instance.
+ * @return a new AlertEntry
+ */
+ protected AlertEntry createAlertEntry() {
+ return new AlertEntry();
+ }
+
+ protected class AlertEntry implements Comparable<AlertEntry> {
+ @Nullable public NotificationData.Entry mEntry;
+ public long mPostTime;
+ public long mEarliestRemovaltime;
+
+ @Nullable protected Runnable mRemoveAlertRunnable;
+
+ public void setEntry(@Nullable final NotificationData.Entry entry) {
+ setEntry(entry, () -> removeAlertEntry(entry.key));
+ }
+
+ public void setEntry(@Nullable final NotificationData.Entry entry,
+ @Nullable Runnable removeAlertRunnable) {
+ mEntry = entry;
+ mRemoveAlertRunnable = removeAlertRunnable;
+
+ mPostTime = calculatePostTime();
+ updateEntry(true /* updatePostTime */);
+ }
+
+ /**
+ * Updates an entry's removal time.
+ * @param updatePostTime whether or not to refresh the post time
+ */
+ public void updateEntry(boolean updatePostTime) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "updateEntry");
+ }
+
+ long currentTime = mClock.currentTimeMillis();
+ mEarliestRemovaltime = currentTime + mMinimumDisplayTime;
+ if (updatePostTime) {
+ mPostTime = Math.max(mPostTime, currentTime);
+ }
+ removeAutoRemovalCallbacks();
+
+ if (!isSticky()) {
+ long finishTime = mPostTime + mAutoDismissNotificationDecay;
+ long removeDelay = Math.max(finishTime - currentTime, mMinimumDisplayTime);
+ mHandler.postDelayed(mRemoveAlertRunnable, removeDelay);
+ }
+ }
+
+ /**
+ * Whether or not the notification is "sticky" i.e. should stay on screen regardless
+ * of the timer and should be removed externally.
+ * @return true if the notification is sticky
+ */
+ protected boolean isSticky() {
+ return false;
+ }
+
+ /**
+ * Whether the notification has been on screen long enough and can be removed.
+ * @return true if the notification has been on screen long enough
+ */
+ public boolean wasShownLongEnough() {
+ return mEarliestRemovaltime < mClock.currentTimeMillis();
+ }
+
+ @Override
+ public int compareTo(@NonNull AlertEntry alertEntry) {
+ return (mPostTime < alertEntry.mPostTime)
+ ? 1 : ((mPostTime == alertEntry.mPostTime)
+ ? mEntry.key.compareTo(alertEntry.mEntry.key) : -1);
+ }
+
+ public void reset() {
+ mEntry = null;
+ removeAutoRemovalCallbacks();
+ mRemoveAlertRunnable = null;
+ }
+
+ /**
+ * Clear any pending removal runnables.
+ */
+ public void removeAutoRemovalCallbacks() {
+ if (mRemoveAlertRunnable != null) {
+ mHandler.removeCallbacks(mRemoveAlertRunnable);
+ }
+ }
+
+ /**
+ * Remove the alert at the earliest allowed removal time.
+ */
+ public void removeAsSoonAsPossible() {
+ if (mRemoveAlertRunnable != null) {
+ removeAutoRemovalCallbacks();
+ mHandler.postDelayed(mRemoveAlertRunnable,
+ mEarliestRemovaltime - mClock.currentTimeMillis());
+ }
+ }
+
+ /**
+ * Calculate what the post time of a notification is at some current time.
+ * @return the post time
+ */
+ protected long calculatePostTime() {
+ return mClock.currentTimeMillis();
+ }
+ }
+
+ protected final static class Clock {
+ public long currentTimeMillis() {
+ return SystemClock.elapsedRealtime();
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index aa07c70f00c2..6c9ca7037305 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.car;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
+import android.car.user.CarUserManagerHelper;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.util.Log;
@@ -28,7 +29,6 @@ import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import com.android.keyguard.KeyguardUpdateMonitor;
-import com.android.settingslib.users.UserManagerHelper;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.Dependency;
import com.android.systemui.Prefs;
@@ -41,6 +41,7 @@ import com.android.systemui.recents.misc.SysUiTaskStackChangeListener;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.car.hvac.HvacController;
+import com.android.systemui.statusbar.car.hvac.TemperatureView;
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -82,6 +83,7 @@ public class CarStatusBar extends StatusBar implements
private ActivityManagerWrapper mActivityManagerWrapper;
private DeviceProvisionedController mDeviceProvisionedController;
private boolean mDeviceIsProvisioned = true;
+ private HvacController mHvacController;
@Override
public void start() {
@@ -95,8 +97,7 @@ public class CarStatusBar extends StatusBar implements
createBatteryController();
mCarBatteryController.startListening();
- Log.d(TAG, "Connecting to HVAC service");
- Dependency.get(HvacController.class).connectToCarService();
+ mHvacController.connectToCarService();
mCarFacetButtonController = Dependency.get(CarFacetButtonController.class);
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
@@ -119,10 +120,11 @@ public class CarStatusBar extends StatusBar implements
* before and after the device is provisioned
*/
private void restartNavBars() {
+ // remove and reattach all hvac components such that we don't keep a reference to unused
+ // ui elements
+ mHvacController.removeAllComponents();
+ addTemperatureViewToController(mStatusBarWindow);
mCarFacetButtonController.removeAll();
-
- Dependency.get(HvacController.class).removeAllComponents();
-
if (mNavigationBarWindow != null) {
mNavigationBarWindow.removeAllViews();
mNavigationBarView = null;
@@ -137,9 +139,22 @@ public class CarStatusBar extends StatusBar implements
mRightNavigationBarWindow.removeAllViews();
mRightNavigationBarView = null;
}
+
buildNavBarContent();
}
+ private void addTemperatureViewToController(View v) {
+ if (v instanceof TemperatureView) {
+ Log.d(TAG, "addTemperatureViewToController: found ");
+ mHvacController.addHvacTextView((TemperatureView) v);
+ } else if (v instanceof ViewGroup) {
+ ViewGroup viewGroup = (ViewGroup) v;
+ for (int i = 0; i < viewGroup.getChildCount(); i++) {
+ addTemperatureViewToController(viewGroup.getChildAt(i));
+ }
+ }
+ }
+
/**
* Allows for showing or hiding just the navigation bars. This is indented to be used when
* the full screen user selector is shown.
@@ -214,6 +229,7 @@ public class CarStatusBar extends StatusBar implements
@Override
protected void makeStatusBarView() {
super.makeStatusBarView();
+ mHvacController = Dependency.get(HvacController.class);
mNotificationPanelBackground = getDefaultWallpaper();
mScrimController.setScrimBehindDrawable(mNotificationPanelBackground);
@@ -226,6 +242,7 @@ public class CarStatusBar extends StatusBar implements
// when a device has connected by bluetooth.
mBatteryMeterView.setVisibility(View.GONE);
});
+ addTemperatureViewToController(mStatusBarWindow);
}
private BatteryController createBatteryController() {
@@ -264,7 +281,6 @@ public class CarStatusBar extends StatusBar implements
private void buildNavBarWindows() {
if (mShowBottom) {
-
mNavigationBarWindow = (ViewGroup) View.inflate(mContext,
R.layout.navigation_bar_window, null);
}
@@ -342,6 +358,7 @@ public class CarStatusBar extends StatusBar implements
throw new RuntimeException("Unable to build botom nav bar due to missing layout");
}
mNavigationBarView.setStatusBar(this);
+ addTemperatureViewToController(mNavigationBarView);
}
private void buildLeft(int layout) {
@@ -352,6 +369,7 @@ public class CarStatusBar extends StatusBar implements
throw new RuntimeException("Unable to build left nav bar due to missing layout");
}
mLeftNavigationBarView.setStatusBar(this);
+ addTemperatureViewToController(mLeftNavigationBarView);
}
@@ -362,6 +380,8 @@ public class CarStatusBar extends StatusBar implements
Log.e(TAG, "CarStatusBar failed inflate for R.layout.car_navigation_bar");
throw new RuntimeException("Unable to build right nav bar due to missing layout");
}
+ mRightNavigationBarView.setStatusBar(this);
+ addTemperatureViewToController(mRightNavigationBarView);
}
@Override
@@ -486,7 +506,7 @@ public class CarStatusBar extends StatusBar implements
@Override
public void updateKeyguardState(boolean goingToFullShade, boolean fromShadeLocked) {
super.updateKeyguardState(goingToFullShade, fromShadeLocked);
- UserManagerHelper helper = new UserManagerHelper(mContext);
+ CarUserManagerHelper helper = new CarUserManagerHelper(mContext);
if (!helper.isHeadlessSystemUser()) {
showUserSwitcher();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
index af0ed284847d..67a76fd86ba7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -18,15 +18,13 @@ package com.android.systemui.statusbar.car;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.car.user.CarUserManagerHelper;
import android.content.Context;
-import android.content.pm.UserInfo;
-import android.util.Log;
import android.view.View;
import android.view.ViewStub;
import androidx.recyclerview.widget.GridLayoutManager;
-import com.android.settingslib.users.UserManagerHelper;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -39,8 +37,7 @@ public class FullscreenUserSwitcher {
private final UserGridRecyclerView mUserGridView;
private final int mShortAnimDuration;
private final StatusBar mStatusBar;
- private final UserManagerHelper mUserManagerHelper;
- private int mCurrentForegroundUserId;
+ private final CarUserManagerHelper mCarUserManagerHelper;
private boolean mShowing;
public FullscreenUserSwitcher(StatusBar statusBar, ViewStub containerStub, Context context) {
@@ -54,15 +51,14 @@ public class FullscreenUserSwitcher {
mUserGridView.buildAdapter();
mUserGridView.setUserSelectionListener(this::onUserSelected);
- mUserManagerHelper = new UserManagerHelper(context);
- updateCurrentForegroundUser();
+ mCarUserManagerHelper = new CarUserManagerHelper(context);
mShortAnimDuration = mContainer.getResources()
.getInteger(android.R.integer.config_shortAnimTime);
}
public void show() {
- if (mUserManagerHelper.isHeadlessSystemUser()) {
+ if (mCarUserManagerHelper.isHeadlessSystemUser()) {
showUserGrid();
}
if (mShowing) {
@@ -78,31 +74,17 @@ public class FullscreenUserSwitcher {
}
public void onUserSwitched(int newUserId) {
- // The logic for foreground user change is needed here to exclude the reboot case. On
- // reboot, system fires ACTION_USER_SWITCHED change from -1 to 0 user. This is not an actual
- // user switch. We only want to trigger keyguard dismissal when foreground user changes.
- if (foregroundUserChanged()) {
- toggleSwitchInProgress(false);
- updateCurrentForegroundUser();
- mParent.post(this::dismissKeyguard);
- }
- }
-
- private boolean foregroundUserChanged() {
- return mCurrentForegroundUserId != mUserManagerHelper.getForegroundUserId();
- }
-
- private void updateCurrentForegroundUser() {
- mCurrentForegroundUserId = mUserManagerHelper.getForegroundUserId();
+ toggleSwitchInProgress(false);
+ mParent.post(this::dismissKeyguard);
}
private void onUserSelected(UserGridRecyclerView.UserRecord record) {
- if (mUserManagerHelper.isHeadlessSystemUser()) {
+ if (mCarUserManagerHelper.isHeadlessSystemUser()) {
hideUserGrid();
}
if (record.mIsForeground || (record.mIsStartGuestSession
- && mUserManagerHelper.foregroundUserIsGuestUser())) {
+ && mCarUserManagerHelper.isForegroundUserGuest())) {
dismissKeyguard();
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
index 23724c29be9b..b376c007bbe4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -22,6 +22,7 @@ import static android.content.DialogInterface.BUTTON_POSITIVE;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
+import android.car.user.CarUserManagerHelper;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.UserInfo;
@@ -42,7 +43,6 @@ import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.util.UserIcons;
-import com.android.settingslib.users.UserManagerHelper;
import com.android.systemui.R;
import com.android.systemui.statusbar.phone.SystemUIDialog;
@@ -54,16 +54,16 @@ import java.util.List;
* One of the uses of this is for the lock screen in auto.
*/
public class UserGridRecyclerView extends PagedListView implements
- UserManagerHelper.OnUsersUpdateListener {
+ CarUserManagerHelper.OnUsersUpdateListener {
private UserSelectionListener mUserSelectionListener;
private UserAdapter mAdapter;
- private UserManagerHelper mUserManagerHelper;
+ private CarUserManagerHelper mCarUserManagerHelper;
private Context mContext;
public UserGridRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
- mUserManagerHelper = new UserManagerHelper(mContext);
+ mCarUserManagerHelper = new CarUserManagerHelper(mContext);
}
/**
@@ -72,7 +72,7 @@ public class UserGridRecyclerView extends PagedListView implements
@Override
public void onFinishInflate() {
super.onFinishInflate();
- mUserManagerHelper.registerOnUsersUpdateListener(this);
+ mCarUserManagerHelper.registerOnUsersUpdateListener(this);
}
/**
@@ -81,7 +81,7 @@ public class UserGridRecyclerView extends PagedListView implements
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
- mUserManagerHelper.unregisterOnUsersUpdateListener();
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(this);
}
/**
@@ -90,7 +90,7 @@ public class UserGridRecyclerView extends PagedListView implements
* @return the adapter
*/
public void buildAdapter() {
- List<UserRecord> userRecords = createUserRecords(mUserManagerHelper
+ List<UserRecord> userRecords = createUserRecords(mCarUserManagerHelper
.getAllUsers());
mAdapter = new UserAdapter(mContext, userRecords);
super.setAdapter(mAdapter);
@@ -103,7 +103,9 @@ public class UserGridRecyclerView extends PagedListView implements
// Don't display guests in the switcher.
continue;
}
- boolean isForeground = mUserManagerHelper.getForegroundUserId() == userInfo.id;
+
+ boolean isForeground =
+ mCarUserManagerHelper.getCurrentForegroundUserId() == userInfo.id;
UserRecord record = new UserRecord(userInfo, false /* isStartGuestSession */,
false /* isAddUser */, isForeground);
userRecords.add(record);
@@ -113,7 +115,7 @@ public class UserGridRecyclerView extends PagedListView implements
userRecords.add(createStartGuestUserRecord());
// Add add user record if the foreground user can add users
- if (mUserManagerHelper.foregroundUserCanAddUsers()) {
+ if (mCarUserManagerHelper.canForegroundUserAddUsers()) {
userRecords.add(createAddUserRecord());
}
@@ -147,7 +149,7 @@ public class UserGridRecyclerView extends PagedListView implements
@Override
public void onUsersUpdate() {
mAdapter.clearUsers();
- mAdapter.updateUsers(createUserRecords(mUserManagerHelper.getAllUsers()));
+ mAdapter.updateUsers(createUserRecords(mCarUserManagerHelper.getAllUsers()));
mAdapter.notifyDataSetChanged();
}
@@ -155,7 +157,7 @@ public class UserGridRecyclerView extends PagedListView implements
* Adapter to populate the grid layout with the available user profiles
*/
public final class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserAdapterViewHolder>
- implements Dialog.OnClickListener {
+ implements Dialog.OnClickListener, Dialog.OnCancelListener {
private final Context mContext;
private List<UserRecord> mUsers;
@@ -210,7 +212,7 @@ public class UserGridRecyclerView extends PagedListView implements
if (userRecord.mIsStartGuestSession) {
notifyUserSelected(userRecord);
- mUserManagerHelper.startNewGuestSession(mGuestName);
+ mCarUserManagerHelper.startNewGuestSession(mGuestName);
return;
}
@@ -231,6 +233,7 @@ public class UserGridRecyclerView extends PagedListView implements
.setMessage(message)
.setNegativeButton(android.R.string.cancel, this)
.setPositiveButton(android.R.string.ok, this)
+ .setOnCancelListener(this)
.create();
// Sets window flags for the SysUI dialog
SystemUIDialog.applyFlags(mDialog);
@@ -239,7 +242,7 @@ public class UserGridRecyclerView extends PagedListView implements
}
// If the user doesn't want to be a guest or add a user, switch to the user selected
notifyUserSelected(userRecord);
- mUserManagerHelper.switchToUser(userRecord.mInfo);
+ mCarUserManagerHelper.switchToUser(userRecord.mInfo);
});
}
@@ -253,7 +256,7 @@ public class UserGridRecyclerView extends PagedListView implements
private Bitmap getUserRecordIcon(UserRecord userRecord) {
if (userRecord.mIsStartGuestSession) {
- return mUserManagerHelper.getGuestDefaultIcon();
+ return mCarUserManagerHelper.getGuestDefaultIcon();
}
if (userRecord.mIsAddUser) {
@@ -261,7 +264,7 @@ public class UserGridRecyclerView extends PagedListView implements
.getDrawable(R.drawable.car_add_circle_round));
}
- return mUserManagerHelper.getUserIcon(userRecord.mInfo);
+ return mCarUserManagerHelper.getUserIcon(userRecord.mInfo);
}
@Override
@@ -277,11 +280,19 @@ public class UserGridRecyclerView extends PagedListView implements
}
}
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ // Enable the add button again if user cancels dialog by clicking outside the dialog
+ if (mAddUserView != null) {
+ mAddUserView.setEnabled(true);
+ }
+ }
+
private class AddNewUserTask extends AsyncTask<String, Void, UserInfo> {
@Override
protected UserInfo doInBackground(String... userNames) {
- return mUserManagerHelper.createNewUser(userNames[0]);
+ return mCarUserManagerHelper.createNewNonAdminUser(userNames[0]);
}
@Override
@@ -291,7 +302,7 @@ public class UserGridRecyclerView extends PagedListView implements
@Override
protected void onPostExecute(UserInfo user) {
if (user != null) {
- mUserManagerHelper.switchToUser(user);
+ mCarUserManagerHelper.switchToUser(user);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java
index 32fd054e8ae6..6c924e3c2c16 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/HvacController.java
@@ -17,7 +17,6 @@
package com.android.systemui.statusbar.car.hvac;
import android.car.Car;
-import android.car.CarNotConnectedException;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.hvac.CarHvacManager;
import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java
index 8143c13b8b55..4d8ce4348319 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/hvac/TemperatureTextView.java
@@ -21,7 +21,6 @@ import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.TextView;
-import com.android.systemui.Dependency;
import com.android.systemui.R;
/**
@@ -31,8 +30,6 @@ import com.android.systemui.R;
* hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
* hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
* hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
- *
- * Note: It registers itself with {@link HvacController}
*/
public class TemperatureTextView extends TextView implements TemperatureView {
@@ -47,10 +44,6 @@ public class TemperatureTextView extends TextView implements TemperatureView {
mPropertyId = typedArray.getInt(R.styleable.TemperatureView_hvacPropertyId, -1);
String format = typedArray.getString(R.styleable.TemperatureView_hvacTempFormat);
mTempFormat = (format == null) ? "%.1f\u00B0" : format;
-
- // register with controller
- HvacController hvacController = Dependency.get(HvacController.class);
- hvacController.addHvacTextView(this);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index dc58cabede20..0ab713829bf4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -487,7 +487,7 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
public void removeNotification(String key, NotificationListenerService.RankingMap ranking) {
boolean deferRemoval = false;
abortExistingInflation(key);
- if (mHeadsUpManager.isHeadsUp(key)) {
+ if (mHeadsUpManager.contains(key)) {
// A cancel() in response to a remote input shouldn't be delayed, as it makes the
// sending look longer than it takes.
// Also we should not defer the removal if reordering isn't allowed since otherwise
@@ -1060,7 +1060,7 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
// We don't want this to be interrupting anymore, lets remove it
mHeadsUpManager.removeNotification(key, false /* ignoreEarliestRemovalTime */);
} else {
- mHeadsUpManager.updateNotification(entry, alertAgain);
+ mHeadsUpManager.updateNotification(entry.key, alertAgain);
}
} else if (shouldPeek && alertAgain) {
// This notification was updated to be a heads-up, show it!
@@ -1069,7 +1069,7 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
}
protected boolean isHeadsUp(String key) {
- return mHeadsUpManager.isHeadsUp(key);
+ return mHeadsUpManager.contains(key);
}
public boolean isNotificationKeptForRemoteInput(String key) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index 67967d43258c..094912b2cdc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -2772,16 +2772,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
case AccessibilityNodeInfo.ACTION_LONG_CLICK:
doLongClickCallback();
return true;
- case R.id.action_snooze:
- NotificationMenuRowPlugin provider = getProvider();
- if (provider == null) {
- provider = createMenu();
+ default:
+ if (action == R.id.action_snooze) {
+ NotificationMenuRowPlugin provider = getProvider();
+ if (provider == null) {
+ provider = createMenu();
+ }
+ MenuItem snoozeMenu = provider.getSnoozeMenuItem(getContext());
+ if (snoozeMenu != null) {
+ doLongClickCallback(getWidth() / 2, getHeight() / 2, snoozeMenu);
+ }
+ return true;
}
- MenuItem snoozeMenu = provider.getSnoozeMenuItem(getContext());
- if (snoozeMenu != null) {
- doLongClickCallback(getWidth() / 2, getHeight() / 2, snoozeMenu);
- }
- return true;
}
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index 8f552e31f5a5..92a9efe743d0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -40,6 +40,8 @@ public class DozeParameters implements TunerService.Tunable {
public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully";
public static final boolean FORCE_NO_BLANKING =
SystemProperties.getBoolean("debug.force_no_blanking", false);
+ public static final boolean FORCE_BLANKING =
+ SystemProperties.getBoolean("debug.force_blanking", false);
private static IntInOutMatcher sPickupSubtypePerformsProxMatcher;
private static DozeParameters sInstance;
@@ -183,7 +185,7 @@ public class DozeParameters implements TunerService.Tunable {
* @return {@code true} if screen needs to be completely black before a power transition.
*/
public boolean getDisplayNeedsBlanking() {
- return !FORCE_NO_BLANKING && mContext.getResources().getBoolean(
+ return FORCE_BLANKING || !FORCE_NO_BLANKING && mContext.getResources().getBoolean(
com.android.internal.R.bool.config_displayBlanksAfterDoze);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index 89107bbeca81..81066f3e3610 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -31,7 +31,6 @@ import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.ScreenDecorations;
@@ -55,7 +54,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
ViewTreeObserver.OnComputeInternalInsetsListener, VisualStabilityManager.Callback,
OnHeadsUpChangedListener, ConfigurationController.ConfigurationListener {
private static final String TAG = "HeadsUpManagerPhone";
- private static final boolean DEBUG = false;
private final View mStatusBarWindowView;
private final NotificationGroupManager mGroupManager;
@@ -114,7 +112,9 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
addListener(new OnHeadsUpChangedListener() {
@Override
public void onHeadsUpPinnedModeChanged(boolean hasPinnedNotification) {
- if (DEBUG) Log.w(TAG, "onHeadsUpPinnedModeChanged");
+ if (Log.isLoggable(TAG, Log.WARN)) {
+ Log.w(TAG, "onHeadsUpPinnedModeChanged");
+ }
updateTouchableRegionListener();
}
});
@@ -153,7 +153,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
*/
public boolean shouldSwallowClick(@NonNull String key) {
HeadsUpManager.HeadsUpEntry entry = getHeadsUpEntry(key);
- return entry != null && mClock.currentTimeMillis() < entry.postTime;
+ return entry != null && mClock.currentTimeMillis() < entry.mPostTime;
}
public void onExpandingFinished() {
@@ -162,9 +162,9 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
mReleaseOnExpandFinish = false;
} else {
for (NotificationData.Entry entry : mEntriesToRemoveAfterExpand) {
- if (isHeadsUp(entry.key)) {
+ if (contains(entry.key)) {
// Maybe the heads-up was removed already
- removeHeadsUpEntry(entry);
+ removeAlertEntry(entry.key);
}
}
}
@@ -235,13 +235,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
}
}
- @VisibleForTesting
- public void removeMinimumDisplayTimeForTesting() {
- mMinimumDisplayTime = 0;
- mHeadsUpNotificationDecay = 0;
- mTouchAcceptanceDelay = 0;
- }
-
///////////////////////////////////////////////////////////////////////////////////////////////
// HeadsUpManager public methods overrides:
@@ -250,12 +243,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
return mTrackingHeadsUp;
}
- @Override
- public void snooze() {
- super.snooze();
- mReleaseOnExpandFinish = true;
- }
-
/**
* React to the removal of the notification in the heads up.
*
@@ -263,14 +250,15 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
* for a bit since it wasn't shown long enough
*/
@Override
- public boolean removeNotification(@NonNull String key, boolean ignoreEarliestRemovalTime) {
- if (wasShownLongEnough(key) || ignoreEarliestRemovalTime) {
- return super.removeNotification(key, ignoreEarliestRemovalTime);
- } else {
- HeadsUpEntryPhone entry = getHeadsUpEntryPhone(key);
- entry.removeAsSoonAsPossible();
- return false;
- }
+ public boolean removeNotification(@NonNull String key, boolean releaseImmediately) {
+ return super.removeNotification(key, canRemoveImmediately(key)
+ || releaseImmediately);
+ }
+
+ @Override
+ public void snooze() {
+ super.snooze();
+ mReleaseOnExpandFinish = true;
}
public void addSwipedOutNotification(@NonNull String key) {
@@ -354,9 +342,9 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
public void onReorderingAllowed() {
mBar.getNotificationScrollLayout().setHeadsUpGoingAwayAnimationsAllowed(false);
for (NotificationData.Entry entry : mEntriesToRemoveWhenReorderingAllowed) {
- if (isHeadsUp(entry.key)) {
+ if (contains(entry.key)) {
// Maybe the heads-up was removed already
- removeHeadsUpEntry(entry);
+ removeAlertEntry(entry.key);
}
}
mEntriesToRemoveWhenReorderingAllowed.clear();
@@ -367,14 +355,14 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
// HeadsUpManager utility (protected) methods overrides:
@Override
- protected HeadsUpEntry createHeadsUpEntry() {
+ protected HeadsUpEntry createAlertEntry() {
return mEntryPool.acquire();
}
@Override
- protected void releaseHeadsUpEntry(HeadsUpEntry entry) {
- entry.reset();
- mEntryPool.release((HeadsUpEntryPhone) entry);
+ protected void onAlertEntryRemoved(AlertEntry alertEntry) {
+ super.onAlertEntryRemoved(alertEntry);
+ mEntryPool.release((HeadsUpEntryPhone) alertEntry);
}
@Override
@@ -394,7 +382,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
@Nullable
private HeadsUpEntryPhone getHeadsUpEntryPhone(@NonNull String key) {
- return (HeadsUpEntryPhone) getHeadsUpEntry(key);
+ return (HeadsUpEntryPhone) mAlertEntries.get(key);
}
@Nullable
@@ -402,7 +390,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
return (HeadsUpEntryPhone) getTopHeadsUpEntry();
}
- private boolean wasShownLongEnough(@NonNull String key) {
+ private boolean canRemoveImmediately(@NonNull String key) {
if (mSwipedOutKeys.contains(key)) {
// We always instantly dismiss views being manually swiped out.
mSwipedOutKeys.remove(key);
@@ -461,33 +449,29 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
mVisualStabilityManager.addReorderingAllowedCallback(
HeadsUpManagerPhone.this);
} else if (!mTrackingHeadsUp) {
- removeHeadsUpEntry(entry);
+ removeAlertEntry(entry.key);
} else {
mEntriesToRemoveAfterExpand.add(entry);
}
};
- super.setEntry(entry, removeHeadsUpRunnable);
- }
-
- public boolean wasShownLongEnough() {
- return earliestRemovaltime < mClock.currentTimeMillis();
+ setEntry(entry, removeHeadsUpRunnable);
}
@Override
public void updateEntry(boolean updatePostTime) {
super.updateEntry(updatePostTime);
- if (mEntriesToRemoveAfterExpand.contains(entry)) {
- mEntriesToRemoveAfterExpand.remove(entry);
+ if (mEntriesToRemoveAfterExpand.contains(mEntry)) {
+ mEntriesToRemoveAfterExpand.remove(mEntry);
}
- if (mEntriesToRemoveWhenReorderingAllowed.contains(entry)) {
- mEntriesToRemoveWhenReorderingAllowed.remove(entry);
+ if (mEntriesToRemoveWhenReorderingAllowed.contains(mEntry)) {
+ mEntriesToRemoveWhenReorderingAllowed.remove(mEntry);
}
}
@Override
- public void expanded(boolean expanded) {
+ public void setExpanded(boolean expanded) {
if (this.expanded == expanded) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index b80cd30914a1..042e4ff16d3a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -103,9 +103,9 @@ public class KeyguardClockPositionAlgorithm {
private float mDarkAmount;
/**
- * If keyguard will just fade away or will require a password.
+ * If keyguard will require a password or just fade away.
*/
- private boolean mFadeAway;
+ private boolean mCurrentlySecure;
/**
* Dozing and receiving a notification (AOD notification.)
@@ -135,7 +135,7 @@ public class KeyguardClockPositionAlgorithm {
public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight,
float panelExpansion, int parentHeight,
- int keyguardStatusHeight, float dark, boolean fadeAway, boolean pulsing,
+ int keyguardStatusHeight, float dark, boolean secure, boolean pulsing,
int bouncerTop) {
mMinTopMargin = minTopMargin + mContainerTopPadding;
mMaxShadeBottom = maxShadeBottom;
@@ -144,7 +144,7 @@ public class KeyguardClockPositionAlgorithm {
mHeight = parentHeight;
mKeyguardStatusHeight = keyguardStatusHeight;
mDarkAmount = dark;
- mFadeAway = fadeAway;
+ mCurrentlySecure = secure;
mPulsing = pulsing;
mBouncerTop = bouncerTop;
}
@@ -198,7 +198,7 @@ public class KeyguardClockPositionAlgorithm {
float clockYRegular = getExpandedClockPosition();
boolean hasEnoughSpace = mMinTopMargin + mKeyguardStatusHeight < mBouncerTop;
- float clockYTarget = !mFadeAway && hasEnoughSpace ?
+ float clockYTarget = mCurrentlySecure && hasEnoughSpace ?
mMinTopMargin : -mKeyguardStatusHeight;
// Move clock up while collapsing the shade
@@ -218,11 +218,11 @@ public class KeyguardClockPositionAlgorithm {
*/
private float getClockAlpha(int y) {
float alphaKeyguard;
- if (mFadeAway) {
+ if (mCurrentlySecure) {
+ alphaKeyguard = 1;
+ } else {
alphaKeyguard = Math.max(0, y / Math.max(1f, getExpandedClockPosition()));
alphaKeyguard = Interpolators.ACCELERATE.getInterpolation(alphaKeyguard);
- } else {
- alphaKeyguard = 1;
}
return MathUtils.lerp(alphaKeyguard, 1f, mDarkAmount);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index ad2e9dcc70bc..b7c1b1088f5a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -265,13 +265,11 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
@Override
public boolean performAccessibilityAction(View host, int action, Bundle args) {
- switch (action) {
- case R.id.action_toggle_overview:
- SysUiServiceProvider.getComponent(getContext(), Recents.class)
- .toggleRecentApps();
- break;
- default:
- return super.performAccessibilityAction(host, action, args);
+ if (action == R.id.action_toggle_overview) {
+ SysUiServiceProvider.getComponent(getContext(), Recents.class)
+ .toggleRecentApps();
+ } else {
+ return super.performAccessibilityAction(host, action, args);
}
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
index 09833d44915d..7b9ed88b8b44 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
@@ -98,6 +98,7 @@ public class NearestTouchFrame extends FrameLayout {
return mClickableChildren
.stream()
.filter(v -> v.isAttachedToWindow())
+ .filter(v -> v.isFocusable())
.map(v -> new Pair<>(distance(v, event), v))
.min(Comparator.comparingInt(f -> f.first))
.get().second;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
index 37c2fdff6c44..c27ccea30963 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
@@ -171,7 +171,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener {
*/
private void cleanUpHeadsUpStatesOnAdd(NotificationGroup group, boolean addIsPending) {
if (!addIsPending && group.hunSummaryOnNextAddition) {
- if (!mHeadsUpManager.isHeadsUp(group.summary.key)) {
+ if (!mHeadsUpManager.contains(group.summary.key)) {
mHeadsUpManager.showNotification(group.summary);
}
group.hunSummaryOnNextAddition = false;
@@ -208,15 +208,17 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener {
NotificationData.Entry entry = children.get(i);
if (onlySummaryAlerts(entry) && entry.row.isHeadsUp()) {
releasedChild = true;
- mHeadsUpManager.releaseImmediately(entry.key);
+ mHeadsUpManager.removeNotification(
+ entry.key, true /* releaseImmediately */);
}
}
if (isolatedChild != null && onlySummaryAlerts(isolatedChild)
&& isolatedChild.row.isHeadsUp()) {
releasedChild = true;
- mHeadsUpManager.releaseImmediately(isolatedChild.key);
+ mHeadsUpManager.removeNotification(
+ isolatedChild.key, true /* releaseImmediately */);
}
- if (releasedChild && !mHeadsUpManager.isHeadsUp(group.summary.key)) {
+ if (releasedChild && !mHeadsUpManager.contains(group.summary.key)) {
boolean notifyImmediately = (numChildren - numPendingChildren) > 1;
if (notifyImmediately) {
mHeadsUpManager.showNotification(group.summary);
@@ -546,8 +548,8 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener {
// the notification is actually already removed, no need to do heads-up on it.
return;
}
- if (mHeadsUpManager.isHeadsUp(child.key)) {
- mHeadsUpManager.updateNotification(child, true);
+ if (mHeadsUpManager.contains(child.key)) {
+ mHeadsUpManager.updateNotification(child.key, true /* alert */);
} else {
if (onlySummaryAlerts(entry)) {
notificationGroup.lastHeadsUpTransfer = SystemClock.elapsedRealtime();
@@ -556,7 +558,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener {
}
}
}
- mHeadsUpManager.releaseImmediately(entry.key);
+ mHeadsUpManager.removeNotification(entry.key, true /* releaseImmediately */);
}
private boolean onlySummaryAlerts(NotificationData.Entry entry) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 0db408c5867f..0a724bd50049 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -536,7 +536,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout {
return 0;
}
- int translation = (int) (mLastVisibleIconState.xTranslation + mIconSize);
+ int translation = (int) (isLayoutRtl() ? getWidth() - mLastVisibleIconState.xTranslation
+ : mLastVisibleIconState.xTranslation + mIconSize);
// There's a chance that last translation goes beyond the edge maybe
return Math.min(getWidth(), translation);
}
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 7db580205ab9..747696376f8f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -92,6 +92,21 @@ public class NotificationPanelView extends PanelView implements
private static final boolean DEBUG = false;
+ /**
+ * Fling expanding QS.
+ */
+ public static final int FLING_EXPAND = 0;
+
+ /**
+ * Fling collapsing QS, potentially stopping when QS becomes QQS.
+ */
+ public static final int FLING_COLLAPSE = 1;
+
+ /**
+ * Fing until QS is completely hidden.
+ */
+ public static final int FLING_HIDE = 2;
+
// Cap and total height of Roboto font. Needs to be adjusted when font for the big clock is
// changed.
private static final int CAP_HEIGHT = 1456;
@@ -524,8 +539,7 @@ public class NotificationPanelView extends PanelView implements
totalHeight,
mKeyguardStatusView.getHeight(),
mInterpolatedDarkAmount,
- !mStatusBar.isKeyguardCurrentlySecure()
- || mStatusBar.isKeyguardOccludeAnimationRunning(),
+ mStatusBar.isKeyguardCurrentlySecure(),
mPulsing,
mBouncerTop);
mClockPositionAlgorithm.run(mClockPositionResult);
@@ -624,7 +638,7 @@ public class NotificationPanelView extends PanelView implements
}
@Override
- public void resetViews() {
+ public void resetViews(boolean animate) {
mIsLaunchTransitionFinished = false;
mBlockTouches = false;
mUnlockIconActive = false;
@@ -632,11 +646,15 @@ public class NotificationPanelView extends PanelView implements
mAffordanceHelper.reset(false);
mLastCameraLaunchSource = KeyguardBottomAreaView.CAMERA_LAUNCH_SOURCE_AFFORDANCE;
}
- closeQs();
mStatusBar.getGutsManager().closeAndSaveGuts(true /* leavebehind */, true /* force */,
true /* controls */, -1 /* x */, -1 /* y */, true /* resetMenu */);
- mNotificationStackScroller.setOverScrollAmount(0f, true /* onTop */, false /* animate */,
- true /* cancelAnimators */);
+ if (animate) {
+ animateCloseQs(true /* animateAway */);
+ } else {
+ closeQs();
+ }
+ mNotificationStackScroller.setOverScrollAmount(0f, true /* onTop */, animate,
+ !animate /* cancelAnimators */);
mNotificationStackScroller.resetScrollPosition();
}
@@ -658,7 +676,13 @@ public class NotificationPanelView extends PanelView implements
setQsExpansion(mQsMinExpansionHeight);
}
- public void animateCloseQs() {
+ /**
+ * Animate QS closing by flinging it.
+ * If QS is expanded, it will collapse into QQS and stop.
+ *
+ * @param animateAway Do not stop when QS becomes QQS. Fling until QS isn't visible anymore.
+ */
+ public void animateCloseQs(boolean animateAway) {
if (mQsExpansionAnimator != null) {
if (!mQsAnimatorExpand) {
return;
@@ -667,14 +691,7 @@ public class NotificationPanelView extends PanelView implements
mQsExpansionAnimator.cancel();
setQsExpansion(height);
}
- flingSettings(0 /* vel */, false);
- }
-
- public void openQs() {
- cancelQsAnimation();
- if (mQsExpansionEnabled) {
- setQsExpansion(mQsMaxExpansionHeight);
- }
+ flingSettings(0 /* vel */, animateAway ? FLING_HIDE : FLING_COLLAPSE);
}
public void expandWithQs() {
@@ -687,7 +704,7 @@ public class NotificationPanelView extends PanelView implements
public void expandWithoutQs() {
if (isQsExpanded()) {
- flingSettings(0 /* velocity */, false /* expand */);
+ flingSettings(0 /* velocity */, FLING_COLLAPSE);
} else {
expand(true /* animate */);
}
@@ -831,7 +848,7 @@ public class NotificationPanelView extends PanelView implements
if (expandsQs) {
logQsSwipeDown(y);
}
- flingSettings(vel, expandsQs && !isCancelMotionEvent);
+ flingSettings(vel, expandsQs && !isCancelMotionEvent ? FLING_EXPAND : FLING_COLLAPSE);
}
private void logQsSwipeDown(float y) {
@@ -1100,7 +1117,8 @@ public class NotificationPanelView extends PanelView implements
mLastOverscroll = 0f;
mQsExpansionFromOverscroll = false;
setQsExpansion(mQsExpansionHeight);
- flingSettings(!mQsExpansionEnabled && open ? 0f : velocity, open && mQsExpansionEnabled,
+ flingSettings(!mQsExpansionEnabled && open ? 0f : velocity,
+ open && mQsExpansionEnabled ? FLING_EXPAND : FLING_COLLAPSE,
new Runnable() {
@Override
public void run() {
@@ -1467,13 +1485,35 @@ public class NotificationPanelView extends PanelView implements
}
}
- public void flingSettings(float vel, boolean expand) {
- flingSettings(vel, expand, null, false /* isClick */);
+ /**
+ * @see #flingSettings(float, int, Runnable, boolean)
+ */
+ public void flingSettings(float vel, int type) {
+ flingSettings(vel, type, null, false /* isClick */);
}
- protected void flingSettings(float vel, boolean expand, final Runnable onFinishRunnable,
+ /**
+ * Animates QS or QQS as if the user had swiped up or down.
+ *
+ * @param vel Finger velocity or 0 when not initiated by touch events.
+ * @param type Either {@link #FLING_EXPAND}, {@link #FLING_COLLAPSE} or {@link #FLING_HIDE}.
+ * @param onFinishRunnable Runnable to be executed at the end of animation.
+ * @param isClick If originated by click (different interpolator and duration.)
+ */
+ protected void flingSettings(float vel, int type, final Runnable onFinishRunnable,
boolean isClick) {
- float target = expand ? mQsMaxExpansionHeight : mQsMinExpansionHeight;
+ float target;
+ switch (type) {
+ case FLING_EXPAND:
+ target = mQsMaxExpansionHeight;
+ break;
+ case FLING_COLLAPSE:
+ target = mQsMinExpansionHeight;
+ break;
+ case FLING_HIDE:
+ default:
+ target = 0;
+ }
if (target == mQsExpansionHeight) {
if (onFinishRunnable != null) {
onFinishRunnable.run();
@@ -1483,7 +1523,8 @@ public class NotificationPanelView extends PanelView implements
// If we move in the opposite direction, reset velocity and use a different duration.
boolean oppositeDirection = false;
- if (vel > 0 && !expand || vel < 0 && expand) {
+ boolean expanding = type == FLING_EXPAND;
+ if (vel > 0 && !expanding || vel < 0 && expanding) {
vel = 0;
oppositeDirection = true;
}
@@ -1497,11 +1538,8 @@ public class NotificationPanelView extends PanelView implements
if (oppositeDirection) {
animator.setDuration(350);
}
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- setQsExpansion((Float) animation.getAnimatedValue());
- }
+ animator.addUpdateListener(animation -> {
+ setQsExpansion((Float) animation.getAnimatedValue());
});
animator.addListener(new AnimatorListenerAdapter() {
@Override
@@ -1515,7 +1553,7 @@ public class NotificationPanelView extends PanelView implements
});
animator.start();
mQsExpansionAnimator = animator;
- mQsAnimatorExpand = expand;
+ mQsAnimatorExpand = expanding;
}
/**
@@ -2001,10 +2039,12 @@ public class NotificationPanelView extends PanelView implements
public void onClick(View v) {
onQsExpansionStarted();
if (mQsExpanded) {
- flingSettings(0 /* vel */, false /* expand */, null, true /* isClick */);
+ flingSettings(0 /* vel */, FLING_COLLAPSE, null /* onFinishRunnable */,
+ true /* isClick */);
} else if (mQsExpansionEnabled) {
mLockscreenGestureLogger.write(MetricsEvent.ACTION_SHADE_QS_TAP, 0, 0);
- flingSettings(0 /* vel */, true /* expand */, null, true /* isClick */);
+ flingSettings(0 /* vel */, FLING_EXPAND, null /* onFinishRunnable */,
+ true /* isClick */);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index 5d234947de29..deac669e31d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -194,7 +194,7 @@ public abstract class PanelBar extends FrameLayout {
pv.collapse(delayed, speedUpFactor);
waiting = true;
} else {
- pv.resetViews();
+ pv.resetViews(false /* animate */);
pv.setExpandedFraction(0); // just in case
pv.cancelPeek();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index e4eeec11fdfd..1f09835a8eb9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -1240,7 +1240,7 @@ public abstract class PanelView extends FrameLayout {
));
}
- public abstract void resetViews();
+ public abstract void resetViews(boolean animate);
protected abstract float getPeekHeight();
/**
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 dd4ea3d903fd..cd0255b0edf4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -56,7 +56,6 @@ import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.app.TaskStackBuilder;
import android.app.UiModeManager;
-import android.app.WallpaperColors;
import android.app.WallpaperInfo;
import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager;
@@ -67,8 +66,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
-import android.content.om.IOverlayManager;
-import android.content.om.OverlayInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -322,8 +319,6 @@ public class StatusBar extends SystemUI implements DemoMode,
public static final int FADE_KEYGUARD_START_DELAY = 100;
public static final int FADE_KEYGUARD_DURATION = 300;
public static final int FADE_KEYGUARD_DURATION_PULSING = 96;
- public static final int FADE_BACKDROP_DURATION = 300;
- public static final int FADE_BACKDROP_DURATION_FAST = 240;
/** If true, the system is in the half-boot-to-decryption-screen state.
* Prudently disable QS and notifications. */
@@ -545,7 +540,6 @@ public class StatusBar extends SystemUI implements DemoMode,
private boolean mIsOccluded;
private boolean mWereIconsJustHidden;
private boolean mBouncerWasShowingWhenHidden;
- private boolean mKeyguardOccludeAnimationRunning;
// Notifies StatusBarKeyguardViewManager every time the keyguard transition is over,
// this animation is tied to the scrim for historic reasons.
@@ -1417,7 +1411,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onPerformRemoveNotification(StatusBarNotification n) {
if (mStackScroller.hasPulsingNotifications() &&
- !mHeadsUpManager.hasHeadsUpNotifications()) {
+ !mHeadsUpManager.hasNotifications()) {
// We were showing a pulse for a notification, but no notifications are pulsing anymore.
// Finish the pulse.
mDozeScrimController.pulseOutNow();
@@ -1644,7 +1638,7 @@ public class StatusBar extends SystemUI implements DemoMode,
boolean wakeAndUnlock = mBiometricUnlockController != null
&& mBiometricUnlockController.isWakeAndUnlock();
- if (mLaunchTransitionFadingAway && !mIsOccluded || wakeAndUnlock) {
+ if (mLaunchTransitionFadingAway || wakeAndUnlock) {
mBackdrop.setVisibility(View.INVISIBLE);
Trace.endSection();
return;
@@ -1763,8 +1757,7 @@ public class StatusBar extends SystemUI implements DemoMode,
boolean cannotAnimateDoze = mDozing && !ScrimState.AOD.getAnimateChange();
if (mBiometricUnlockController.getMode()
== BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
- || hideBecauseOccluded && !mKeyguardOccludeAnimationRunning
- || cannotAnimateDoze) {
+ || hideBecauseOccluded || cannotAnimateDoze) {
// We are unlocking directly - no animation!
mBackdrop.setVisibility(View.GONE);
@@ -1775,9 +1768,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mBackdrop.animate()
.alpha(SRC_MIN_ALPHA)
.setInterpolator(Interpolators.ACCELERATE_DECELERATE)
- .setDuration(
- mKeyguardOccludeAnimationRunning
- ? FADE_BACKDROP_DURATION_FAST : FADE_BACKDROP_DURATION)
+ .setDuration(300)
.setStartDelay(0)
.withEndAction(() -> {
mBackdrop.setVisibility(View.GONE);
@@ -2245,7 +2236,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationPanel.expand(true /* animate */);
mMetricsLogger.count(NotificationPanelView.COUNTER_PANEL_OPEN, 1);
} else if (!mNotificationPanel.isInSettings() && !mNotificationPanel.isExpanding()){
- mNotificationPanel.flingSettings(0 /* velocity */, true /* expand */);
+ mNotificationPanel.flingSettings(0 /* velocity */,
+ NotificationPanelView.FLING_EXPAND);
mMetricsLogger.count(NotificationPanelView.COUNTER_PANEL_OPEN_QS, 1);
}
}
@@ -3674,27 +3666,6 @@ public class StatusBar extends SystemUI implements DemoMode,
}
/**
- * Is keyguard being occluded by a newly launched activity.
- */
- public boolean isKeyguardOccludeAnimationRunning() {
- return mKeyguardOccludeAnimationRunning;
- }
-
- /**
- * Plays the animation when new activity is launched over keyguard.
- */
- public void animateKeyguardOccluding() {
- mKeyguardOccludeAnimationRunning = true;
- addPostCollapseAction(() -> {
- mStatusBarKeyguardViewManager.reset(true /* hideBouncerWhenShowing */);
- mKeyguardOccludeAnimationRunning = false;
- });
- mStatusBarKeyguardViewManager.animateCollapsePanels(1.0f /* speedfactor */);
- updateScrimController();
- updateMediaMetaData(false /* metaDataChanged */, true /* allowEnterAnimation */);
- }
-
- /**
* Plays the animation when an activity that was occluding Keyguard goes away.
*/
public void animateKeyguardUnoccluding() {
@@ -3716,7 +3687,7 @@ public class StatusBar extends SystemUI implements DemoMode,
Log.w(TAG, "Launch transition: Timeout!");
mNotificationPanel.onAffordanceLaunchEnded();
releaseGestureWakeLock();
- mNotificationPanel.resetViews();
+ mNotificationPanel.resetViews(false /* animate */);
}
private void runLaunchTransitionEndRunnable() {
@@ -3869,7 +3840,9 @@ public class StatusBar extends SystemUI implements DemoMode,
Trace.beginSection("StatusBar#updateKeyguardState");
if (mState == StatusBarState.KEYGUARD) {
mKeyguardIndicationController.setVisible(true);
- mNotificationPanel.resetViews();
+ boolean dozingAnimated = mDozingRequested
+ && DozeParameters.getInstance(mContext).shouldControlScreenOff();
+ mNotificationPanel.resetViews(dozingAnimated);
if (mKeyguardUserSwitcher != null) {
mKeyguardUserSwitcher.setKeyguard(true, fromShadeLocked);
}
@@ -4014,7 +3987,7 @@ public class StatusBar extends SystemUI implements DemoMode,
if (mNotificationPanel.isQsDetailShowing()) {
mNotificationPanel.closeQsDetail();
} else {
- mNotificationPanel.animateCloseQs();
+ mNotificationPanel.animateCloseQs(false /* animateAway */);
}
return true;
}
@@ -4039,7 +4012,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private void showBouncerIfKeyguard() {
if ((mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED)
- && !mKeyguardViewMediator.isHiding() && !mKeyguardOccludeAnimationRunning) {
+ && !mKeyguardViewMediator.isHiding()) {
showBouncer(true /* scrimmed */);
}
}
@@ -4539,11 +4512,6 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onStartedGoingToSleep() {
- // in case we start going to sleep while new animation is launching over keyguard, make
- // sure to finish it
- if (mKeyguardOccludeAnimationRunning) {
- runPostCollapseRunnables();
- }
notifyHeadsUpGoingToSleep();
dismissVolumeDialog();
}
@@ -4785,7 +4753,7 @@ public class StatusBar extends SystemUI implements DemoMode,
? ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER;
mScrimController.transitionTo(state);
} else if (isInLaunchTransition() || mLaunchCameraOnScreenTurningOn
- || launchingAffordanceWithPreview || mKeyguardOccludeAnimationRunning) {
+ || launchingAffordanceWithPreview) {
mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
} else if (mBrightnessMirrorVisible) {
mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR);
@@ -4864,7 +4832,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void onPulseStarted() {
callback.onPulseStarted();
- if (mHeadsUpManager.hasHeadsUpNotifications()) {
+ if (mHeadsUpManager.hasNotifications()) {
// Only pulse the stack scroller if there's actually something to show.
// Otherwise just show the always-on screen.
setPulsing(true);
@@ -5137,7 +5105,7 @@ public class StatusBar extends SystemUI implements DemoMode,
final boolean wasOccluded = mIsOccluded;
dismissKeyguardThenExecute(() -> {
// TODO: Some of this code may be able to move to NotificationEntryManager.
- if (mHeadsUpManager != null && mHeadsUpManager.isHeadsUp(notificationKey)) {
+ if (mHeadsUpManager != null && mHeadsUpManager.contains(notificationKey)) {
// Release the HUN notification to the shade.
if (isPresenterFullyCollapsed()) {
@@ -5146,7 +5114,8 @@ public class StatusBar extends SystemUI implements DemoMode,
//
// In most cases, when FLAG_AUTO_CANCEL is set, the notification will
// become canceled shortly by NoMan, but we can't assume that.
- mHeadsUpManager.releaseImmediately(notificationKey);
+ mHeadsUpManager.removeNotification(sbn.getKey(),
+ true /* releaseImmediately */);
}
StatusBarNotification parentToCancel = null;
if (shouldAutoCancel(sbn) && mGroupManager.isOnlyChildInGroup(sbn)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 97088bd0ce84..c4424d8e3c97 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -365,11 +365,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
});
return;
- } else if (animate) {
- mOccluded = true;
- mStatusBar.animateKeyguardOccluding();
- mStatusBarWindowManager.setKeyguardOccluded(mOccluded);
- return;
}
} else if (!occluded && mOccluded && mShowing) {
StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index f83fb43af8f3..a5716f2c2c09 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -144,8 +144,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D
state.scrimsVisibility == ScrimController.VISIBILITY_FULLY_OPAQUE;
final boolean keyguardOrAod = state.keyguardShowing
|| (state.dozing && mDozeParameters.getAlwaysOn());
- if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper
- && !state.keyguardOccluded) {
+ if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper) {
mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
} else {
mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
@@ -181,12 +180,12 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D
mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
}
- private void applyExpandedFlag(State state) {
- if (state.panelExpanded || state.isKeyguardShowingAndNotOccluded() || state.bouncerShowing
+ private void applyForceShowNavigationFlag(State state) {
+ if (state.panelExpanded || state.bouncerShowing
|| ENABLE_REMOTE_INPUT && state.remoteInputActive) {
- mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_BAR_EXPANDED;
+ mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
} else {
- mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_BAR_EXPANDED;
+ mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
}
}
@@ -244,7 +243,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D
applyKeyguardFlags(state);
applyForceStatusBarVisibleFlag(state);
applyFocusableFlag(state);
- applyExpandedFlag(state);
+ applyForceShowNavigationFlag(state);
adjustScreenOrientation(state);
applyHeight(state);
applyUserActivityTimeout(state);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java
index dc1b35d6c701..2ed2edb969bd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java
@@ -45,25 +45,18 @@ public class UserAvatarView extends View {
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);
- switch (attr) {
- case R.styleable.UserAvatarView_avatarPadding:
- setAvatarPadding(a.getDimension(attr, 0));
- break;
- case R.styleable.UserAvatarView_frameWidth:
- setFrameWidth(a.getDimension(attr, 0));
- break;
- case R.styleable.UserAvatarView_framePadding:
- setFramePadding(a.getDimension(attr, 0));
- break;
- case R.styleable.UserAvatarView_frameColor:
- setFrameColor(a.getColorStateList(attr));
- break;
- case R.styleable.UserAvatarView_badgeDiameter:
- setBadgeDiameter(a.getDimension(attr, 0));
- break;
- case R.styleable.UserAvatarView_badgeMargin:
- setBadgeMargin(a.getDimension(attr, 0));
- break;
+ if (attr == R.styleable.UserAvatarView_avatarPadding) {
+ setAvatarPadding(a.getDimension(attr, 0));
+ } else if (attr == R.styleable.UserAvatarView_frameWidth) {
+ setFrameWidth(a.getDimension(attr, 0));
+ } else if (attr == R.styleable.UserAvatarView_framePadding) {
+ setFramePadding(a.getDimension(attr, 0));
+ } else if (attr == R.styleable.UserAvatarView_frameColor) {
+ setFrameColor(a.getColorStateList(attr));
+ } else if (attr == R.styleable.UserAvatarView_badgeDiameter) {
+ setBadgeDiameter(a.getDimension(attr, 0));
+ } else if (attr == R.styleable.UserAvatarView_badgeMargin) {
+ setBadgeMargin(a.getDimension(attr, 0));
}
}
a.recycle();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
index 677dd731a992..d477587f8ecb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
@@ -21,56 +21,44 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
-import android.os.SystemClock;
-import android.os.Handler;
-import android.os.Looper;
import android.util.ArrayMap;
import android.provider.Settings;
import android.util.Log;
-import android.view.accessibility.AccessibilityEvent;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
+import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.NotificationData;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.stream.Stream;
-import java.util.HashMap;
import java.util.HashSet;
/**
* A manager which handles heads up notifications which is a special mode where
* they simply peek from the top of the screen.
*/
-public class HeadsUpManager {
+public abstract class HeadsUpManager extends AlertingNotificationManager {
private static final String TAG = "HeadsUpManager";
- private static final boolean DEBUG = false;
private static final String SETTING_HEADS_UP_SNOOZE_LENGTH_MS = "heads_up_snooze_length_ms";
- protected final Clock mClock = new Clock();
protected final HashSet<OnHeadsUpChangedListener> mListeners = new HashSet<>();
- protected final Handler mHandler = new Handler(Looper.getMainLooper());
protected final Context mContext;
- protected int mHeadsUpNotificationDecay;
- protected int mMinimumDisplayTime;
protected int mTouchAcceptanceDelay;
protected int mSnoozeLengthMs;
protected boolean mHasPinnedNotification;
protected int mUser;
- private final HashMap<String, HeadsUpEntry> mHeadsUpEntries = new HashMap<>();
private final ArrayMap<String, Long> mSnoozedPackages;
public HeadsUpManager(@NonNull final Context context) {
mContext = context;
Resources resources = context.getResources();
mMinimumDisplayTime = resources.getInteger(R.integer.heads_up_notification_minimum_time);
- mHeadsUpNotificationDecay = resources.getInteger(R.integer.heads_up_notification_decay);
+ mAutoDismissNotificationDecay = resources.getInteger(R.integer.heads_up_notification_decay);
mTouchAcceptanceDelay = resources.getInteger(R.integer.touch_acceptance_delay);
mSnoozedPackages = new ArrayMap<>();
int defaultSnoozeLengthMs =
@@ -85,7 +73,9 @@ public class HeadsUpManager {
context.getContentResolver(), SETTING_HEADS_UP_SNOOZE_LENGTH_MS, -1);
if (packageSnoozeLengthMs > -1 && packageSnoozeLengthMs != mSnoozeLengthMs) {
mSnoozeLengthMs = packageSnoozeLengthMs;
- if (DEBUG) Log.v(TAG, "mSnoozeLengthMs = " + mSnoozeLengthMs);
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "mSnoozeLengthMs = " + mSnoozeLengthMs);
+ }
}
}
};
@@ -108,49 +98,14 @@ public class HeadsUpManager {
mListeners.remove(listener);
}
- /**
- * Called when posting a new notification to the heads up.
- */
- public void showNotification(@NonNull NotificationData.Entry headsUp) {
- if (DEBUG) Log.v(TAG, "showNotification");
- addHeadsUpEntry(headsUp);
- updateNotification(headsUp, true);
- headsUp.setInterruption();
- }
-
- /**
- * Called when updating or posting a notification to the heads up.
- */
- public void updateNotification(@NonNull NotificationData.Entry headsUp, boolean alert) {
- if (DEBUG) Log.v(TAG, "updateNotification");
-
- headsUp.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
-
- if (alert) {
- HeadsUpEntry headsUpEntry = mHeadsUpEntries.get(headsUp.key);
- if (headsUpEntry == null) {
- // the entry was released before this update (i.e by a listener) This can happen
- // with the groupmanager
- return;
- }
- headsUpEntry.updateEntry(true /* updatePostTime */);
- setEntryPinned(headsUpEntry, shouldHeadsUpBecomePinned(headsUp));
+ public void updateNotification(@NonNull String key, boolean alert) {
+ super.updateNotification(key, alert);
+ AlertEntry alertEntry = getHeadsUpEntry(key);
+ if (alert && alertEntry != null) {
+ setEntryPinned((HeadsUpEntry) alertEntry, shouldHeadsUpBecomePinned(alertEntry.mEntry));
}
}
- private void addHeadsUpEntry(@NonNull NotificationData.Entry entry) {
- HeadsUpEntry headsUpEntry = createHeadsUpEntry();
- // This will also add the entry to the sortedList
- headsUpEntry.setEntry(entry);
- mHeadsUpEntries.put(entry.key, headsUpEntry);
- entry.row.setHeadsUp(true);
- setEntryPinned(headsUpEntry, shouldHeadsUpBecomePinned(entry));
- for (OnHeadsUpChangedListener listener : mListeners) {
- listener.onHeadsUpStateChanged(entry, true);
- }
- entry.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
- }
-
protected boolean shouldHeadsUpBecomePinned(@NonNull NotificationData.Entry entry) {
return hasFullScreenIntent(entry);
}
@@ -161,8 +116,10 @@ public class HeadsUpManager {
protected void setEntryPinned(
@NonNull HeadsUpManager.HeadsUpEntry headsUpEntry, boolean isPinned) {
- if (DEBUG) Log.v(TAG, "setEntryPinned: " + isPinned);
- ExpandableNotificationRow row = headsUpEntry.entry.row;
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "setEntryPinned: " + isPinned);
+ }
+ ExpandableNotificationRow row = headsUpEntry.mEntry.row;
if (row.isPinned() != isPinned) {
row.setPinned(isPinned);
updatePinnedMode();
@@ -176,20 +133,24 @@ public class HeadsUpManager {
}
}
- protected void removeHeadsUpEntry(@NonNull NotificationData.Entry entry) {
- HeadsUpEntry remove = mHeadsUpEntries.remove(entry.key);
- onHeadsUpEntryRemoved(remove);
+ @Override
+ protected void onAlertEntryAdded(AlertEntry alertEntry) {
+ NotificationData.Entry entry = alertEntry.mEntry;
+ entry.row.setHeadsUp(true);
+ setEntryPinned((HeadsUpEntry) alertEntry, shouldHeadsUpBecomePinned(entry));
+ for (OnHeadsUpChangedListener listener : mListeners) {
+ listener.onHeadsUpStateChanged(entry, true);
+ }
}
- protected void onHeadsUpEntryRemoved(@NonNull HeadsUpEntry remove) {
- NotificationData.Entry entry = remove.entry;
- entry.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ @Override
+ protected void onAlertEntryRemoved(AlertEntry alertEntry) {
+ NotificationData.Entry entry = alertEntry.mEntry;
entry.row.setHeadsUp(false);
- setEntryPinned(remove, false /* isPinned */);
+ setEntryPinned((HeadsUpEntry) alertEntry, false /* isPinned */);
for (OnHeadsUpChangedListener listener : mListeners) {
listener.onHeadsUpStateChanged(entry, false);
}
- releaseHeadsUpEntry(remove);
}
protected void updatePinnedMode() {
@@ -197,7 +158,7 @@ public class HeadsUpManager {
if (hasPinnedNotification == mHasPinnedNotification) {
return;
}
- if (DEBUG) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Pinned mode changed: " + mHasPinnedNotification + " -> " +
hasPinnedNotification);
}
@@ -211,50 +172,6 @@ public class HeadsUpManager {
}
/**
- * React to the removal of the notification in the heads up.
- *
- * @return true if the notification was removed and false if it still needs to be kept around
- * for a bit since it wasn't shown long enough
- */
- public boolean removeNotification(@NonNull String key, boolean ignoreEarliestRemovalTime) {
- if (DEBUG) Log.v(TAG, "removeNotification");
- releaseImmediately(key);
- return true;
- }
-
- /**
- * Returns if the given notification is in the Heads Up Notification list or not.
- */
- public boolean isHeadsUp(@NonNull String key) {
- return mHeadsUpEntries.containsKey(key);
- }
-
- /**
- * Pushes any current Heads Up notification down into the shade.
- */
- public void releaseAllImmediately() {
- if (DEBUG) Log.v(TAG, "releaseAllImmediately");
- Iterator<HeadsUpEntry> iterator = mHeadsUpEntries.values().iterator();
- while (iterator.hasNext()) {
- HeadsUpEntry entry = iterator.next();
- iterator.remove();
- onHeadsUpEntryRemoved(entry);
- }
- }
-
- /**
- * Pushes the given Heads Up notification down into the shade.
- */
- public void releaseImmediately(@NonNull String key) {
- HeadsUpEntry headsUpEntry = getHeadsUpEntry(key);
- if (headsUpEntry == null) {
- return;
- }
- NotificationData.Entry shadeEntry = headsUpEntry.entry;
- removeHeadsUpEntry(shadeEntry);
- }
-
- /**
* Returns if the given notification is snoozed or not.
*/
public boolean isSnoozed(@NonNull String packageName) {
@@ -262,7 +179,9 @@ public class HeadsUpManager {
Long snoozedUntil = mSnoozedPackages.get(key);
if (snoozedUntil != null) {
if (snoozedUntil > mClock.currentTimeMillis()) {
- if (DEBUG) Log.v(TAG, key + " snoozed");
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, key + " snoozed");
+ }
return true;
}
mSnoozedPackages.remove(packageName);
@@ -274,9 +193,9 @@ public class HeadsUpManager {
* Snoozes all current Heads Up Notifications.
*/
public void snooze() {
- for (String key : mHeadsUpEntries.keySet()) {
- HeadsUpEntry entry = mHeadsUpEntries.get(key);
- String packageName = entry.entry.notification.getPackageName();
+ for (String key : mAlertEntries.keySet()) {
+ AlertEntry entry = getHeadsUpEntry(key);
+ String packageName = entry.mEntry.notification.getPackageName();
mSnoozedPackages.put(snoozeKey(packageName, mUser),
mClock.currentTimeMillis() + mSnoozeLengthMs);
}
@@ -289,53 +208,27 @@ public class HeadsUpManager {
@Nullable
protected HeadsUpEntry getHeadsUpEntry(@NonNull String key) {
- return mHeadsUpEntries.get(key);
+ return (HeadsUpEntry) mAlertEntries.get(key);
}
/**
- * Returns the entry of given Heads Up Notification.
- *
- * @param key Key of heads up notification
- */
- @Nullable
- public NotificationData.Entry getEntry(@NonNull String key) {
- HeadsUpEntry entry = mHeadsUpEntries.get(key);
- return entry != null ? entry.entry : null;
- }
-
- /**
- * Returns the stream of all current Heads Up Notifications.
- */
- @NonNull
- public Stream<NotificationData.Entry> getAllEntries() {
- return mHeadsUpEntries.values().stream().map(headsUpEntry -> headsUpEntry.entry);
- }
-
- /**
- * Returns the top Heads Up Notification, which appeares to show at first.
+ * Returns the top Heads Up Notification, which appears to show at first.
*/
@Nullable
public NotificationData.Entry getTopEntry() {
HeadsUpEntry topEntry = getTopHeadsUpEntry();
- return (topEntry != null) ? topEntry.entry : null;
- }
-
- /**
- * Returns if any heads up notification is available or not.
- */
- public boolean hasHeadsUpNotifications() {
- return !mHeadsUpEntries.isEmpty();
+ return (topEntry != null) ? topEntry.mEntry : null;
}
@Nullable
protected HeadsUpEntry getTopHeadsUpEntry() {
- if (mHeadsUpEntries.isEmpty()) {
+ if (mAlertEntries.isEmpty()) {
return null;
}
HeadsUpEntry topEntry = null;
- for (HeadsUpEntry entry: mHeadsUpEntries.values()) {
+ for (AlertEntry entry: mAlertEntries.values()) {
if (topEntry == null || entry.compareTo(topEntry) < 0) {
- topEntry = entry;
+ topEntry = (HeadsUpEntry) entry;
}
}
return topEntry;
@@ -359,8 +252,8 @@ public class HeadsUpManager {
pw.print(" mSnoozeLengthMs="); pw.println(mSnoozeLengthMs);
pw.print(" now="); pw.println(mClock.currentTimeMillis());
pw.print(" mUser="); pw.println(mUser);
- for (HeadsUpEntry entry: mHeadsUpEntries.values()) {
- pw.print(" HeadsUpEntry="); pw.println(entry.entry);
+ for (AlertEntry entry: mAlertEntries.values()) {
+ pw.print(" HeadsUpEntry="); pw.println(entry.mEntry);
}
int N = mSnoozedPackages.size();
pw.println(" snoozed packages: " + N);
@@ -378,9 +271,9 @@ public class HeadsUpManager {
}
private boolean hasPinnedNotificationInternal() {
- for (String key : mHeadsUpEntries.keySet()) {
- HeadsUpEntry entry = mHeadsUpEntries.get(key);
- if (entry.entry.row.isPinned()) {
+ for (String key : mAlertEntries.keySet()) {
+ AlertEntry entry = getHeadsUpEntry(key);
+ if (entry.mEntry.row.isPinned()) {
return true;
}
}
@@ -392,16 +285,16 @@ public class HeadsUpManager {
* @param userUnPinned The unpinned action is trigger by user real operation.
*/
public void unpinAll(boolean userUnPinned) {
- for (String key : mHeadsUpEntries.keySet()) {
- HeadsUpEntry entry = mHeadsUpEntries.get(key);
+ for (String key : mAlertEntries.keySet()) {
+ HeadsUpEntry entry = getHeadsUpEntry(key);
setEntryPinned(entry, false /* isPinned */);
// maybe it got un sticky
entry.updateEntry(false /* updatePostTime */);
// when the user unpinned all of HUNs by moving one HUN, all of HUNs should not stay
// on the screen.
- if (userUnPinned && entry.entry != null && entry.entry.row != null) {
- ExpandableNotificationRow row = entry.entry.row;
+ if (userUnPinned && entry.mEntry != null && entry.mEntry.row != null) {
+ ExpandableNotificationRow row = entry.mEntry.row;
if (row.mustStayOnScreen()) {
row.setHeadsUpIsVisible();
}
@@ -425,8 +318,8 @@ public class HeadsUpManager {
* one should be ranked higher and 0 if they are equal.
*/
public int compare(@NonNull NotificationData.Entry a, @NonNull NotificationData.Entry b) {
- HeadsUpEntry aEntry = getHeadsUpEntry(a.key);
- HeadsUpEntry bEntry = getHeadsUpEntry(b.key);
+ AlertEntry aEntry = getHeadsUpEntry(a.key);
+ AlertEntry bEntry = getHeadsUpEntry(b.key);
if (aEntry == null || bEntry == null) {
return aEntry == null ? 1 : -1;
}
@@ -438,21 +331,18 @@ public class HeadsUpManager {
* until it's collapsed again.
*/
public void setExpanded(@NonNull NotificationData.Entry entry, boolean expanded) {
- HeadsUpManager.HeadsUpEntry headsUpEntry = mHeadsUpEntries.get(entry.key);
+ HeadsUpEntry headsUpEntry = getHeadsUpEntry(entry.key);
if (headsUpEntry != null && entry.row.isPinned()) {
- headsUpEntry.expanded(expanded);
+ headsUpEntry.setExpanded(expanded);
}
}
@NonNull
- protected HeadsUpEntry createHeadsUpEntry() {
+ @Override
+ protected HeadsUpEntry createAlertEntry() {
return new HeadsUpEntry();
}
- protected void releaseHeadsUpEntry(@NonNull HeadsUpEntry entry) {
- entry.reset();
- }
-
public void onDensityOrFontScaleChanged() {
}
@@ -460,108 +350,58 @@ public class HeadsUpManager {
* This represents a notification and how long it is in a heads up mode. It also manages its
* lifecycle automatically when created.
*/
- protected class HeadsUpEntry implements Comparable<HeadsUpEntry> {
- @Nullable public NotificationData.Entry entry;
- public long postTime;
+ protected class HeadsUpEntry extends AlertEntry {
public boolean remoteInputActive;
- public long earliestRemovaltime;
- public boolean expanded;
-
- @Nullable private Runnable mRemoveHeadsUpRunnable;
-
- public void setEntry(@Nullable final NotificationData.Entry entry) {
- setEntry(entry, null);
- }
+ protected boolean expanded;
- public void setEntry(@Nullable final NotificationData.Entry entry,
- @Nullable Runnable removeHeadsUpRunnable) {
- this.entry = entry;
- this.mRemoveHeadsUpRunnable = removeHeadsUpRunnable;
-
- // The actual post time will be just after the heads-up really slided in
- postTime = mClock.currentTimeMillis() + mTouchAcceptanceDelay;
- updateEntry(true /* updatePostTime */);
- }
-
- public void updateEntry(boolean updatePostTime) {
- if (DEBUG) Log.v(TAG, "updateEntry");
-
- long currentTime = mClock.currentTimeMillis();
- earliestRemovaltime = currentTime + mMinimumDisplayTime;
- if (updatePostTime) {
- postTime = Math.max(postTime, currentTime);
- }
- removeAutoRemovalCallbacks();
-
- if (!isSticky()) {
- long finishTime = postTime + mHeadsUpNotificationDecay;
- long removeDelay = Math.max(finishTime - currentTime, mMinimumDisplayTime);
- mHandler.postDelayed(mRemoveHeadsUpRunnable, removeDelay);
- }
- }
-
- private boolean isSticky() {
- return (entry.row.isPinned() && expanded)
- || remoteInputActive || hasFullScreenIntent(entry);
+ @Override
+ protected boolean isSticky() {
+ return (mEntry.row.isPinned() && expanded)
+ || remoteInputActive || hasFullScreenIntent(mEntry);
}
@Override
- public int compareTo(@NonNull HeadsUpEntry o) {
- boolean isPinned = entry.row.isPinned();
- boolean otherPinned = o.entry.row.isPinned();
+ public int compareTo(@NonNull AlertEntry alertEntry) {
+ HeadsUpEntry headsUpEntry = (HeadsUpEntry) alertEntry;
+ boolean isPinned = mEntry.row.isPinned();
+ boolean otherPinned = headsUpEntry.mEntry.row.isPinned();
if (isPinned && !otherPinned) {
return -1;
} else if (!isPinned && otherPinned) {
return 1;
}
- boolean selfFullscreen = hasFullScreenIntent(entry);
- boolean otherFullscreen = hasFullScreenIntent(o.entry);
+ boolean selfFullscreen = hasFullScreenIntent(mEntry);
+ boolean otherFullscreen = hasFullScreenIntent(headsUpEntry.mEntry);
if (selfFullscreen && !otherFullscreen) {
return -1;
} else if (!selfFullscreen && otherFullscreen) {
return 1;
}
- if (remoteInputActive && !o.remoteInputActive) {
+ if (remoteInputActive && !headsUpEntry.remoteInputActive) {
return -1;
- } else if (!remoteInputActive && o.remoteInputActive) {
+ } else if (!remoteInputActive && headsUpEntry.remoteInputActive) {
return 1;
}
- return postTime < o.postTime ? 1
- : postTime == o.postTime ? entry.key.compareTo(o.entry.key)
- : -1;
+ return super.compareTo(headsUpEntry);
}
- public void expanded(boolean expanded) {
+ public void setExpanded(boolean expanded) {
this.expanded = expanded;
}
+ @Override
public void reset() {
- entry = null;
+ super.reset();
expanded = false;
remoteInputActive = false;
- removeAutoRemovalCallbacks();
- mRemoveHeadsUpRunnable = null;
- }
-
- public void removeAutoRemovalCallbacks() {
- if (mRemoveHeadsUpRunnable != null)
- mHandler.removeCallbacks(mRemoveHeadsUpRunnable);
- }
-
- public void removeAsSoonAsPossible() {
- if (mRemoveHeadsUpRunnable != null) {
- removeAutoRemovalCallbacks();
- mHandler.postDelayed(mRemoveHeadsUpRunnable,
- earliestRemovaltime - mClock.currentTimeMillis());
- }
}
- }
- public static class Clock {
- public long currentTimeMillis() {
- return SystemClock.elapsedRealtime();
+ @Override
+ protected long calculatePostTime() {
+ // The actual post time will be just after the heads-up really slided in
+ return super.calculatePostTime() + mTouchAcceptanceDelay;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 8dbdd21c2d64..cf394043b091 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -979,7 +979,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
private SubscriptionInfo addSignalController(int id, int simSlotIndex) {
SubscriptionInfo info = new SubscriptionInfo(id, "", simSlotIndex, "", "", 0, 0, "", 0,
- null, null, null, "");
+ null, null, null, "", false, null, null);
MobileSignalController controller = new MobileSignalController(mContext,
mConfig, mHasMobileDataFeature, mPhone, mCallbackHandler, this, info,
mSubDefaults, mReceiverHandler.getLooper());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index c76a4b566939..dd031623f356 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -127,19 +127,14 @@ public class SmartReplyView extends ViewGroup {
final int length = arr.getIndexCount();
for (int i = 0; i < length; i++) {
int attr = arr.getIndex(i);
- switch (attr) {
- case R.styleable.SmartReplyView_spacing:
- spacing = arr.getDimensionPixelSize(i, 0);
- break;
- case R.styleable.SmartReplyView_singleLineButtonPaddingHorizontal:
- singleLineButtonPaddingHorizontal = arr.getDimensionPixelSize(i, 0);
- break;
- case R.styleable.SmartReplyView_doubleLineButtonPaddingHorizontal:
- doubleLineButtonPaddingHorizontal = arr.getDimensionPixelSize(i, 0);
- break;
- case R.styleable.SmartReplyView_buttonStrokeWidth:
- strokeWidth = arr.getDimensionPixelSize(i, 0);
- break;
+ if (attr == R.styleable.SmartReplyView_spacing) {
+ spacing = arr.getDimensionPixelSize(i, 0);
+ } else if (attr == R.styleable.SmartReplyView_singleLineButtonPaddingHorizontal) {
+ singleLineButtonPaddingHorizontal = arr.getDimensionPixelSize(i, 0);
+ } else if (attr == R.styleable.SmartReplyView_doubleLineButtonPaddingHorizontal) {
+ doubleLineButtonPaddingHorizontal = arr.getDimensionPixelSize(i, 0);
+ } else if (attr == R.styleable.SmartReplyView_buttonStrokeWidth) {
+ strokeWidth = arr.getDimensionPixelSize(i, 0);
}
}
arr.recycle();
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
index 1bdb7ad3c3fc..196d9bc32e75 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
@@ -119,7 +119,9 @@ public class TunerServiceImpl extends TunerService {
// 3 Removed because of a revert.
if (oldVersion < 4) {
// Delay this so that we can wait for everything to be registered first.
- new Handler(Dependency.get(Dependency.BG_LOOPER)).postDelayed(() -> clearAll(), 5000);
+ final int user = mCurrentUser;
+ new Handler(Dependency.get(Dependency.BG_LOOPER)).postDelayed(
+ () -> clearAllFromUser(user), 5000);
}
setValue(TUNER_VERSION, newVersion);
}
@@ -221,6 +223,10 @@ public class TunerServiceImpl extends TunerService {
@Override
public void clearAll() {
+ clearAllFromUser(mCurrentUser);
+ }
+
+ public void clearAllFromUser(int user) {
// A couple special cases.
Settings.Global.putString(mContentResolver, DemoMode.DEMO_MODE_ALLOWED, null);
Intent intent = new Intent(DemoMode.ACTION_DEMO);
@@ -231,7 +237,7 @@ public class TunerServiceImpl extends TunerService {
if (ArrayUtils.contains(RESET_BLACKLIST, key)) {
continue;
}
- Settings.Secure.putString(mContentResolver, key, null);
+ Settings.Secure.putStringForUser(mContentResolver, key, null, user);
}
}
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index e604877c63b0..f95027bc849d 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -15,6 +15,7 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
package="com.android.systemui.tests">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
@@ -64,6 +65,13 @@
<action android:name="com.android.systemui.action.TEST_ACTION" />
</intent-filter>
</receiver>
+
+ <provider
+ android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
+ tools:replace="android:authorities"
+ android:authorities="${applicationId}.lifecycle-tests"
+ android:exported="false"
+ android:multiprocess="true" />
</application>
<instrumentation android:name="android.testing.TestableInstrumentation"
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
new file mode 100644
index 000000000000..e6e485740a7b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java
@@ -0,0 +1,169 @@
+/*
+ * 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.keyguard;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.graphics.Color;
+import android.graphics.Paint.Style;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.text.TextPaint;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.TextClock;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.ClockPlugin;
+import com.android.systemui.plugins.PluginListener;
+import com.android.systemui.plugins.PluginManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWithLooper(setAsMainLooper = true)
+@RunWith(AndroidTestingRunner.class)
+public class KeyguardClockSwitchTest extends SysuiTestCase {
+ private PluginManager mPluginManager;
+
+ @Mock
+ TextClock mClockView;
+ @InjectMocks
+ KeyguardClockSwitch mKeyguardClockSwitch;
+
+ @Before
+ public void setUp() {
+ mPluginManager = mDependency.injectMockDependency(PluginManager.class);
+ LayoutInflater layoutInflater = LayoutInflater.from(getContext());
+ mKeyguardClockSwitch =
+ (KeyguardClockSwitch) layoutInflater.inflate(R.layout.keyguard_clock_switch, null);
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void onAttachToWindow_addPluginListener() {
+ mKeyguardClockSwitch.onAttachedToWindow();
+
+ ArgumentCaptor<PluginListener> listener = ArgumentCaptor.forClass(PluginListener.class);
+ verify(mPluginManager).addPluginListener(listener.capture(), eq(ClockPlugin.class));
+ }
+
+ @Test
+ public void onDetachToWindow_removePluginListener() {
+ mKeyguardClockSwitch.onDetachedFromWindow();
+
+ ArgumentCaptor<PluginListener> listener = ArgumentCaptor.forClass(PluginListener.class);
+ verify(mPluginManager).removePluginListener(listener.capture());
+ }
+
+ @Test
+ public void onPluginConnected_showPluginClock() {
+ ClockPlugin plugin = mock(ClockPlugin.class);
+ TextClock pluginView = new TextClock(getContext());
+ when(plugin.getView()).thenReturn(pluginView);
+ TextPaint paint = mock(TextPaint.class);
+ doReturn(paint).when(mClockView).getPaint();
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+
+ listener.onPluginConnected(plugin, null);
+
+ verify(mClockView).setVisibility(GONE);
+ assertThat(plugin.getView().getParent()).isEqualTo(mKeyguardClockSwitch);
+ }
+
+ @Test
+ public void onPluginDisconnected_showDefaultClock() {
+ ClockPlugin plugin = mock(ClockPlugin.class);
+ TextClock pluginView = new TextClock(getContext());
+ when(plugin.getView()).thenReturn(pluginView);
+ mClockView.setVisibility(GONE);
+ mKeyguardClockSwitch.addView(plugin.getView(), -1,
+ new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+
+ listener.onPluginDisconnected(plugin);
+
+ verify(mClockView).setVisibility(VISIBLE);
+ assertThat(plugin.getView().getParent()).isNull();
+ }
+
+ @Test
+ public void setTextColor_defaultClockSetTextColor() {
+ mKeyguardClockSwitch.setTextColor(Color.YELLOW);
+
+ verify(mClockView).setTextColor(Color.YELLOW);
+ }
+
+ @Test
+ public void setTextColor_pluginClockSetTextColor() {
+ ClockPlugin plugin = mock(ClockPlugin.class);
+ TextClock pluginView = new TextClock(getContext());
+ when(plugin.getView()).thenReturn(pluginView);
+ TextPaint paint = mock(TextPaint.class);
+ doReturn(paint).when(mClockView).getPaint();
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin, null);
+
+ mKeyguardClockSwitch.setTextColor(Color.WHITE);
+
+ verify(plugin).setTextColor(Color.WHITE);
+ }
+
+ @Test
+ public void setStyle_defaultClockSetStyle() {
+ TextPaint paint = mock(TextPaint.class);
+ Style style = mock(Style.class);
+ doReturn(paint).when(mClockView).getPaint();
+
+ mKeyguardClockSwitch.setStyle(style);
+
+ verify(paint).setStyle(style);
+ }
+
+ @Test
+ public void setStyle_pluginClockSetStyle() {
+ ClockPlugin plugin = mock(ClockPlugin.class);
+ TextClock pluginView = new TextClock(getContext());
+ when(plugin.getView()).thenReturn(pluginView);
+ TextPaint paint = mock(TextPaint.class);
+ doReturn(paint).when(mClockView).getPaint();
+ Style style = mock(Style.class);
+ PluginListener listener = mKeyguardClockSwitch.getClockPluginListener();
+ listener.onPluginConnected(plugin, null);
+
+ mKeyguardClockSwitch.setStyle(style);
+
+ verify(plugin).setStyle(style);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
index d2e837158872..4ec30fde40e4 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
@@ -55,7 +55,7 @@ public class KeyguardSliceViewTest extends SysuiTestCase {
@Test
public void showSlice_notifiesListener() {
- ListBuilder builder = new ListBuilder(getContext(), mSliceUri);
+ ListBuilder builder = new ListBuilder(getContext(), mSliceUri, ListBuilder.INFINITY);
AtomicBoolean notified = new AtomicBoolean();
mKeyguardSliceView.setContentChangeListener(()-> notified.set(true));
mKeyguardSliceView.onChanged(builder.build());
@@ -74,13 +74,11 @@ public class KeyguardSliceViewTest extends SysuiTestCase {
@Test
public void hasHeader_readsSliceData() {
- ListBuilder builder = new ListBuilder(getContext(), mSliceUri);
+ ListBuilder builder = new ListBuilder(getContext(), mSliceUri, ListBuilder.INFINITY);
mKeyguardSliceView.onChanged(builder.build());
Assert.assertFalse("View should not have a header", mKeyguardSliceView.hasHeader());
- builder.setHeader((ListBuilder.HeaderBuilder headerBuilder) -> {
- headerBuilder.setTitle("header title!");
- });
+ builder.setHeader(new ListBuilder.HeaderBuilder().setTitle("header title!"));
mKeyguardSliceView.onChanged(builder.build());
Assert.assertTrue("View should have a header", mKeyguardSliceView.hasHeader());
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java
index 1d8de2fbbcca..9e96df2c30cf 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java
@@ -22,7 +22,6 @@ import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.LayoutInflater;
-import android.widget.TextClock;
import com.android.systemui.SysuiTestCase;
@@ -40,7 +39,7 @@ public class KeyguardStatusViewTest extends SysuiTestCase {
@Mock
KeyguardSliceView mKeyguardSlice;
@Mock
- TextClock mClockView;
+ KeyguardClockSwitch mClockView;
@InjectMocks
KeyguardStatusView mKeyguardStatusView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index 644c0b347bde..f1bf31d7a58a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -34,10 +34,8 @@ import static org.mockito.Mockito.when;
import android.app.Fragment;
import android.content.res.Configuration;
-import android.os.Handler;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.Display;
import android.view.View;
@@ -62,7 +60,6 @@ import org.junit.runner.RunWith;
@SmallTest
public class ScreenDecorationsTest extends SysuiTestCase {
- private TestableLooper mTestableLooper;
private ScreenDecorations mScreenDecorations;
private StatusBar mStatusBar;
private WindowManager mWindowManager;
@@ -74,10 +71,6 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Before
public void setup() {
- mTestableLooper = TestableLooper.get(this);
- mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
- new Handler(mTestableLooper.getLooper()));
-
mStatusBar = mock(StatusBar.class);
mWindowManager = mock(WindowManager.class);
mView = spy(new StatusBarWindowView(mContext, null));
@@ -95,31 +88,7 @@ public class ScreenDecorationsTest extends SysuiTestCase {
mTunerService = mDependency.injectMockDependency(TunerService.class);
-
- mScreenDecorations = new ScreenDecorations() {
- @Override
- public void start() {
- super.start();
- mTestableLooper.processAllMessages();
- }
-
- @Override
- Handler startHandlerThread() {
- return new Handler(mTestableLooper.getLooper());
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- mTestableLooper.processAllMessages();
- }
-
- @Override
- public void onTuningChanged(String key, String newValue) {
- super.onTuningChanged(key, newValue);
- mTestableLooper.processAllMessages();
- }
- };
+ mScreenDecorations = new ScreenDecorations();
mScreenDecorations.mContext = mContext;
mScreenDecorations.mComponents = mContext.getComponents();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
index 62d80ace39df..f45500a87274 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java
@@ -45,12 +45,12 @@ public class DozeConfigurationUtil {
boolean[] doneHolder = new boolean[1];
AmbientDisplayConfiguration config = mock(AmbientDisplayConfiguration.class,
noDefaultAnswer(doneHolder));
- when(config.pulseOnDoubleTapEnabled(anyInt())).thenReturn(false);
- when(config.pulseOnPickupEnabled(anyInt())).thenReturn(false);
+ when(config.doubleTapGestureEnabled(anyInt())).thenReturn(false);
+ when(config.pickupGestureEnabled(anyInt())).thenReturn(false);
when(config.pulseOnNotificationEnabled(anyInt())).thenReturn(true);
when(config.doubleTapSensorType()).thenReturn(null);
- when(config.pulseOnPickupAvailable()).thenReturn(false);
+ when(config.dozePickupSensorAvailable()).thenReturn(false);
doneHolder[0] = true;
return config;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
index 46e2bfbb1431..a26b1b55b30c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
@@ -137,7 +137,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
@Test
public void addZenMode_addedToSlice() {
- ListBuilder listBuilder = spy(new ListBuilder(getContext(), mProvider.getUri()));
+ ListBuilder listBuilder = spy(new ListBuilder(getContext(), mProvider.getUri(),
+ ListBuilder.INFINITY));
mProvider.addZenMode(listBuilder);
verify(listBuilder, never()).addRow(any(ListBuilder.RowBuilder.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
new file mode 100644
index 000000000000..f04a1151384e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java
@@ -0,0 +1,176 @@
+/*
+ * 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.systemui.statusbar;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertEquals;
+
+import android.app.ActivityManager;
+import android.app.Notification;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.AlertingNotificationManager;
+import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
+
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class AlertingNotificationManagerTest extends SysuiTestCase {
+ @Rule
+ public MockitoRule rule = MockitoJUnit.rule();
+
+ private static final String TEST_PACKAGE_NAME = "test";
+ private static final int TEST_UID = 0;
+
+ private static final int TEST_MINIMUM_DISPLAY_TIME = 200;
+ private static final int TEST_AUTO_DISMISS_TIME = 500;
+ // Number of notifications to use in tests requiring multiple notifications
+ private static final int TEST_NUM_NOTIFICATIONS = 4;
+ private static final int TEST_TIMEOUT_TIME = 10000;
+ private final Runnable TEST_TIMEOUT_RUNNABLE = () -> mTimedOut = true;
+
+ private AlertingNotificationManager mAlertingNotificationManager;
+
+ protected NotificationData.Entry mEntry;
+ protected Handler mTestHandler;
+ private StatusBarNotification mSbn;
+ private boolean mTimedOut = false;
+
+ @Mock protected ExpandableNotificationRow mRow;
+
+ private final class TestableAlertingNotificationManager extends AlertingNotificationManager {
+ private TestableAlertingNotificationManager() {
+ mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME;
+ mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME;
+ mHandler = mTestHandler;
+ }
+
+ @Override
+ protected void onAlertEntryAdded(AlertEntry alertEntry) {}
+
+ @Override
+ protected void onAlertEntryRemoved(AlertEntry alertEntry) {}
+ }
+
+ protected AlertingNotificationManager createAlertingNotificationManager() {
+ return new TestableAlertingNotificationManager();
+ }
+
+ private StatusBarNotification createNewNotification(int id) {
+ Notification.Builder n = new Notification.Builder(mContext, "")
+ .setSmallIcon(R.drawable.ic_person)
+ .setContentTitle("Title")
+ .setContentText("Text");
+ return new StatusBarNotification(
+ TEST_PACKAGE_NAME /* pkg */,
+ TEST_PACKAGE_NAME,
+ id,
+ null /* tag */,
+ TEST_UID,
+ 0 /* initialPid */,
+ n.build(),
+ new UserHandle(ActivityManager.getCurrentUser()),
+ null /* overrideGroupKey */,
+ 0 /* postTime */);
+ }
+
+ @Before
+ public void setUp() {
+ mTestHandler = Handler.createAsync(Looper.myLooper());
+ mSbn = createNewNotification(0 /* id */);
+ mEntry = new NotificationData.Entry(mSbn);
+ mEntry.row = mRow;
+
+ mAlertingNotificationManager = createAlertingNotificationManager();
+ }
+
+ @Test
+ public void testShowNotification_addsEntry() {
+ mAlertingNotificationManager.showNotification(mEntry);
+
+ assertTrue(mAlertingNotificationManager.contains(mEntry.key));
+ assertTrue(mAlertingNotificationManager.hasNotifications());
+ assertEquals(mEntry, mAlertingNotificationManager.getEntry(mEntry.key));
+ }
+
+ @Test
+ public void testShowNotification_autoDismisses() {
+ mAlertingNotificationManager.showNotification(mEntry);
+ mTestHandler.postDelayed(TEST_TIMEOUT_RUNNABLE, TEST_TIMEOUT_TIME);
+
+ // Wait for remove runnable and then process it immediately
+ TestableLooper.get(this).processMessages(1);
+
+ assertFalse("Test timed out", mTimedOut);
+ assertFalse(mAlertingNotificationManager.contains(mEntry.key));
+ }
+
+ @Test
+ public void testRemoveNotification_removeDeferred() {
+ mAlertingNotificationManager.showNotification(mEntry);
+
+ // Try to remove but defer, since the notification has not been shown long enough.
+ mAlertingNotificationManager.removeNotification(mEntry.key, false /* releaseImmediately */);
+
+ assertTrue(mAlertingNotificationManager.contains(mEntry.key));
+ }
+
+ @Test
+ public void testRemoveNotification_forceRemove() {
+ mAlertingNotificationManager.showNotification(mEntry);
+
+ //Remove forcibly with releaseImmediately = true.
+ mAlertingNotificationManager.removeNotification(mEntry.key, true /* releaseImmediately */);
+
+ assertFalse(mAlertingNotificationManager.contains(mEntry.key));
+ }
+
+ @Test
+ public void testReleaseAllImmediately() {
+ for (int i = 0; i < TEST_NUM_NOTIFICATIONS; i++) {
+ StatusBarNotification sbn = createNewNotification(i);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ entry.row = mRow;
+ mAlertingNotificationManager.showNotification(entry);
+ }
+
+ mAlertingNotificationManager.releaseAllImmediately();
+
+ assertEquals(0, mAlertingNotificationManager.getAllEntries().count());
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
index 1837909d5d7c..bdf7cd31c791 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java
@@ -16,22 +16,13 @@
package com.android.systemui.statusbar.phone;
-import android.app.ActivityManager;
-import android.app.Instrumentation;
-import android.app.Notification;
-import android.os.UserHandle;
import android.view.View;
-import android.service.notification.StatusBarNotification;
-import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.AlertingNotificationManager;
+import com.android.systemui.statusbar.AlertingNotificationManagerTest;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import org.junit.Before;
@@ -42,175 +33,54 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertFalse;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
-public class HeadsUpManagerPhoneTest extends SysuiTestCase {
+public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest {
@Rule public MockitoRule rule = MockitoJUnit.rule();
- private static final String TEST_PACKAGE_NAME = "test";
- private static final int TEST_UID = 0;
-
private HeadsUpManagerPhone mHeadsUpManager;
- private NotificationData.Entry mEntry;
- private StatusBarNotification mSbn;
-
@Mock private NotificationGroupManager mGroupManager;
@Mock private View mStatusBarWindowView;
- @Mock private StatusBar mBar;
- @Mock private ExpandableNotificationRow mRow;
@Mock private VisualStabilityManager mVSManager;
+ @Mock private StatusBar mBar;
+
+ protected AlertingNotificationManager createAlertingNotificationManager() {
+ return mHeadsUpManager;
+ }
@Before
public void setUp() {
when(mVSManager.isReorderingAllowed()).thenReturn(true);
-
- mHeadsUpManager = new HeadsUpManagerPhone(
- mContext, mStatusBarWindowView, mGroupManager, mBar, mVSManager);
-
- Notification.Builder n = new Notification.Builder(mContext, "")
- .setSmallIcon(R.drawable.ic_person)
- .setContentTitle("Title")
- .setContentText("Text");
- mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID,
- 0, n.build(), new UserHandle(ActivityManager.getCurrentUser()), null, 0);
-
- mEntry = new NotificationData.Entry(mSbn);
- mEntry.row = mRow;
- mEntry.expandedIcon = mock(StatusBarIconView.class);
+ mHeadsUpManager = new HeadsUpManagerPhone(mContext, mStatusBarWindowView, mGroupManager,
+ mBar, mVSManager);
+ super.setUp();
+ mHeadsUpManager.mHandler = mTestHandler;
}
@Test
- public void testBasicOperations() {
- // Check the initial state.
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
-
- // Add a notification.
+ public void testSnooze() {
mHeadsUpManager.showNotification(mEntry);
- assertEquals(mEntry, mHeadsUpManager.getEntry(mEntry.key));
- assertEquals(mEntry, mHeadsUpManager.getTopEntry());
- assertEquals(1, mHeadsUpManager.getAllEntries().count());
- assertTrue(mHeadsUpManager.hasHeadsUpNotifications());
-
- // Update the notification.
- mHeadsUpManager.updateNotification(mEntry, false);
-
- assertEquals(mEntry, mHeadsUpManager.getEntry(mEntry.key));
- assertEquals(mEntry, mHeadsUpManager.getTopEntry());
- assertEquals(1, mHeadsUpManager.getAllEntries().count());
- assertTrue(mHeadsUpManager.hasHeadsUpNotifications());
-
- // Try to remove but defer, since the notification is currenlt visible on display.
- mHeadsUpManager.removeNotification(mEntry.key, false /* ignoreEarliestRemovalTime */);
-
- assertEquals(mEntry, mHeadsUpManager.getEntry(mEntry.key));
- assertEquals(mEntry, mHeadsUpManager.getTopEntry());
- assertEquals(1, mHeadsUpManager.getAllEntries().count());
- assertTrue(mHeadsUpManager.hasHeadsUpNotifications());
+ mHeadsUpManager.snooze();
- // Remove forcibly with ignoreEarliestRemovalTime = true.
- mHeadsUpManager.removeNotification(mEntry.key, true /* ignoreEarliestRemovalTime */);
-
- // Check the initial state.
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
- }
-
- @Test
- public void testsTimeoutRemoval() {
- mHeadsUpManager.removeMinimumDisplayTimeForTesting();
-
- // Check the initial state.
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
-
- Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
-
- // Run the code on the main thready, not to run an async operations.
- instrumentation.runOnMainSync(() -> {
- // Add a notification.
- mHeadsUpManager.showNotification(mEntry);
-
- // Ensure the head up is visible before timeout.
- assertNotNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNotNull(mHeadsUpManager.getTopEntry());
- assertEquals(1, mHeadsUpManager.getAllEntries().count());
- assertTrue(mHeadsUpManager.hasHeadsUpNotifications());
- });
- // Wait for the async operations, which removes the heads up notification.
- waitForIdleSync();
-
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
- }
-
- @Test
- public void releaseImmediately() {
- // Check the initial state.
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
-
- // Add a notification.
- mHeadsUpManager.showNotification(mEntry);
-
- assertEquals(mEntry, mHeadsUpManager.getEntry(mEntry.key));
- assertEquals(mEntry, mHeadsUpManager.getTopEntry());
- assertEquals(1, mHeadsUpManager.getAllEntries().count());
- assertTrue(mHeadsUpManager.hasHeadsUpNotifications());
-
- // Remove but defer, since the notification is visible on display.
- mHeadsUpManager.releaseImmediately(mEntry.key);
-
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
+ assertTrue(mHeadsUpManager.isSnoozed(mEntry.notification.getPackageName()));
}
@Test
- public void releaseAllImmediately() {
- // Check the initial state.
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
-
- // Add a notification.
+ public void testSwipedOutNotification() {
mHeadsUpManager.showNotification(mEntry);
+ mHeadsUpManager.addSwipedOutNotification(mEntry.key);
- assertEquals(mEntry, mHeadsUpManager.getEntry(mEntry.key));
- assertEquals(mEntry, mHeadsUpManager.getTopEntry());
- assertEquals(1, mHeadsUpManager.getAllEntries().count());
- assertTrue(mHeadsUpManager.hasHeadsUpNotifications());
-
- // Remove but defer, since the notification is visible on display.
- mHeadsUpManager.releaseAllImmediately();
+ // Remove should succeed because the notification is swiped out
+ mHeadsUpManager.removeNotification(mEntry.key, false /* releaseImmediately */);
- assertNull(mHeadsUpManager.getEntry(mEntry.key));
- assertNull(mHeadsUpManager.getTopEntry());
- assertEquals(0, mHeadsUpManager.getAllEntries().count());
- assertFalse(mHeadsUpManager.hasHeadsUpNotifications());
+ assertFalse(mHeadsUpManager.contains(mEntry.key));
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
index 667a5082892d..2423e148bb97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
@@ -171,6 +171,23 @@ public class NearestTouchFrameTest extends SysuiTestCase {
ev.recycle();
}
+ @Test
+ public void testFurtherSelectedWhenCloserNotFocusable() {
+ View closer = mockViewAt(0, 0, 10, 10);
+ View further = mockViewAt(20, 0, 10, 10);
+ closer.setFocusable(false);
+
+ mNearestTouchFrame.addView(closer);
+ mNearestTouchFrame.addView(further);
+ mNearestTouchFrame.onMeasure(0, 0);
+
+ MotionEvent ev = MotionEvent.obtain(0, 0, 0,
+ 12 /* x */, 5 /* y */, 0);
+ mNearestTouchFrame.onTouchEvent(ev);
+ verify(further).onTouchEvent(eq(ev));
+ ev.recycle();
+ }
+
private View mockViewAt(int x, int y, int width, int height) {
View v = spy(new View(mContext));
doAnswer(invocation -> {
@@ -187,6 +204,7 @@ public class NearestTouchFrameTest extends SysuiTestCase {
v.setRight(width);
v.setTop(0);
v.setBottom(height);
+ v.setFocusable(true);
return v;
}
} \ No newline at end of file
diff --git a/packages/VpnDialogs/res/values-fr/strings.xml b/packages/VpnDialogs/res/values-fr/strings.xml
index 2b3eacea6430..71801197ddf2 100644
--- a/packages/VpnDialogs/res/values-fr/strings.xml
+++ b/packages/VpnDialogs/res/values-fr/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"Demande de connexion"</string>
- <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> souhaite configurer une connexion VPN qui permet de surveiller le trafic réseau. N\'acceptez que si vous faites confiance à la source. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; s\'affiche en haut de votre écran lorsqu\'une connexion VPN est active."</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> souhaite configurer une connexion VPN qui lui permet de surveiller le trafic réseau. N\'acceptez que si vous faites confiance à la source. &lt;br /&gt; &lt;br /&gt; &lt;img src=vpn_icon /&gt; s\'affiche en haut de votre écran lorsqu\'une connexion VPN est active."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN connecté"</string>
<string name="session" msgid="6470628549473641030">"Session :"</string>
<string name="duration" msgid="3584782459928719435">"Durée :"</string>
diff --git a/packages/VpnDialogs/res/values-ru/strings.xml b/packages/VpnDialogs/res/values-ru/strings.xml
index 3b9b4b550ec7..0543937a39fc 100644
--- a/packages/VpnDialogs/res/values-ru/strings.xml
+++ b/packages/VpnDialogs/res/values-ru/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"Запрос на подключение"</string>
- <string name="warning" msgid="809658604548412033">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" пытается подключиться к сети VPN, чтобы отслеживать трафик. Этот запрос следует принимать, только если вы доверяете источнику.<br/><br/>Когда подключение к сети VPN активно, в верхней части экрана появляется значок &lt;img src=vpn_icon /&gt;."</string>
+ <string name="warning" msgid="809658604548412033">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" пытается подключиться к сети VPN, чтобы отслеживать трафик. Этот запрос следует принимать, только если вы доверяете источнику. <br/><br/>Когда подключение к сети VPN активно, в верхней части экрана появляется значок &lt;img src=vpn_icon /&gt;."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN-подключение установлено"</string>
<string name="session" msgid="6470628549473641030">"Сеанс:"</string>
<string name="duration" msgid="3584782459928719435">"Продолжительность:"</string>
diff --git a/packages/VpnDialogs/res/values-ta/strings.xml b/packages/VpnDialogs/res/values-ta/strings.xml
index ffaf93ae5b17..3b4cc571d860 100644
--- a/packages/VpnDialogs/res/values-ta/strings.xml
+++ b/packages/VpnDialogs/res/values-ta/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="prompt" msgid="3183836924226407828">"இணைப்புக் கோரிக்கை"</string>
- <string name="warning" msgid="809658604548412033">"VPN இணைப்பை அமைக்க <xliff:g id="APP">%s</xliff:g> விழைகிறது. அதன்மூலம் இது நெட்வொர்க் டிராஃபிக்கைக் கண்காணிக்கும் அனுமதியைப் பெறும். நம்பகமான மூலத்தை மட்டுமே ஏற்கவும். &lt;br /&gt; &lt;br /&gt; VPN இயக்கத்தில் உள்ளபோது திரையில் மேல் பகுதியில் &lt;img src=vpn_icon /&gt; தோன்றும்."</string>
+ <string name="warning" msgid="809658604548412033">"நெட்வொர்க் டிராஃபிக்கைக் கண்காணிக்க வசதியாக VPN இணைப்பை அமைக்க <xliff:g id="APP">%s</xliff:g> கோருகிறது. நம்பகமான மூலத்தை மட்டுமே ஏற்கவும். &lt;br /&gt; &lt;br /&gt; VPN இயக்கத்தில் உள்ளபோது திரையின் மேல் பகுதியில் &lt;img src=vpn_icon /&gt; தோன்றும்."</string>
<string name="legacy_title" msgid="192936250066580964">"VPN இணைக்கப்பட்டது"</string>
<string name="session" msgid="6470628549473641030">"அமர்வு:"</string>
<string name="duration" msgid="3584782459928719435">"காலஅளவு:"</string>
diff --git a/packages/WAPPushManager/AndroidManifest.xml b/packages/WAPPushManager/AndroidManifest.xml
index 89e9d6ab8685..14e6e91e3a25 100644
--- a/packages/WAPPushManager/AndroidManifest.xml
+++ b/packages/WAPPushManager/AndroidManifest.xml
@@ -24,7 +24,8 @@
android:protectionLevel="signatureOrSystem" />
<original-package android:name="com.android.smspush" />
- <application>
+ <application
+ android:allowClearUserData="false">
<service android:name=".WapPushManager"
android:permission="com.android.smspush.WAPPUSH_MANAGER_BIND"
android:exported="true">
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 6cc6221e50d5..ec65f1b2728d 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -941,9 +941,10 @@ message MetricsEvent {
// OS: 6.0
NOTIFICATION_ZEN_MODE_EVENT_RULE = 146;
- // ACTION: App notification settings > Block Notifications
+ // ACTION: App notification settings > Block Notifications or long press on
+ // notification blocks.
// CATEGORY: SETTINGS
- // OS: 6.0
+ // OS: 9.0
ACTION_BAN_APP_NOTES = 147;
// ACTION: Notification shade > Dismiss all button
@@ -4083,6 +4084,8 @@ message MetricsEvent {
// Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
// Tag FIELD_AUTOFILL_SESSION_ID: id of the autofill session associated with this metric.
// Tag FIELD_AUTOFILL_COMPAT_MODE: package is being autofilled on compatibility mode.
+ // NOTE: starting on OS Q, it also added the following fields:
+ // FIELD_AUTOFILL_UPDATE: Whether the UI displayed "UPDATE" instead of "SAVE"
AUTOFILL_SAVE_UI = 916;
// Tag of a field for the number of saveable ids
@@ -6425,6 +6428,13 @@ message MetricsEvent {
// OS: Q (will also ship in PQ1A)
FIELD_ACTIVITY_RECORD_MILLIS_SINCE_LAST_LAUNCH = 1553;
+ // OPEN: Settings > Add face
+ // OS: Q
+ FACE_ENROLL_PREVIEW = 1554;
+
+ // Field used to indicate whether a save request was used to update existing user data.
+ FIELD_AUTOFILL_UPDATE = 1555;
+
// ---- End Q Constants, all Q constants go above this line ----
// Add new aosp constants above this line.
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index f7fcf5c6adac..45d8a5561677 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -811,6 +811,12 @@ message StaEvent {
// Framework changed Sta interface MAC address
TYPE_MAC_CHANGE = 17;
+
+ // Wifi is turned on
+ TYPE_WIFI_ENABLED = 18;
+
+ // Wifi is turned off
+ TYPE_WIFI_DISABLED = 19;
}
enum FrameworkDisconnectReason {
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java
index c9c7adc45697..f69b6387a605 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetService.java
@@ -48,11 +48,6 @@ public class AppWidgetService extends SystemService {
}
@Override
- public void onUnlockUser(int userHandle) {
- FgThread.getHandler().post(() -> mImpl.onUserUnlocked(userHandle));
- }
-
- @Override
public void onStopUser(int userHandle) {
mImpl.onUserStopped(userHandle);
}
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index db8ad12cfdf8..b71d7a726b28 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -19,7 +19,6 @@ package com.android.server.appwidget;
import static android.content.Context.KEYGUARD_SERVICE;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import android.annotation.UserIdInt;
@@ -2697,7 +2696,12 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
}
}
- void onUserUnlocked(int userId) {
+ /**
+ * This does not use the usual onUserUnlocked() listener mechanism because it is
+ * invoked at a choreographed point in the middle of the user unlock sequence,
+ * before the boot-completed broadcast is issued and the listeners notified.
+ */
+ void handleUserUnlocked(int userId) {
if (isProfileWithLockedParent(userId)) {
return;
}
@@ -2734,7 +2738,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
}
}
}
- Slog.i(TAG, "Async processing of onUserUnlocked u" + userId + " took "
+ Slog.i(TAG, "Processing of handleUserUnlocked u" + userId + " took "
+ (SystemClock.elapsedRealtime() - time) + " ms");
}
@@ -4801,5 +4805,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
return widgetPackages;
}
}
+
+ @Override
+ public void unlockUser(int userId) {
+ handleUserUnlocked(userId);
+ }
+
}
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 101bf496538c..5a10c1e4b42a 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -290,6 +290,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
componentNameFromApp == null ? "null"
: componentNameFromApp.flattenToShortString()));
}
+ // Flags used to start the session.
+ int flags = structure.getFlags();
+
if (mCompatMode) {
// Sanitize URL bar, if needed
final String[] urlBarIds = mService.getUrlBarResourceIdsForCompatMode(
@@ -310,12 +313,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mViewStates.put(urlBarId, viewState);
}
}
+ flags |= FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST;
}
structure.sanitizeForParceling(true);
- // Flags used to start the session.
- final int flags = structure.getFlags();
-
if (mContexts == null) {
mContexts = new ArrayList<>(1);
}
@@ -1473,11 +1474,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// Cache used to make sure changed fields do not belong to a dataset.
final ArrayMap<AutofillId, AutofillValue> currentValues = new ArrayMap<>();
- final ArraySet<AutofillId> allIds = new ArraySet<>();
+ // Savable (optional or required) ids that will be checked against the dataset ids.
+ final ArraySet<AutofillId> savableIds = new ArraySet<>();
final AutofillId[] requiredIds = saveInfo.getRequiredIds();
boolean allRequiredAreNotEmpty = true;
boolean atLeastOneChanged = false;
+ // If an autofilled field is changed, we need to change isUpdate to true so the proper UI is
+ // shown.
+ boolean isUpdate = false;
if (requiredIds != null) {
for (int i = 0; i < requiredIds.length; i++) {
final AutofillId id = requiredIds[i];
@@ -1485,7 +1490,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
Slog.w(TAG, "null autofill id on " + Arrays.toString(requiredIds));
continue;
}
- allIds.add(id);
+ savableIds.add(id);
final ViewState viewState = mViewStates.get(id);
if (viewState == null) {
Slog.w(TAG, "showSaveLocked(): no ViewState for required " + id);
@@ -1535,6 +1540,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
changed = false;
}
+ } else {
+ isUpdate = true;
}
if (changed) {
if (sDebug) {
@@ -1548,12 +1555,21 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
final AutofillId[] optionalIds = saveInfo.getOptionalIds();
+ if (sVerbose) {
+ Slog.v(TAG, "allRequiredAreNotEmpty: " + allRequiredAreNotEmpty + " hasOptional: "
+ + (optionalIds != null));
+ }
if (allRequiredAreNotEmpty) {
- if (!atLeastOneChanged && optionalIds != null) {
+ // Must look up all optional ids in 2 scenarios:
+ // - if no required id changed but an optional id did, it should trigger save / update
+ // - if at least one required id changed but it was not part of a filled dataset, we
+ // need to check if an optional id is part of a filled datased (in which case we show
+ // Update instead of Save)
+ if (optionalIds!= null && (!atLeastOneChanged || !isUpdate)) {
// No change on required ids yet, look for changes on optional ids.
for (int i = 0; i < optionalIds.length; i++) {
final AutofillId id = optionalIds[i];
- allIds.add(id);
+ savableIds.add(id);
final ViewState viewState = mViewStates.get(id);
if (viewState == null) {
Slog.w(TAG, "no ViewState for optional " + id);
@@ -1561,17 +1577,27 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
if ((viewState.getState() & ViewState.STATE_CHANGED) != 0) {
final AutofillValue currentValue = viewState.getCurrentValue();
- currentValues.put(id, currentValue);
+ final AutofillValue value = getSanitizedValue(sanitizers, id, currentValue);
+ if (value == null) {
+ if (sDebug) {
+ Slog.d(TAG, "value of opt. field " + id + " failed sanitization");
+ }
+ continue;
+ }
+
+ currentValues.put(id, value);
final AutofillValue filledValue = viewState.getAutofilledValue();
- if (currentValue != null && !currentValue.equals(filledValue)) {
+ if (value != null && !value.equals(filledValue)) {
if (sDebug) {
Slog.d(TAG, "found a change on optional " + id + ": " + filledValue
- + " => " + currentValue);
+ + " => " + value);
+ }
+ if (filledValue != null) {
+ isUpdate = true;
}
atLeastOneChanged = true;
- break;
}
- } else {
+ } else {
// Update current values cache based on initial value
final AutofillValue initialValue = getValueFromContextsLocked(id);
if (sDebug) {
@@ -1622,16 +1648,16 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
Helper.getFields(dataset);
if (sVerbose) {
Slog.v(TAG, "Checking if saved fields match contents of dataset #" + i
- + ": " + dataset + "; allIds=" + allIds);
+ + ": " + dataset + "; savableIds=" + savableIds);
}
- for (int j = 0; j < allIds.size(); j++) {
- final AutofillId id = allIds.valueAt(j);
+ savable_ids_loop: for (int j = 0; j < savableIds.size(); j++) {
+ final AutofillId id = savableIds.valueAt(j);
final AutofillValue currentValue = currentValues.get(id);
if (currentValue == null) {
if (sDebug) {
Slog.d(TAG, "dataset has value for field that is null: " + id);
}
- continue datasets_loop;
+ continue savable_ids_loop;
}
final AutofillValue datasetValue = datasetValues.get(id);
if (!currentValue.equals(datasetValue)) {
@@ -1657,14 +1683,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
}
// Use handler so logContextCommitted() is logged first
- mHandler.sendMessage(obtainMessage(
- Session::logSaveShown, this));
+ mHandler.sendMessage(obtainMessage(Session::logSaveShown, this));
final IAutoFillManagerClient client = getClient();
mPendingSaveUi = new PendingUi(mActivityToken, id, client);
getUiForShowing().showSaveUi(mService.getServiceLabel(), mService.getServiceIcon(),
mService.getServicePackageName(), saveInfo, this,
- mComponentName, this, mPendingSaveUi, mCompatMode);
+ mComponentName, this, mPendingSaveUi, isUpdate, mCompatMode);
if (client != null) {
try {
client.setSaveUiState(id, true);
@@ -1714,12 +1739,14 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
return sanitizers;
}
+ // TODO: this method is called a few times in the save process, we should cache its results into
+ // ViewState.
@Nullable
private AutofillValue getSanitizedValue(
@Nullable ArrayMap<AutofillId, InternalSanitizer> sanitizers,
@NonNull AutofillId id,
- @NonNull AutofillValue value) {
- if (sanitizers == null) return value;
+ @Nullable AutofillValue value) {
+ if (sanitizers == null || value == null) return value;
final InternalSanitizer sanitizer = sanitizers.get(id);
if (sanitizer == null) {
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index c5e838aaa85e..596240601f55 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -268,9 +268,10 @@ public final class AutoFillUI {
@Nullable String servicePackageName, @NonNull SaveInfo info,
@NonNull ValueFinder valueFinder, @NonNull ComponentName componentName,
@NonNull AutoFillUiCallback callback, @NonNull PendingUi pendingSaveUi,
- boolean compatMode) {
+ boolean isUpdate, boolean compatMode) {
if (sVerbose) {
- Slog.v(TAG, "showSaveUi() for " + componentName.toShortString() + ": " + info);
+ Slog.v(TAG, "showSaveUi(update=" + isUpdate + ") for " + componentName.toShortString()
+ + ": " + info);
}
int numIds = 0;
numIds += info.getRequiredIds() == null ? 0 : info.getRequiredIds().length;
@@ -280,6 +281,9 @@ public final class AutoFillUI {
.newLogMaker(MetricsEvent.AUTOFILL_SAVE_UI, componentName, servicePackageName,
pendingSaveUi.sessionId, compatMode)
.addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUM_IDS, numIds);
+ if (isUpdate) {
+ log.addTaggedData(MetricsEvent.FIELD_AUTOFILL_UPDATE, 1);
+ }
mHandler.post(() -> {
if (callback != mCallback) {
@@ -328,7 +332,7 @@ public final class AutoFillUI {
}
mMetricsLogger.write(log);
}
- }, compatMode);
+ }, isUpdate, compatMode);
});
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index dc84498353ea..0812cb992100 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -81,6 +81,13 @@ final class SaveUi {
void onDestroy();
}
+ /**
+ * Wrapper that guarantees that only one callback is triggered by ignoring further calls after
+ * it's destroyed.
+ *
+ * <p>It's needed becase {@link #onCancel(IntentSender)} is always called when the Save UI
+ * dialog is dismissed.
+ */
private class OneTimeListener implements OnSaveListener {
private final OnSaveListener mRealListener;
@@ -96,7 +103,6 @@ final class SaveUi {
if (mDone) {
return;
}
- mDone = true;
mRealListener.onSave();
}
@@ -106,7 +112,6 @@ final class SaveUi {
if (mDone) {
return;
}
- mDone = true;
mRealListener.onCancel(listener);
}
@@ -144,7 +149,7 @@ final class SaveUi {
@Nullable String servicePackageName, @NonNull ComponentName componentName,
@NonNull SaveInfo info, @NonNull ValueFinder valueFinder,
@NonNull OverlayControl overlayControl, @NonNull OnSaveListener listener,
- boolean compatMode) {
+ boolean isUpdate, boolean compatMode) {
mPendingUi= pendingUi;
mListener = new OneTimeListener(listener);
mOverlayControl = overlayControl;
@@ -179,21 +184,29 @@ final class SaveUi {
switch (types.size()) {
case 1:
- mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_type,
+ mTitle = Html.fromHtml(context.getString(
+ isUpdate ? R.string.autofill_update_title_with_type
+ : R.string.autofill_save_title_with_type,
types.valueAt(0), serviceLabel), 0);
break;
case 2:
- mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_2types,
+ mTitle = Html.fromHtml(context.getString(
+ isUpdate ? R.string.autofill_update_title_with_2types
+ : R.string.autofill_save_title_with_2types,
types.valueAt(0), types.valueAt(1), serviceLabel), 0);
break;
case 3:
- mTitle = Html.fromHtml(context.getString(R.string.autofill_save_title_with_3types,
+ mTitle = Html.fromHtml(context.getString(
+ isUpdate ? R.string.autofill_update_title_with_3types
+ : R.string.autofill_save_title_with_3types,
types.valueAt(0), types.valueAt(1), types.valueAt(2), serviceLabel), 0);
break;
default:
// Use generic if more than 3 or invalid type (size 0).
mTitle = Html.fromHtml(
- context.getString(R.string.autofill_save_title, serviceLabel), 0);
+ context.getString(isUpdate ? R.string.autofill_update_title
+ : R.string.autofill_save_title, serviceLabel),
+ 0);
}
titleView.setText(mTitle);
@@ -228,7 +241,10 @@ final class SaveUi {
}
noButton.setOnClickListener((v) -> mListener.onCancel(info.getNegativeActionListener()));
- final View yesButton = view.findViewById(R.id.autofill_save_yes);
+ final TextView yesButton = view.findViewById(R.id.autofill_save_yes);
+ if (isUpdate) {
+ yesButton.setText(R.string.autofill_update_yes);
+ }
yesButton.setOnClickListener((v) -> mListener.onSave());
mDialog = new Dialog(context, THEME_ID);
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
index a40afc3cfa4d..f7c1c109266a 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
@@ -136,7 +136,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
CountDownLatch mLatch;
FullBackupJob mJob; // if a scheduled job needs to be finished afterwards
IBackupObserver mBackupObserver;
- IBackupManagerMonitor mMonitor;
+ @Nullable private IBackupManagerMonitor mMonitor;
boolean mUserInitiated;
SinglePackageBackupRunner mBackupRunner;
private final int mBackupRunnerOpToken;
@@ -154,7 +154,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
IFullBackupRestoreObserver observer,
String[] whichPackages, boolean updateSchedule,
FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver,
- IBackupManagerMonitor monitor, @Nullable OnTaskFinishedListener listener,
+ @Nullable IBackupManagerMonitor monitor, @Nullable OnTaskFinishedListener listener,
boolean userInitiated) {
super(observer);
this.backupManagerService = backupManagerService;
diff --git a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupReporter.java b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupReporter.java
new file mode 100644
index 000000000000..8c83e6756d1c
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupReporter.java
@@ -0,0 +1,411 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.keyvalue;
+
+import android.annotation.Nullable;
+import android.app.backup.BackupManager;
+import android.app.backup.BackupManagerMonitor;
+import android.app.backup.BackupTransport;
+import android.app.backup.IBackupManagerMonitor;
+import android.app.backup.IBackupObserver;
+import android.content.pm.PackageInfo;
+import android.util.EventLog;
+import android.util.Slog;
+
+import com.android.server.EventLogTags;
+import com.android.server.backup.BackupManagerService;
+import com.android.server.backup.DataChangedJournal;
+import com.android.server.backup.remote.RemoteResult;
+import com.android.server.backup.utils.BackupManagerMonitorUtils;
+import com.android.server.backup.utils.BackupObserverUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+
+/**
+ * Reports events that happen during a key-value backup task to:
+ *
+ * <ul>
+ * <li>Logcat (main and event buffers).
+ * <li>Backup observer (see {@link IBackupObserver}).
+ * <li>Backup manager monitor (see {@link IBackupManagerMonitor}).
+ * </ul>
+ */
+// TODO: In KeyValueBackupTaskTest, remove direct assertions on logcat, observer or monitor and
+// verify calls to this object. Add these and more assertions to the test of this class.
+class KeyValueBackupReporter {
+ private static final String TAG = "KeyValueBackupTask";
+ private static final boolean DEBUG = BackupManagerService.DEBUG;
+ private static final boolean MORE_DEBUG = BackupManagerService.MORE_DEBUG || true;
+
+ private final BackupManagerService mBackupManagerService;
+ private final IBackupObserver mObserver;
+ @Nullable private IBackupManagerMonitor mMonitor;
+
+ KeyValueBackupReporter(
+ BackupManagerService backupManagerService,
+ IBackupObserver observer,
+ IBackupManagerMonitor monitor) {
+ mBackupManagerService = backupManagerService;
+ mObserver = observer;
+ mMonitor = monitor;
+ }
+
+ /** Returns the monitor or {@code null} if we lost connection to it. */
+ @Nullable
+ IBackupManagerMonitor getMonitor() {
+ return mMonitor;
+ }
+
+ void onSkipBackup() {
+ if (DEBUG) {
+ Slog.d(TAG, "Skipping backup since one is already in progress");
+ }
+ }
+
+ void onEmptyQueueAtStart() {
+ Slog.w(TAG, "Backup begun with an empty queue, nothing to do");
+ }
+
+ void onPmFoundInQueue() {
+ if (MORE_DEBUG) {
+ Slog.i(TAG, "PM metadata in queue, removing");
+ }
+ }
+
+ void onQueueReady(List<BackupRequest> queue) {
+ if (DEBUG) {
+ Slog.v(TAG, "Beginning backup of " + queue.size() + " targets");
+ }
+ }
+
+ void onTransportReady(String transportName) {
+ EventLog.writeEvent(EventLogTags.BACKUP_START, transportName);
+ }
+
+ void onInitializeTransport(String transportName) {
+ Slog.i(TAG, "Initializing transport and resetting backup state");
+ }
+
+ void onTransportInitialized(int status) {
+ if (status == BackupTransport.TRANSPORT_OK) {
+ EventLog.writeEvent(EventLogTags.BACKUP_INITIALIZE);
+ } else {
+ EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
+ Slog.e(TAG, "Transport error in initializeDevice()");
+ }
+ }
+
+ void onInitializeTransportError(Exception e) {
+ Slog.e(TAG, "Error during initialization", e);
+ }
+
+ void onSkipPm() {
+ Slog.d(TAG, "Skipping backup of PM metadata");
+ }
+
+ void onInvokePmAgentError(Exception e) {
+ Slog.e(TAG, "Error during PM metadata backup", e);
+ }
+
+ void onEmptyQueue() {
+ if (MORE_DEBUG) {
+ Slog.i(TAG, "Queue now empty");
+ }
+ }
+
+ void onStartPackageBackup(String packageName) {
+ Slog.d(TAG, "Starting key-value backup of " + packageName);
+ }
+
+ void onPackageNotEligibleForBackup(String packageName) {
+ Slog.i(TAG, "Package " + packageName + " no longer supports backup, skipping");
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ }
+
+ void onPackageEligibleForFullBackup(String packageName) {
+ Slog.i(
+ TAG,
+ "Package " + packageName + " performs full-backup rather than key-value, skipping");
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ }
+
+ void onPackageStopped(String packageName) {
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ }
+
+ void onBindAgentError(SecurityException e) {
+ Slog.d(TAG, "Error in bind/backup", e);
+ }
+
+ void onAgentUnknown(String packageName) {
+ Slog.d(TAG, "Package does not exist, skipping");
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_PACKAGE_NOT_FOUND);
+ }
+
+ void onAgentError(String packageName) {
+ if (MORE_DEBUG) {
+ Slog.i(TAG, "Agent failure for " + packageName + ", re-staging");
+ }
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_AGENT_FAILURE);
+ }
+
+ void onInvokeAgent(String packageName) {
+ if (DEBUG) {
+ Slog.d(TAG, "Invoking agent on " + packageName);
+ }
+ }
+
+ void onAgentFilesReady(File backupDataFile) {
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "Data file: " + backupDataFile);
+ }
+ }
+
+ void onRestoreconFailed(File backupDataFile) {
+ Slog.e(TAG, "SELinux restorecon failed on " + backupDataFile);
+ }
+
+ void onCallAgentDoBackupError(String packageName, boolean callingAgent, Exception e) {
+ if (callingAgent) {
+ Slog.e(TAG, "Error invoking agent on " + packageName + ": " + e);
+ } else {
+ Slog.e(TAG, "Error before invoking agent on " + packageName + ": " + e);
+ }
+ EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName, e.toString());
+ }
+
+ void onFailAgentError(String packageName) {
+ Slog.w(TAG, "Error conveying failure to " + packageName);
+ }
+
+ void onAgentIllegalKey(PackageInfo packageInfo, String key) {
+ String packageName = packageInfo.packageName;
+ EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName, "bad key");
+ mMonitor =
+ BackupManagerMonitorUtils.monitorEvent(
+ mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_ILLEGAL_KEY,
+ packageInfo,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+ BackupManagerMonitorUtils.putMonitoringExtra(
+ null, BackupManagerMonitor.EXTRA_LOG_ILLEGAL_KEY, key));
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_AGENT_FAILURE);
+ if (MORE_DEBUG) {
+ Slog.i(
+ TAG,
+ "Agent failure for " + packageName + " with illegal key " + key + ", dropped");
+ }
+ }
+
+ void onReadAgentDataError(String packageName, IOException e) {
+ Slog.w(TAG, "Unable read backup data for " + packageName + ": " + e);
+ }
+
+ void onWriteWidgetDataError(String packageName, IOException e) {
+ Slog.w(TAG, "Unable to save widget data for " + packageName + ": " + e);
+ }
+
+ void onDigestError(NoSuchAlgorithmException e) {
+ Slog.e(TAG, "Unable to use SHA-1!");
+ }
+
+ void onWriteWidgetData(boolean priorStateExists, @Nullable byte[] widgetState) {
+ if (MORE_DEBUG) {
+ Slog.i(
+ TAG,
+ "Checking widget update: state="
+ + (widgetState != null)
+ + " prior="
+ + priorStateExists);
+ }
+ }
+
+ void onTruncateDataError() {
+ Slog.w(TAG, "Unable to roll back");
+ }
+
+ void onSendDataToTransport(String packageName) {
+ if (MORE_DEBUG) {
+ Slog.v(TAG, "Sending non-empty data to transport for " + packageName);
+ }
+ }
+
+ void onNonIncrementalAndNonIncrementalRequired() {
+ Slog.e(TAG, "Transport requested non-incremental but already the case");
+ }
+
+ void onEmptyData(PackageInfo packageInfo) {
+ if (MORE_DEBUG) {
+ Slog.i(TAG, "No backup data written, not calling transport");
+ }
+ mMonitor =
+ BackupManagerMonitorUtils.monitorEvent(
+ mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_NO_DATA_TO_SEND,
+ packageInfo,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
+ null);
+ }
+
+ void onPackageBackupComplete(String packageName, long size) {
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.SUCCESS);
+ EventLog.writeEvent(EventLogTags.BACKUP_PACKAGE, packageName, size);
+ mBackupManagerService.logBackupComplete(packageName);
+ }
+
+ void onPackageBackupRejected(String packageName) {
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_TRANSPORT_PACKAGE_REJECTED);
+ EventLogTags.writeBackupAgentFailure(packageName, "Transport rejected");
+ }
+
+ void onPackageBackupQuotaExceeded(String packageName) {
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "Package " + packageName + " hit quota limit on key-value backup");
+ }
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_TRANSPORT_QUOTA_EXCEEDED);
+ EventLog.writeEvent(EventLogTags.BACKUP_QUOTA_EXCEEDED, packageName);
+ }
+
+ void onAgentDoQuotaExceededError(Exception e) {
+ Slog.e(TAG, "Unable to notify about quota exceeded: " + e);
+ }
+
+ void onPackageBackupNonIncrementalRequired(PackageInfo packageInfo) {
+ Slog.i(TAG, "Transport lost data, retrying package");
+ BackupManagerMonitorUtils.monitorEvent(
+ mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED,
+ packageInfo,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT,
+ /* extras */ null);
+ }
+
+ void onPackageBackupTransportFailure(String packageName) {
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_TRANSPORT_ABORTED);
+ EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, packageName);
+ }
+
+ void onPackageBackupError(String packageName, Exception e) {
+ Slog.e(TAG, "Transport error backing up " + packageName, e);
+ BackupObserverUtils.sendBackupOnPackageResult(
+ mObserver, packageName, BackupManager.ERROR_TRANSPORT_ABORTED);
+ EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, packageName);
+ }
+
+ void onCloseFileDescriptorError(String logName) {
+ Slog.w(TAG, "Error closing " + logName + " file-descriptor");
+ }
+
+ void onCancel() {
+ if (MORE_DEBUG) {
+ Slog.v(TAG, "Cancel received");
+ }
+ }
+
+ void onAgentTimedOut(@Nullable PackageInfo packageInfo) {
+ String packageName = getPackageName(packageInfo);
+ Slog.i(TAG, "Agent " + packageName + " timed out");
+ EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName);
+ // Time-out used to be implemented as cancel w/ cancelAll = false.
+ // TODO: Change monitoring event to reflect time-out as an event itself.
+ mMonitor =
+ BackupManagerMonitorUtils.monitorEvent(
+ mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL,
+ packageInfo,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
+ BackupManagerMonitorUtils.putMonitoringExtra(
+ null, BackupManagerMonitor.EXTRA_LOG_CANCEL_ALL, false));
+ }
+
+ void onAgentCancelled(@Nullable PackageInfo packageInfo) {
+ String packageName = getPackageName(packageInfo);
+ Slog.i(TAG, "Cancel backing up " + packageName);
+ EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName);
+ mMonitor =
+ BackupManagerMonitorUtils.monitorEvent(
+ mMonitor,
+ BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL,
+ packageInfo,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
+ BackupManagerMonitorUtils.putMonitoringExtra(
+ null, BackupManagerMonitor.EXTRA_LOG_CANCEL_ALL, true));
+ }
+
+ private String getPackageName(@Nullable PackageInfo packageInfo) {
+ return (packageInfo != null) ? packageInfo.packageName : "no_package_yet";
+ }
+
+ void onRevertBackup() {
+ if (MORE_DEBUG) {
+ Slog.i(TAG, "Reverting backup queue, re-staging everything");
+ }
+ }
+
+ void onTransportRequestBackupTimeError(Exception e) {
+ Slog.w(TAG, "Unable to contact transport for recommended backoff: " + e);
+ }
+
+ void onRemoteCallReturned(RemoteResult result) {
+ if (MORE_DEBUG) {
+ Slog.v(TAG, "Agent call returned " + result);
+ }
+ }
+
+ void onJournalDeleteFailed(DataChangedJournal journal) {
+ Slog.e(TAG, "Unable to remove backup journal file " + journal);
+ }
+
+ void onSetCurrentTokenError(Exception e) {
+ Slog.e(TAG, "Transport threw reporting restore set: " + e);
+ }
+
+ void onTransportNotInitialized() {
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "Transport requires initialization, rerunning");
+ }
+ }
+
+ void onPendingInitializeTransportError(Exception e) {
+ Slog.w(TAG, "Failed to query transport name for pending init: " + e);
+ }
+
+ void onBackupFinished(int status) {
+ BackupObserverUtils.sendBackupFinished(mObserver, status);
+ }
+
+ void onStartFullBackup(List<String> pendingFullBackups) {
+ Slog.d(TAG, "Starting full backups for: " + pendingFullBackups);
+ }
+
+ void onKeyValueBackupFinished() {
+ Slog.i(TAG, "K/V backup pass finished");
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
index 1cb99334dfeb..41013aafa504 100644
--- a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
+++ b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java
@@ -16,7 +16,11 @@
package com.android.server.backup.keyvalue;
-import static com.android.server.backup.BackupManagerService.DEBUG_BACKUP_TRACE;
+import static android.os.ParcelFileDescriptor.MODE_CREATE;
+import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
+import static android.os.ParcelFileDescriptor.MODE_READ_WRITE;
+import static android.os.ParcelFileDescriptor.MODE_TRUNCATE;
+
import static com.android.server.backup.BackupManagerService.KEY_WIDGET_STATE;
import static com.android.server.backup.BackupManagerService.OP_PENDING;
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP;
@@ -29,7 +33,6 @@ import android.app.backup.BackupAgent;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupManager;
-import android.app.backup.BackupManagerMonitor;
import android.app.backup.BackupTransport;
import android.app.backup.IBackupCallback;
import android.app.backup.IBackupManager;
@@ -47,7 +50,6 @@ import android.os.UserHandle;
import android.os.WorkSource;
import android.system.ErrnoException;
import android.system.Os;
-import android.util.EventLog;
import android.util.Pair;
import android.util.Slog;
@@ -55,12 +57,12 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.backup.IBackupTransport;
import com.android.internal.util.Preconditions;
import com.android.server.AppWidgetBackupBridge;
-import com.android.server.EventLogTags;
import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.KeyValueBackupJob;
+import com.android.server.backup.TransportManager;
import com.android.server.backup.fullbackup.PerformFullTransportBackupTask;
import com.android.server.backup.internal.OnTaskFinishedListener;
import com.android.server.backup.internal.Operation;
@@ -69,9 +71,8 @@ import com.android.server.backup.remote.RemoteCallable;
import com.android.server.backup.remote.RemoteResult;
import com.android.server.backup.transport.TransportClient;
import com.android.server.backup.utils.AppBackupUtils;
-import com.android.server.backup.utils.BackupManagerMonitorUtils;
-import com.android.server.backup.utils.BackupObserverUtils;
+import java.io.Closeable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
@@ -172,7 +173,7 @@ import java.util.concurrent.atomic.AtomicInteger;
// TODO: Distinguish between cancel and time-out where possible for logging/monitoring/observing
public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
private static final String TAG = "KeyValueBackupTask";
- private static final boolean DEBUG = BackupManagerService.DEBUG || true;
+ private static final boolean DEBUG = BackupManagerService.DEBUG;
private static final boolean MORE_DEBUG = BackupManagerService.MORE_DEBUG || false;
private static final int THREAD_PRIORITY = Process.THREAD_PRIORITY_BACKGROUND;
private static final AtomicInteger THREAD_COUNT = new AtomicInteger();
@@ -212,8 +213,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
List<BackupRequest> queue,
@Nullable DataChangedJournal dataChangedJournal,
IBackupObserver observer,
- IBackupManagerMonitor monitor,
- @Nullable OnTaskFinishedListener listener,
+ @Nullable IBackupManagerMonitor monitor,
+ OnTaskFinishedListener listener,
List<String> pendingFullBackups,
boolean userInitiated,
boolean nonIncremental) {
@@ -239,10 +240,13 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
}
private final BackupManagerService mBackupManagerService;
+ private final PackageManager mPackageManager;
+ private final TransportManager mTransportManager;
private final TransportClient mTransportClient;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
private final IBackupObserver mObserver;
- private final OnTaskFinishedListener mListener;
+ private final KeyValueBackupReporter mReporter;
+ private final OnTaskFinishedListener mTaskFinishedListener;
private final boolean mUserInitiated;
private final boolean mNonIncremental;
private final int mCurrentOpToken;
@@ -251,7 +255,6 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
private final List<BackupRequest> mQueue;
private final List<String> mPendingFullBackups;
@Nullable private final DataChangedJournal mJournal;
- private IBackupManagerMonitor mMonitor;
@Nullable private PerformFullTransportBackupTask mFullBackupTask;
private IBackupAgent mAgentBinder;
@@ -294,20 +297,22 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
List<BackupRequest> queue,
@Nullable DataChangedJournal journal,
IBackupObserver observer,
- IBackupManagerMonitor monitor,
- @Nullable OnTaskFinishedListener listener,
+ @Nullable IBackupManagerMonitor monitor,
+ OnTaskFinishedListener taskFinishedListener,
List<String> pendingFullBackups,
boolean userInitiated,
boolean nonIncremental) {
mBackupManagerService = backupManagerService;
+ mTransportManager = backupManagerService.getTransportManager();
+ mPackageManager = backupManagerService.getPackageManager();
mTransportClient = transportClient;
mOriginalQueue = queue;
// We need to retain the original queue contents in case of transport failure
- mQueue = new ArrayList<>(mOriginalQueue);
+ mQueue = new ArrayList<>(queue);
mJournal = journal;
mObserver = observer;
- mMonitor = monitor;
- mListener = (listener != null) ? listener : OnTaskFinishedListener.NOP;
+ mReporter = new KeyValueBackupReporter(backupManagerService, observer, monitor);
+ mTaskFinishedListener = taskFinishedListener;
mPendingFullBackups = pendingFullBackups;
mUserInitiated = userInitiated;
mNonIncremental = nonIncremental;
@@ -332,7 +337,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
public void run() {
Process.setThreadPriority(THREAD_PRIORITY);
- BackupState state = beginBackup();
+ BackupState state = startBackup();
while (state == BackupState.RUNNING_QUEUE || state == BackupState.BACKUP_PM) {
if (mCancelled) {
state = BackupState.CANCELLED;
@@ -342,24 +347,24 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
state = backupPm();
break;
case RUNNING_QUEUE:
- Pair<BackupState, RemoteResult> stateAndResult = invokeNextAgent();
+ Pair<BackupState, RemoteResult> stateAndResult = extractNextAgentData();
state = stateAndResult.first;
if (state == null) {
- state = processAgentInvocation(stateAndResult.second);
+ state = handleAgentResult(stateAndResult.second);
}
break;
}
}
if (state == BackupState.CANCELLED) {
- finalizeCancelledBackup();
+ finishCancelledBackup();
} else {
- finalizeBackup();
+ finishBackup();
}
}
- private BackupState processAgentInvocation(RemoteResult result) {
+ private BackupState handleAgentResult(RemoteResult result) {
if (result == RemoteResult.FAILED_THREAD_INTERRUPTED) {
- // Not an explicit cancel, we need to flag it
+ // Not an explicit cancel, we need to flag it.
mCancelled = true;
handleAgentCancelled();
return BackupState.CANCELLED;
@@ -373,7 +378,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
return BackupState.RUNNING_QUEUE;
}
Preconditions.checkState(result.succeeded());
- return handleAgentResult(result.get());
+ return sendDataToTransport(result.get());
}
@Override
@@ -382,24 +387,10 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
@Override
public void operationComplete(long unusedResult) {}
- private BackupState beginBackup() {
- if (DEBUG_BACKUP_TRACE) {
- mBackupManagerService.clearBackupTrace();
- StringBuilder b = new StringBuilder(256);
- b.append("beginBackup: [");
- for (BackupRequest req : mOriginalQueue) {
- b.append(' ');
- b.append(req.packageName);
- }
- b.append(" ]");
- mBackupManagerService.addBackupTrace(b.toString());
- }
+ private BackupState startBackup() {
synchronized (mBackupManagerService.getCurrentOpLock()) {
if (mBackupManagerService.isBackupOperationInProgress()) {
- if (DEBUG) {
- Slog.d(TAG, "Skipping backup since one is already in progress");
- }
- mBackupManagerService.addBackupTrace("Skipped. Backup already in progress.");
+ mReporter.onSkipBackup();
return BackupState.FINAL;
}
}
@@ -415,19 +406,17 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
/* runningJob */ null,
new CountDownLatch(1),
mObserver,
- mMonitor,
- mListener,
+ mReporter.getMonitor(),
+ mTaskFinishedListener,
mUserInitiated);
registerTask();
- mBackupManagerService.addBackupTrace("STATE => INITIAL");
mAgentBinder = null;
mStatus = BackupTransport.TRANSPORT_OK;
// Sanity check: if the queue is empty we have no work to do.
if (mOriginalQueue.isEmpty() && mPendingFullBackups.isEmpty()) {
- Slog.w(TAG, "Backup begun with an empty queue, nothing to do.");
- mBackupManagerService.addBackupTrace("queue empty at begin");
+ mReporter.onEmptyQueueAtStart();
return BackupState.FINAL;
}
@@ -441,55 +430,39 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
// we're committed to evaluating it for backup regardless.
for (int i = 0; i < mQueue.size(); i++) {
if (PACKAGE_MANAGER_SENTINEL.equals(mQueue.get(i).packageName)) {
- if (MORE_DEBUG) {
- Slog.i(TAG, "PM metadata in queue, removing");
- }
+ mReporter.onPmFoundInQueue();
mQueue.remove(i);
skipPm = false;
break;
}
}
+ mReporter.onQueueReady(mQueue);
- if (DEBUG) {
- Slog.v(TAG, "Beginning backup of " + mQueue.size() + " targets");
- }
File pmState = new File(mStateDir, PACKAGE_MANAGER_SENTINEL);
try {
- IBackupTransport transport = mTransportClient.connectOrThrow("KVBT.beginBackup()");
+ IBackupTransport transport = mTransportClient.connectOrThrow("KVBT.startBackup()");
String transportName = transport.name();
- EventLog.writeEvent(EventLogTags.BACKUP_START, transportName);
+ mReporter.onTransportReady(transportName);
- // If we haven't stored package manager metadata yet, we must init the transport.
+ // If we haven't stored PM metadata yet, we must initialize the transport.
if (pmState.length() <= 0) {
- Slog.i(TAG, "Initializing transport and resetting backup state");
- mBackupManagerService.addBackupTrace("initializing transport " + transportName);
- mBackupManagerService.resetBackupState(mStateDir); // Just to make sure.
+ mReporter.onInitializeTransport(transportName);
+ mBackupManagerService.resetBackupState(mStateDir);
mStatus = transport.initializeDevice();
-
- mBackupManagerService.addBackupTrace("transport.initializeDevice() == " + mStatus);
- if (mStatus == BackupTransport.TRANSPORT_OK) {
- EventLog.writeEvent(EventLogTags.BACKUP_INITIALIZE);
- } else {
- EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
- Slog.e(TAG, "Transport error in initializeDevice()");
- }
+ mReporter.onTransportInitialized(mStatus);
}
} catch (Exception e) {
- Slog.e(TAG, "Error during initialization", e);
- mBackupManagerService.addBackupTrace("Exception in backup thread during init: " + e);
+ mReporter.onInitializeTransportError(e);
mStatus = BackupTransport.TRANSPORT_ERROR;
}
- mBackupManagerService.addBackupTrace("exiting prelim: " + mStatus);
if (mStatus != BackupTransport.TRANSPORT_OK) {
- // if things went wrong at this point, we need to
- // restage everything and try again later.
- mBackupManagerService.resetBackupState(mStateDir); // Just to make sure.
+ mBackupManagerService.resetBackupState(mStateDir);
return BackupState.FINAL;
}
if (skipPm) {
- Slog.d(TAG, "Skipping backup of PM metadata");
+ mReporter.onSkipPm();
return BackupState.RUNNING_QUEUE;
}
@@ -498,38 +471,27 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
private BackupState backupPm() {
RemoteResult agentResult = null;
- BackupState nextState;
try {
- // The package manager doesn't have a proper <application> etc, but since it's running
- // here in the system process we can just set up its agent directly and use a synthetic
- // BackupRequest.
+ // Since PM is running in the system process we can set up its agent directly.
BackupAgent pmAgent = mBackupManagerService.makeMetadataAgent();
Pair<Integer, RemoteResult> statusAndResult =
- invokeAgentForBackup(
+ extractAgentData(
PACKAGE_MANAGER_SENTINEL,
IBackupAgent.Stub.asInterface(pmAgent.onBind()));
mStatus = statusAndResult.first;
agentResult = statusAndResult.second;
-
- mBackupManagerService.addBackupTrace("PM agent invoke: " + mStatus);
} catch (Exception e) {
- Slog.e(TAG, "Error during PM metadata backup", e);
- mBackupManagerService.addBackupTrace("Exception in backup thread during pm: " + e);
+ mReporter.onInvokePmAgentError(e);
mStatus = BackupTransport.TRANSPORT_ERROR;
}
- mBackupManagerService.addBackupTrace("exiting backupPm: " + mStatus);
- if (mStatus == BackupTransport.TRANSPORT_OK) {
- Preconditions.checkNotNull(agentResult);
- nextState = processAgentInvocation(agentResult);
- } else {
- // if things went wrong at this point, we need to
- // restage everything and try again later.
- mBackupManagerService.resetBackupState(mStateDir); // Just to make sure.
- nextState = BackupState.FINAL;
+ if (mStatus != BackupTransport.TRANSPORT_OK) {
+ mBackupManagerService.resetBackupState(mStateDir);
+ return BackupState.FINAL;
}
- return nextState;
+ Preconditions.checkNotNull(agentResult);
+ return handleAgentResult(agentResult);
}
/**
@@ -540,250 +502,183 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
* <li>({@code null}, agent result): In case we successfully called the agent.
* </ul>
*/
- private Pair<BackupState, RemoteResult> invokeNextAgent() {
+ private Pair<BackupState, RemoteResult> extractNextAgentData() {
mStatus = BackupTransport.TRANSPORT_OK;
- mBackupManagerService.addBackupTrace("invoke q=" + mQueue.size());
- // Sanity check that we have work to do. If not, skip to the end where
- // we reestablish the wakelock invariants etc.
if (mQueue.isEmpty()) {
- if (MORE_DEBUG) {
- Slog.i(TAG, "Queue now empty");
- }
+ mReporter.onEmptyQueue();
return Pair.create(BackupState.FINAL, null);
}
- // pop the entry we're going to process on this step
BackupRequest request = mQueue.remove(0);
+ String packageName = request.packageName;
+ mReporter.onStartPackageBackup(packageName);
- Slog.d(TAG, "Starting key-value backup of " + request);
- mBackupManagerService.addBackupTrace("launch agent for " + request.packageName);
-
- // Verify that the requested app exists; it might be something that
- // requested a backup but was then uninstalled. The request was
- // journalled and rather than tamper with the journal it's safer
- // to sanity-check here. This also gives us the classname of the
- // package's backup agent.
+ // Verify that the requested app is eligible for key-value backup.
RemoteResult agentResult = null;
try {
- PackageManager pm = mBackupManagerService.getPackageManager();
- mCurrentPackage = pm.getPackageInfo(request.packageName,
- PackageManager.GET_SIGNING_CERTIFICATES);
- if (!AppBackupUtils.appIsEligibleForBackup(mCurrentPackage.applicationInfo, pm)) {
- // The manifest has changed but we had a stale backup request pending. This won't
- // happen again because the app won't be requesting further backups.
- Slog.i(TAG, "Package " + request.packageName
- + " no longer supports backup, skipping");
- mBackupManagerService.addBackupTrace("skipping - not eligible, completion is noop");
- // Shouldn't happen in case of requested backup, as pre-check was done in
- // #requestBackup(), except to app update done concurrently
- BackupObserverUtils.sendBackupOnPackageResult(mObserver,
- mCurrentPackage.packageName,
- BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ mCurrentPackage = mPackageManager.getPackageInfo(
+ request.packageName, PackageManager.GET_SIGNING_CERTIFICATES);
+ ApplicationInfo applicationInfo = mCurrentPackage.applicationInfo;
+ if (!AppBackupUtils.appIsEligibleForBackup(applicationInfo, mPackageManager)) {
+ // The manifest has changed. This won't happen again because the app won't be
+ // requesting further backups.
+ mReporter.onPackageNotEligibleForBackup(packageName);
return Pair.create(BackupState.RUNNING_QUEUE, null);
}
if (AppBackupUtils.appGetsFullBackup(mCurrentPackage)) {
- // It's possible that this app *formerly* was enqueued for key-value backup, but has
- // since been updated and now only supports the full-backup path. Don't proceed with
- // a key-value backup for it in this case.
- Slog.i(TAG, "Package " + request.packageName
- + " performs full-backup rather than key-value, skipping");
- mBackupManagerService.addBackupTrace(
- "skipping - fullBackupOnly, completion is noop");
- // Shouldn't happen in case of requested backup, as pre-check was done in
- // #requestBackup()
- BackupObserverUtils.sendBackupOnPackageResult(mObserver,
- mCurrentPackage.packageName,
- BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ // Initially enqueued for key-value backup, but only supports full-backup now.
+ mReporter.onPackageEligibleForFullBackup(packageName);
return Pair.create(BackupState.RUNNING_QUEUE, null);
}
- if (AppBackupUtils.appIsStopped(mCurrentPackage.applicationInfo)) {
- // The app has been force-stopped or cleared or just installed,
- // and not yet launched out of that state, so just as it won't
- // receive broadcasts, we won't run it for backup.
- mBackupManagerService.addBackupTrace("skipping - stopped");
- BackupObserverUtils.sendBackupOnPackageResult(mObserver,
- mCurrentPackage.packageName,
- BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ if (AppBackupUtils.appIsStopped(applicationInfo)) {
+ // Just as it won't receive broadcasts, we won't run it for backup.
+ mReporter.onPackageStopped(packageName);
return Pair.create(BackupState.RUNNING_QUEUE, null);
}
try {
- mBackupManagerService.setWorkSource(
- new WorkSource(mCurrentPackage.applicationInfo.uid));
+ mBackupManagerService.setWorkSource(new WorkSource(applicationInfo.uid));
IBackupAgent agent =
mBackupManagerService.bindToAgentSynchronous(
- mCurrentPackage.applicationInfo,
+ applicationInfo,
ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL);
- mBackupManagerService.addBackupTrace("agent bound; a? = " + (agent != null));
if (agent != null) {
mAgentBinder = agent;
Pair<Integer, RemoteResult> statusAndResult =
- invokeAgentForBackup(request.packageName, agent);
+ extractAgentData(request.packageName, agent);
mStatus = statusAndResult.first;
agentResult = statusAndResult.second;
} else {
- // Timeout waiting for the agent
+ // Timeout waiting for the agent to bind.
mStatus = BackupTransport.AGENT_ERROR;
}
- } catch (SecurityException se) {
- // Try for the next one.
- Slog.d(TAG, "Error in bind/backup", se);
+ } catch (SecurityException e) {
+ mReporter.onBindAgentError(e);
mStatus = BackupTransport.AGENT_ERROR;
- mBackupManagerService.addBackupTrace("agent SE");
}
} catch (PackageManager.NameNotFoundException e) {
- Slog.d(TAG, "Package does not exist, skipping");
- mBackupManagerService.addBackupTrace("no such package");
mStatus = BackupTransport.AGENT_UNKNOWN;
} finally {
mBackupManagerService.setWorkSource(null);
}
if (mStatus != BackupTransport.TRANSPORT_OK) {
- BackupState nextState = BackupState.RUNNING_QUEUE;
mAgentBinder = null;
- // An agent-level failure means we re-enqueue this one agent for
- // a later retry, but otherwise proceed normally.
if (mStatus == BackupTransport.AGENT_ERROR) {
- if (MORE_DEBUG) {
- Slog.i(TAG, "Agent failure for " + request.packageName + ", re-staging");
- }
+ mReporter.onAgentError(packageName);
mBackupManagerService.dataChangedImpl(request.packageName);
mStatus = BackupTransport.TRANSPORT_OK;
- BackupObserverUtils
- .sendBackupOnPackageResult(mObserver, mCurrentPackage.packageName,
- BackupManager.ERROR_AGENT_FAILURE);
- } else if (mStatus == BackupTransport.AGENT_UNKNOWN) {
- // Failed lookup of the app, so we couldn't bring up an agent, but
- // we're otherwise fine. Just drop it and go on to the next as usual.
+ return Pair.create(BackupState.RUNNING_QUEUE, null);
+ }
+
+ if (mStatus == BackupTransport.AGENT_UNKNOWN) {
+ mReporter.onAgentUnknown(packageName);
mStatus = BackupTransport.TRANSPORT_OK;
- BackupObserverUtils
- .sendBackupOnPackageResult(mObserver, request.packageName,
- BackupManager.ERROR_PACKAGE_NOT_FOUND);
- } else {
- // Transport-level failure means we re-enqueue everything
- revertAndEndBackup();
- nextState = BackupState.FINAL;
+ return Pair.create(BackupState.RUNNING_QUEUE, null);
}
- return Pair.create(nextState, null);
+ // Transport-level failure, re-enqueue everything.
+ revertBackup();
+ return Pair.create(BackupState.FINAL, null);
}
// Success: caller will figure out the state based on call result
- mBackupManagerService.addBackupTrace("call made; result = " + agentResult);
return Pair.create(null, agentResult);
}
- private void finalizeBackup() {
- mBackupManagerService.addBackupTrace("finishing");
-
- // Mark packages that we didn't backup (because backup was cancelled, etc.) as needing
- // backup.
- for (BackupRequest req : mQueue) {
- mBackupManagerService.dataChangedImpl(req.packageName);
+ private void finishBackup() {
+ // Mark packages that we couldn't backup as pending backup.
+ for (BackupRequest request : mQueue) {
+ mBackupManagerService.dataChangedImpl(request.packageName);
}
- // Either backup was successful, in which case we of course do not need
- // this pass's journal any more; or it failed, in which case we just
- // re-enqueued all of these packages in the current active journal.
- // Either way, we no longer need this pass's journal.
+ // If backup succeeded, we just invalidated this journal. If not, we've already re-enqueued
+ // the packages and also don't need the journal.
if (mJournal != null && !mJournal.delete()) {
- Slog.e(TAG, "Unable to remove backup journal file " + mJournal);
+ mReporter.onJournalDeleteFailed(mJournal);
}
- // If everything actually went through and this is the first time we've
- // done a backup, we can now record what the current backup dataset token
- // is.
- String callerLogString = "KVBT.finalizeBackup()";
- if ((mBackupManagerService.getCurrentToken() == 0) && (mStatus
- == BackupTransport.TRANSPORT_OK)) {
- mBackupManagerService.addBackupTrace("success; recording token");
+ String callerLogString = "KVBT.finishBackup()";
+
+ // If we succeeded and this is the first time we've done a backup, we can record the current
+ // backup dataset token.
+ long currentToken = mBackupManagerService.getCurrentToken();
+ if ((mStatus == BackupTransport.TRANSPORT_OK) && (currentToken == 0)) {
try {
IBackupTransport transport = mTransportClient.connectOrThrow(callerLogString);
mBackupManagerService.setCurrentToken(transport.getCurrentRestoreSet());
mBackupManagerService.writeRestoreTokens();
} catch (Exception e) {
- // nothing for it at this point, unfortunately, but this will be
- // recorded the next time we fully succeed.
- Slog.e(TAG, "Transport threw reporting restore set: " + e);
- mBackupManagerService.addBackupTrace("transport threw returning token");
+ // This will be recorded the next time we succeed.
+ mReporter.onSetCurrentTokenError(e);
}
}
- // Set up the next backup pass - at this point we can set mBackupRunning
- // to false to allow another pass to fire
synchronized (mBackupManagerService.getQueueLock()) {
mBackupManagerService.setBackupRunning(false);
if (mStatus == BackupTransport.TRANSPORT_NOT_INITIALIZED) {
- if (MORE_DEBUG) {
- Slog.d(TAG, "Transport requires initialization, rerunning");
- }
- mBackupManagerService.addBackupTrace("init required; rerunning");
+ mReporter.onTransportNotInitialized();
try {
- String name = mBackupManagerService.getTransportManager()
- .getTransportName(mTransportClient.getTransportComponent());
- mBackupManagerService.getPendingInits().add(name);
+ IBackupTransport transport = mTransportClient.connectOrThrow(callerLogString);
+ mBackupManagerService.getPendingInits().add(transport.name());
+ clearPmMetadata();
+ mBackupManagerService.backupNow();
} catch (Exception e) {
- Slog.w(TAG, "Failed to query transport name for init: " + e);
- // swallow it and proceed; we don't rely on this
+ mReporter.onPendingInitializeTransportError(e);
}
- clearMetadata();
- mBackupManagerService.backupNow();
}
}
- mBackupManagerService.clearBackupTrace();
-
unregisterTask();
-
- if (!mCancelled && mStatus == BackupTransport.TRANSPORT_OK &&
- mPendingFullBackups != null && !mPendingFullBackups.isEmpty()) {
- Slog.d(TAG, "Starting full backups for: " + mPendingFullBackups);
- // Acquiring wakelock for PerformFullTransportBackupTask before its start.
- mBackupManagerService.getWakelock().acquire();
- // The full-backup task is now responsible for calling onFinish() on mListener, which
- // was the listener we passed it.
+ mReporter.onKeyValueBackupFinished();
+
+ if (!mCancelled
+ && mStatus == BackupTransport.TRANSPORT_OK
+ && mFullBackupTask != null
+ && !mPendingFullBackups.isEmpty()) {
+ mReporter.onStartFullBackup(mPendingFullBackups);
+ // The key-value backup has finished but not the overall backup. Full-backup task will:
+ // * Call mObserver.backupFinished() (which is called by mReporter below).
+ // * Call mTaskFinishedListener.onFinished().
+ // * Release the wakelock.
(new Thread(mFullBackupTask, "full-transport-requested")).start();
- } else if (mCancelled) {
- mListener.onFinished(callerLogString);
- if (mFullBackupTask != null) {
- mFullBackupTask.unregisterTask();
- }
- BackupObserverUtils.sendBackupFinished(mObserver, BackupManager.ERROR_BACKUP_CANCELLED);
- } else {
- mListener.onFinished(callerLogString);
- if (mFullBackupTask != null) {
- mFullBackupTask.unregisterTask();
- }
- switch (mStatus) {
- case BackupTransport.TRANSPORT_OK:
- case BackupTransport.TRANSPORT_QUOTA_EXCEEDED:
- case BackupTransport.TRANSPORT_PACKAGE_REJECTED:
- BackupObserverUtils.sendBackupFinished(mObserver, BackupManager.SUCCESS);
- break;
- case BackupTransport.TRANSPORT_NOT_INITIALIZED:
- BackupObserverUtils.sendBackupFinished(mObserver,
- BackupManager.ERROR_TRANSPORT_ABORTED);
- break;
- case BackupTransport.TRANSPORT_ERROR:
- default:
- BackupObserverUtils.sendBackupFinished(mObserver,
- BackupManager.ERROR_TRANSPORT_ABORTED);
- break;
- }
+ return;
}
- Slog.i(TAG, "K/V backup pass finished");
+
+ if (mFullBackupTask != null) {
+ mFullBackupTask.unregisterTask();
+ }
+ mTaskFinishedListener.onFinished(callerLogString);
+ mReporter.onBackupFinished(getBackupFinishedStatus(mCancelled, mStatus));
mBackupManagerService.getWakelock().release();
}
- // Remove the PM metadata state. This will generate an init on the next pass.
- private void clearMetadata() {
- final File pmState = new File(mStateDir, PACKAGE_MANAGER_SENTINEL);
- if (pmState.exists()) pmState.delete();
+ private int getBackupFinishedStatus(boolean cancelled, int transportStatus) {
+ if (cancelled) {
+ return BackupManager.ERROR_BACKUP_CANCELLED;
+ }
+ switch (transportStatus) {
+ case BackupTransport.TRANSPORT_OK:
+ case BackupTransport.TRANSPORT_QUOTA_EXCEEDED:
+ case BackupTransport.TRANSPORT_PACKAGE_REJECTED:
+ return BackupManager.SUCCESS;
+ case BackupTransport.TRANSPORT_NOT_INITIALIZED:
+ case BackupTransport.TRANSPORT_ERROR:
+ default:
+ return BackupManager.ERROR_TRANSPORT_ABORTED;
+ }
+ }
+
+ /** Removes PM state, triggering initialization in the next key-value task. */
+ private void clearPmMetadata() {
+ File pmState = new File(mStateDir, PACKAGE_MANAGER_SENTINEL);
+ if (pmState.exists()) {
+ pmState.delete();
+ }
}
/**
@@ -791,22 +686,16 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
* {@link BackupTransport#TRANSPORT_OK}, the second of the pair contains the agent result,
* otherwise {@code null}.
*/
- private Pair<Integer, RemoteResult> invokeAgentForBackup(
- String packageName, IBackupAgent agent) {
- if (DEBUG) {
- Slog.d(TAG, "Invoking agent on " + packageName);
- }
- mBackupManagerService.addBackupTrace("invoking " + packageName);
+ private Pair<Integer, RemoteResult> extractAgentData(String packageName, IBackupAgent agent) {
+ mReporter.onInvokeAgent(packageName);
File blankStateFile = new File(mStateDir, BLANK_STATE_FILE_NAME);
mSavedStateFile = new File(mStateDir, packageName);
+ File savedStateFileForAgent = (mNonIncremental) ? blankStateFile : mSavedStateFile;
mBackupDataFile =
new File(mBackupManagerService.getDataDir(), packageName + STAGING_FILE_SUFFIX);
mNewStateFile = new File(mStateDir, packageName + NEW_STATE_FILE_SUFFIX);
- if (MORE_DEBUG) {
- Slog.d(TAG, "Data file: " + mBackupDataFile);
- }
-
+ mReporter.onAgentFilesReady(mBackupDataFile);
mSavedState = null;
mBackupData = null;
@@ -815,46 +704,31 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
boolean callingAgent = false;
final RemoteResult agentResult;
try {
- // Look up the package info & signatures. This is first so that if it
- // throws an exception, there's no file setup yet that would need to
- // be unraveled.
+ // TODO: Move this to backupPm()
if (packageName.equals(PACKAGE_MANAGER_SENTINEL)) {
- // The metadata 'package' is synthetic; construct one and make
- // sure our global state is pointed at it
mCurrentPackage = new PackageInfo();
mCurrentPackage.packageName = packageName;
}
+ // MODE_CREATE to make an empty file if necessary
mSavedState = ParcelFileDescriptor.open(
- (mNonIncremental) ? blankStateFile : mSavedStateFile,
- ParcelFileDescriptor.MODE_READ_ONLY |
- ParcelFileDescriptor.MODE_CREATE); // Make an empty file if necessary
-
- mBackupData = ParcelFileDescriptor.open(mBackupDataFile,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
+ savedStateFileForAgent, MODE_READ_ONLY | MODE_CREATE);
+ mBackupData = ParcelFileDescriptor.open(
+ mBackupDataFile, MODE_READ_WRITE | MODE_CREATE | MODE_TRUNCATE);
+ mNewState = ParcelFileDescriptor.open(
+ mNewStateFile, MODE_READ_WRITE | MODE_CREATE | MODE_TRUNCATE);
if (!SELinux.restorecon(mBackupDataFile)) {
- Slog.e(TAG, "SELinux restorecon failed on " + mBackupDataFile);
+ mReporter.onRestoreconFailed(mBackupDataFile);
}
- mNewState = ParcelFileDescriptor.open(mNewStateFile,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
-
- IBackupTransport transport =
- mTransportClient.connectOrThrow("KVBT.invokeAgentForBackup()");
-
- final long quota = transport.getBackupQuota(packageName, false /* isFullBackup */);
- callingAgent = true;
-
- // Initiate the target's backup pass
+ IBackupTransport transport = mTransportClient.connectOrThrow("KVBT.extractAgentData()");
+ long quota = transport.getBackupQuota(packageName, /* isFullBackup */ false);
+ int transportFlags = transport.getTransportFlags();
long kvBackupAgentTimeoutMillis =
mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
- mBackupManagerService.addBackupTrace("calling agent doBackup()");
+ callingAgent = true;
agentResult =
remoteCall(
callback ->
@@ -864,22 +738,19 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
mNewState,
quota,
callback,
- transport.getTransportFlags()),
+ transportFlags),
kvBackupAgentTimeoutMillis);
} catch (Exception e) {
- Slog.e(TAG, "Error invoking agent on " + packageName + ": " + e);
- mBackupManagerService.addBackupTrace("exception: " + e);
- EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName, e.toString());
+ mReporter.onCallAgentDoBackupError(packageName, callingAgent, e);
errorCleanup();
+ // TODO: Remove the check on callingAgent when RemoteCall supports local agent calls.
int status =
callingAgent ? BackupTransport.AGENT_ERROR : BackupTransport.TRANSPORT_ERROR;
return Pair.create(status, null);
- } finally {
- if (mNonIncremental) {
- blankStateFile.delete();
- }
}
-
+ if (mNonIncremental) {
+ blankStateFile.delete();
+ }
return Pair.create(BackupTransport.TRANSPORT_OK, agentResult);
}
@@ -887,7 +758,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
try {
agent.fail(message);
} catch (Exception e) {
- Slog.w(TAG, "Error conveying failure to " + mCurrentPackage.packageName);
+ mReporter.onFailAgentError(mCurrentPackage.packageName);
}
}
@@ -898,36 +769,27 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
MessageDigest md = MessageDigest.getInstance("SHA-1");
checksum = md.digest(input);
} catch (NoSuchAlgorithmException e) {
- Slog.e(TAG, "Unable to use SHA-1!");
+ mReporter.onDigestError(e);
return "00";
}
- StringBuffer sb = new StringBuffer(checksum.length * 2);
+ StringBuilder string = new StringBuilder(checksum.length * 2);
for (byte item : checksum) {
- sb.append(Integer.toHexString(item));
+ string.append(Integer.toHexString(item));
}
- return sb.toString();
+ return string.toString();
}
private void writeWidgetPayloadIfAppropriate(FileDescriptor fd, String pkgName)
throws IOException {
// TODO: http://b/22388012
byte[] widgetState = AppWidgetBackupBridge.getWidgetState(pkgName, UserHandle.USER_SYSTEM);
- // has the widget state changed since last time?
- final File widgetFile = new File(mStateDir, pkgName + "_widget");
- final boolean priorStateExists = widgetFile.exists();
-
- if (MORE_DEBUG) {
- if (priorStateExists || widgetState != null) {
- Slog.i(TAG, "Checking widget update: state=" + (widgetState != null)
- + " prior=" + priorStateExists);
- }
- }
-
+ File widgetFile = new File(mStateDir, pkgName + "_widget");
+ boolean priorStateExists = widgetFile.exists();
if (!priorStateExists && widgetState == null) {
- // no prior state, no new state => nothing to do
return;
}
+ mReporter.onWriteWidgetData(priorStateExists, widgetState);
// if the new state is not null, we might need to compare checksums to
// determine whether to update the widget blob in the archive. If the
@@ -969,93 +831,67 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
}
}
- private BackupState handleAgentResult(long unusedResult) {
+ private BackupState sendDataToTransport(long agentResult) {
Preconditions.checkState(mBackupData != null);
- final String pkgName = mCurrentPackage.packageName;
- final long filepos = mBackupDataFile.length();
+ String packageName = mCurrentPackage.packageName;
+ ApplicationInfo applicationInfo = mCurrentPackage.applicationInfo;
+ long filePos = mBackupDataFile.length();
FileDescriptor fd = mBackupData.getFileDescriptor();
+ boolean writingWidgetData = false;
try {
- // If it's a 3rd party app, see whether they wrote any protected keys
- // and complain mightily if they are attempting shenanigans.
- if (mCurrentPackage.applicationInfo != null &&
- (mCurrentPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
- == 0) {
- ParcelFileDescriptor readFd = ParcelFileDescriptor.open(mBackupDataFile,
- ParcelFileDescriptor.MODE_READ_ONLY);
+ // If it's a 3rd party app, crash them if they wrote any protected keys.
+ if (applicationInfo != null &&
+ (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ ParcelFileDescriptor readFd =
+ ParcelFileDescriptor.open(mBackupDataFile, MODE_READ_ONLY);
BackupDataInput in = new BackupDataInput(readFd.getFileDescriptor());
try {
while (in.readNextHeader()) {
- final String key = in.getKey();
+ String key = in.getKey();
if (key != null && key.charAt(0) >= 0xff00) {
- // Not okay: crash them and bail.
+ mReporter.onAgentIllegalKey(mCurrentPackage, key);
failAgent(mAgentBinder, "Illegal backup key: " + key);
- mBackupManagerService
- .addBackupTrace("illegal key " + key + " from " + pkgName);
- EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, pkgName,
- "bad key");
- mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor,
- BackupManagerMonitor.LOG_EVENT_ID_ILLEGAL_KEY,
- mCurrentPackage,
- BackupManagerMonitor
- .LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
- BackupManagerMonitorUtils.putMonitoringExtra(null,
- BackupManagerMonitor.EXTRA_LOG_ILLEGAL_KEY,
- key));
- BackupObserverUtils
- .sendBackupOnPackageResult(mObserver, pkgName,
- BackupManager.ERROR_AGENT_FAILURE);
errorCleanup();
- if (MORE_DEBUG) {
- Slog.i(TAG, "Agent failure for " + pkgName
- + " with illegal key " + key + ", dropped");
- }
-
return BackupState.RUNNING_QUEUE;
}
in.skipEntityData();
}
} finally {
- if (readFd != null) {
- readFd.close();
- }
+ readFd.close();
}
}
- // Piggyback the widget state payload, if any
- writeWidgetPayloadIfAppropriate(fd, pkgName);
+ writingWidgetData = true;
+ writeWidgetPayloadIfAppropriate(fd, packageName);
} catch (IOException e) {
- // Hard disk error; recovery/failure policy TBD. For now roll back,
- // but we may want to consider this a transport-level failure (i.e.
- // we're in such a bad state that we can't contemplate doing backup
- // operations any more during this pass).
- Slog.w(TAG, "Unable read backup data or to save widget state for " + pkgName);
+ if (writingWidgetData) {
+ mReporter.onWriteWidgetDataError(packageName, e);
+ } else {
+ mReporter.onReadAgentDataError(packageName, e);
+ }
try {
- Os.ftruncate(fd, filepos);
+ Os.ftruncate(fd, filePos);
} catch (ErrnoException ee) {
- Slog.w(TAG, "Unable to roll back");
+ mReporter.onTruncateDataError();
}
}
clearAgentState();
- mBackupManagerService.addBackupTrace("operation complete");
ParcelFileDescriptor backupData = null;
mStatus = BackupTransport.TRANSPORT_OK;
long size = 0;
try {
- IBackupTransport transport = mTransportClient.connectOrThrow("KVBT.handleAgentResult()");
+ IBackupTransport transport =
+ mTransportClient.connectOrThrow("KVBT.sendDataToTransport()");
size = mBackupDataFile.length();
if (size > 0) {
- if (MORE_DEBUG) {
- Slog.v(TAG, "Sending non-empty data to transport for " + pkgName);
- }
boolean isNonIncremental = mSavedStateFile.length() == 0;
- if (mStatus == BackupTransport.TRANSPORT_OK) {
- backupData = ParcelFileDescriptor.open(mBackupDataFile,
- ParcelFileDescriptor.MODE_READ_ONLY);
- mBackupManagerService.addBackupTrace("sending data to transport");
+ if (mStatus == BackupTransport.TRANSPORT_OK) {
+ mReporter.onSendDataToTransport(packageName);
+ backupData = ParcelFileDescriptor.open(mBackupDataFile, MODE_READ_ONLY);
int userInitiatedFlag =
mUserInitiated ? BackupTransport.FLAG_USER_INITIATED : 0;
int incrementalFlag =
@@ -1069,114 +905,58 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
if (isNonIncremental
&& mStatus == BackupTransport.TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED) {
- // TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED is only valid if the backup was
- // incremental, as if the backup is non-incremental there is no state to
- // clear. This avoids us ending up in a retry loop if the transport always
- // returns this code.
- Slog.e(TAG, "Transport requested non-incremental but already the case");
- mBackupManagerService.addBackupTrace(
- "Transport requested non-incremental but already the case, error");
+ mReporter.onNonIncrementalAndNonIncrementalRequired();
mStatus = BackupTransport.TRANSPORT_ERROR;
}
- mBackupManagerService.addBackupTrace("data delivered: " + mStatus);
if (mStatus == BackupTransport.TRANSPORT_OK) {
- mBackupManagerService.addBackupTrace("finishing op on transport");
mStatus = transport.finishBackup();
- mBackupManagerService.addBackupTrace("finished: " + mStatus);
- } else if (mStatus == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
- mBackupManagerService.addBackupTrace("transport rejected package");
}
} else {
- if (MORE_DEBUG) {
- Slog.i(TAG, "No backup data written, not calling transport");
- }
- mBackupManagerService.addBackupTrace("no data to send");
- mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor,
- BackupManagerMonitor.LOG_EVENT_ID_NO_DATA_TO_SEND,
- mCurrentPackage,
- BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
- null);
+ mReporter.onEmptyData(mCurrentPackage);
}
if (mStatus == BackupTransport.TRANSPORT_OK) {
- // After successful transport, delete the now-stale data
- // and juggle the files so that next time we supply the agent
- // with the new state file it just created.
mBackupDataFile.delete();
mNewStateFile.renameTo(mSavedStateFile);
- BackupObserverUtils.sendBackupOnPackageResult(
- mObserver, pkgName, BackupManager.SUCCESS);
- EventLog.writeEvent(EventLogTags.BACKUP_PACKAGE, pkgName, size);
- mBackupManagerService.logBackupComplete(pkgName);
+ mReporter.onPackageBackupComplete(packageName, size);
} else if (mStatus == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
- // The transport has rejected backup of this specific package. Roll it
- // back but proceed with running the rest of the queue.
mBackupDataFile.delete();
mNewStateFile.delete();
- BackupObserverUtils.sendBackupOnPackageResult(mObserver, pkgName,
- BackupManager.ERROR_TRANSPORT_PACKAGE_REJECTED);
- EventLogTags.writeBackupAgentFailure(pkgName, "Transport rejected");
+ mReporter.onPackageBackupRejected(packageName);
} else if (mStatus == BackupTransport.TRANSPORT_QUOTA_EXCEEDED) {
- BackupObserverUtils.sendBackupOnPackageResult(mObserver, pkgName,
- BackupManager.ERROR_TRANSPORT_QUOTA_EXCEEDED);
- EventLog.writeEvent(EventLogTags.BACKUP_QUOTA_EXCEEDED, pkgName);
-
+ // TODO: Should reset files like above?
+ mReporter.onPackageBackupQuotaExceeded(packageName);
} else if (mStatus == BackupTransport.TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED) {
- Slog.i(TAG, "Transport lost data, retrying package");
- mBackupManagerService.addBackupTrace(
- "Transport lost data, retrying package:" + pkgName);
- BackupManagerMonitorUtils.monitorEvent(
- mMonitor,
- BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED,
- mCurrentPackage,
- BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT,
- /*extras=*/ null);
-
+ mReporter.onPackageBackupNonIncrementalRequired(mCurrentPackage);
mBackupDataFile.delete();
mSavedStateFile.delete();
mNewStateFile.delete();
// Immediately retry the package by adding it back to the front of the queue.
// We cannot add @pm@ to the queue because we back it up separately at the start
- // of the backup pass in state BACKUP_PM. Instead we retry this state (see
- // below).
- if (!PACKAGE_MANAGER_SENTINEL.equals(pkgName)) {
- mQueue.add(0, new BackupRequest(pkgName));
+ // of the backup pass in state BACKUP_PM. See below.
+ if (!PACKAGE_MANAGER_SENTINEL.equals(packageName)) {
+ mQueue.add(0, new BackupRequest(packageName));
}
-
} else {
- // Actual transport-level failure to communicate the data to the backend
- BackupObserverUtils.sendBackupOnPackageResult(mObserver, pkgName,
- BackupManager.ERROR_TRANSPORT_ABORTED);
- EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, pkgName);
+ mReporter.onPackageBackupTransportFailure(packageName);
}
} catch (Exception e) {
- BackupObserverUtils.sendBackupOnPackageResult(mObserver, pkgName,
- BackupManager.ERROR_TRANSPORT_ABORTED);
- Slog.e(TAG, "Transport error backing up " + pkgName, e);
- EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, pkgName);
+ mReporter.onPackageBackupError(packageName, e);
mStatus = BackupTransport.TRANSPORT_ERROR;
} finally {
- try {
- if (backupData != null) {
- backupData.close();
- }
- } catch (IOException e) {
- Slog.w(TAG, "Error closing backup data file-descriptor");
- }
+ tryCloseFileDescriptor(backupData, "backup data");
}
final BackupState nextState;
if (mStatus == BackupTransport.TRANSPORT_OK
|| mStatus == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
- // Success or single-package rejection. Proceed with the next app if any,
- // otherwise we're done.
nextState = BackupState.RUNNING_QUEUE;
} else if (mStatus == BackupTransport.TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED) {
// We want to immediately retry the current package.
- if (PACKAGE_MANAGER_SENTINEL.equals(pkgName)) {
+ if (PACKAGE_MANAGER_SENTINEL.equals(packageName)) {
nextState = BackupState.BACKUP_PM;
} else {
// This is an ordinary package so we will have added it back into the queue
@@ -1185,25 +965,21 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
}
} else if (mStatus == BackupTransport.TRANSPORT_QUOTA_EXCEEDED) {
- if (MORE_DEBUG) {
- Slog.d(TAG, "Package " + mCurrentPackage.packageName +
- " hit quota limit on key-value backup");
- }
if (mAgentBinder != null) {
try {
IBackupTransport transport =
- mTransportClient.connectOrThrow("KVBT.handleAgentResult()");
+ mTransportClient.connectOrThrow("KVBT.sendDataToTransport()");
long quota = transport.getBackupQuota(mCurrentPackage.packageName, false);
mAgentBinder.doQuotaExceeded(size, quota);
} catch (Exception e) {
- Slog.e(TAG, "Unable to notify about quota exceeded: " + e.getMessage());
+ mReporter.onAgentDoQuotaExceededError(e);
}
}
nextState = BackupState.RUNNING_QUEUE;
} else {
// Any other error here indicates a transport-level failure. That means
// we need to halt everything and reschedule everything for next time.
- revertAndEndBackup();
+ revertBackup();
nextState = BackupState.FINAL;
}
@@ -1223,10 +999,9 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
*/
@Override
public void handleCancel(boolean cancelAll) {
+ // This is called in a thread different from the one that executes method run().
Preconditions.checkArgument(cancelAll, "Can't partially cancel a key-value backup task");
- if (MORE_DEBUG) {
- Slog.v(TAG, "Cancel received");
- }
+ mReporter.onCancel();
mCancelled = true;
RemoteCall pendingCall = mPendingCall;
if (pendingCall != null) {
@@ -1236,66 +1011,35 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
}
private void handleAgentTimeout() {
- String packageName = getPackageNameForLog();
- Slog.i(TAG, "Agent " + packageName + " timed out");
- EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName);
- mBackupManagerService.addBackupTrace("timeout of " + packageName);
- mMonitor =
- BackupManagerMonitorUtils.monitorEvent(
- mMonitor,
- BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL,
- mCurrentPackage,
- BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
- BackupManagerMonitorUtils.putMonitoringExtra(
- null, BackupManagerMonitor.EXTRA_LOG_CANCEL_ALL, false));
+ mReporter.onAgentTimedOut(mCurrentPackage);
errorCleanup();
}
private void handleAgentCancelled() {
- String packageName = getPackageNameForLog();
- Slog.i(TAG, "Cancel backing up " + packageName);
- EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName);
- mBackupManagerService.addBackupTrace("cancel of " + packageName);
+ mReporter.onAgentCancelled(mCurrentPackage);
errorCleanup();
}
- private void finalizeCancelledBackup() {
- mMonitor =
- BackupManagerMonitorUtils.monitorEvent(
- mMonitor,
- BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL,
- mCurrentPackage,
- BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
- BackupManagerMonitorUtils.putMonitoringExtra(
- null, BackupManagerMonitor.EXTRA_LOG_CANCEL_ALL, true));
- finalizeBackup();
+ private void finishCancelledBackup() {
+ finishBackup();
// finalizeBackup() may call the transport, so we only acknowledge the cancellation here.
mCancelAcknowledged.open();
}
- private String getPackageNameForLog() {
- return (mCurrentPackage != null) ? mCurrentPackage.packageName : "no_package_yet";
- }
-
- private void revertAndEndBackup() {
- if (MORE_DEBUG) {
- Slog.i(TAG, "Reverting backup queue, re-staging everything");
- }
- mBackupManagerService.addBackupTrace("transport error; reverting");
-
- // We want to reset the backup schedule based on whatever the transport suggests
- // by way of retry/backoff time.
+ private void revertBackup() {
+ mReporter.onRevertBackup();
long delay;
try {
IBackupTransport transport =
- mTransportClient.connectOrThrow("KVBT.revertAndEndBackup()");
+ mTransportClient.connectOrThrow("KVBT.revertBackup()");
delay = transport.requestBackupTime();
} catch (Exception e) {
- Slog.w(TAG, "Unable to contact transport for recommended backoff: " + e);
- delay = 0; // use the scheduler's default
+ mReporter.onTransportRequestBackupTimeError(e);
+ // Use the scheduler's default.
+ delay = 0;
}
- KeyValueBackupJob.schedule(mBackupManagerService.getContext(), delay,
- mBackupManagerService.getConstants());
+ KeyValueBackupJob.schedule(
+ mBackupManagerService.getContext(), delay, mBackupManagerService.getConstants());
for (BackupRequest request : mOriginalQueue) {
mBackupManagerService.dataChangedImpl(request.packageName);
@@ -1308,50 +1052,37 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable {
clearAgentState();
}
- // Cleanup common to both success and failure cases
private void clearAgentState() {
- try {
- if (mSavedState != null) {
- mSavedState.close();
- }
- } catch (IOException e) {
- Slog.w(TAG, "Error closing old state file-descriptor");
- }
- try {
- if (mBackupData != null) {
- mBackupData.close();
- }
- } catch (IOException e) {
- Slog.w(TAG, "Error closing backup data file-descriptor");
- }
- try {
- if (mNewState != null) {
- mNewState.close();
- }
- } catch (IOException e) {
- Slog.w(TAG, "Error closing new state file-descriptor");
- }
+ // Cleanup common to both success and failure cases.
+ tryCloseFileDescriptor(mSavedState, "old state");
+ tryCloseFileDescriptor(mBackupData, "backup data");
+ tryCloseFileDescriptor(mNewState, "new state");
synchronized (mBackupManagerService.getCurrentOpLock()) {
- // Current-operation callback handling requires the validity of these various
- // bits of internal state as an invariant of the operation still being live.
- // This means we make sure to clear all of the state in unison inside the lock.
+ // TODO: Do we still need this?
mSavedState = mBackupData = mNewState = null;
}
- // If this was a pseudo-package there's no associated Activity Manager state
+ // For PM metadata (for which applicationInfo is null) there is no agent-bound state.
if (mCurrentPackage.applicationInfo != null) {
- mBackupManagerService.addBackupTrace("unbinding " + mCurrentPackage.packageName);
mBackupManagerService.unbindAgent(mCurrentPackage.applicationInfo);
}
}
+ private void tryCloseFileDescriptor(@Nullable Closeable closeable, String logName) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (IOException e) {
+ mReporter.onCloseFileDescriptorError(logName);
+ }
+ }
+ }
+
private RemoteResult remoteCall(RemoteCallable<IBackupCallback> remoteCallable, long timeoutMs)
throws RemoteException {
mPendingCall = new RemoteCall(mCancelled, remoteCallable, timeoutMs);
RemoteResult result = mPendingCall.call();
- if (MORE_DEBUG) {
- Slog.v(TAG, "Agent call returned " + result);
- }
+ mReporter.onRemoteCallReturned(result);
mPendingCall = null;
return result;
}
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index 28e9b77c82fc..9af952ddfc1c 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -136,7 +136,14 @@ public class AppBackupUtils {
/**
* Checks if the app is in a stopped state. This is not part of the general "eligible for
* backup?" check because we *do* still need to restore data to apps in this state (e.g.
- * newly-installing ones)
+ * newly-installing ones).
+ *
+ * <p>Reasons for such state:
+ * <ul>
+ * <li>The app has been force-stopped.
+ * <li>The app has been cleared.
+ * <li>The app has just been installed.
+ * </ul>
*/
public static boolean appIsStopped(ApplicationInfo app) {
return ((app.flags & ApplicationInfo.FLAG_STOPPED) != 0);
diff --git a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java
index b23781d37569..6f083760980d 100644
--- a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorUtils.java
@@ -21,6 +21,7 @@ import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NA
import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.TAG;
+import android.annotation.Nullable;
import android.app.backup.BackupManagerMonitor;
import android.app.backup.IBackupManagerMonitor;
import android.content.pm.PackageInfo;
@@ -44,8 +45,13 @@ public class BackupManagerMonitorUtils {
* @param extras - additional event data.
* @return <code>monitor</code> if call succeeded and <code>null</code> otherwise.
*/
- public static IBackupManagerMonitor monitorEvent(IBackupManagerMonitor monitor, int id,
- PackageInfo pkg, int category, Bundle extras) {
+ @Nullable
+ public static IBackupManagerMonitor monitorEvent(
+ @Nullable IBackupManagerMonitor monitor,
+ int id,
+ PackageInfo pkg,
+ int category,
+ Bundle extras) {
if (monitor != null) {
try {
Bundle bundle = new Bundle();
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index 5c14459da566..50f15ca0739f 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -624,7 +624,7 @@ public final class BatteryService extends SystemService {
// them will get the new sequence number at that point. (See for example how testing
// of JobScheduler's BatteryController works.)
sendBatteryChangedIntentLocked();
- if (mLastBatteryLevel != mHealthInfo.batteryLevel) {
+ if (mLastBatteryLevel != mHealthInfo.batteryLevel || mLastPlugType != mPlugType) {
sendBatteryLevelChangedIntentLocked();
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 6b3f8f8eb216..ba5f32308a30 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2194,8 +2194,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
break;
}
case NetworkAgent.EVENT_NETWORK_SCORE_CHANGED: {
- Integer score = (Integer) msg.obj;
- if (score != null) updateNetworkScore(nai, score.intValue());
+ updateNetworkScore(nai, msg.arg1);
break;
}
case NetworkAgent.EVENT_SET_EXPLICITLY_SELECTED: {
@@ -2203,7 +2202,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
loge("ERROR: already-connected network explicitly selected.");
}
nai.networkMisc.explicitlySelected = true;
- nai.networkMisc.acceptUnvalidated = (boolean) msg.obj;
+ nai.networkMisc.acceptUnvalidated = msg.arg1 == 1;
break;
}
case NetworkAgent.EVENT_PACKET_KEEPALIVE: {
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index abcd6ef1140f..5f391d82b663 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -646,12 +646,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
SystemProperties.set(PROP_QTAGUID_ENABLED, mBandwidthControlEnabled ? "1" : "0");
- try {
- mConnector.execute("strict", "enable");
- mStrictEnabled = true;
- } catch (NativeDaemonConnectorException e) {
- Log.wtf(TAG, "Failed strict enable", e);
- }
+ mStrictEnabled = true;
setDataSaverModeEnabled(mDataSaverMode);
@@ -1809,26 +1804,26 @@ public class NetworkManagementService extends INetworkManagementService.Stub
}
private void applyUidCleartextNetworkPolicy(int uid, int policy) {
- final String policyString;
+ final int policyValue;
switch (policy) {
case StrictMode.NETWORK_POLICY_ACCEPT:
- policyString = "accept";
+ policyValue = INetd.PENALTY_POLICY_ACCEPT;
break;
case StrictMode.NETWORK_POLICY_LOG:
- policyString = "log";
+ policyValue = INetd.PENALTY_POLICY_LOG;
break;
case StrictMode.NETWORK_POLICY_REJECT:
- policyString = "reject";
+ policyValue = INetd.PENALTY_POLICY_REJECT;
break;
default:
throw new IllegalArgumentException("Unknown policy " + policy);
}
try {
- mConnector.execute("strict", "set_uid_cleartext_policy", uid, policyString);
+ mNetdService.strictUidCleartextPenalty(uid, policyValue);
mUidCleartextPolicy.put(uid, policy);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1846,6 +1841,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
return;
}
+ // TODO: remove this code after removing prepareNativeDaemon()
if (!mStrictEnabled) {
// Module isn't enabled yet; stash the requested policy away to
// apply later once the daemon is connected.
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index a05a3e767d12..0deaee7f7878 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -43,6 +43,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.MediaStore;
import android.provider.Settings;
import android.system.ErrnoException;
@@ -104,6 +105,7 @@ public final class PinnerService extends SystemService {
private final Context mContext;
private final ActivityManagerInternal mAmInternal;
private final IActivityManager mAm;
+ private final UserManager mUserManager;
/** The list of the statically pinned files. */
@GuardedBy("this")
@@ -165,6 +167,8 @@ public final class PinnerService extends SystemService {
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
mAm = ActivityManager.getService();
+ mUserManager = mContext.getSystemService(UserManager.class);
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
filter.addDataScheme("package");
@@ -195,12 +199,16 @@ public final class PinnerService extends SystemService {
*/
@Override
public void onSwitchUser(int userHandle) {
- sendPinAppsMessage(userHandle);
+ if (!mUserManager.isManagedProfile(userHandle)) {
+ sendPinAppsMessage(userHandle);
+ }
}
@Override
public void onUnlockUser(int userHandle) {
- sendPinAppsMessage(userHandle);
+ if (!mUserManager.isManagedProfile(userHandle)) {
+ sendPinAppsMessage(userHandle);
+ }
}
/**
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 42157cc562b9..30a8557f6971 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -24,12 +24,14 @@ import static android.os.storage.OnObbStateChangeListener.ERROR_NOT_MOUNTED;
import static android.os.storage.OnObbStateChangeListener.ERROR_PERMISSION_DENIED;
import static android.os.storage.OnObbStateChangeListener.MOUNTED;
import static android.os.storage.OnObbStateChangeListener.UNMOUNTED;
+
import static com.android.internal.util.XmlUtils.readIntAttribute;
import static com.android.internal.util.XmlUtils.readLongAttribute;
import static com.android.internal.util.XmlUtils.readStringAttribute;
import static com.android.internal.util.XmlUtils.writeIntAttribute;
import static com.android.internal.util.XmlUtils.writeLongAttribute;
import static com.android.internal.util.XmlUtils.writeStringAttribute;
+
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
@@ -112,6 +114,7 @@ import android.util.TimeUtils;
import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IMediaContainerService;
import com.android.internal.os.AppFuseMount;
import com.android.internal.os.BackgroundThread;
@@ -125,11 +128,13 @@ import com.android.internal.util.HexDump;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.internal.widget.LockPatternUtils;
-import com.android.server.pm.PackageManagerService;
import com.android.server.storage.AppFuseBridge;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal.ScreenObserver;
+import libcore.io.IoUtils;
+import libcore.util.EmptyArray;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -159,14 +164,13 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
-import libcore.io.IoUtils;
-import libcore.util.EmptyArray;
-
/**
* Service responsible for various storage media. Connects to {@code vold} to
* watch for and manage dynamically added storage, such as SD cards and USB mass
@@ -182,8 +186,8 @@ class StorageManagerService extends IStorageManager.Stub
private static final String ZRAM_ENABLED_PROPERTY =
"persist.sys.zram_enabled";
- private static final String ISOLATED_STORAGE_PROPERTY =
- "persist.sys.isolated_storage";
+ private static final boolean ENABLE_ISOLATED_STORAGE = SystemProperties
+ .getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false);
private static final String SHARED_SANDBOX_ID_PREFIX = "shared:";
@@ -448,8 +452,8 @@ class StorageManagerService extends IStorageManager.Stub
private volatile boolean mDaemonConnected = false;
private volatile boolean mSecureKeyguardShowing = true;
- private PackageManagerService mPms;
private PackageManagerInternal mPmInternal;
+ private UserManagerInternal mUmInternal;
private final Callbacks mCallbacks;
private final LockPatternUtils mLockPatternUtils;
@@ -824,8 +828,8 @@ class StorageManagerService extends IStorageManager.Stub
// System user does not have media provider, so skip.
if (user.isSystemOnly()) continue;
- final ProviderInfo provider = mPms.resolveContentProvider(MediaStore.AUTHORITY,
- PackageManager.MATCH_DIRECT_BOOT_AWARE
+ final ProviderInfo provider = mPmInternal.resolveContentProvider(
+ MediaStore.AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
user.id);
if (provider != null) {
@@ -1180,7 +1184,7 @@ class StorageManagerService extends IStorageManager.Stub
@GuardedBy("mLock")
private void onVolumeCreatedLocked(VolumeInfo vol) {
- if (mPms.isOnlyCoreApps()) {
+ if (mPmInternal.isOnlyCoreApps()) {
Slog.d(TAG, "System booted in core-only mode; ignoring volume " + vol.getId());
return;
}
@@ -1428,9 +1432,8 @@ class StorageManagerService extends IStorageManager.Stub
mCallbacks = new Callbacks(FgThread.get().getLooper());
mLockPatternUtils = new LockPatternUtils(mContext);
- // XXX: This will go away soon in favor of IMountServiceObserver
- mPms = (PackageManagerService) ServiceManager.getService("package");
mPmInternal = LocalServices.getService(PackageManagerInternal.class);
+ mUmInternal = LocalServices.getService(UserManagerInternal.class);
HandlerThread hthread = new HandlerThread(TAG);
hthread.start();
@@ -1484,14 +1487,13 @@ class StorageManagerService extends IStorageManager.Stub
connect();
}
- private void collectPackagesInfo() {
- if (!SystemProperties.getBoolean(ISOLATED_STORAGE_PROPERTY, false)) {
- return;
- }
+ @VisibleForTesting
+ void collectPackagesInfo() {
+ if (!ENABLE_ISOLATED_STORAGE) return;
+
resetPackageData();
final SparseArray<String> sharedUserIds = mPmInternal.getAppsWithSharedUserIds();
- final int[] userIds = LocalServices.getService(
- UserManagerInternal.class).getUserIds();
+ final int[] userIds = mUmInternal.getUserIds();
for (int userId : userIds) {
final List<ApplicationInfo> appInfos
= mContext.getPackageManager().getInstalledApplicationsAsUser(
@@ -1525,9 +1527,8 @@ class StorageManagerService extends IStorageManager.Stub
return sharedUserId == null ? packageName : SHARED_SANDBOX_ID_PREFIX + sharedUserId;
}
private void pushPackagesInfo() throws RemoteException {
- if (!SystemProperties.getBoolean(ISOLATED_STORAGE_PROPERTY, false)) {
- return;
- }
+ if (!ENABLE_ISOLATED_STORAGE) return;
+
// Arrays to fill up from {@link #mAppIds}
final String[] allPackageNames;
final int[] appIdsForPackages;
@@ -1565,9 +1566,8 @@ class StorageManagerService extends IStorageManager.Stub
}
private String[] getPackagesArrayForUser(int userId) {
- if (!SystemProperties.getBoolean(ISOLATED_STORAGE_PROPERTY, false)) {
- return new String[0];
- }
+ if (!ENABLE_ISOLATED_STORAGE) return EmptyArray.STRING;
+
synchronized (mPackagesLock) {
return getPackagesForUserPL(userId).toArray(new String[0]);
}
@@ -2267,7 +2267,7 @@ class StorageManagerService extends IStorageManager.Stub
return false;
}
- final int packageUid = mPms.getPackageUid(packageName,
+ final int packageUid = mPmInternal.getPackageUid(packageName,
PackageManager.MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getUserId(callerUid));
if (DEBUG_OBB) {
@@ -3091,7 +3091,7 @@ class StorageManagerService extends IStorageManager.Stub
bytes += storage.getStorageLowBytes(path);
}
- mPms.freeStorage(volumeUuid, bytes, flags);
+ mPmInternal.freeStorage(volumeUuid, bytes, flags);
} catch (IOException e) {
throw new ParcelableException(e);
} finally {
@@ -3099,6 +3099,72 @@ class StorageManagerService extends IStorageManager.Stub
}
}
+ private static final Pattern PATTERN_TRANSLATE = Pattern.compile(
+ "(?i)^(/storage/[^/]+/(?:[0-9]+/)?)(.*)");
+
+ @Override
+ public String translateAppToSystem(String path, String packageName, int userId) {
+ return translateInternal(path, packageName, userId, true);
+ }
+
+ @Override
+ public String translateSystemToApp(String path, String packageName, int userId) {
+ return translateInternal(path, packageName, userId, false);
+ }
+
+ private String translateInternal(String path, String packageName, int userId,
+ boolean toSystem) {
+ if (!ENABLE_ISOLATED_STORAGE) return path;
+
+ if (path.contains("/../")) {
+ throw new SecurityException("Shady looking path " + path);
+ }
+
+ final int uid = mPmInternal.getPackageUid(packageName,
+ PackageManager.MATCH_UNINSTALLED_PACKAGES, userId);
+ final String sandboxId;
+ synchronized (mPackagesLock) {
+ sandboxId = mSandboxIds.get(UserHandle.getAppId(uid));
+ }
+ if (uid < 0 || sandboxId == null) {
+ throw new IllegalArgumentException("Unknown package " + packageName);
+ }
+
+ final Matcher m = PATTERN_TRANSLATE.matcher(path);
+ if (m.matches()) {
+ final String device = m.group(1);
+ final String devicePath = m.group(2);
+
+ // Does path belong to any packages belonging to this UID? If so,
+ // they get to go straight through to legacy paths.
+ final String[] pkgs = mContext.getPackageManager().getPackagesForUid(uid);
+ for (String pkg : pkgs) {
+ if (devicePath.startsWith("Android/data/" + pkg + "/") ||
+ devicePath.startsWith("Android/media/" + pkg + "/") ||
+ devicePath.startsWith("Android/obb/" + pkg + "/")) {
+ return path;
+ }
+ }
+
+ if (toSystem) {
+ // Everything else goes into sandbox.
+ return device + "Android/sandbox/" + sandboxId.replace(':', '/') + "/" + devicePath;
+ } else {
+ // Does path belong to this sandbox? If so, leave sandbox.
+ final String sandboxPrefix = "Android/sandbox/" + sandboxId.replace(':', '/') + "/";
+ if (devicePath.startsWith(sandboxPrefix)) {
+ return device + devicePath.substring(sandboxPrefix.length());
+ }
+
+ // Path isn't valid inside sandbox!
+ throw new SecurityException(
+ "Path " + path + " isn't valid inside sandbox " + sandboxId);
+ }
+ }
+
+ return path;
+ }
+
private void addObbStateLocked(ObbState obbState) throws RemoteException {
final IBinder binder = obbState.getBinder();
List<ObbState> obbStates = mObbMounts.get(binder);
@@ -3764,9 +3830,7 @@ class StorageManagerService extends IStorageManager.Stub
@Override
public void onExternalStoragePolicyChanged(int uid, String packageName) {
// No runtime storage permissions in isolated storage world, so nothing to do here.
- if (SystemProperties.getBoolean(ISOLATED_STORAGE_PROPERTY, false)) {
- return;
- }
+ if (!ENABLE_ISOLATED_STORAGE) return;
final int mountMode = getExternalStorageMountMode(uid, packageName);
remountUidExternalStorage(uid, mountMode);
}
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index e7a8221dc523..713da305ed55 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -100,6 +100,7 @@ public class Watchdog extends Thread {
"android.hardware.audio@4.0::IDevicesFactory",
"android.hardware.bluetooth@1.0::IBluetoothHci",
"android.hardware.camera.provider@2.4::ICameraProvider",
+ "android.hardware.graphics.allocator@2.0::IAllocator",
"android.hardware.graphics.composer@2.1::IComposer",
"android.hardware.media.omx@1.0::IOmx",
"android.hardware.media.omx@1.0::IOmxStore",
diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java
index ff6595115584..8cd9d1881639 100644
--- a/services/core/java/com/android/server/am/ActiveInstrumentation.java
+++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java
@@ -139,7 +139,9 @@ class ActiveInstrumentation {
proto.write(ActiveInstrumentationProto.WATCHER, mWatcher.toString());
proto.write(ActiveInstrumentationProto.UI_AUTOMATION_CONNECTION,
mUiAutomationConnection.toString());
- proto.write(ActiveInstrumentationProto.ARGUMENTS, mArguments.toString());
+ if (mArguments != null) {
+ mArguments.writeToProto(proto, ActiveInstrumentationProto.ARGUMENTS);
+ }
proto.end(token);
}
}
diff --git a/services/core/java/com/android/server/am/RunningTasks.java b/services/core/java/com/android/server/am/RunningTasks.java
index 8c92496a18b6..7008cee395d7 100644
--- a/services/core/java/com/android/server/am/RunningTasks.java
+++ b/services/core/java/com/android/server/am/RunningTasks.java
@@ -54,17 +54,15 @@ class RunningTasks {
// Gather all of the tasks across all of the tasks, and add them to the sorted set
mTmpSortedSet.clear();
- mTmpStackTasks.clear();
final int numDisplays = activityDisplays.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final ActivityDisplay display = activityDisplays.valueAt(displayNdx);
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = display.getChildAt(stackNdx);
+ mTmpStackTasks.clear();
stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
callingUid, allowed);
- for (int i = mTmpStackTasks.size() - 1; i >= 0; i--) {
- mTmpSortedSet.addAll(mTmpStackTasks);
- }
+ mTmpSortedSet.addAll(mTmpStackTasks);
}
}
diff --git a/services/core/java/com/android/server/am/TEST_MAPPING b/services/core/java/com/android/server/am/TEST_MAPPING
index 9e11eb0fa603..4ca96a1904db 100644
--- a/services/core/java/com/android/server/am/TEST_MAPPING
+++ b/services/core/java/com/android/server/am/TEST_MAPPING
@@ -46,7 +46,7 @@
"include-annotation": "android.platform.test.annotations.Presubmit"
},
{
- "exclude-annotation": "android.support.test.filters.FlakyTest"
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
}
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index f854df663e2e..bd412fc5339c 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -24,7 +24,6 @@ import static android.app.ActivityManager.USER_OP_IS_CURRENT;
import static android.app.ActivityManager.USER_OP_SUCCESS;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SYSTEM_UID;
-
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -49,6 +48,7 @@ import android.app.IStopUserCallback;
import android.app.IUserSwitchObserver;
import android.app.KeyguardManager;
import android.app.usage.UsageEvents;
+import android.appwidget.AppWidgetManagerInternal;
import android.content.Context;
import android.content.IIntentReceiver;
import android.content.Intent;
@@ -535,6 +535,9 @@ class UserController implements Handler.Callback {
}
}
+ // Spin up app widgets prior to boot-complete, so they can be ready promptly
+ mInjector.startUserWidgets(userId);
+
Slog.i(TAG, "Sending BOOT_COMPLETE user #" + userId);
// Do not report secondary users, runtime restarts or first boot/upgrade
if (userId == UserHandle.USER_SYSTEM
@@ -2174,6 +2177,13 @@ class UserController implements Handler.Callback {
}
}
+ void startUserWidgets(int userId) {
+ AppWidgetManagerInternal awm = LocalServices.getService(AppWidgetManagerInternal.class);
+ if (awm != null) {
+ awm.unlockUser(userId);
+ }
+ }
+
void updateUserConfiguration() {
mService.mActivityTaskManager.updateUserConfiguration();
}
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index d06e78514a5c..f4d20b332e2f 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -1014,12 +1014,7 @@ public class SyncManager {
Bundle finalExtras = new Bundle(extras);
String packageName = syncAdapterInfo.componentName.getPackageName();
// If the app did not run and has no account access, done
- try {
- if (!mPackageManagerInternal.wasPackageEverLaunched(packageName, userId)) {
- continue;
- }
- } catch (IllegalArgumentException e) {
- // Package not found, race with an uninstall
+ if (!wasPackageEverLaunched(packageName, userId)) {
continue;
}
mAccountManagerInternal.requestAccountAccess(account.account,
@@ -3352,7 +3347,7 @@ public class SyncManager {
String packageName = op.owningPackage;
final int userId = UserHandle.getUserId(op.owningUid);
// If the app did not run and has no account access, done
- if (!mPackageManagerInternal.wasPackageEverLaunched(packageName, userId)) {
+ if (!wasPackageEverLaunched(packageName, userId)) {
return;
}
mAccountManagerInternal.requestAccountAccess(op.target.account,
@@ -4059,4 +4054,12 @@ public class SyncManager {
public void resetTodayStats() {
mSyncStorageEngine.resetTodayStats(/*force=*/ true);
}
+
+ private boolean wasPackageEverLaunched(String packageName, int userId) {
+ try {
+ return mPackageManagerInternal.wasPackageEverLaunched(packageName, userId);
+ } catch (IllegalArgumentException e) {
+ return false; // Package has been removed.
+ }
+ }
}
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index 5292d3e5fd3b..ba05b49b7698 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -50,7 +50,6 @@ import android.provider.Settings;
import android.service.dreams.DreamManagerInternal;
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
-import android.text.TextUtils;
import android.util.Slog;
import android.view.Display;
@@ -124,7 +123,7 @@ public final class DreamManagerService extends SystemService {
}
}, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler);
mContext.getContentResolver().registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP), false,
+ Settings.Secure.getUriFor(Settings.Secure.DOZE_DOUBLE_TAP_GESTURE), false,
mDozeEnabledObserver, UserHandle.USER_ALL);
writePulseGestureEnabled();
}
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index a5d7b27bc2cd..9df9ba600f2a 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -212,8 +212,7 @@ public class InputManagerService extends IInputManager.Stub
int injectorPid, int injectorUid, int syncMode, int timeoutMillis,
int policyFlags);
private static native void nativeToggleCapsLock(long ptr, int deviceId);
- private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles,
- int displayId);
+ private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles);
private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen);
private static native void nativeSetSystemUiVisibility(long ptr, int visibility);
private static native void nativeSetFocusedApplication(long ptr,
@@ -1468,7 +1467,7 @@ public class InputManagerService extends IInputManager.Stub
}
public void setInputWindows(InputWindowHandle[] windowHandles,
- InputWindowHandle focusedWindowHandle, int displayId) {
+ InputWindowHandle focusedWindowHandle) {
final IWindow newFocusedWindow =
focusedWindowHandle != null ? focusedWindowHandle.clientWindow : null;
if (mFocusedWindow != newFocusedWindow) {
@@ -1477,7 +1476,7 @@ public class InputManagerService extends IInputManager.Stub
setPointerCapture(false);
}
}
- nativeSetInputWindows(mPtr, windowHandles, displayId);
+ nativeSetInputWindows(mPtr, windowHandles);
}
public void setFocusedApplication(InputApplicationHandle application) {
diff --git a/services/core/java/com/android/server/notification/CriticalNotificationExtractor.java b/services/core/java/com/android/server/notification/CriticalNotificationExtractor.java
new file mode 100644
index 000000000000..a899a084ce93
--- /dev/null
+++ b/services/core/java/com/android/server/notification/CriticalNotificationExtractor.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import android.app.Notification;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.util.Slog;
+
+/**
+ * Sets the criticality of a notification record. This is used to allow a bypass to all other
+ * ranking signals. It is required in the automotive use case to facilitate placing emergency and
+ * warning notifications above all others. It does not process notifications unless the system
+ * has the automotive feature flag set.
+ * <p>
+ * Note: it is up to the notification ranking system to determine the effect of criticality values
+ * on a notification record
+ *
+ */
+public class CriticalNotificationExtractor implements NotificationSignalExtractor {
+
+ private static final String TAG = "CriticalNotificationExt";
+ private static final boolean DBG = false;
+ private boolean mSupportsCriticalNotifications = false;
+ /**
+ * Intended to bypass all other ranking, notification should be placed above all others.
+ * In the automotive case, the notification would be used to tell a driver to pull over
+ * immediately
+ */
+ static final int CRITICAL = 0;
+ /**
+ * Indicates a notification should be place above all notifications except those marked as
+ * critical. In the automotive case this is a check engine light.
+ */
+ static final int CRITICAL_LOW = 1;
+ /** Normal notification. */
+ static final int NORMAL = 2;
+
+ @Override
+ public void initialize(Context context, NotificationUsageStats usageStats) {
+ if (DBG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
+ mSupportsCriticalNotifications = supportsCriticalNotifications(context);
+ }
+
+ private boolean supportsCriticalNotifications(Context context) {
+ return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0);
+ }
+
+ @Override
+ public RankingReconsideration process(NotificationRecord record) {
+ if (!mSupportsCriticalNotifications) {
+ if (DBG) Slog.d(TAG, "skipping since system does not support critical notification");
+ return null;
+ }
+ if (record == null || record.getNotification() == null) {
+ if (DBG) Slog.d(TAG, "skipping empty notification");
+ return null;
+ }
+ // Note: The use of both CATEGORY_CAR_EMERGENCY and CATEGORY_CAR_WARNING is restricted to
+ // System apps
+ if (record.isCategory(Notification.CATEGORY_CAR_EMERGENCY)) {
+ record.setCriticality(CRITICAL);
+ } else if (record.isCategory(Notification.CATEGORY_CAR_WARNING)) {
+ record.setCriticality(CRITICAL_LOW);
+ } else {
+ record.setCriticality(NORMAL);
+ }
+ return null;
+ }
+
+ @Override
+ public void setConfig(RankingConfig config) {
+ }
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+ }
+
+}
diff --git a/services/core/java/com/android/server/notification/ImportanceExtractor.java b/services/core/java/com/android/server/notification/ImportanceExtractor.java
index dfdd55b9ad6f..ca41b74707cd 100644
--- a/services/core/java/com/android/server/notification/ImportanceExtractor.java
+++ b/services/core/java/com/android/server/notification/ImportanceExtractor.java
@@ -41,7 +41,7 @@ public class ImportanceExtractor implements NotificationSignalExtractor {
if (DBG) Slog.d(TAG, "missing config");
return null;
}
- record.setUserImportance(record.getChannel().getImportance());
+ record.calculateImportance();
return null;
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 3f57faf58e8c..b1b4c4fc9d3f 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -2144,6 +2144,10 @@ public class NotificationManagerService extends SystemService {
enforceSystemOrSystemUI("setNotificationsEnabledForPackage");
mPreferencesHelper.setEnabled(pkg, uid, enabled);
+ mMetricsLogger.write(new LogMaker(MetricsEvent.ACTION_BAN_APP_NOTES)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setPackageName(pkg)
+ .setSubtype(enabled ? 1 : 0));
// Now, cancel any outstanding notifications that are part of a just-disabled app
if (!enabled) {
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
@@ -3480,20 +3484,25 @@ public class NotificationManagerService extends SystemService {
public void applyAdjustmentsFromAssistant(INotificationListener token,
List<Adjustment> adjustments) {
+ boolean needsSort = false;
final long identity = Binder.clearCallingIdentity();
try {
- boolean appliedAdjustment = false;
synchronized (mNotificationLock) {
mAssistants.checkServiceTokenLocked(token);
for (Adjustment adjustment : adjustments) {
NotificationRecord r = mNotificationsByKey.get(adjustment.getKey());
if (r != null && mAssistants.isSameUser(token, r.getUserId())) {
applyAdjustment(r, adjustment);
- appliedAdjustment = true;
+ r.applyAdjustments();
+ if (r.getImportance() == IMPORTANCE_NONE) {
+ cancelNotificationsFromListener(token, new String[]{r.getKey()});
+ } else {
+ needsSort = true;
+ }
}
}
}
- if (appliedAdjustment) {
+ if (needsSort) {
mRankingHandler.requestSort();
}
} finally {
@@ -4114,14 +4123,16 @@ public class NotificationManagerService extends SystemService {
// an opinion otherwise (and the channel hasn't yet shown a fg service).
if (TextUtils.isEmpty(channelId)
|| NotificationChannel.DEFAULT_CHANNEL_ID.equals(channelId)) {
- r.setImportance(IMPORTANCE_LOW, "Bumped for foreground service");
+ r.setSystemImportance(IMPORTANCE_LOW);
} else {
channel.setImportance(IMPORTANCE_LOW);
+ r.setSystemImportance(IMPORTANCE_LOW);
if (!fgServiceShown) {
channel.unlockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
channel.setFgServiceShown(true);
}
- mPreferencesHelper.updateNotificationChannel(pkg, notificationUid, channel, false);
+ mPreferencesHelper.updateNotificationChannel(
+ pkg, notificationUid, channel, false);
r.updateNotificationChannel(channel);
}
} else if (!fgServiceShown && !TextUtils.isEmpty(channelId)
@@ -4295,11 +4306,7 @@ public class NotificationManagerService extends SystemService {
usageStats.registerSuspendedByAdmin(r);
return isPackageSuspended;
}
- final boolean isBlocked =
- mPreferencesHelper.isGroupBlocked(pkg, callingUid, r.getChannel().getGroup())
- || mPreferencesHelper.getImportance(pkg, callingUid)
- == NotificationManager.IMPORTANCE_NONE
- || r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE;
+ final boolean isBlocked = isBlocked(r);
if (isBlocked) {
Slog.e(TAG, "Suppressing notification from package by user request.");
usageStats.registerBlocked(r);
@@ -4307,6 +4314,15 @@ public class NotificationManagerService extends SystemService {
return isBlocked;
}
+ private boolean isBlocked(NotificationRecord r) {
+ final String pkg = r.sbn.getPackageName();
+ final int callingUid = r.sbn.getUid();
+ return mPreferencesHelper.isGroupBlocked(pkg, callingUid, r.getChannel().getGroup())
+ || mPreferencesHelper.getImportance(pkg, callingUid)
+ == NotificationManager.IMPORTANCE_NONE
+ || r.getImportance() == NotificationManager.IMPORTANCE_NONE;
+ }
+
protected class SnoozeNotificationRunnable implements Runnable {
private final String mKey;
private final long mDuration;
@@ -4383,6 +4399,88 @@ public class NotificationManagerService extends SystemService {
}
}
+ protected class CancelNotificationRunnable implements Runnable {
+ private final int mCallingUid;
+ private final int mCallingPid;
+ private final String mPkg;
+ private final String mTag;
+ private final int mId;
+ private final int mMustHaveFlags;
+ private final int mMustNotHaveFlags;
+ private final boolean mSendDelete;
+ private final int mUserId;
+ private final int mReason;
+ private final int mRank;
+ private final int mCount;
+ private final ManagedServiceInfo mListener;
+
+ CancelNotificationRunnable(final int callingUid, final int callingPid,
+ final String pkg, final String tag, final int id,
+ final int mustHaveFlags, final int mustNotHaveFlags, final boolean sendDelete,
+ final int userId, final int reason, int rank, int count,
+ final ManagedServiceInfo listener) {
+ this.mCallingUid = callingUid;
+ this.mCallingPid = callingPid;
+ this.mPkg = pkg;
+ this.mTag = tag;
+ this.mId = id;
+ this.mMustHaveFlags = mustHaveFlags;
+ this.mMustNotHaveFlags = mustNotHaveFlags;
+ this.mSendDelete = sendDelete;
+ this.mUserId = userId;
+ this.mReason = reason;
+ this.mRank = rank;
+ this.mCount = count;
+ this.mListener = listener;
+ }
+
+ @Override
+ public void run() {
+ String listenerName = mListener == null ? null : mListener.component.toShortString();
+ if (DBG) {
+ EventLogTags.writeNotificationCancel(mCallingUid, mCallingPid, mPkg, mId, mTag,
+ mUserId, mMustHaveFlags, mMustNotHaveFlags, mReason, listenerName);
+ }
+
+ synchronized (mNotificationLock) {
+ // Look for the notification, searching both the posted and enqueued lists.
+ NotificationRecord r = findNotificationLocked(mPkg, mTag, mId, mUserId);
+ if (r != null) {
+ // The notification was found, check if it should be removed.
+
+ // Ideally we'd do this in the caller of this method. However, that would
+ // require the caller to also find the notification.
+ if (mReason == REASON_CLICK) {
+ mUsageStats.registerClickedByUser(r);
+ }
+
+ if ((r.getNotification().flags & mMustHaveFlags) != mMustHaveFlags) {
+ return;
+ }
+ if ((r.getNotification().flags & mMustNotHaveFlags) != 0) {
+ return;
+ }
+
+ // Cancel the notification.
+ boolean wasPosted = removeFromNotificationListsLocked(r);
+ cancelNotificationLocked(
+ r, mSendDelete, mReason, mRank, mCount, wasPosted, listenerName);
+ cancelGroupChildrenLocked(r, mCallingUid, mCallingPid, listenerName,
+ mSendDelete, null);
+ updateLightsLocked();
+ } else {
+ // No notification was found, assume that it is snoozed and cancel it.
+ if (mReason != REASON_SNOOZED) {
+ final boolean wasSnoozed = mSnoozeHelper.cancel(mUserId, mPkg, mTag, mId);
+ if (wasSnoozed) {
+ savePolicyFile();
+ }
+ }
+ }
+ }
+ }
+ }
+
protected class EnqueueNotificationRunnable implements Runnable {
private final NotificationRecord r;
private final int userId;
@@ -4482,6 +4580,11 @@ public class NotificationManagerService extends SystemService {
return;
}
+ if (isBlocked(r)) {
+ Slog.i(TAG, "notification blocked by assistant request");
+ return;
+ }
+
r.setHidden(isPackageSuspendedLocked(r));
NotificationRecord old = mNotificationsByKey.get(key);
final StatusBarNotification n = r.sbn;
@@ -5405,6 +5508,11 @@ public class NotificationManagerService extends SystemService {
}
}
+ protected void scheduleCancelNotification(CancelNotificationRunnable cancelRunnable) {
+ if (!hasCallbacks(cancelRunnable)) {
+ sendMessage(Message.obtain(this, cancelRunnable));
+ }
+ }
}
private final class RankingHandlerWorker extends Handler implements RankingHandler
@@ -5730,56 +5838,15 @@ public class NotificationManagerService extends SystemService {
void cancelNotification(final int callingUid, final int callingPid,
final String pkg, final String tag, final int id,
final int mustHaveFlags, final int mustNotHaveFlags, final boolean sendDelete,
- final int userId, final int reason, int rank, int count, final ManagedServiceInfo listener) {
-
+ final int userId, final int reason, int rank, int count,
+ final ManagedServiceInfo listener) {
// In enqueueNotificationInternal notifications are added by scheduling the
// work on the worker handler. Hence, we also schedule the cancel on this
// handler to avoid a scenario where an add notification call followed by a
// remove notification call ends up in not removing the notification.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- String listenerName = listener == null ? null : listener.component.toShortString();
- if (DBG) EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, id, tag,
- userId, mustHaveFlags, mustNotHaveFlags, reason, listenerName);
-
- synchronized (mNotificationLock) {
- // Look for the notification, searching both the posted and enqueued lists.
- NotificationRecord r = findNotificationLocked(pkg, tag, id, userId);
- if (r != null) {
- // The notification was found, check if it should be removed.
-
- // Ideally we'd do this in the caller of this method. However, that would
- // require the caller to also find the notification.
- if (reason == REASON_CLICK) {
- mUsageStats.registerClickedByUser(r);
- }
-
- if ((r.getNotification().flags & mustHaveFlags) != mustHaveFlags) {
- return;
- }
- if ((r.getNotification().flags & mustNotHaveFlags) != 0) {
- return;
- }
-
- // Cancel the notification.
- boolean wasPosted = removeFromNotificationListsLocked(r);
- cancelNotificationLocked(r, sendDelete, reason, rank, count, wasPosted, listenerName);
- cancelGroupChildrenLocked(r, callingUid, callingPid, listenerName,
- sendDelete, null);
- updateLightsLocked();
- } else {
- // No notification was found, assume that it is snoozed and cancel it.
- if (reason != REASON_SNOOZED) {
- final boolean wasSnoozed = mSnoozeHelper.cancel(userId, pkg, tag, id);
- if (wasSnoozed) {
- savePolicyFile();
- }
- }
- }
- }
- }
- });
+ mHandler.scheduleCancelNotification(new CancelNotificationRunnable(callingUid, callingPid,
+ pkg, tag, id, mustHaveFlags, mustNotHaveFlags, sendDelete, userId, reason, rank,
+ count, listener));
}
/**
@@ -6503,18 +6570,18 @@ public class NotificationManagerService extends SystemService {
mHandler.post(new Runnable() {
@Override
public void run() {
- notifyEnqueued(info, sbnToPost);
+ notifyEnqueued(info, sbnToPost, r.getChannel());
}
});
}
}
private void notifyEnqueued(final ManagedServiceInfo info,
- final StatusBarNotification sbn) {
+ final StatusBarNotification sbn, final NotificationChannel channel) {
final INotificationListener assistant = (INotificationListener) info.service;
StatusBarNotificationHolder sbnHolder = new StatusBarNotificationHolder(sbn);
try {
- assistant.onNotificationEnqueued(sbnHolder);
+ assistant.onNotificationEnqueuedWithChannel(sbnHolder, channel);
} catch (RemoteException ex) {
Log.e(TAG, "unable to notify assistant (enqueued): " + assistant, ex);
}
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 469828b73ef7..a6d861565080 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -49,7 +49,6 @@ import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
-import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.Adjustment;
@@ -142,8 +141,11 @@ public final class NotificationRecord {
private int mAuthoritativeRank;
private String mGlobalSortKey;
private int mPackageVisibility;
- private int mUserImportance = IMPORTANCE_UNSPECIFIED;
+ private int mSystemImportance = IMPORTANCE_UNSPECIFIED;
+ private int mAssistantImportance = IMPORTANCE_UNSPECIFIED;
private int mImportance = IMPORTANCE_UNSPECIFIED;
+ // Field used in global sort key to bypass normal notifications
+ private int mCriticality = CriticalNotificationExtractor.NORMAL;
private CharSequence mImportanceExplanation = null;
private int mSuppressedVisualEffects = 0;
@@ -198,7 +200,7 @@ public final class NotificationRecord {
mSound = calculateSound();
mVibration = calculateVibration();
mAttributes = calculateAttributes();
- mImportance = calculateImportance();
+ mImportance = calculateInitialImportance();
mLight = calculateLights();
mAdjustments = new ArrayList<>();
mStats = new NotificationStats();
@@ -321,7 +323,7 @@ public final class NotificationRecord {
return attributes;
}
- private int calculateImportance() {
+ private int calculateInitialImportance() {
final Notification n = sbn.getNotification();
int importance = getChannel().getImportance();
int requestedImportance = IMPORTANCE_DEFAULT;
@@ -525,8 +527,10 @@ public final class NotificationRecord {
pw.println(prefix + "mRecentlyIntrusive=" + mRecentlyIntrusive);
pw.println(prefix + "mPackagePriority=" + mPackagePriority);
pw.println(prefix + "mPackageVisibility=" + mPackageVisibility);
- pw.println(prefix + "mUserImportance="
- + NotificationListenerService.Ranking.importanceToString(mUserImportance));
+ pw.println(prefix + "mSystemImportance="
+ + NotificationListenerService.Ranking.importanceToString(mSystemImportance));
+ pw.println(prefix + "mAsstImportance="
+ + NotificationListenerService.Ranking.importanceToString(mAssistantImportance));
pw.println(prefix + "mImportance="
+ NotificationListenerService.Ranking.importanceToString(mImportance));
pw.println(prefix + "mImportanceExplanation=" + mImportanceExplanation);
@@ -641,6 +645,12 @@ public final class NotificationRecord {
if (signals.containsKey(Adjustment.KEY_SMART_REPLIES)) {
setSmartReplies(signals.getCharSequenceArrayList(Adjustment.KEY_SMART_REPLIES));
}
+ if (signals.containsKey(Adjustment.KEY_IMPORTANCE)) {
+ int importance = signals.getInt(Adjustment.KEY_IMPORTANCE);
+ importance = Math.max(IMPORTANCE_UNSPECIFIED, importance);
+ importance = Math.min(IMPORTANCE_HIGH, importance);
+ setAssistantImportance(importance);
+ }
}
}
}
@@ -654,7 +664,7 @@ public final class NotificationRecord {
mContactAffinity = contactAffinity;
if (mImportance < IMPORTANCE_DEFAULT &&
mContactAffinity > ValidateNotificationPeople.VALID_CONTACT) {
- setImportance(IMPORTANCE_DEFAULT, getPeopleExplanation());
+ setSystemImportance(IMPORTANCE_DEFAULT);
}
}
@@ -693,11 +703,6 @@ public final class NotificationRecord {
return mPackageVisibility;
}
- public void setUserImportance(int importance) {
- mUserImportance = importance;
- applyUserImportance();
- }
-
private String getUserExplanation() {
if (mUserExplanation == null) {
mUserExplanation = mContext.getResources().getString(
@@ -706,31 +711,42 @@ public final class NotificationRecord {
return mUserExplanation;
}
- private String getPeopleExplanation() {
- if (mPeopleExplanation == null) {
- mPeopleExplanation = mContext.getResources().getString(
- com.android.internal.R.string.importance_from_person);
- }
- return mPeopleExplanation;
- }
-
- private void applyUserImportance() {
- if (mUserImportance != IMPORTANCE_UNSPECIFIED) {
- mImportance = mUserImportance;
- mImportanceExplanation = getUserExplanation();
- }
+ /**
+ * Sets the importance value the system thinks the record should have.
+ * e.g. bumping up foreground service notifications or people to people notifications.
+ */
+ public void setSystemImportance(int importance) {
+ mSystemImportance = importance;
+ calculateImportance();
}
- public int getUserImportance() {
- return mUserImportance;
+ /**
+ * Sets the importance value the
+ * {@link android.service.notification.NotificationAssistantService} thinks the record should
+ * have.
+ */
+ public void setAssistantImportance(int importance) {
+ mAssistantImportance = importance;
+ calculateImportance();
}
- public void setImportance(int importance, CharSequence explanation) {
- if (importance != IMPORTANCE_UNSPECIFIED) {
- mImportance = importance;
- mImportanceExplanation = explanation;
+ /**
+ * Recalculates the importance of the record after fields affecting importance have changed
+ */
+ protected void calculateImportance() {
+ mImportance = calculateInitialImportance();
+ mImportanceExplanation = "app";
+ if (getChannel().isImportanceLocked()) {
+ mImportanceExplanation = "user";
+ }
+ if (!getChannel().isImportanceLocked() && mAssistantImportance != IMPORTANCE_UNSPECIFIED) {
+ mImportance = mAssistantImportance;
+ mImportanceExplanation = "asst";
+ }
+ if (mSystemImportance != IMPORTANCE_UNSPECIFIED) {
+ mImportance = mSystemImportance;
+ mImportanceExplanation = "system";
}
- applyUserImportance();
}
public int getImportance() {
@@ -746,6 +762,19 @@ public final class NotificationRecord {
return mIntercept;
}
+ /**
+ * Set to affect global sort key.
+ *
+ * @param criticality used in a string based sort thus 0 is the most critical
+ */
+ public void setCriticality(int criticality) {
+ mCriticality = criticality;
+ }
+
+ public int getCriticality() {
+ return mCriticality;
+ }
+
public boolean isIntercepted() {
return mIntercept;
}
@@ -920,7 +949,7 @@ public final class NotificationRecord {
}
/**
- * @see RankingHelper#getIsAppImportanceLocked(String, int)
+ * @see PreferencesHelper#getIsAppImportanceLocked(String, int)
*/
public boolean getIsAppImportanceLocked() {
return mIsAppImportanceLocked;
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index f5e58ea9b27b..b1e914442871 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -106,6 +106,8 @@ public class RankingHelper {
synchronized (mProxyByGroupTmp) {
// record individual ranking result and nominate proxies for each group
+ // Note: iteration is done backwards such that the index can be used as a sort key
+ // in a string compare below
for (int i = N - 1; i >= 0; i--) {
final NotificationRecord record = notificationList.get(i);
record.setAuthoritativeRank(i);
@@ -138,7 +140,8 @@ public class RankingHelper {
boolean isGroupSummary = record.getNotification().isGroupSummary();
record.setGlobalSortKey(
- String.format("intrsv=%c:grnk=0x%04x:gsmry=%c:%s:rnk=0x%04x",
+ String.format("crtcl=0x%04x:intrsv=%c:grnk=0x%04x:gsmry=%c:%s:rnk=0x%04x",
+ record.getCriticality(),
record.isRecentlyIntrusive()
&& record.getImportance() > NotificationManager.IMPORTANCE_MIN
? '0' : '1',
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3b67663697ec..8247e4317cf9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -90,6 +90,7 @@ import static android.os.storage.StorageManager.FLAG_STORAGE_CE;
import static android.os.storage.StorageManager.FLAG_STORAGE_DE;
import static android.system.OsConstants.O_CREAT;
import static android.system.OsConstants.O_RDWR;
+
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB64_DIR_NAME;
@@ -321,6 +322,11 @@ import com.android.server.security.VerityUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
+import dalvik.system.CloseGuard;
+import dalvik.system.VMRuntime;
+
+import libcore.io.IoUtils;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -365,10 +371,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
-import dalvik.system.CloseGuard;
-import dalvik.system.VMRuntime;
-import libcore.io.IoUtils;
-
/**
* Keep track of all those APKs everywhere.
* <p>
@@ -6369,17 +6371,17 @@ public class PackageManagerService extends IPackageManager.Stub
&& intent.hasCategory(CATEGORY_DEFAULT);
}
- private boolean isDeviceProvisioned() {
- return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.DEVICE_PROVISIONED, 0) == 1;
- }
-
// TODO: handle preferred activities missing while user has amnesia
ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags,
List<ResolveInfo> query, int priority, boolean always,
boolean removeMatches, boolean debug, int userId) {
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
+ // could cause a deadlock.
+ final boolean isDeviceProvisioned =
+ android.provider.Settings.Global.getInt(mContext.getContentResolver(),
+ android.provider.Settings.Global.DEVICE_PROVISIONED, 0) == 1;
flags = updateFlagsForResolve(
flags, userId, intent, callingUid, false /*includeInstantApps*/);
intent = updateIntentForResolve(intent);
@@ -6459,7 +6461,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
final boolean excludeSetupWizardHomeActivity = isHomeIntent(intent)
- && !isDeviceProvisioned();
+ && !isDeviceProvisioned;
if (ai == null) {
// Do not remove launcher's preferred activity during SetupWizard
// due to it may not install yet
@@ -24449,6 +24451,17 @@ public class PackageManagerService extends IPackageManager.Stub
return getAppsWithSharedUserIdsLocked();
}
}
+
+ @Override
+ public boolean isOnlyCoreApps() {
+ return PackageManagerService.this.isOnlyCoreApps();
+ }
+
+ @Override
+ public void freeStorage(String volumeUuid, long bytes, int storageFlags)
+ throws IOException {
+ PackageManagerService.this.freeStorage(volumeUuid, bytes, storageFlags);
+ }
}
private SparseArray<String> getAppsWithSharedUserIdsLocked() {
diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java
index ca08415f7a77..c94d209892af 100644
--- a/services/core/java/com/android/server/pm/SharedUserSetting.java
+++ b/services/core/java/com/android/server/pm/SharedUserSetting.java
@@ -64,7 +64,7 @@ public final class SharedUserSetting extends SettingBase {
public void writeToProto(ProtoOutputStream proto, long fieldId) {
long token = proto.start(fieldId);
- proto.write(PackageServiceDumpProto.SharedUserProto.USER_ID, userId);
+ proto.write(PackageServiceDumpProto.SharedUserProto.UID, userId);
proto.write(PackageServiceDumpProto.SharedUserProto.NAME, name);
proto.end(token);
}
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index 9ca02bad50bd..3f28ee659a58 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -574,13 +574,13 @@ public class UserRestrictionsUtils {
Settings.Secure.DOZE_ALWAYS_ON, 0, userId);
android.provider.Settings.Secure.putIntForUser(
context.getContentResolver(),
- Settings.Secure.DOZE_PULSE_ON_PICK_UP, 0, userId);
+ Settings.Secure.DOZE_PICK_UP_GESTURE, 0, userId);
android.provider.Settings.Secure.putIntForUser(
context.getContentResolver(),
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS, 0, userId);
android.provider.Settings.Secure.putIntForUser(
context.getContentResolver(),
- Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, 0, userId);
+ Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, 0, userId);
}
break;
case UserManager.DISALLOW_CONFIG_LOCATION:
@@ -684,9 +684,9 @@ public class UserRestrictionsUtils {
case android.provider.Settings.Secure.DOZE_ENABLED:
case android.provider.Settings.Secure.DOZE_ALWAYS_ON:
- case android.provider.Settings.Secure.DOZE_PULSE_ON_PICK_UP:
+ case android.provider.Settings.Secure.DOZE_PICK_UP_GESTURE:
case android.provider.Settings.Secure.DOZE_PULSE_ON_LONG_PRESS:
- case android.provider.Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP:
+ case android.provider.Settings.Secure.DOZE_DOUBLE_TAP_GESTURE:
if ("0".equals(value)) {
return false;
}
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 50e6f8d5b905..843cd8a1ba0f 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -45,6 +45,7 @@ import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.print.PrintManager;
@@ -169,12 +170,33 @@ public final class DefaultPermissionGrantPolicy {
SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
}
+ @Deprecated
private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
static {
STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
+ private static final Set<String> MEDIA_AURAL_PERMISSIONS = new ArraySet<>();
+ static {
+ // STOPSHIP(b/112545973): remove once feature enabled by default
+ if (SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
+ MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_AUDIO);
+ MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_AUDIO);
+ }
+ }
+
+ private static final Set<String> MEDIA_VISUAL_PERMISSIONS = new ArraySet<>();
+ static {
+ // STOPSHIP(b/112545973): remove once feature enabled by default
+ if (SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
+ MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES);
+ MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_IMAGES);
+ MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_VIDEO);
+ MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_VIDEO);
+ }
+ }
+
private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
private static final String ACTION_TRACK = "com.android.fitness.TRACK";
@@ -404,6 +426,8 @@ public final class DefaultPermissionGrantPolicy {
MediaStore.AUTHORITY, userId);
if (mediaStorePackage != null) {
grantRuntimePermissions(mediaStorePackage, STORAGE_PERMISSIONS, true, userId);
+ grantRuntimePermissions(mediaStorePackage, MEDIA_AURAL_PERMISSIONS, true, userId);
+ grantRuntimePermissions(mediaStorePackage, MEDIA_VISUAL_PERMISSIONS, true, userId);
grantRuntimePermissions(mediaStorePackage, PHONE_PERMISSIONS, true, userId);
}
@@ -615,6 +639,7 @@ public final class DefaultPermissionGrantPolicy {
if (galleryPackage != null
&& doesPackageSupportRuntimePermissions(galleryPackage)) {
grantRuntimePermissions(galleryPackage, STORAGE_PERMISSIONS, userId);
+ grantRuntimePermissions(galleryPackage, MEDIA_VISUAL_PERMISSIONS, userId);
}
// Email
@@ -724,6 +749,7 @@ public final class DefaultPermissionGrantPolicy {
if (musicPackage != null
&& doesPackageSupportRuntimePermissions(musicPackage)) {
grantRuntimePermissions(musicPackage, STORAGE_PERMISSIONS, userId);
+ grantRuntimePermissions(musicPackage, MEDIA_AURAL_PERMISSIONS, userId);
}
// Home
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index ed1dc58701bd..d15271cc2730 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -76,7 +76,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CO
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_BAR_EXPANDED;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
@@ -128,7 +128,6 @@ import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
-import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN;
import static com.android.server.wm.WindowManagerPolicyProto.FOCUSED_APP_TOKEN;
@@ -223,7 +222,6 @@ import android.service.vr.IPersistentVrStateCallbacks;
import android.speech.RecognizerIntent;
import android.telecom.TelecomManager;
import android.util.ArraySet;
-import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
import android.util.LongSparseArray;
@@ -269,7 +267,6 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.internal.policy.IShortcutService;
-import com.android.internal.policy.KeyguardDismissCallback;
import com.android.internal.policy.PhoneWindow;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ArrayUtils;
@@ -917,6 +914,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
android.Manifest.permission.USER_ACTIVITY);
+ break;
case MSG_RINGER_TOGGLE_CHORD:
handleRingerChordGesture();
break;
@@ -2452,11 +2450,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
break;
case TYPE_STATUS_BAR:
+
// If the Keyguard is in a hidden state (occluded by another window), we force to
- // remove the keyguard flag so that any change in-flight after setting
- // the keyguard as occluded wouldn't set the flag again.
+ // remove the wallpaper and keyguard flag so that any change in-flight after setting
+ // the keyguard as occluded wouldn't set these flags again.
// See {@link #processKeyguardSetHiddenResultLw}.
if (mKeyguardOccluded) {
+ attrs.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
attrs.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
}
break;
@@ -4328,8 +4328,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (!isKeyguardShowing) {
navTranslucent &= areTranslucentBarsAllowed();
}
- boolean statusBarExpandedNotKeyguard = !isKeyguardShowing && mStatusBar != null
- && (mStatusBar.getAttrs().privateFlags & PRIVATE_FLAG_STATUS_BAR_EXPANDED) != 0;
+ boolean statusBarForcesShowingNavigation = !isKeyguardShowing && mStatusBar != null
+ && (mStatusBar.getAttrs().privateFlags
+ & PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION) != 0;
// When the navigation bar isn't visible, we put up a fake input window to catch all
// touch events. This way we can detect when the user presses anywhere to bring back the
@@ -4355,7 +4356,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
navVisible |= !canHideNavigationBar();
boolean updateSysUiVisibility = layoutNavigationBar(displayFrames, uiMode, navVisible,
- navTranslucent, navAllowedHidden, statusBarExpandedNotKeyguard);
+ navTranslucent, navAllowedHidden, statusBarForcesShowingNavigation);
if (DEBUG_LAYOUT) Slog.i(TAG, "mDock rect:" + displayFrames.mDock);
updateSysUiVisibility |= layoutStatusBar(displayFrames, sysui, isKeyguardShowing);
if (updateSysUiVisibility) {
@@ -4508,7 +4509,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean layoutNavigationBar(DisplayFrames displayFrames, int uiMode, boolean navVisible,
boolean navTranslucent, boolean navAllowedHidden,
- boolean statusBarExpandedNotKeyguard) {
+ boolean statusBarForcesShowingNavigation) {
if (mNavigationBar == null) {
return false;
}
@@ -4542,7 +4543,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
= displayFrames.mRestrictedOverscan.bottom = top;
} else {
// We currently want to hide the navigation UI - unless we expanded the status bar.
- mNavigationBarController.setBarShowingLw(statusBarExpandedNotKeyguard);
+ mNavigationBarController.setBarShowingLw(statusBarForcesShowingNavigation);
}
if (navVisible && !navTranslucent && !navAllowedHidden
&& !mNavigationBar.isAnimatingLw()
@@ -4565,7 +4566,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
= displayFrames.mRestrictedOverscan.right = left;
} else {
// We currently want to hide the navigation UI - unless we expanded the status bar.
- mNavigationBarController.setBarShowingLw(statusBarExpandedNotKeyguard);
+ mNavigationBarController.setBarShowingLw(statusBarForcesShowingNavigation);
}
if (navVisible && !navTranslucent && !navAllowedHidden
&& !mNavigationBar.isAnimatingLw()
@@ -4588,7 +4589,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
displayFrames.mRestrictedOverscan.left = right;
} else {
// We currently want to hide the navigation UI - unless we expanded the status bar.
- mNavigationBarController.setBarShowingLw(statusBarExpandedNotKeyguard);
+ mNavigationBarController.setBarShowingLw(statusBarForcesShowingNavigation);
}
if (navVisible && !navTranslucent && !navAllowedHidden
&& !mNavigationBar.isAnimatingLw()
@@ -5398,19 +5399,21 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mStatusBarController.setShowTransparent(true /* transparent */);
}
- boolean statusBarExpanded =
- (mStatusBar.getAttrs().privateFlags & PRIVATE_FLAG_STATUS_BAR_EXPANDED) != 0;
+ boolean statusBarForcesShowingNavigation
+ = (mStatusBar.getAttrs().privateFlags
+ & PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION) != 0;
boolean topAppHidesStatusBar = topAppHidesStatusBar();
if (mForceStatusBar || mForceStatusBarFromKeyguard || mForceStatusBarTransparent
- || statusBarExpanded) {
+ || statusBarForcesShowingNavigation) {
if (DEBUG_LAYOUT) Slog.v(TAG, "Showing status bar: forced");
if (mStatusBarController.setBarShowingLw(true)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT;
}
// Maintain fullscreen layout until incoming animation is complete.
topIsFullscreen = mTopIsFullscreen && mStatusBar.isAnimatingLw();
- // Transient status bar on the lockscreen is not allowed
- if ((mForceStatusBarFromKeyguard || statusBarExpanded)
+ // Transient status bar is not allowed if status bar is on lockscreen or status bar
+ // is expecting the navigation keys from the user.
+ if ((mForceStatusBarFromKeyguard || statusBarForcesShowingNavigation)
&& mStatusBarController.isTransientShowing()) {
mStatusBarController.updateVisibilityLw(false /*transientAllowed*/,
mLastSystemUiFlags, mLastSystemUiFlags);
@@ -5517,13 +5520,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardDelegate.setOccluded(false, true /* animate */);
if (mStatusBar != null) {
mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD;
+ if (!mKeyguardDelegate.hasLockscreenWallpaper()) {
+ mStatusBar.getAttrs().flags |= FLAG_SHOW_WALLPAPER;
+ }
}
return true;
} else if (isOccluded && changed && showing) {
mKeyguardOccluded = true;
- mKeyguardDelegate.setOccluded(true, !mShowingDream /* animate */);
+ mKeyguardDelegate.setOccluded(true, false /* animate */);
if (mStatusBar != null) {
mStatusBar.getAttrs().privateFlags &= ~PRIVATE_FLAG_KEYGUARD;
+ mStatusBar.getAttrs().flags &= ~FLAG_SHOW_WALLPAPER;
}
return true;
} else if (changed) {
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 3ae5cedec773..b55adeb32729 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -1711,8 +1711,8 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
}
/**
- * Requests that the WindowManager sends WindowManagerPolicy#ACTION_USER_ACTIVITY_NOTIFICATION
- * on the next user activity.
+ * Requests that the WindowManager sends
+ * WindowManagerPolicyConstants#ACTION_USER_ACTIVITY_NOTIFICATION on the next user activity.
*/
public void requestUserActivityNotification();
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 7ee35e79e2e4..d73606f3003f 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -1557,7 +1557,7 @@ public class AppTransition implements Dump {
if (isKeyguardGoingAwayTransit(transit) && enter) {
a = loadKeyguardExitAnimation(transit);
} else if (transit == TRANSIT_KEYGUARD_OCCLUDE) {
- a = loadAnimationRes(lp, com.android.internal.R.anim.keyguard_occlude_open_enter);
+ a = null;
} else if (transit == TRANSIT_KEYGUARD_UNOCCLUDE && !enter) {
a = loadAnimationRes(lp, com.android.internal.R.anim.wallpaper_open_exit);
} else if (transit == TRANSIT_CRASHING_ACTIVITY_CLOSE) {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 44d01871b693..65ee18a56094 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -101,19 +101,19 @@ import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP;
import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING;
import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW;
import static com.android.server.wm.WindowSurfacePlacer.SET_WALLPAPER_MAY_CHANGE;
-import static com.android.server.wm.DisplayProto.ABOVE_APP_WINDOWS;
-import static com.android.server.wm.DisplayProto.BELOW_APP_WINDOWS;
-import static com.android.server.wm.DisplayProto.DISPLAY_FRAMES;
-import static com.android.server.wm.DisplayProto.DISPLAY_INFO;
-import static com.android.server.wm.DisplayProto.DOCKED_STACK_DIVIDER_CONTROLLER;
-import static com.android.server.wm.DisplayProto.DPI;
-import static com.android.server.wm.DisplayProto.ID;
-import static com.android.server.wm.DisplayProto.IME_WINDOWS;
-import static com.android.server.wm.DisplayProto.PINNED_STACK_CONTROLLER;
-import static com.android.server.wm.DisplayProto.ROTATION;
-import static com.android.server.wm.DisplayProto.SCREEN_ROTATION_ANIMATION;
-import static com.android.server.wm.DisplayProto.STACKS;
-import static com.android.server.wm.DisplayProto.WINDOW_CONTAINER;
+import static com.android.server.wm.DisplayContentProto.ABOVE_APP_WINDOWS;
+import static com.android.server.wm.DisplayContentProto.BELOW_APP_WINDOWS;
+import static com.android.server.wm.DisplayContentProto.DISPLAY_FRAMES;
+import static com.android.server.wm.DisplayContentProto.DISPLAY_INFO;
+import static com.android.server.wm.DisplayContentProto.DOCKED_STACK_DIVIDER_CONTROLLER;
+import static com.android.server.wm.DisplayContentProto.DPI;
+import static com.android.server.wm.DisplayContentProto.ID;
+import static com.android.server.wm.DisplayContentProto.IME_WINDOWS;
+import static com.android.server.wm.DisplayContentProto.PINNED_STACK_CONTROLLER;
+import static com.android.server.wm.DisplayContentProto.ROTATION;
+import static com.android.server.wm.DisplayContentProto.SCREEN_ROTATION_ANIMATION;
+import static com.android.server.wm.DisplayContentProto.STACKS;
+import static com.android.server.wm.DisplayContentProto.WINDOW_CONTAINER;
import android.annotation.CallSuper;
import android.annotation.NonNull;
@@ -122,7 +122,6 @@ import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Matrix;
-import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
@@ -814,7 +813,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
// {@link DisplayContent} ready for use.
mDisplayReady = true;
- mInputMonitor = new InputMonitor(service, mDisplayId);
+ // TODO(b/112081256): Use independent InputMonitor.
+ mInputMonitor = isDefaultDisplay ? new InputMonitor(service, mDisplayId)
+ : mService.getDefaultDisplayContentLocked().mInputMonitor;
}
boolean isReady() {
@@ -2128,11 +2129,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
}
mService.mAnimator.removeDisplayLocked(mDisplayId);
+ mWindowingLayer.release();
+ mOverlayLayer.release();
} finally {
mRemovingDisplay = false;
}
- mInputMonitor.onRemoved();
mService.onDisplayRemoved(mDisplayId);
}
diff --git a/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java b/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java
index f5e6e7210356..f2cbc86eb9d0 100644
--- a/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java
+++ b/services/core/java/com/android/server/wm/ForcedSeamlessRotator.java
@@ -21,7 +21,6 @@ import static android.view.Surface.ROTATION_90;
import android.graphics.Matrix;
import android.view.DisplayInfo;
-import android.view.Surface.Rotation;
import com.android.server.wm.utils.CoordinateTransforms;
@@ -67,16 +66,6 @@ public class ForcedSeamlessRotator {
}
/**
- * Returns the rotation of the display before it started rotating.
- *
- * @return the old rotation of the display
- */
- @Rotation
- public int getOldRotation() {
- return mOldRotation;
- }
-
- /**
* Removes the transform to the window token's surface that undoes the effect of the global
* display rotation.
*
diff --git a/services/core/java/com/android/server/wm/InputConsumerImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java
index af0eac6fbc6c..6a08f4d22661 100644
--- a/services/core/java/com/android/server/wm/InputConsumerImpl.java
+++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java
@@ -20,6 +20,7 @@ import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.view.Display;
import android.view.InputChannel;
import android.view.WindowManager;
import com.android.server.input.InputApplicationHandle;
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 823a0dec22b2..c4beb553e0ec 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -367,13 +367,6 @@ final class InputMonitor {
}
}
- void onRemoved() {
- // If DisplayContent removed, we need find a way to remove window handles of this display
- // from InputDispatcher, so pass an empty InputWindowHandles to remove them.
- mService.mInputManager.setInputWindows(mInputWindowHandles, mFocusedInputWindowHandle,
- mDisplayId);
- }
-
private final class UpdateInputForAllWindowsConsumer implements Consumer<WindowState> {
InputConsumerImpl navInputConsumer;
InputConsumerImpl pipInputConsumer;
@@ -406,7 +399,8 @@ final class InputMonitor {
this.inDrag = inDrag;
wallpaperController = mService.mRoot.mWallpaperController;
- mService.mRoot.getDisplayContent(mDisplayId).forAllWindows(this,
+ // TODO(b/112081256): Use independent InputMonitor for each display.
+ mService.mRoot/*.getDisplayContent(mDisplayId)*/.forAllWindows(this,
true /* traverseTopToBottom */);
if (mAddWallpaperInputConsumerHandle) {
// No visible wallpaper found, add the wallpaper input consumer at the end.
@@ -414,8 +408,8 @@ final class InputMonitor {
}
// Send windows to native code.
- mService.mInputManager.setInputWindows(mInputWindowHandles, mFocusedInputWindowHandle,
- mDisplayId);
+ // TODO: Update Input windows and focus by display?
+ mService.mInputManager.setInputWindows(mInputWindowHandles, mFocusedInputWindowHandle);
clearInputWindowHandlesLw();
@@ -435,8 +429,7 @@ final class InputMonitor {
final int flags = w.mAttrs.flags;
final int privateFlags = w.mAttrs.privateFlags;
final int type = w.mAttrs.type;
- // TODO(b/111361570): multi-display focus, one focus for all display in current.
- final boolean hasFocus = w == mService.mCurrentFocus;//mInputFocus;
+ final boolean hasFocus = w == mInputFocus;
final boolean isVisible = w.isVisibleLw();
if (mAddRecentsAnimationInputConsumerHandle) {
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index b5566a7dca08..dea40769f4fd 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -361,6 +361,11 @@ public class RecentsAnimationController implements DeathRecipient {
new RemoteAnimationTarget[appAnimations.size()]);
mPendingStart = false;
+ // Perform layout if it was scheduled before to make sure that we get correct content
+ // insets for the target app window after a rotation
+ final DisplayContent displayContent = mService.mRoot.getDisplayContent(mDisplayId);
+ displayContent.performLayout(false /* initial */, false /* updateInputWindows */);
+
final Rect minimizedHomeBounds = mTargetAppToken != null
&& mTargetAppToken.inSplitScreenSecondaryWindowingMode()
? mMinimizedHomeBounds
@@ -369,8 +374,7 @@ public class RecentsAnimationController implements DeathRecipient {
&& mTargetAppToken.findMainWindow() != null
? mTargetAppToken.findMainWindow().mContentInsets
: null;
- mRunner.onAnimationStart(mController, appTargets, contentInsets,
- minimizedHomeBounds);
+ mRunner.onAnimationStart(mController, appTargets, contentInsets, minimizedHomeBounds);
if (DEBUG_RECENTS_ANIMATIONS) {
Slog.d(TAG, "startAnimation(): Notify animation start:");
for (int i = 0; i < mPendingAnimations.size(); i++) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 3acecba8db26..7520bfafe71a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -6071,21 +6071,26 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void createInputConsumer(IBinder token, String name, InputChannel inputChannel) {
synchronized (mWindowMap) {
- // TODO(b/112049699): multi-display inputConsumer, just support default in current.
- // Need consider about the behavior from controller.
- DisplayContent displayContent = getDefaultDisplayContentLocked();
- displayContent.getInputMonitor().createInputConsumer(token, name, inputChannel,
- Binder.getCallingPid(), Binder.getCallingUserHandle());
+ // TODO(b/112049699): Fix this for multiple displays. There is only one inputChannel
+ // here to accept the return value.
+ DisplayContent display = mRoot.getDisplayContent(Display.DEFAULT_DISPLAY);
+ if (display != null) {
+ display.getInputMonitor().createInputConsumer(token, name, inputChannel,
+ Binder.getCallingPid(), Binder.getCallingUserHandle());
+ }
}
}
@Override
public boolean destroyInputConsumer(String name) {
synchronized (mWindowMap) {
- // TODO(b/112049699): multi-display inputConsumer, just support default in current.
- // Need consider about the behavior from controller.
- DisplayContent displayContent = getDefaultDisplayContentLocked();
- return displayContent.getInputMonitor().destroyInputConsumer(name);
+ // TODO(b/112049699): Fix this for multiple displays. For consistency with
+ // createInputConsumer above.
+ DisplayContent display = mRoot.getDisplayContent(Display.DEFAULT_DISPLAY);
+ if (display != null) {
+ return display.getInputMonitor().destroyInputConsumer(name);
+ }
+ return false;
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 58fb7a0f0a5e..0d093d1e3e35 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -634,10 +634,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
void forceSeamlesslyRotateIfAllowed(int oldRotation, int rotation) {
if (mForceSeamlesslyRotate) {
- if (mPendingForcedSeamlessRotate != null) {
- oldRotation = mPendingForcedSeamlessRotate.getOldRotation();
- }
-
mPendingForcedSeamlessRotate = new ForcedSeamlessRotator(
oldRotation, rotation, getDisplayInfo());
mPendingForcedSeamlessRotate.unrotate(this.mToken);
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index f5f19f644e25..52f2d674f993 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -210,7 +210,7 @@ public:
const sp<InputWindowHandle>& inputWindowHandle, bool monitor);
status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel);
- void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray, int displayId);
+ void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray);
void setFocusedApplication(JNIEnv* env, jobject applicationHandleObj);
void setInputDispatchMode(bool enabled, bool frozen);
void setSystemUiVisibility(int32_t visibility);
@@ -736,8 +736,7 @@ void NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration
}
}
-void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray,
- int displayId) {
+void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray) {
Vector<sp<InputWindowHandle> > windowHandles;
if (windowHandleObjArray) {
@@ -757,7 +756,7 @@ void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleO
}
}
- mInputManager->getDispatcher()->setInputWindows(windowHandles, displayId);
+ mInputManager->getDispatcher()->setInputWindows(windowHandles);
// Do this after the dispatcher has updated the window handle state.
bool newPointerGesturesEnabled = true;
@@ -1447,10 +1446,10 @@ static void nativeToggleCapsLock(JNIEnv* env, jclass /* clazz */,
}
static void nativeSetInputWindows(JNIEnv* env, jclass /* clazz */,
- jlong ptr, jobjectArray windowHandleObjArray, jint displayId) {
+ jlong ptr, jobjectArray windowHandleObjArray) {
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
- im->setInputWindows(env, windowHandleObjArray, displayId);
+ im->setInputWindows(env, windowHandleObjArray);
}
static void nativeSetFocusedApplication(JNIEnv* env, jclass /* clazz */,
@@ -1679,7 +1678,7 @@ static const JNINativeMethod gInputManagerMethods[] = {
(void*) nativeInjectInputEvent },
{ "nativeToggleCapsLock", "(JI)V",
(void*) nativeToggleCapsLock },
- { "nativeSetInputWindows", "(J[Lcom/android/server/input/InputWindowHandle;I)V",
+ { "nativeSetInputWindows", "(J[Lcom/android/server/input/InputWindowHandle;)V",
(void*) nativeSetInputWindows },
{ "nativeSetFocusedApplication", "(JLcom/android/server/input/InputApplicationHandle;)V",
(void*) nativeSetFocusedApplication },
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index b6f3d3b337e8..c82c242ea522 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -28,6 +28,7 @@ import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources.Theme;
import android.database.sqlite.SQLiteCompatibilityWalFlags;
+import android.database.sqlite.SQLiteGlobal;
import android.os.BaseBundle;
import android.os.Binder;
import android.os.Build;
@@ -355,6 +356,10 @@ public final class SystemServer {
Binder.setWarnOnBlocking(true);
// The system server should always load safe labels
PackageItemInfo.setForceSafeLabels(true);
+
+ // Default to FULL within the system server.
+ SQLiteGlobal.sDefaultSyncMode = SQLiteGlobal.SYNC_MODE_FULL;
+
// Deactivate SQLiteCompatibilityWalFlags until settings provider is initialized
SQLiteCompatibilityWalFlags.init(null);
diff --git a/services/robotests/README b/services/robotests/README
new file mode 100644
index 000000000000..3c682922102d
--- /dev/null
+++ b/services/robotests/README
@@ -0,0 +1,23 @@
+This folder is for Robolectric tests inside the platform.
+
+To add a test class annotate it as follows:
+
+@RunWith(FrameworkRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, sdk = 26)
+@SystemLoaderClasses({ClassUnderTest.class, DependencyClasses.class})
+@SystemLoaderPackages({"com.android.server.yourmodule"})
+
+Robolectric loads some classes that it decides from versioned jars of the framework. Since we are
+part of the framework some of our classes get loaded from these jars. This is NOT what we want, we
+want to test against what we wrote in the tree. Because of this we use a custom test runner,
+FrameworkRobolectricTestRunner, that bypasses these jars and loads certain classes from the system
+class loader.
+
+To specify which classes to load use either @SystemLoaderClasses or @SystemLoaderPackages. In
+practice:
+* You MUST put the class under test here.
+* If you encounter any exceptions that might be caused by a different version of the class being
+loaded, such as NoSuchMethodException, put the class involved in the exception in this annotation
+and try again.
+
+Check Android.mk file for more info.
diff --git a/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java b/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
index de22201e3874..e316d5b48de5 100644
--- a/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java
@@ -1382,6 +1382,7 @@ public class KeyValueBackupTaskTest {
verify(agentMock.agent).onQuotaExceeded(anyLong(), eq(1234L));
assertEventLogged(EventLogTags.BACKUP_QUOTA_EXCEEDED, PACKAGE_1.packageName);
assertBackupNotPendingFor(PACKAGE_1);
+ // TODO: Assert about state/staging files (possible bug)
}
@Test
diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk
index 8f4e8e435593..43f319e8ccd6 100644
--- a/services/tests/servicestests/Android.mk
+++ b/services/tests/servicestests/Android.mk
@@ -22,7 +22,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
services.net \
services.usage \
guava \
- android-support-test \
+ androidx-test \
mockito-target-minus-junit4 \
platform-test-annotations \
ShortcutManagerTestUtils \
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index a8efe819e518..16cc8fd18bfd 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -220,7 +220,7 @@
</application>
<instrumentation
- android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.frameworks.servicestests"
android:label="Frameworks Services Tests" />
</manifest>
diff --git a/services/tests/servicestests/AndroidTest.xml b/services/tests/servicestests/AndroidTest.xml
index 5ac68d4b69d4..4d653b99439c 100644
--- a/services/tests/servicestests/AndroidTest.xml
+++ b/services/tests/servicestests/AndroidTest.xml
@@ -28,7 +28,7 @@
<option name="test-tag" value="FrameworksServicesTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.frameworks.servicestests" />
- <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>
diff --git a/services/tests/servicestests/src/com/android/server/AlarmManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/AlarmManagerServiceTest.java
index 918807d0392c..1f63d6165617 100644
--- a/services/tests/servicestests/src/com/android/server/AlarmManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/AlarmManagerServiceTest.java
@@ -20,10 +20,11 @@ import static android.app.AlarmManager.RTC_WAKEUP;
import static org.junit.Assert.assertEquals;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.ObjectUtils;
import com.android.server.AlarmManagerService.Alarm;
diff --git a/services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java b/services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java
index 4d77fab808ba..aac96a1dd847 100644
--- a/services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java
+++ b/services/tests/servicestests/src/com/android/server/AppOpsUpgradeTest.java
@@ -25,13 +25,14 @@ import android.content.Context;
import android.content.res.AssetManager;
import android.os.Handler;
import android.os.HandlerThread;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.util.SparseArray;
import android.util.Xml;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
index 933b3d6b4b6c..910aad7fd86e 100644
--- a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
@@ -60,12 +60,13 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings.Global;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
import android.util.ArraySet;
import android.util.Pair;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.server.AppStateTracker.Listener;
diff --git a/services/tests/servicestests/src/com/android/server/BatteryServiceTest.java b/services/tests/servicestests/src/com/android/server/BatteryServiceTest.java
index 106f9e8c2705..cb12ba7d7679 100644
--- a/services/tests/servicestests/src/com/android/server/BatteryServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/BatteryServiceTest.java
@@ -17,27 +17,24 @@
package com.android.server;
import static junit.framework.Assert.*;
+
import static org.mockito.Mockito.*;
import android.hardware.health.V2_0.IHealth;
import android.hidl.manager.V1_0.IServiceManager;
import android.hidl.manager.V1_0.IServiceNotification;
-import android.os.RemoteException;
-import android.support.test.filters.SmallTest;
import android.test.AndroidTestCase;
-import android.util.Slog;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.NoSuchElementException;
+import androidx.test.filters.SmallTest;
-import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
import org.mockito.invocation.InvocationOnMock;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.NoSuchElementException;
public class BatteryServiceTest extends AndroidTestCase {
diff --git a/services/tests/servicestests/src/com/android/server/BootReceiverFixFsckFsStatTest.java b/services/tests/servicestests/src/com/android/server/BootReceiverFixFsckFsStatTest.java
index 69c149912034..9ba3308622ed 100644
--- a/services/tests/servicestests/src/com/android/server/BootReceiverFixFsckFsStatTest.java
+++ b/services/tests/servicestests/src/com/android/server/BootReceiverFixFsckFsStatTest.java
@@ -18,10 +18,8 @@ package com.android.server;
import static junit.framework.Assert.*;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import junit.framework.Assert;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java b/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java
index 33e4165718a5..2ec6830b7755 100644
--- a/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/GestureLauncherServiceTest.java
@@ -33,12 +33,13 @@ import android.os.Looper;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
-import android.view.KeyEvent;
import android.util.MutableBoolean;
+import android.view.KeyEvent;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -46,17 +47,16 @@ import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.LocalServices;
import com.android.server.statusbar.StatusBarManagerInternal;
-import java.util.List;
-
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.List;
+
/**
* Unit tests for {@link GestureLauncherService}.
* runtest frameworks-services -c com.android.server.GestureLauncherServiceTest
diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java
index c9180a99c98d..4bac200a22c6 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java
@@ -29,10 +29,11 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.net.NetworkPolicyManager;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -52,7 +53,7 @@ import java.util.function.BiFunction;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
* Run: adb shell am instrument -e class com.android.server.NetworkManagementInternalTest -w \
- * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 17babe9635be..eb28e1ae2f23 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -114,8 +114,6 @@ import android.os.RemoteException;
import android.os.SimpleClock;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionPlan;
@@ -128,6 +126,9 @@ import android.util.Log;
import android.util.Range;
import android.util.RecurrenceRule;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent;
@@ -135,9 +136,6 @@ import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.net.NetworkPolicyManagerService;
import com.android.server.net.NetworkStatsManagerInternal;
-import libcore.io.IoUtils;
-import libcore.io.Streams;
-
import com.google.common.util.concurrent.AbstractFuture;
import org.junit.After;
@@ -154,6 +152,9 @@ import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
+import libcore.io.IoUtils;
+import libcore.io.Streams;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
@@ -190,7 +191,7 @@ import java.util.stream.Collectors;
m -j32 FrameworksServicesTests && adb install -r -g \
${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk && \
adb shell am instrument -e class "com.android.server.NetworkPolicyManagerServiceTest" -w \
- "com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner"
+ "com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner"
* </code></pre>
*/
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
index 4176d2a7d9d5..e9e96c9c7efb 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
@@ -24,14 +24,12 @@ import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -47,7 +45,6 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.res.Resources;
-import android.database.ContentObserver;
import android.net.INetworkRecommendationProvider;
import android.net.INetworkScoreCache;
import android.net.NetworkKey;
@@ -69,9 +66,10 @@ import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.devicepolicy.MockUtils;
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
index 6874624ae193..52428e8bc478 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScorerAppManagerTest.java
@@ -34,7 +34,6 @@ import android.Manifest.permission;
import android.app.AppOpsManager;
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -45,14 +44,14 @@ import android.net.NetworkScoreManager;
import android.net.NetworkScorerAppData;
import android.os.Bundle;
import android.provider.Settings;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
diff --git a/services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java
new file mode 100644
index 000000000000..43438b99edef
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/StorageManagerServiceTest.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
+import android.os.UserHandle;
+import android.os.UserManagerInternal;
+import android.os.storage.StorageManagerInternal;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.SparseArray;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class StorageManagerServiceTest {
+
+ private StorageManagerService mService;
+
+ @Mock private Context mContext;
+ @Mock private PackageManager mPm;
+ @Mock private PackageManagerInternal mPmi;
+ @Mock private UserManagerInternal mUmi;
+
+ private static final String PKG_GREY = "com.grey";
+ private static final String PKG_RED = "com.red";
+ private static final String PKG_BLUE = "com.blue";
+
+ private static final int UID_GREY = 10000;
+ private static final int UID_COLORS = 10001;
+
+ private static final String NAME_COLORS = "colors";
+
+ private static ApplicationInfo buildApplicationInfo(String packageName, int uid) {
+ final ApplicationInfo ai = new ApplicationInfo();
+ ai.packageName = packageName;
+ ai.uid = uid;
+ return ai;
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ LocalServices.removeServiceForTest(StorageManagerInternal.class);
+
+ LocalServices.removeServiceForTest(PackageManagerInternal.class);
+ LocalServices.addService(PackageManagerInternal.class, mPmi);
+ LocalServices.removeServiceForTest(UserManagerInternal.class);
+ LocalServices.addService(UserManagerInternal.class, mUmi);
+
+ when(mContext.getPackageManager()).thenReturn(mPm);
+
+ when(mUmi.getUserIds()).thenReturn(new int[] { 0 });
+
+ {
+ final SparseArray<String> res = new SparseArray<>();
+ res.put(UID_COLORS, NAME_COLORS);
+ when(mPmi.getAppsWithSharedUserIds()).thenReturn(res);
+ }
+
+ {
+ final List<ApplicationInfo> res = new ArrayList<>();
+ res.add(buildApplicationInfo(PKG_GREY, UID_GREY));
+ res.add(buildApplicationInfo(PKG_RED, UID_COLORS));
+ res.add(buildApplicationInfo(PKG_BLUE, UID_COLORS));
+ when(mPm.getInstalledApplicationsAsUser(anyInt(), anyInt())).thenReturn(res);
+ }
+
+ when(mPmi.getPackageUid(eq(PKG_GREY), anyInt(), anyInt())).thenReturn(UID_GREY);
+ when(mPmi.getPackageUid(eq(PKG_RED), anyInt(), anyInt())).thenReturn(UID_COLORS);
+ when(mPmi.getPackageUid(eq(PKG_BLUE), anyInt(), anyInt())).thenReturn(UID_COLORS);
+
+ when(mPm.getPackagesForUid(eq(UID_GREY))).thenReturn(new String[] { PKG_GREY });
+ when(mPm.getPackagesForUid(eq(UID_COLORS))).thenReturn(new String[] { PKG_RED, PKG_BLUE });
+
+ mService = new StorageManagerService(mContext);
+ mService.collectPackagesInfo();
+ }
+
+ @Test
+ public void testNone() throws Exception {
+ assertTranslation(
+ "/dev/null",
+ "/dev/null", PKG_GREY);
+ assertTranslation(
+ "/dev/null",
+ "/dev/null", PKG_RED);
+ }
+
+ @Test
+ public void testPrimary() throws Exception {
+ assertTranslation(
+ "/storage/emulated/0/Android/sandbox/com.grey/foo.jpg",
+ "/storage/emulated/0/foo.jpg", PKG_GREY);
+ assertTranslation(
+ "/storage/emulated/0/Android/sandbox/shared/colors/foo.jpg",
+ "/storage/emulated/0/foo.jpg", PKG_RED);
+ }
+
+ @Test
+ public void testSecondary() throws Exception {
+ assertTranslation(
+ "/storage/0000-0000/Android/sandbox/com.grey/foo/bar.jpg",
+ "/storage/0000-0000/foo/bar.jpg", PKG_GREY);
+ assertTranslation(
+ "/storage/0000-0000/Android/sandbox/shared/colors/foo/bar.jpg",
+ "/storage/0000-0000/foo/bar.jpg", PKG_RED);
+ }
+
+ @Test
+ public void testLegacy() throws Exception {
+ // Accessing their own paths goes straight through
+ assertTranslation(
+ "/storage/emulated/0/Android/data/com.grey/foo.jpg",
+ "/storage/emulated/0/Android/data/com.grey/foo.jpg", PKG_GREY);
+
+ // Accessing other package paths goes into sandbox
+ assertTranslation(
+ "/storage/emulated/0/Android/sandbox/shared/colors/"
+ + "Android/data/com.grey/foo.jpg",
+ "/storage/emulated/0/Android/data/com.grey/foo.jpg", PKG_RED);
+ }
+
+ @Test
+ public void testLegacyShared() throws Exception {
+ // Accessing their own paths goes straight through
+ assertTranslation(
+ "/storage/emulated/0/Android/data/com.red/foo.jpg",
+ "/storage/emulated/0/Android/data/com.red/foo.jpg", PKG_RED);
+ assertTranslation(
+ "/storage/emulated/0/Android/data/com.red/foo.jpg",
+ "/storage/emulated/0/Android/data/com.red/foo.jpg", PKG_BLUE);
+
+ // Accessing other package paths goes into sandbox
+ assertTranslation(
+ "/storage/emulated/0/Android/sandbox/com.grey/"
+ + "Android/data/com.red/foo.jpg",
+ "/storage/emulated/0/Android/data/com.red/foo.jpg", PKG_GREY);
+ }
+
+ @Test
+ public void testSecurity() throws Exception {
+ // Shady paths should throw
+ try {
+ mService.translateAppToSystem(
+ "/storage/emulated/0/../foo.jpg",
+ PKG_GREY, UserHandle.USER_SYSTEM);
+ fail();
+ } catch (SecurityException expected) {
+ }
+
+ // Sandboxes can't see system paths
+ try {
+ mService.translateSystemToApp(
+ "/storage/emulated/0/foo.jpg",
+ PKG_GREY, UserHandle.USER_SYSTEM);
+ fail();
+ } catch (SecurityException expected) {
+ }
+
+ // Sandboxes can't see paths in other sandboxes
+ try {
+ mService.translateSystemToApp(
+ "/storage/emulated/0/Android/sandbox/shared/colors/foo.jpg",
+ PKG_GREY, UserHandle.USER_SYSTEM);
+ fail();
+ } catch (SecurityException expected) {
+ }
+ }
+
+ private void assertTranslation(String system, String sandbox, String packageName)
+ throws Exception {
+ assertEquals(system,
+ mService.translateAppToSystem(sandbox, packageName, UserHandle.USER_SYSTEM));
+ assertEquals(sandbox,
+ mService.translateSystemToApp(system, packageName, UserHandle.USER_SYSTEM));
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/WatchdogDiagnosticsTest.java b/services/tests/servicestests/src/com/android/server/WatchdogDiagnosticsTest.java
index 6e76b679940b..4d229efc8328 100644
--- a/services/tests/servicestests/src/com/android/server/WatchdogDiagnosticsTest.java
+++ b/services/tests/servicestests/src/com/android/server/WatchdogDiagnosticsTest.java
@@ -18,14 +18,14 @@ package com.android.server;
import static org.junit.Assert.assertEquals;
-import android.support.test.runner.AndroidJUnit4;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
/**
* Unit tests for {@link WatchdogDiagnostics}
*/
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java
index 5d09e31a3dc7..4c0f38aa2998 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java
@@ -18,6 +18,7 @@ package com.android.server.accessibility;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertSame;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -30,13 +31,14 @@ import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Instrumentation;
import android.os.Looper;
import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IAccessibilityManager;
import android.view.accessibility.IAccessibilityManagerClient;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.IntPair;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java b/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
index 18193984dd19..236b45894fb3 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
@@ -19,6 +19,7 @@ package com.android.server.accessibility;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
+
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyObject;
@@ -30,11 +31,6 @@ import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
import android.content.Context;
import android.os.Handler;
import android.os.IPowerManager;
@@ -42,9 +38,10 @@ import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteException;
-import android.support.test.runner.AndroidJUnit4;
import android.view.KeyEvent;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.accessibility.KeyEventDispatcher.KeyEventFilter;
import com.android.server.policy.WindowManagerPolicy;
@@ -56,6 +53,11 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
/**
* Tests for KeyEventDispatcher
*/
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
index ceb3f9d23ce7..851e22173420 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
@@ -23,14 +23,19 @@ import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.isNull;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
-import org.hamcrest.BaseMatcher;
+import android.os.Looper;
+import android.view.KeyEvent;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.policy.WindowManagerPolicy.WindowState;
+
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
@@ -42,13 +47,6 @@ import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import android.os.Looper;
-import android.support.test.runner.AndroidJUnit4;
-import android.view.KeyEvent;
-
-import com.android.server.policy.WindowManagerPolicy;
-import com.android.server.policy.WindowManagerPolicy.WindowState;
-
/**
* Tests for KeyboardInterceptor
*/
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
index 5253cb4da32e..f9d264b7e532 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
@@ -17,9 +17,9 @@
package com.android.server.accessibility;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
@@ -43,9 +43,10 @@ import android.graphics.Region;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.support.test.runner.AndroidJUnit4;
import android.view.MagnificationSpec;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.R;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowManagerInternal.MagnificationCallbacks;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java
index 23fe0ffda60e..79e4d705db19 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java
@@ -35,12 +35,13 @@ import static org.mockito.Mockito.verify;
import android.annotation.NonNull;
import android.content.Context;
import android.os.Message;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.util.DebugUtils;
import android.view.InputDevice;
import android.view.MotionEvent;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.testutils.OffsettableClock;
import com.android.server.testutils.TestHandler;
@@ -50,7 +51,6 @@ import org.junit.runner.RunWith;
import java.util.function.IntConsumer;
-
/**
* Tests the state transitions of {@link MagnificationGestureHandler}
*
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
index 6cacb1fe0c06..5f0fa874b7da 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
@@ -19,6 +19,7 @@ package com.android.server.accessibility;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;
import static android.view.WindowManagerPolicyConstants.FLAG_PASS_TO_USER;
+
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.everyItem;
@@ -45,18 +46,14 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
-import android.util.Pair;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.accessibility.AccessibilityEvent;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import androidx.test.runner.AndroidJUnit4;
-import android.view.accessibility.AccessibilityEvent;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
@@ -66,6 +63,10 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
/**
* Tests for MotionEventInjector
*/
diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
index 149ef156a9fa..5c449b3b2843 100644
--- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java
@@ -17,6 +17,7 @@
package com.android.server.accounts;
import static android.database.sqlite.SQLiteDatabase.deleteDatabase;
+
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
@@ -25,7 +26,6 @@ import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.nullable;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -35,11 +35,10 @@ import android.accounts.AccountManagerInternal;
import android.accounts.CantAddAccountActivity;
import android.accounts.IAccountManagerResponse;
import android.app.AppOpsManager;
+import android.app.INotificationManager;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
-import android.app.INotificationManager;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -67,7 +66,6 @@ import android.test.mock.MockContext;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
-import com.android.frameworks.servicestests.R;
import com.android.server.LocalServices;
import org.mockito.ArgumentCaptor;
@@ -90,7 +88,6 @@ import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
-
/**
* Tests for {@link AccountManagerService}.
* <p>Run with:<pre>
@@ -98,7 +95,7 @@ import java.util.concurrent.atomic.AtomicLong;
* adb install -r ${OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
* adb shell am instrument -w -e package com.android.server.accounts \
* com.android.frameworks.servicestests\
- * /android.support.test.runner.AndroidJUnitRunner
+ * /androidx.test.runner.AndroidJUnitRunner
* </pre>
*/
public class AccountManagerServiceTest extends AndroidTestCase {
diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountsDbTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountsDbTest.java
index 5d0c23f81737..fa7501dc8ac6 100644
--- a/services/tests/servicestests/src/com/android/server/accounts/AccountsDbTest.java
+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountsDbTest.java
@@ -17,14 +17,20 @@
package com.android.server.accounts;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
import android.accounts.Account;
import android.content.Context;
import android.database.Cursor;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Pair;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -35,11 +41,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
/**
* Tests for {@link AccountsDb}.
* <p>Run with:<pre>
@@ -47,7 +48,7 @@ import static org.junit.Assert.assertTrue;
* adb install \
* -r out/target/product/marlin/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
* adb shell am instrument -e class com.android.server.accounts.AccountsDbTest \
- * -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
* </pre>
*/
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java
index 583a9dd3a342..9de64f2cf211 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java
@@ -16,28 +16,29 @@
package com.android.server.am;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+
+import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_DONE;
+import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import android.app.ActivityOptions;
import android.content.pm.ActivityInfo;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.am.LaunchParamsController.LaunchParams;
-import org.junit.runner.RunWith;
+
import org.junit.Before;
import org.junit.Test;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_DONE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.doAnswer;
-
-import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
+import org.junit.runner.RunWith;
/**
* Tests for exercising resizing bounds due to activity options.
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
index bce87dc58819..9a7488e42326 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
@@ -21,8 +21,9 @@ import static org.junit.Assert.assertTrue;
import android.app.ActivityManagerInternal;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
@@ -43,7 +44,7 @@ import org.mockito.MockitoAnnotations;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
* Run: adb shell am instrument -e class com.android.server.am.ActivityManagerInternalTest -w \
- * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@RunWith(AndroidJUnit4.class)
public class ActivityManagerInternalTest {
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index aeae11a34ace..47ce8796e449 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -28,6 +28,7 @@ import static android.app.ActivityManager.PROCESS_STATE_RECEIVER;
import static android.app.ActivityManager.PROCESS_STATE_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_TOP;
import static android.util.DebugUtils.valueToString;
+
import static com.android.server.am.ActivityManagerInternalTest.CustomThread;
import static com.android.server.am.ActivityManagerService.DISPATCH_UIDS_CHANGED_UI_MSG;
import static com.android.server.am.ActivityManagerService.Injector;
@@ -62,9 +63,10 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.AppOpsService;
@@ -97,7 +99,7 @@ import java.util.function.Function;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
* Run: adb shell am instrument -e class com.android.server.am.ActivityManagerServiceTest -w \
- * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java
index 28b37c58c799..d15bff4f6378 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java
@@ -20,19 +20,19 @@ import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
+
import static org.junit.Assert.assertEquals;
import android.app.ActivityOptions;
import android.os.Bundle;
-import android.os.Debug;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-
/**
* atest FrameworksServicesTests:ActivityOptionsTest
*/
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
index 6cfa317fe60c..233874475d9c 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
@@ -22,11 +22,7 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.view.Display.DEFAULT_DISPLAY;
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
-import static com.android.server.am.ActivityStack.ActivityState.FINISHING;
import static com.android.server.am.ActivityStack.ActivityState.INITIALIZING;
-import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING;
@@ -43,7 +39,6 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -54,14 +49,14 @@ import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.PauseActivityItem;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.MutableBoolean;
-import org.junit.runner.RunWith;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
/**
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
index 3c4fe18a7820..20df2aeed66f 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -27,8 +27,7 @@ import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
import static android.content.pm.ActivityInfo.FLAG_SHOW_WHEN_LOCKED;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
-import static com.android.server.am.ActivityStackSupervisor
- .MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE;
+import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -47,10 +46,11 @@ import android.app.ActivityOptions;
import android.app.WaitResult;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseIntArray;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index 5669819091ff..59b08909bb76 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -34,23 +34,20 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
import android.content.pm.ActivityInfo;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.runner.RunWith;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for the {@link ActivityStack} class.
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
index f5ae46cd19ed..e1ebbcf8f653 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
@@ -19,25 +19,26 @@ package com.android.server.am;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
import android.app.IApplicationThread;
import android.content.Intent;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.am.ActivityStackSupervisor.PendingActivityLaunch;
import com.android.server.am.ActivityStarter.Factory;
-import org.junit.runner.RunWith;
import org.junit.Test;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.times;
+import org.junit.runner.RunWith;
import java.util.Random;
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
index 41c7f1d787a4..86541b95f395 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
@@ -39,12 +39,13 @@ import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
import android.testing.DexmakerShareClassLoaderRule;
+import androidx.test.filters.SmallTest;
+
+import com.android.internal.app.HarmfulAppWarningActivity;
import com.android.internal.app.SuspendedAppActivity;
import com.android.internal.app.UnlaunchableAppActivity;
-import com.android.internal.app.HarmfulAppWarningActivity;
import com.android.server.LocalServices;
import com.android.server.pm.PackageManagerService;
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
index 90607adacaf3..d032eb51c974 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
@@ -32,10 +32,26 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
+
+import static com.android.server.am.ActivityManagerService.ANIMATE;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyObject;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import android.app.ActivityOptions;
import android.app.IApplicationThread;
-import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.WindowLayout;
@@ -47,13 +63,8 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.service.voice.IVoiceInteractionSession;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Gravity;
-import org.junit.runner.RunWith;
-import org.junit.Test;
-
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
import static com.android.server.am.ActivityManagerService.ANIMATE;
@@ -76,11 +87,14 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.am.LaunchParamsController.LaunchParamsModifier;
import com.android.server.am.TaskRecord.TaskRecordFactory;
-import java.util.ArrayList;
-import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for the {@link ActivityStarter} class.
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index a9e0aa805c37..9c0b525a411f 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -26,14 +26,14 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
@@ -62,27 +62,30 @@ import android.os.HandlerThread;
import android.os.Looper;
import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession;
-import android.support.test.InstrumentationRegistry;
import android.testing.DexmakerShareClassLoaderRule;
import android.util.SparseIntArray;
+import androidx.test.InstrumentationRegistry;
import com.android.internal.app.IVoiceInteractor;
-
import com.android.server.AttributeCache;
import com.android.server.wm.AppWindowContainerController;
+import com.android.server.wm.DisplayWindowController;
import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.StackWindowController;
import com.android.server.wm.TaskWindowContainerController;
import com.android.server.wm.WindowManagerService;
import com.android.server.wm.WindowTestUtils;
+import com.android.server.uri.UriGrantsManagerInternal;
+
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
import java.util.List;
-
/**
* A base class to handle common operations in activity related unit tests.
*/
diff --git a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
index 243c1b379608..87d367fcb2b2 100644
--- a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
@@ -18,10 +18,11 @@ package com.android.server.am;
import android.content.Context;
import android.os.Handler;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.AppOpsService;
diff --git a/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java b/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
index f74d11645be4..a030210398d6 100644
--- a/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
@@ -42,12 +42,13 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.view.IWindowManager;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.am.AssistDataRequester.AssistDataRequesterCallbacks;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java b/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
index 32573899aedd..62c5734561f9 100644
--- a/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
@@ -25,8 +25,9 @@ import android.content.pm.ResolveInfo;
import android.os.Process;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java b/services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java
index ef6d5e81b472..b4ad183db386 100644
--- a/services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ClientLifecycleManagerTests.java
@@ -9,8 +9,9 @@ import android.app.IApplicationThread;
import android.app.servertransaction.ClientTransaction;
import android.os.Binder;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
index da30c11be81a..fe8256eeb977 100644
--- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
@@ -26,18 +26,18 @@ import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.AppOpsService;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -58,7 +58,7 @@ import java.io.File;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
* Run: adb shell am instrument -e class com.android.server.am.CoreSettingsObserverTest -w \
- * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java b/services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java
index d9b3e1c0173b..765aaad45efb 100644
--- a/services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/GlobalSettingsToPropertiesMapperTest.java
@@ -18,11 +18,12 @@ package com.android.server.am;
import android.content.ContentResolver;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.Preconditions;
import com.android.internal.util.test.FakeSettingsProvider;
diff --git a/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java b/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java
index fbe552dbcbbc..d4bab2ef2a43 100644
--- a/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java
@@ -16,20 +16,14 @@
package com.android.server.am;
-import android.app.ActivityOptions;
-import android.content.pm.ActivityInfo.WindowLayout;
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.android.server.am.LaunchParamsController.LaunchParams;
-import org.junit.runner.RunWith;
-import org.junit.Before;
-import org.junit.Test;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
-import com.android.server.am.LaunchParamsController.LaunchParamsModifier;
+import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_CONTINUE;
+import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_DONE;
+import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doNothing;
@@ -40,12 +34,19 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_DONE;
-import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_CONTINUE;
-import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_SKIP;
+import android.app.ActivityOptions;
+import android.content.pm.ActivityInfo.WindowLayout;
+import android.platform.test.annotations.Presubmit;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.am.LaunchParamsController.LaunchParams;
+import com.android.server.am.LaunchParamsController.LaunchParamsModifier;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for exercising {@link LaunchParamsController}.
diff --git a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java
index f46d712df65b..863a0d8d34a4 100644
--- a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java
@@ -52,12 +52,13 @@ import android.os.Message;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
import android.telecom.TelecomManager;
import android.testing.DexmakerShareClassLoaderRule;
import android.util.Pair;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
diff --git a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
index 5518ca5bd8cc..06c74371eb51 100644
--- a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
@@ -16,15 +16,15 @@
package com.android.server.am;
+import static com.android.server.am.MemoryStatUtil.MemoryStat;
import static com.android.server.am.MemoryStatUtil.parseMemoryStatFromMemcg;
import static com.android.server.am.MemoryStatUtil.parseMemoryStatFromProcfs;
-import static com.android.server.am.MemoryStatUtil.MemoryStat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java b/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
index e73661b0557b..1c4e0f64759b 100644
--- a/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
@@ -20,16 +20,14 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import android.annotation.Nullable;
import android.app.ActivityOptions;
-import android.os.Handler;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.ArrayMap;
import android.view.RemoteAnimationAdapter;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.testutils.OffsettableClock;
import com.android.server.testutils.TestHandler;
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
index ee484d6a5a50..ba82487ec591 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
@@ -36,11 +36,8 @@ import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
-import static java.lang.Integer.MAX_VALUE;
-
import android.app.ActivityManager.RecentTaskInfo;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityTaskManager;
@@ -57,19 +54,22 @@ import android.os.Looper;
import android.os.RemoteException;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.MutableLong;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.am.RecentTasks.Callbacks;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import static java.lang.Integer.MAX_VALUE;
+
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java b/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java
index b642d263af3c..f15b5f7f04b0 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java
@@ -19,9 +19,10 @@ package com.android.server.am;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+
import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
+
import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
@@ -33,11 +34,12 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.IRecentsAnimationRunner;
-import com.android.server.AttributeCache;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
index 944f20f7ff0f..283c0278dff2 100644
--- a/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
@@ -30,11 +30,12 @@ import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -42,7 +43,7 @@ import org.junit.runner.RunWith;
import java.util.ArrayList;
/**
- * runtest --path frameworks/base/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
+ * atest FrameworksServicesTests:RunningTasksTest
*/
@MediumTest
@Presubmit
diff --git a/services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java b/services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java
index 168bc1782d56..8e4e7e6b63c3 100644
--- a/services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/SafeActivityOptionsTest.java
@@ -20,9 +20,10 @@ import static org.junit.Assert.assertEquals;
import android.app.ActivityOptions;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
index f71a6e75a25f..f5b8f78cfd53 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
@@ -16,31 +16,25 @@
package com.android.server.am;
-import android.content.pm.ActivityInfo.WindowLayout;
-import android.graphics.Rect;
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import android.view.Gravity;
-
-import org.junit.runner.RunWith;
-import org.junit.Before;
-import org.junit.Test;
-
-import org.mockito.invocation.InvocationOnMock;
-
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.RESULT_CONTINUE;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.doAnswer;
import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+import android.content.pm.ActivityInfo.WindowLayout;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.view.Gravity;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for exercising resizing task bounds.
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
index b8680bf5f381..fa8a09cc2b85 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
@@ -29,20 +29,17 @@ import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.content.res.XmlResourceParser;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.service.voice.IVoiceInteractionSession;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Xml;
-import com.android.frameworks.servicestests.R;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.app.IVoiceInteractor;
import com.android.server.am.TaskRecord.TaskRecordFactory;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -57,9 +54,7 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Reader;
-import java.nio.file.Files;
import java.util.ArrayList;
-import java.util.Comparator;
/**
* Tests for exercising {@link TaskRecord}.
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java b/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
index 5cd410e0e851..b431af1f75c3 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
@@ -16,7 +16,8 @@
package com.android.server.am;
-import static android.support.test.InstrumentationRegistry.getInstrumentation;
+import static androidx.test.InstrumentationRegistry.getInstrumentation;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -33,23 +34,25 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.content.res.Resources.Theme;
import android.os.RemoteException;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.text.TextUtils;
-import android.util.Pair;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.annotations.GuardedBy;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
@MediumTest
@RunWith(AndroidJUnit4.class)
public class TaskStackChangedListenerTest {
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java b/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java
index 7f397d6a2cfc..7e0dfcfd73f0 100644
--- a/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java
@@ -31,9 +31,10 @@ import android.app.AppOpsManager;
import android.app.AppOpsManager.OnOpActiveChangedListener;
import android.content.Context;
import android.os.Process;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
index 45e2865e8e5a..4ae9bea7617c 100644
--- a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
@@ -31,9 +31,10 @@ import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
index 1bb93ccef093..f3c76b609c25 100644
--- a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
@@ -53,7 +53,6 @@ import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
-
/**
* Tests for {@link AppWidgetManager} and {@link AppWidgetServiceImpl}.
*
@@ -61,7 +60,7 @@ import java.util.concurrent.CountDownLatch;
adb install \
-r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.appwidget.AppWidgetServiceImplTest \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
public class AppWidgetServiceImplTest extends InstrumentationTestCase {
diff --git a/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java
index bc162977de2b..2dc0ee11398b 100644
--- a/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java
@@ -17,7 +17,6 @@
package com.android.server.backup;
import static com.android.server.testutils.TestUtils.assertExpectException;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyString;
@@ -25,8 +24,9 @@ import static org.mockito.Mockito.doThrow;
import android.content.Context;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.backup.utils.PasswordUtils;
diff --git a/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java
index 3cdeba607d41..f588c4fdb060 100644
--- a/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java
@@ -19,8 +19,9 @@ package com.android.server.backup;
import static com.google.common.truth.Truth.assertThat;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
diff --git a/services/tests/servicestests/src/com/android/server/backup/ProcessedPackagesJournalTest.java b/services/tests/servicestests/src/com/android/server/backup/ProcessedPackagesJournalTest.java
index b4a1f1857d77..cf4f9753ad9f 100644
--- a/services/tests/servicestests/src/com/android/server/backup/ProcessedPackagesJournalTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/ProcessedPackagesJournalTest.java
@@ -19,8 +19,9 @@ package com.android.server.backup;
import static com.google.common.truth.Truth.assertThat;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.google.android.collect.Sets;
diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
index bbd999bdc466..79eba680c998 100644
--- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
@@ -43,8 +43,9 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/backup/restore/PerformAdbRestoreTaskTest.java b/services/tests/servicestests/src/com/android/server/backup/restore/PerformAdbRestoreTaskTest.java
index 05f4c1339265..00c63915c83d 100644
--- a/services/tests/servicestests/src/com/android/server/backup/restore/PerformAdbRestoreTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/restore/PerformAdbRestoreTaskTest.java
@@ -20,9 +20,10 @@ import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.servicestests.R;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
index 6801bd2e164a..9fcdf2d517e9 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
@@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
@@ -31,8 +30,9 @@ import android.content.pm.Signature;
import android.content.pm.SigningInfo;
import android.os.Process;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.backup.BackupManagerService;
import com.android.server.backup.testutils.PackageManagerStub;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java
index c40b411a21d7..d3fd89c3018a 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java
@@ -18,9 +18,9 @@ package com.android.server.backup.utils;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_CATEGORY;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_ID;
+import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME;
import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION;
-import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION;
import static com.google.common.truth.Truth.assertThat;
@@ -33,8 +33,9 @@ import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/BackupObserverUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/BackupObserverUtilsTest.java
index ebe6133e3bc7..cdffd35ab8d8 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/BackupObserverUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/BackupObserverUtilsTest.java
@@ -23,8 +23,9 @@ import android.app.backup.BackupProgress;
import android.app.backup.IBackupObserver;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java
index bfb95c1a3eda..efd460387b85 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java
@@ -19,8 +19,10 @@ package com.android.server.backup.utils;
import static com.google.common.truth.Truth.assertThat;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupRestoreObserverUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupRestoreObserverUtilsTest.java
index 2f56598a0b86..9b861a4dbf03 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupRestoreObserverUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupRestoreObserverUtilsTest.java
@@ -24,8 +24,9 @@ import static org.mockito.Mockito.verify;
import android.app.backup.IFullBackupRestoreObserver;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupUtilsTest.java
index 4e3de6415c10..ae0452a60161 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/FullBackupUtilsTest.java
@@ -25,8 +25,9 @@ import static org.mockito.Mockito.verifyZeroInteractions;
import android.os.ParcelFileDescriptor;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -40,7 +41,6 @@ import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileOutputStream;
-import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java
index db55120dc023..679e098e782e 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java
@@ -19,10 +19,11 @@ package com.android.server.backup.utils;
import static com.google.common.truth.Truth.assertThat;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.google.android.collect.Sets;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
index 2830a7459dc8..12f2991b3fea 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
@@ -29,8 +29,6 @@ import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_VERSION_OF_BA
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
@@ -47,13 +45,14 @@ import android.content.pm.SigningInfo;
import android.os.Bundle;
import android.os.Process;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.frameworks.servicestests.R;
-import com.android.server.backup.FileMetadata;
import com.android.server.backup.BackupManagerService;
+import com.android.server.backup.FileMetadata;
import com.android.server.backup.restore.PerformAdbRestoreTask;
import com.android.server.backup.restore.RestorePolicy;
import com.android.server.backup.testutils.PackageManagerStub;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java
index 175fdd84fb04..be05245deea1 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java
@@ -28,7 +28,7 @@ import android.test.suitebuilder.annotation.SmallTest;
-w com.android.frameworks.servicestests
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
public class DevicePolicyConstantsTest extends AndroidTestCase {
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index a23636ca20dc..e37a6c10409d 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -117,7 +117,7 @@ import java.util.concurrent.TimeUnit;
adb install \
-r ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.devicepolicy.DevicePolicyManagerTest \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
(mmma frameworks/base/services/tests/servicestests/ for non-ninja build)
*
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
index 939a2725fb07..34edd9fb020b 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
@@ -33,11 +33,12 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
import android.os.RemoteException;
-import android.support.test.InstrumentationRegistry;
import android.test.AndroidTestCase;
import android.test.mock.MockPackageManager;
import android.view.inputmethod.InputMethodInfo;
+import androidx.test.InstrumentationRegistry;
+
import com.android.internal.R;
import com.android.internal.view.IInputMethodManager;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
index cb6a7472d3bc..5899bb0e94fe 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
@@ -16,12 +16,12 @@
package com.android.server.devicepolicy;
-import com.android.server.devicepolicy.DevicePolicyManagerServiceTestable.OwnersTestable;
-
import android.content.ComponentName;
import android.os.UserHandle;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.server.devicepolicy.DevicePolicyManagerServiceTestable.OwnersTestable;
+
/**
* Tests for the DeviceOwner object that saves & loads device and policy owner information.
* run this test with:
@@ -29,7 +29,7 @@ import android.test.suitebuilder.annotation.SmallTest;
adb install \
-r out/target/product/hammerhead/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.devicepolicy.OwnersTest \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
(mmma frameworks/base/services/tests/servicestests/ for non-ninja build)
*/
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
index e4e97012367a..e51859b5c829 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
@@ -20,6 +20,7 @@ import static android.app.admin.SystemUpdatePolicy.ValidationFailedException.ERR
import static android.app.admin.SystemUpdatePolicy.ValidationFailedException.ERROR_DUPLICATE_OR_OVERLAP;
import static android.app.admin.SystemUpdatePolicy.ValidationFailedException.ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE;
import static android.app.admin.SystemUpdatePolicy.ValidationFailedException.ERROR_NEW_FREEZE_PERIOD_TOO_LONG;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -27,10 +28,10 @@ import static org.junit.Assert.fail;
import android.app.admin.FreezePeriod;
import android.app.admin.SystemUpdatePolicy;
import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.Pair;
import android.util.Xml;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.FastXmlSerializer;
import org.junit.Test;
@@ -50,7 +51,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
-
/**
* Unit tests for {@link android.app.admin.SystemUpdatePolicy}.
* Throughout this test, we use "MM-DD" format to denote dates without year.
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
index e3e61ac29cce..2005dd901ad1 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
@@ -30,7 +30,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.os.Environment;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.runner.AndroidJUnit4;
import android.util.Log;
import com.android.server.devicepolicy.TransferOwnershipMetadataManager.Injector;
diff --git a/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java
index 8502e69dd060..e8e6dedaa258 100644
--- a/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java
@@ -25,9 +25,10 @@ import static org.junit.Assert.assertTrue;
import android.hardware.display.AmbientBrightnessDayStats;
import android.os.SystemClock;
import android.os.UserManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
index 284d443bbcf9..e6ca03b17092 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
@@ -30,11 +30,11 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.hardware.display.BrightnessConfiguration;
import android.os.PowerManager;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.MathUtils;
import android.util.Spline;
-import android.util.Slog;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -531,8 +531,8 @@ public class BrightnessMappingStrategyTest {
@Test
public void testGammaCorrectionChangeAtEdges() {
// The algorithm behaves differently at the edges, because gamma correction there tends to
- // be extreme. If we add a user data point at (x0, y0+0.3), the adjustment should be
- // 0.3*2 = 0.6, resulting in a gamma of 3**-0.6 = ~0.52.
+ // be extreme. If we add a user data point at (x0, y0+0.3), the adjustment should be 0.3,
+ // resulting in a gamma of 3**-0.6 = ~0.52.
final int x0 = 100;
final int x2 = 2500;
final int x4 = 4900;
@@ -547,17 +547,15 @@ public class BrightnessMappingStrategyTest {
assertEquals(y2, strategy.getBrightness(x2), 0.01f /* tolerance */);
assertEquals(y4, strategy.getBrightness(x4), 0.01f /* tolerance */);
// Rollin':
- float increase = 0.3f;
- float adjustment = increase * 2;
+ float adjustment = 0.3f;
float gamma = (float) MathUtils.pow(MAXIMUM_GAMMA, -adjustment);
- strategy.addUserDataPoint(x0, y0 + increase);
- assertEquals(y0 + increase, strategy.getBrightness(x0), 0.01f /* tolerance */);
+ strategy.addUserDataPoint(x0, y0 + adjustment);
+ assertEquals(y0 + adjustment, strategy.getBrightness(x0), 0.01f /* tolerance */);
assertEquals(MathUtils.pow(y2, gamma), strategy.getBrightness(x2), 0.01f /* tolerance */);
assertEquals(MathUtils.pow(y4, gamma), strategy.getBrightness(x4), 0.01f /* tolerance */);
assertEquals(adjustment, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
- // Similarly, if we set a user data point at (x4, 1.0), the adjustment should be (1-y4)*2.
- increase = 1.0f - y4;
- adjustment = increase * 2;
+ // Similarly, if we set a user data point at (x4, 1.0), the adjustment should be 1 - y4.
+ adjustment = 1.0f - y4;
gamma = (float) MathUtils.pow(MAXIMUM_GAMMA, -adjustment);
strategy.addUserDataPoint(x4, 1.0f);
assertEquals(MathUtils.pow(y0, gamma), strategy.getBrightness(x0), 0.01f /* tolerance */);
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
index 75dc96f13da4..ece9f42bd0eb 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
@@ -46,11 +46,12 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserManager;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.AtomicFile;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java b/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java
index 6bd8011f1aa9..53711a623704 100644
--- a/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/ColorDisplayServiceTest.java
@@ -16,6 +16,10 @@
package com.android.server.display;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.Mockito.doReturn;
+
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.AlarmManager;
@@ -26,10 +30,11 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.provider.Settings.System;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.app.ColorDisplayController;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.LocalServices;
@@ -37,24 +42,22 @@ import com.android.server.SystemService;
import com.android.server.twilight.TwilightListener;
import com.android.server.twilight.TwilightManager;
import com.android.server.twilight.TwilightState;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
import java.util.Calendar;
import java.util.HashMap;
-import java.time.LocalTime;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static org.mockito.Mockito.doReturn;
-
@RunWith(AndroidJUnit4.class)
public class ColorDisplayServiceTest {
diff --git a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java
index 675000e91a1c..196454bd32ce 100644
--- a/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/PersistentDataStoreTest.java
@@ -22,23 +22,21 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.hardware.display.BrightnessConfiguration;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.AtomicFile;
import android.util.Pair;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.io.FileInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
-import java.io.InputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
-import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
@SmallTest
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/DetectTvSystemAudioModeSupportActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/DetectTvSystemAudioModeSupportActionTest.java
index e114e032753e..81145103f689 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/DetectTvSystemAudioModeSupportActionTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/DetectTvSystemAudioModeSupportActionTest.java
@@ -22,8 +22,11 @@ import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.Looper;
import android.os.test.TestLooper;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import com.android.server.hdmi.HdmiCecLocalDeviceAudioSystem.TvSystemAudioModeSupportedCallback;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
index 6cf5f0045c2d..cc005ed266b3 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
@@ -18,6 +18,7 @@ package com.android.server.hdmi;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_PLAYBACK;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV;
+
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2;
@@ -25,14 +26,18 @@ import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_3;
import static com.android.server.hdmi.Constants.ADDR_SPECIFIC_USE;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
+
import static junit.framework.Assert.assertEquals;
import android.content.Context;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.Looper;
import android.os.test.TestLooper;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
index 0dc513003fb3..6dbbbfe8e9e4 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
@@ -22,21 +22,27 @@ import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC
import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF;
import static com.google.common.truth.Truth.assertThat;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
import android.media.AudioManager;
import android.os.Looper;
import android.os.SystemProperties;
import android.os.test.TestLooper;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.util.ArrayList;
+
@SmallTest
@RunWith(JUnit4.class)
/** Tests for {@link HdmiCecLocalDeviceAudioSystem} class. */
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
index 3cd84817bcac..daf35dd382fa 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
@@ -16,25 +16,30 @@
package com.android.server.hdmi;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV;
+
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
import static com.android.server.hdmi.Constants.MESSAGE_DEVICE_VENDOR_ID;
import static com.android.server.hdmi.Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import android.hardware.hdmi.HdmiControlManager;
import android.os.test.TestLooper;
-import android.support.test.filters.SmallTest;
-import java.util.Arrays;
+
+import androidx.test.filters.SmallTest;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.util.Arrays;
+
@SmallTest
@RunWith(JUnit4.class)
/** Tests for {@link HdmiCecLocalDevice} class. */
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
index 1ca48d433624..c7809d3f2f29 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageBuilderTest.java
@@ -21,7 +21,9 @@ import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.google.common.truth.Truth.assertThat;
import android.hardware.hdmi.HdmiDeviceInfo;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
index 7de637b2df3c..71af71e711ea 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java
@@ -17,20 +17,27 @@ package com.android.server.hdmi;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_PLAYBACK;
+
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
+
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import android.os.Looper;
import android.os.test.TestLooper;
-import android.support.test.filters.SmallTest;
-import java.util.ArrayList;
+
+import androidx.test.filters.SmallTest;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-/** Tests for {@link HdmiControlService} class. */
+import java.util.ArrayList;
+
+/**
+ * Tests for {@link HdmiControlService} class.
+ */
@SmallTest
@RunWith(JUnit4.class)
public class HdmiControlServiceTest {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java
index e6ff1436468e..6ff1c0f2cef1 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java
@@ -16,6 +16,7 @@
package com.android.server.hdmi;
import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -25,7 +26,9 @@ import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.media.AudioManager;
import android.os.Looper;
import android.os.test.TestLooper;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java b/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
index 14b118ebd2e1..be8e569c7a45 100644
--- a/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/BackgroundRestrictionsTest.java
@@ -38,11 +38,12 @@ import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.servicestests.apps.jobtestapp.TestJobActivity;
import org.junit.After;
diff --git a/services/tests/servicestests/src/com/android/server/job/JobSetTest.java b/services/tests/servicestests/src/com/android/server/job/JobSetTest.java
index 83bd9fc2f648..e62e07d6858f 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobSetTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobSetTest.java
@@ -29,13 +29,14 @@ import android.content.Context;
import android.content.pm.PackageManagerInternal;
import android.os.Build;
import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.LocalServices;
import com.android.server.job.controllers.JobStatus;
diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
index 4ee2ff48fd62..543f51cba41f 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -22,12 +22,13 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.RenamingDelegatingContext;
import android.util.Log;
import android.util.Pair;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.HexDump;
import com.android.server.IoThread;
import com.android.server.LocalServices;
diff --git a/services/tests/servicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/servicestests/src/com/android/server/job/controllers/JobStatusTest.java
index d78af22e49c9..1752479ade35 100644
--- a/services/tests/servicestests/src/com/android/server/job/controllers/JobStatusTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/controllers/JobStatusTest.java
@@ -21,7 +21,8 @@ import static org.junit.Assert.assertEquals;
import android.app.job.JobInfo;
import android.content.ComponentName;
import android.os.SystemClock;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.job.JobSchedulerService;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
index 2214d74d56b6..a28a5a10e832 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
@@ -29,24 +29,20 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static java.io.FileDescriptor.*;
-
import android.app.ActivityManager;
import android.content.Context;
import android.os.Binder;
-import android.os.Debug;
import android.os.Handler;
import android.os.Looper;
import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import com.android.internal.widget.LockPatternUtils;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
-import junit.framework.Assert;
+import com.android.internal.widget.LockPatternUtils;
import org.junit.Before;
import org.junit.Test;
@@ -54,7 +50,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.io.FileDescriptor;
+import static java.io.FileDescriptor.*;
/**
* Test class for {@link LockSettingsShellCommand}.
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
index 90947f44ef2b..8a9e5d181777 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
@@ -20,9 +20,9 @@ import static android.security.keystore.recovery.KeyChainProtectionParams.TYPE_L
import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PASSWORD;
import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PATTERN;
import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PIN;
+
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
-
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertArrayEquals;
@@ -31,7 +31,6 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
@@ -50,9 +49,10 @@ import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.RecoveryController;
import android.security.keystore.recovery.TrustedRootCertificates;
import android.security.keystore.recovery.WrappedApplicationKey;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnapshotStorage;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
index fae48c68b8db..f832d3ceef8e 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
@@ -22,8 +22,8 @@ import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.google.common.collect.ImmutableMap;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java
index 0f0e3f386fec..13436e7f8674 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java
@@ -32,9 +32,10 @@ import android.app.KeyguardManager;
import android.content.Context;
import android.security.keystore.KeyProperties;
import android.security.keystore.KeyProtection;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java
index fd8b319b74ca..48afb8b6abcb 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java
@@ -25,9 +25,10 @@ import android.content.Context;
import android.security.keystore.AndroidKeyStoreSecretKey;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
index 8e86a87915e8..b15863dd3613 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
@@ -23,6 +23,7 @@ import static android.security.keystore.recovery.RecoveryController.ERROR_DOWNGR
import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_CERTIFICATE;
import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@@ -35,16 +36,14 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.Manifest;
import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.Manifest;
import android.os.Binder;
import android.os.ServiceSpecificException;
import android.os.UserHandle;
-import android.security.KeyStore;
-import android.security.keystore.AndroidKeyStoreProvider;
import android.security.keystore.AndroidKeyStoreSecretKey;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
@@ -53,9 +52,10 @@ import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.TrustedRootCertificates;
import android.security.keystore.recovery.WrappedApplicationKey;
-import android.support.test.filters.SmallTest;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.storage.ApplicationKeyStorage;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
@@ -75,19 +75,16 @@ import org.mockito.Spy;
import java.io.File;
import java.nio.charset.StandardCharsets;
-import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
-import java.util.concurrent.Executors;
import java.util.Map;
import java.util.Random;
+import java.util.concurrent.Executors;
-import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
-import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
@SmallTest
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorageTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorageTest.java
index acc200fa81ad..33038aa18337 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorageTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorageTest.java
@@ -8,9 +8,10 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/SecureBoxTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/SecureBoxTest.java
index 35ec23b2ee6b..15b070829cdb 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/SecureBoxTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/SecureBoxTest.java
@@ -17,11 +17,16 @@
package com.android.server.locksettings.recoverablekeystore;
import static com.google.common.truth.Truth.assertThat;
+
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.expectThrows;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
@@ -31,9 +36,8 @@ import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.ECPrivateKeySpec;
+
import javax.crypto.AEADBadTagException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
index 67436cc4c853..944d6e0512eb 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelperTest.java
@@ -3,8 +3,9 @@ package com.android.server.locksettings.recoverablekeystore;
import static com.google.common.truth.Truth.assertThat;
import android.security.keystore.recovery.TrustedRootCertificates;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.widget.LockPatternUtils;
@@ -13,6 +14,7 @@ import org.junit.runner.RunWith;
import java.util.HashMap;
import java.util.Map;
+
import javax.crypto.SecretKey;
@SmallTest
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
index 56122a7d6d4c..b5ee60e7ec24 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
@@ -24,8 +24,9 @@ import static org.junit.Assert.fail;
import android.security.keystore.AndroidKeyStoreSecretKey;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertUtilsTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertUtilsTest.java
index 9279698c6004..1cbebffb2a1c 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertUtilsTest.java
@@ -18,13 +18,17 @@ package com.android.server.locksettings.recoverablekeystore.certificate;
import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.expectThrows;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.w3c.dom.Element;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
import java.io.InputStream;
import java.security.KeyPairGenerator;
@@ -39,10 +43,6 @@ import java.util.Base64;
import java.util.Collections;
import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.w3c.dom.Element;
-
@SmallTest
@RunWith(AndroidJUnit4.class)
public final class CertUtilsTest {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertXmlTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertXmlTest.java
index 52269d98da21..bbcc41113f5a 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertXmlTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/CertXmlTest.java
@@ -21,17 +21,17 @@ import static com.google.common.truth.Truth.assertThat;
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.expectThrows;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import java.security.cert.CertPath;
-import java.security.cert.X509Certificate;
-import java.util.List;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.security.cert.CertPath;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public final class CertXmlTest {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/SigXmlTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/SigXmlTest.java
index 4d87006d4fe3..45adb4ba7a26 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/SigXmlTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/SigXmlTest.java
@@ -21,8 +21,8 @@ import static com.google.common.truth.Truth.assertThat;
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.expectThrows;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/TestData.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/TestData.java
index 5eb416639b5a..c5792adea1ed 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/TestData.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/certificate/TestData.java
@@ -17,7 +17,8 @@
package com.android.server.locksettings.recoverablekeystore.certificate;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
+
+import androidx.test.InstrumentationRegistry;
import com.google.common.io.ByteStreams;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
index a23ac0fce6ab..880255d79eb7 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotSerializerTest.java
@@ -22,9 +22,9 @@ import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.WrappedApplicationKey;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.TestData;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
index 9b09dd1ae6ad..7130b4226ef1 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java
@@ -18,25 +18,26 @@ package com.android.server.locksettings.recoverablekeystore.storage;
import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.KeysEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RecoveryServiceMetadataEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.RootOfTrustEntry;
import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDbContract.UserMetadataEntry;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class RecoverableKeyStoreDbHelperTest {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
index 940745e955e4..6a26f8c72e81 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
@@ -17,25 +17,27 @@
package com.android.server.locksettings.recoverablekeystore.storage;
import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import android.content.Context;
import android.security.keystore.recovery.RecoveryController;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.TestData;
import com.android.server.locksettings.recoverablekeystore.WrappedKey;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.security.KeyPairGenerator;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorageTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorageTest.java
index bb0474efee58..c2d1440c553e 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorageTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorageTest.java
@@ -22,8 +22,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java
index ad14c3a8adef..e8614af387b3 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorageTest.java
@@ -12,9 +12,10 @@ import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.WrappedApplicationKey;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.locksettings.recoverablekeystore.TestData;
diff --git a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
index 28b54ef84a91..fe7a376d9e8d 100644
--- a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
@@ -20,10 +20,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import com.android.frameworks.servicestests.R;
-import com.android.servicestests.aidl.ICmdReceiverService;
-import com.android.servicestests.aidl.INetworkStateObserver;
-
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -34,13 +30,17 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.SystemClock;
import android.provider.Settings;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.text.TextUtils;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.servicestests.aidl.ICmdReceiverService;
+import com.android.servicestests.aidl.INetworkStateObserver;
+
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
@@ -64,7 +64,7 @@ import java.util.concurrent.TimeUnit;
* Install: adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
* Run: adb shell am instrument -e class com.android.server.net.ConnOnActivityStartTest -w \
- * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@LargeTest
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
index 9f4b75462134..7767a2810ac2 100644
--- a/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
@@ -27,9 +27,10 @@ import android.net.LinkAddress;
import android.net.NetworkUtils;
import android.net.ProxyInfo;
import android.net.StaticIpConfiguration;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/HarmfulDigestsTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/HarmfulDigestsTests.java
index a34f95eed040..be56855d93da 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/HarmfulDigestsTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/HarmfulDigestsTests.java
@@ -19,8 +19,8 @@ package com.android.server.net.watchlist;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.HexDump;
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java
index ccd3cdd3a20b..b5a354ccefe6 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java
@@ -17,7 +17,6 @@
package com.android.server.net.watchlist;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -30,9 +29,10 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.ServiceThread;
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java
index 6f2237f1baef..9d2c40961ce4 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/PrivacyUtilsTests.java
@@ -21,8 +21,9 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import android.privacy.DifferentialPrivacyEncoder;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/ReportEncoderTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/ReportEncoderTests.java
index cb4f6c5f9351..bf125f8f4c71 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/ReportEncoderTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/ReportEncoderTests.java
@@ -19,9 +19,13 @@ package com.android.server.net.watchlist;
import static org.junit.Assert.assertEquals;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.service.nano.NetworkWatchlistAppResultProto;
+import com.android.service.nano.NetworkWatchlistReportProto;
import org.junit.After;
import org.junit.Before;
@@ -35,9 +39,6 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
-import com.android.service.nano.NetworkWatchlistReportProto;
-import com.android.service.nano.NetworkWatchlistAppResultProto;
-
/**
* runtest frameworks-services -c com.android.server.net.watchlist.ReportEncoderTests
*/
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
index 678f0188e485..fa61c59852f3 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
@@ -18,13 +18,14 @@ package com.android.server.net.watchlist;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.HexDump;
@@ -40,8 +41,6 @@ import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
-import java.util.Arrays;
-
/**
* runtest frameworks-services -c com.android.server.net.watchlist.WatchlistConfigTests
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistLoggingHandlerTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistLoggingHandlerTests.java
index 8399dac17699..8bbad8d6abde 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistLoggingHandlerTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistLoggingHandlerTests.java
@@ -17,11 +17,12 @@
package com.android.server.net.watchlist;
import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.doAnswer;
-
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
import android.content.Context;
import android.content.ContextWrapper;
@@ -32,21 +33,18 @@ import android.content.pm.UserInfo;
import android.os.FileUtils;
import android.os.Looper;
import android.os.UserManager;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.InstrumentationRegistry;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistSettingsTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistSettingsTests.java
index 07158afbaaff..03b1c41c7a6b 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistSettingsTests.java
@@ -20,9 +20,10 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.HexDump;
diff --git a/services/tests/servicestests/src/com/android/server/pm/InstallerTest.java b/services/tests/servicestests/src/com/android/server/pm/InstallerTest.java
index b2eb57267cec..6591d6f67ac8 100644
--- a/services/tests/servicestests/src/com/android/server/pm/InstallerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/InstallerTest.java
@@ -22,10 +22,11 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.ArrayUtils;
import org.junit.After;
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
index cdac516c9577..e379cd09f0f8 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
@@ -18,7 +18,8 @@ package com.android.server.pm;
import android.content.IIntentReceiver;
import android.os.Bundle;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Assert;
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index 97ff94fdab56..ee41c0bdac82 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -42,14 +42,15 @@ import android.os.BaseBundle;
import android.os.PersistableBundle;
import android.os.UserHandle;
import android.os.UserManagerInternal;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.LongSparseArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.os.AtomicFile;
import com.android.server.LocalServices;
import com.android.server.pm.permission.PermissionManagerInternal;
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index 2f6e2c2ae6a3..318ed3a5217c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -15,6 +15,8 @@
*/
package com.android.server.pm;
+import static org.junit.Assert.*;
+
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
@@ -28,9 +30,18 @@ import android.content.pm.Signature;
import android.os.Bundle;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import libcore.io.IoUtils;
import java.io.File;
import java.lang.reflect.Array;
@@ -42,16 +53,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import static org.junit.Assert.*;
-
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import libcore.io.IoUtils;
-
@RunWith(AndroidJUnit4.class)
@MediumTest
public class PackageParserTest {
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
index 2a4ea8ccead3..4a33ca37f767 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
@@ -24,10 +24,11 @@ import static org.junit.Assert.assertThat;
import android.content.pm.PackageUserState;
import android.os.PersistableBundle;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/pm/ParallelPackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/ParallelPackageParserTest.java
index d665094c5a26..41489dc42a6a 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ParallelPackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ParallelPackageParserTest.java
@@ -17,9 +17,10 @@
package com.android.server.pm;
import android.content.pm.PackageParser;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.runner.AndroidJUnit4;
+
import junit.framework.Assert;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 6c6c9932e34c..fa734477cfe7 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -117,7 +117,7 @@ import java.util.function.BiConsumer;
adb install \
-r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest1 \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java
index ca1e6afd11ed..ae01b409d322 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest10.java
@@ -37,7 +37,7 @@ import static org.mockito.Mockito.*;
adb install \
-r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest10 \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
public class ShortcutManagerTest10 extends BaseShortcutManagerTest {
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index fcdadaccd2ac..76d52fd48431 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -50,8 +50,6 @@ import com.android.server.pm.ShortcutUser.PackageWithUser;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.io.Writer;
import java.util.Locale;
@@ -62,7 +60,7 @@ import java.util.Locale;
adb install \
-r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest2 \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
public class ShortcutManagerTest2 extends BaseShortcutManagerTest {
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java
index e9a329ca5a04..8a489d209887 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest8.java
@@ -56,7 +56,7 @@ import org.mockito.ArgumentCaptor;
adb install \
-r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest8 \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
* TODO for CTS
* - Foreground check.
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest9.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest9.java
index 012024f1b822..edb9df585aec 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest9.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest9.java
@@ -44,7 +44,7 @@ import org.mockito.ArgumentCaptor;
adb install \
-r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.pm.ShortcutManagerTest9 \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
*/
@SmallTest
public class ShortcutManagerTest9 extends BaseShortcutManagerTest {
diff --git a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
index c186e48e8794..f115b9cd0fc5 100644
--- a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
@@ -41,9 +41,6 @@ import android.os.Looper;
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
@@ -52,6 +49,10 @@ import android.util.Log;
import android.view.IWindowManager;
import android.view.WindowManagerGlobal;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.servicestests.apps.suspendtestapp.SuspendTestActivity;
import com.android.servicestests.apps.suspendtestapp.SuspendTestReceiver;
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserDataPreparerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserDataPreparerTest.java
index bb35beb20a23..c489cf0a138d 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserDataPreparerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserDataPreparerTest.java
@@ -16,15 +16,22 @@
package com.android.server.pm;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.FileUtils;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
@@ -39,19 +46,13 @@ import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collections;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isNull;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
/**
* <p>Run with:<pre>
* m FrameworksServicesTests &&
* adb install \
* -r out/target/product/hammerhead/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
* adb shell am instrument -e class com.android.server.pm.UserDataPreparerTest \
- * -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
* </pre>
*/
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
index 304e0e98790e..d6f7e37fcb39 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java
@@ -24,11 +24,12 @@ import android.content.Context;
import android.content.pm.UserInfo;
import android.os.RemoteException;
import android.os.UserManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceCreateProfileTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceCreateProfileTest.java
index c314de4f13eb..8dd896713834 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceCreateProfileTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceCreateProfileTest.java
@@ -24,20 +24,21 @@ import android.content.pm.UserInfo;
import android.os.Looper;
import android.os.UserHandle;
import android.os.UserManagerInternal;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.IconDrawableFactory;
-import com.android.server.LocalServices;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
-import java.util.List;
+import com.android.server.LocalServices;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.List;
+
/**
* <p>Run with:<pre>
* runtest -c com.android.server.pm.UserManagerServiceCreateProfileTest frameworks-services
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceIdRecyclingTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceIdRecyclingTest.java
index 35967fbaca3a..a9ce6187b9ac 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceIdRecyclingTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceIdRecyclingTest.java
@@ -16,12 +16,17 @@
package com.android.server.pm;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import android.content.pm.UserInfo;
import android.os.Looper;
import android.os.UserManagerInternal;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.filters.MediumTest;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.LocalServices;
@@ -31,17 +36,13 @@ import org.junit.runner.RunWith;
import java.util.LinkedHashSet;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
/**
* <p>Run with:<pre>
* m FrameworksServicesTests &&
* adb install \
* -r out/target/product/hammerhead/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
* adb shell am instrument -e class com.android.server.pm.UserManagerServiceIdRecyclingTest \
- * -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ * -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
* </pre>
*/
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java
index 092119e7ad71..806c71a7a9b8 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java
@@ -16,16 +16,21 @@
package com.android.server.pm;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import android.content.pm.UserInfo;
import android.os.Looper;
import android.os.Parcel;
-import android.os.UserManagerInternal;
import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.filters.MediumTest;
+import android.os.UserManagerInternal;
import android.text.TextUtils;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.LocalServices;
import com.android.server.pm.UserManagerService.UserData;
@@ -38,10 +43,6 @@ import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.util.List;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
/**
* <p>Run with:<pre>
* runtest -c com.android.server.pm.UserManagerServiceUserInfoTest frameworks-services
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java
index 882bf32fcb68..2cc5323e56a2 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java
@@ -35,7 +35,7 @@ import android.util.SparseArray;
adb install \
-r out/target/product/hammerhead/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
adb shell am instrument -e class com.android.server.pm.UserRestrictionsUtilsTest \
- -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
+ -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
* </pre>
*/
@SmallTest
diff --git a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
index caa1d02b47f0..13612a1f93f7 100644
--- a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
@@ -17,24 +17,22 @@ package com.android.server.pm.backup;
import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageParser;
-import android.content.pm.PackageParser.Package;
import android.content.pm.Signature;
import android.content.pm.SigningInfo;
-import android.test.MoreAsserts;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.test.MoreAsserts;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.backup.BackupUtils;
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java
index bf8d4056ee55..87c3cd2dad06 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexLoggerTests.java
@@ -16,13 +16,19 @@
package com.android.server.pm.dex;
+import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
-import android.content.pm.PackageInfo;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.os.storage.StorageManager;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
@@ -40,14 +46,6 @@ import org.mockito.quality.Strictness;
import java.util.Arrays;
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-
-import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo;
-import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
public class DexLoggerTests {
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
index 147347d47444..416a616b0546 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
@@ -16,16 +16,40 @@
package com.android.server.pm.dex;
+import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
+import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.os.Build;
import android.os.UserHandle;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.pm.Installer;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+
import dalvik.system.DelegateLastClassLoader;
import dalvik.system.PathClassLoader;
import dalvik.system.VMRuntime;
@@ -38,31 +62,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-import org.mockito.quality.Strictness;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo;
-import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
public class DexManagerTests {
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
index 93064bc4ab92..62589ebb92fe 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java
@@ -19,19 +19,19 @@ package com.android.server.pm.dex;
import static com.android.server.pm.PackageManagerServiceCompilerMapping.getCompilerFilterForReason;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.pm.PackageManagerService;
import com.android.server.pm.PackageManagerServiceCompilerMapping;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
@RunWith(AndroidJUnit4.class)
@SmallTest
public class DexoptOptionsTests {
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
index 150f7f0c948c..77f517b7c48b 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptUtilsTest.java
@@ -16,9 +16,8 @@
package com.android.server.pm.dex;
-import com.android.server.pm.PackageDexOptimizer;
-
import static com.android.server.pm.PackageDexOptimizer.SKIP_SHARED_LIBRARY_CHECK;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -26,17 +25,18 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.content.pm.ApplicationInfo;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
-import dalvik.system.DelegateLastClassLoader;
-import dalvik.system.DexClassLoader;
-import dalvik.system.PathClassLoader;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
+import dalvik.system.DelegateLastClassLoader;
+import dalvik.system.DexClassLoader;
+import dalvik.system.PathClassLoader;
+
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java
index 69a148db8b63..3e93dcf3ba92 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java
@@ -16,16 +16,27 @@
package com.android.server.pm.dex;
+import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
+import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import android.os.Build;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import dalvik.system.VMRuntime;
-import java.util.Collections;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import dalvik.system.VMRuntime;
+
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
@@ -35,16 +46,6 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo;
-import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
public class PackageDexUsageTests {
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
index 7e18ce78c9d1..cce6ba718400 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
@@ -22,16 +22,15 @@ import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import static org.hamcrest.Matchers.equalTo;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Display;
import android.view.DisplayInfo;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
index cb9fab3fa87c..fee761dd92d3 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
@@ -39,11 +39,12 @@ import static org.junit.Assert.assertThat;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.DisplayCutout;
import android.view.WindowManager;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java
index 30665b56c8dc..d92d7e03ef3b 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTest.java
@@ -19,6 +19,10 @@ package com.android.server.policy;
import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import static android.view.WindowManager.DOCKED_BOTTOM;
+import static android.view.WindowManager.DOCKED_LEFT;
+import static android.view.WindowManager.DOCKED_RIGHT;
+import static android.view.WindowManager.DOCKED_TOP;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
@@ -28,13 +32,9 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
-import static android.view.WindowManager.DOCKED_BOTTOM;
-import static android.view.WindowManager.DOCKED_LEFT;
-import static android.view.WindowManager.DOCKED_RIGHT;
-import static android.view.WindowManager.DOCKED_TOP;
-import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_LEFT;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_BOTTOM;
+import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_LEFT;
import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_RIGHT;
import static org.junit.Assert.assertEquals;
@@ -44,10 +44,11 @@ import static org.junit.Assert.assertTrue;
import android.graphics.PixelFormat;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.WindowManager;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
index ef87f9d7d3bc..acd065e90a0c 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
@@ -34,13 +34,11 @@ import android.content.ContextWrapper;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Matrix;
-import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.IBinder;
import android.os.UserHandle;
-import android.support.test.InstrumentationRegistry;
import android.testing.TestableResources;
import android.util.Pair;
import android.view.Display;
@@ -53,6 +51,8 @@ import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IAccessibilityManager;
+import androidx.test.InstrumentationRegistry;
+
import com.android.server.policy.keyguard.KeyguardServiceDelegate;
import com.android.server.wm.DisplayFrames;
import com.android.server.wm.WindowTestUtils.TestDisplayContent;
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
index 0764a56af18f..fd04970d50fe 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
@@ -25,10 +25,11 @@ import static org.mockito.Mockito.when;
import android.content.ContentResolver;
import android.content.res.Resources;
import android.provider.Settings.Global;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContext;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.google.common.base.Objects;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
index 9bd4cc34662a..ba61fd2597a4 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
@@ -25,8 +25,9 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.metrics.LogMaker;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java
index f72ec3411461..8371e9c85244 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/CpuFrequenciesTest.java
@@ -17,10 +17,11 @@ package com.android.server.power.batterysaver;
import static org.junit.Assert.assertEquals;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/FileUpdaterTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/FileUpdaterTest.java
index 7324fe6de9d8..89c7dd45e9d3 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/FileUpdaterTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/FileUpdaterTest.java
@@ -27,14 +27,14 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.content.Context;
-import android.hardware.camera2.impl.GetCommand;
import android.os.Handler;
import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -48,7 +48,6 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
-
/**
atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/FileUpdaterTest.java
*/
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java b/services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java
index 62f1433f7907..9e000770fe42 100644
--- a/services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java
+++ b/services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java
@@ -28,9 +28,10 @@ import android.content.Intent;
import android.icu.util.Calendar;
import android.icu.util.GregorianCalendar;
import android.icu.util.TimeZone;
-import android.support.test.runner.AndroidJUnit4;
import android.util.TimestampedValue;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
index ed74cd7b3e53..45fef764482f 100644
--- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
@@ -31,15 +31,16 @@ import static org.mockito.Mockito.when;
import android.app.timedetector.TimeSignal;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.support.test.runner.AndroidJUnit4;
import android.util.TimestampedValue;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.timedetector.TimeDetectorStrategy.Callback;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import com.android.server.timedetector.TimeDetectorStrategy.Callback;
-
import java.io.PrintWriter;
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java
index 301ded47ee0b..239d413c12d2 100644
--- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java
@@ -18,9 +18,10 @@ package com.android.server.timedetector;
import static org.junit.Assert.assertEquals;
-import android.support.test.runner.AndroidJUnit4;
import android.util.TimestampedValue;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/timezone/CheckTokenTest.java b/services/tests/servicestests/src/com/android/server/timezone/CheckTokenTest.java
index 9603a06aaa66..f7d282b95dff 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/CheckTokenTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/CheckTokenTest.java
@@ -16,16 +16,16 @@
package com.android.server.timezone;
-import org.junit.Test;
-
-import android.support.test.filters.SmallTest;
-
-import java.io.IOException;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+import java.io.IOException;
+
@SmallTest
public class CheckTokenTest {
diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java
index 74013b792f07..090db111ab31 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java
@@ -16,26 +16,28 @@
package com.android.server.timezone;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import android.content.Context;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
-import static junit.framework.Assert.assertTrue;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
@SmallTest
public class PackageStatusStorageTest {
private static final PackageVersions VALID_PACKAGE_VERSIONS = new PackageVersions(1, 2);
diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusTest.java
index c0ae81e30049..9b45f0542610 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusTest.java
@@ -16,13 +16,13 @@
package com.android.server.timezone;
-import org.junit.Test;
-
-import android.support.test.filters.SmallTest;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
@SmallTest
public class PackageStatusTest {
diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
index d9f4adfb5e06..1356ea250526 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
@@ -16,6 +16,25 @@
package com.android.server.timezone;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.hamcrest.MockitoHamcrest.argThat;
+
+import android.app.timezone.RulesUpdaterContract;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.TimeZoneRulesDataContract;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
@@ -23,13 +42,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import android.app.timezone.RulesUpdaterContract;
-import android.content.Context;
-import android.content.Intent;
-import android.provider.TimeZoneRulesDataContract;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -37,17 +49,6 @@ import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.mockito.hamcrest.MockitoHamcrest.argThat;
-
/**
* White box interaction / unit testing of the {@link PackageTracker}.
*/
diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageVersionsTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageVersionsTest.java
index a470f8f6c230..9ffc4e97e019 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/PackageVersionsTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/PackageVersionsTest.java
@@ -16,13 +16,13 @@
package com.android.server.timezone;
-import org.junit.Test;
-
-import android.support.test.filters.SmallTest;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
@SmallTest
public class PackageVersionsTest {
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
index 19d31cfafc35..0936fff0357e 100644
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
@@ -17,8 +17,9 @@
package com.android.server.timezonedetector;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 84611667d113..869f8fa0c2fa 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -37,11 +37,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
-
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -58,12 +56,13 @@ import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
import android.view.Display;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.SystemService;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
index 84475bb365b7..047adddd794d 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppTimeLimitControllerTests.java
@@ -19,13 +19,13 @@ package com.android.server.usage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
import android.app.PendingIntent;
import android.os.HandlerThread;
import android.os.Looper;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/utils/PriorityDumpTest.java b/services/tests/servicestests/src/com/android/server/utils/PriorityDumpTest.java
index da45d81c6a08..4eb2474da740 100644
--- a/services/tests/servicestests/src/com/android/server/utils/PriorityDumpTest.java
+++ b/services/tests/servicestests/src/com/android/server/utils/PriorityDumpTest.java
@@ -18,14 +18,16 @@ package com.android.server.utils;
import static com.android.server.utils.PriorityDump.dump;
-import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertSame;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.verify;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
+
+import androidx.test.filters.SmallTest;
+
import com.android.server.utils.PriorityDump.PriorityDumper;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java b/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java
index 9c010a07135d..2dd881712e67 100644
--- a/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java
@@ -24,9 +24,10 @@ import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.service.wallpaper.WallpaperService;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
index dca09af7b3b7..bf89cd064812 100644
--- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
@@ -19,15 +19,12 @@ package com.android.server.webkit;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.Signature;
import android.os.Build;
import android.os.Bundle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.Base64;
import android.webkit.UserPackage;
@@ -35,17 +32,18 @@ import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-
import org.mockito.ArgumentMatcher;
-import org.mockito.Mockito;
import org.mockito.Matchers;
+import org.mockito.Mockito;
import java.lang.Integer;
import java.util.concurrent.CountDownLatch;
-
/**
* Tests for WebViewUpdateService
runtest --path frameworks/base/services/tests/servicestests/ \
diff --git a/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java b/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
index 164c80b2427a..b5fe8b159c47 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
@@ -18,27 +18,22 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.mockito.ArgumentMatchers.any;
+
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+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;
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
index be7d781799fa..3053c4197f82 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
@@ -20,13 +20,15 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
+
import static org.junit.Assert.assertEquals;
import android.content.Context;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
index e0645b1f4bfb..fcd8a39e4d07 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
@@ -16,26 +16,28 @@
package com.android.server.wm;
-import android.support.test.filters.FlakyTest;
-import org.junit.Test;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.res.Configuration.EMPTY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.wm.WindowTestUtils.TestTaskWindowContainerController;
+import org.junit.Test;
+
/**
* Test class for {@link AppWindowContainerController}.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
index e8d8022e0bc0..6d31dfbb8186 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -16,16 +16,6 @@
package com.android.server.wm;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.view.Surface;
-import android.view.WindowManager;
-
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
@@ -38,6 +28,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.TRANSIT_UNSET;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
@@ -46,6 +37,17 @@ import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import android.platform.test.annotations.Presubmit;
+import android.view.Surface;
+import android.view.WindowManager;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
/**
* Tests for the {@link AppWindowToken} class.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
index 08b522c0c66e..12be0b3ae6f8 100644
--- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
@@ -21,34 +21,31 @@ import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_START;
import static com.android.server.wm.BoundsAnimationController.SchedulePipModeChangedState;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Looper;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.wm.BoundsAnimationController.BoundsAnimator;
import com.android.server.wm.WindowManagerInternal.AppTransitionListener;
import org.junit.Test;
import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import com.android.server.wm.BoundsAnimationController.BoundsAnimator;
-
/**
* Test class for {@link BoundsAnimationController} to ensure that it sends the right callbacks
* depending on the various interactions.
diff --git a/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java
index 192e1564ae8d..2b8214d162c9 100644
--- a/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/ConfigurationContainerTests.java
@@ -28,13 +28,16 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
import static android.content.res.Configuration.EMPTY;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.content.res.Configuration;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
index 6769e40dca78..21555e38a7e8 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
@@ -29,10 +29,11 @@ import static org.mockito.Mockito.verify;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.runner.AndroidJUnit4;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index ef0e27b9cc1e..cfef51c88838 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -30,6 +30,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
+
import static com.android.server.wm.WindowContainer.POSITION_TOP;
import static org.hamcrest.Matchers.is;
@@ -42,25 +43,26 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import android.annotation.SuppressLint;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.DisplayMetrics;
import android.util.SparseIntArray;
import android.view.DisplayCutout;
import android.view.MotionEvent;
import android.view.Surface;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.wm.utils.WmDisplayCutout;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplaySettingsTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplaySettingsTests.java
index 0ea56ed146fc..07eafa5c4be4 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplaySettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplaySettingsTests.java
@@ -22,12 +22,13 @@ import static org.junit.Assert.assertNotEquals;
import android.app.WindowConfiguration;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Display;
import android.view.DisplayInfo;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java
index a09656c7dc92..f383fda0970f 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DragDropControllerTests.java
@@ -19,6 +19,7 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
@@ -33,21 +34,25 @@ import android.os.Looper;
import android.os.UserHandle;
import android.os.UserManagerInternal;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.InputChannel;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.View;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.annotations.GuardedBy;
import com.android.server.LocalServices;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
/**
* Tests for the {@link DragDropController} class.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/PinnedStackControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/PinnedStackControllerTest.java
index 96745fa5956e..7222a999e23c 100644
--- a/services/tests/servicestests/src/com/android/server/wm/PinnedStackControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/PinnedStackControllerTest.java
@@ -2,27 +2,28 @@ package com.android.server.wm;
import static android.view.Display.DEFAULT_DISPLAY;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.IPinnedStackListener;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
@SmallTest
@Presubmit
@RunWith(AndroidJUnit4.class)
diff --git a/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java
index a2af9b80fe36..e7c45d59078c 100644
--- a/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java
@@ -19,8 +19,10 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.Display.DEFAULT_DISPLAY;
+
import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
+
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeast;
@@ -31,11 +33,14 @@ import static org.mockito.Mockito.when;
import android.os.Binder;
import android.os.IInterface;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.IRecentsAnimationRunner;
import android.view.SurfaceControl;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index 95361f03fe4b..7d19baa9f871 100644
--- a/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -31,9 +31,6 @@ import android.graphics.Rect;
import android.os.Binder;
import android.os.IInterface;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.IRemoteAnimationFinishedCallback;
import android.view.IRemoteAnimationRunner;
import android.view.RemoteAnimationAdapter;
@@ -41,6 +38,9 @@ import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.testutils.OffsettableClock;
import com.android.server.testutils.TestHandler;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
diff --git a/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java
index 204e26cee532..c1db6a6a4def 100644
--- a/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -1,16 +1,16 @@
package com.android.server.wm;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import static org.junit.Assert.assertTrue;
import android.content.res.Configuration;
import android.graphics.Rect;
-
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import static org.junit.Assert.assertTrue;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for the {@link RootWindowContainer} class.
diff --git a/services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java b/services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java
index bfc99c85d6e1..60025f0f03fe 100644
--- a/services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/ScreenDecorWindowTests.java
@@ -32,6 +32,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+
import static org.junit.Assert.assertEquals;
import android.app.Activity;
@@ -46,9 +47,6 @@ import android.hardware.display.VirtualDisplay;
import android.media.ImageReader;
import android.os.Handler;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Pair;
import android.view.Display;
import android.view.DisplayInfo;
@@ -57,6 +55,10 @@ import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.TextView;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
index ab0a2bd86dd8..9f2645cc98ae 100644
--- a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
@@ -16,20 +16,20 @@
package com.android.server.wm;
-import android.graphics.Rect;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
/**
* Test class for {@link StackWindowController}.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
index 79e9bb4c769d..4551c3611102 100644
--- a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
@@ -16,7 +16,6 @@
package com.android.server.wm;
-import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -34,9 +33,6 @@ import android.graphics.Matrix;
import android.graphics.Point;
import android.os.PowerManagerInternal;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Choreographer;
import android.view.Choreographer.FrameCallback;
import android.view.SurfaceControl;
@@ -44,6 +40,10 @@ import android.view.SurfaceControl.Transaction;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
import org.junit.Before;
@@ -54,6 +54,8 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
import java.util.concurrent.CountDownLatch;
/**
diff --git a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
index 16b84581de39..7b5e8deeeb65 100644
--- a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
@@ -28,14 +28,15 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Builder;
import android.view.SurfaceControl.Transaction;
import android.view.SurfaceSession;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.wm.SurfaceAnimator.Animatable;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
@@ -46,8 +47,6 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import java.util.ArrayList;
-
/**
* Test class for {@link SurfaceAnimatorTest}.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
index dc6bbbfe5285..17b7fc1fd0f0 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
@@ -16,31 +16,32 @@
package com.android.server.wm;
-import android.app.IActivityManager;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.app.IActivityTaskManager;
-import android.graphics.Rect;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.Display;
-import org.mockito.Mockito;
-
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+
import static com.android.server.wm.TaskPositioner.MIN_ASPECT;
import static com.android.server.wm.WindowManagerService.dipToPixel;
import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP;
import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_WIDTH_IN_DP;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.app.IActivityTaskManager;
+import android.graphics.Rect;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Display;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
/**
* Tests for the {@link TaskPositioner} class.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java
index 6070516669b5..ced084717494 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -27,9 +28,11 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.InputChannel;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java
index 649de4a783fa..c9d800449ff9 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotCacheTest.java
@@ -17,12 +17,14 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
+
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
index 5650050f0420..efce063c8fca 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotControllerTest.java
@@ -19,17 +19,19 @@ package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.TRANSIT_UNSET;
+
import static com.android.server.wm.TaskSnapshotController.*;
+
import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.google.android.collect.Sets;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
index 325d42aa6293..600b2e52b083 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
@@ -18,23 +18,24 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
import android.app.ActivityManager.TaskSnapshot;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.ArraySet;
-
import android.view.View;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.wm.TaskSnapshotPersister.RemoveObsoleteFilesQueueItem;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
index 8b8604365fa1..6f4f17380e3f 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterTestBase.java
@@ -28,7 +28,8 @@ import android.graphics.GraphicBuffer;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.UserManager;
-import android.support.test.InstrumentationRegistry;
+
+import androidx.test.InstrumentationRegistry;
import org.junit.After;
import org.junit.Before;
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
index 21402cee0b55..91074b9db081 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
@@ -19,6 +19,7 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
+
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
@@ -35,10 +36,11 @@ import android.graphics.GraphicBuffer;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.Surface;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.server.wm.TaskSnapshotSurface.Window;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
index ca1994f85ccf..9fa5ba42204f 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackContainersTests.java
@@ -18,20 +18,20 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.junit.Before;
-import org.junit.After;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
/**
* Tests for the {@link DisplayContent.TaskStackContainers} container in {@link DisplayContent}.
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
index eaf71f0dc5b3..53a1185b4655 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskStackTests.java
@@ -16,21 +16,19 @@
package com.android.server.wm;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for the {@link TaskStack} class.
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java
index 1dd9365825cf..edd76647f4a8 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskWindowContainerControllerTests.java
@@ -16,17 +16,19 @@
package com.android.server.wm;
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
/**
* Test class for {@link TaskWindowContainerController}.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
index a5c47deb2c06..3ac97027a893 100644
--- a/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/UnknownAppVisibilityControllerTest.java
@@ -19,8 +19,9 @@ package com.android.server.wm;
import static junit.framework.Assert.assertTrue;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java
index 71ead204c9df..882e78924629 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WallpaperControllerTests.java
@@ -11,8 +11,9 @@ import static org.mockito.Mockito.when;
import android.graphics.Bitmap;
import android.os.IBinder;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java
index 9dc00251896a..827d938aa73e 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java
@@ -28,12 +28,13 @@ import static org.mockito.Mockito.verify;
import android.graphics.Point;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.SurfaceControl;
import android.view.animation.Animation;
import android.view.animation.ClipRectAnimation;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
index 10d7aad967b7..e7cc2859ff62 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
@@ -16,17 +16,6 @@
package com.android.server.wm;
-import org.junit.Test;
-
-import android.app.WindowConfiguration;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.view.DisplayInfo;
-
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -35,9 +24,21 @@ import static android.app.WindowConfiguration.WINDOW_CONFIG_ALWAYS_ON_TOP;
import static android.app.WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS;
import static android.app.WindowConfiguration.WINDOW_CONFIG_WINDOWING_MODE;
import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
+
+import android.app.WindowConfiguration;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.view.DisplayInfo;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
/**
* Test class to for {@link android.app.WindowConfiguration}.
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
index 502cb6e27c68..6b1feb87aa42 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerControllerTests.java
@@ -16,21 +16,22 @@
package com.android.server.wm;
-import android.app.WindowConfiguration;
-import android.content.res.Configuration;
-import android.support.test.filters.FlakyTest;
-import org.junit.Test;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.content.res.Configuration.EMPTY;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import android.content.res.Configuration;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+
/**
* Test class for {@link WindowContainerController}.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
index f8b282848489..dc763b9bb079 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
@@ -16,20 +16,6 @@
package com.android.server.wm;
-import android.support.test.filters.FlakyTest;
-import android.view.SurfaceControl;
-import android.view.SurfaceSession;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import java.util.Comparator;
-
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
@@ -44,7 +30,6 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyFloat;
import static org.mockito.Mockito.eq;
@@ -53,6 +38,21 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.view.SurfaceControl;
+import android.view.SurfaceSession;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Comparator;
+
/**
* Test class for {@link WindowContainer}.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTraversalTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTraversalTests.java
index e07639933b7a..ffc86226cd39 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTraversalTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTraversalTests.java
@@ -20,19 +20,19 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+
+import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import static org.mockito.Matchers.eq;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
-
import java.util.function.Consumer;
/**
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
index 431d1a7a237a..ea3a3d097dae 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
@@ -16,29 +16,31 @@
package com.android.server.wm;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import static android.view.DisplayCutout.fromBoundingRect;
+import static android.view.WindowManager.LayoutParams.FILL_PARENT;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import android.app.ActivityManager.TaskDescription;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.DisplayInfo;
import android.view.Gravity;
import android.view.IWindow;
import android.view.WindowManager;
-import static android.view.DisplayCutout.fromBoundingRect;
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
-import static android.view.WindowManager.LayoutParams.FILL_PARENT;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.server.wm.utils.WmDisplayCutout;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
/**
* Tests for the {@link WindowState#computeFrameLw} method and other window frame machinery.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
index d13c3c9efc20..666475637361 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
@@ -33,9 +33,10 @@ import android.content.Context;
import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
-import android.support.test.InstrumentationRegistry;
import android.view.InputChannel;
+import androidx.test.InstrumentationRegistry;
+
import com.android.server.LocalServices;
import com.android.server.input.InputManagerService;
import com.android.server.policy.WindowManagerPolicy;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java
index 6cf6d7bc96ec..570a853a62ca 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java
@@ -20,8 +20,9 @@ import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 0ddba6ac401c..645015f4a521 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -16,19 +16,6 @@
package com.android.server.wm;
-import android.graphics.Rect;
-import android.view.SurfaceControl;
-import android.view.WindowManager;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import java.util.LinkedList;
-
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.hardware.camera2.params.OutputConfiguration.ROTATION_90;
@@ -52,7 +39,6 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
@@ -61,6 +47,20 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.view.SurfaceControl;
+import android.view.WindowManager;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.LinkedList;
+
/**
* Tests for the {@link WindowState} class.
*
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java
index e173b7db2da7..057f04740198 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowSurfacePlacerTest.java
@@ -20,13 +20,15 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.TRANSIT_TASK_CLOSE;
import static android.view.WindowManager.TRANSIT_TASK_OPEN;
+
import static junit.framework.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.WindowManager;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index ef019fe5ee27..d128363b7a83 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -16,30 +16,12 @@
package com.android.server.wm;
+import static android.app.AppOpsManager.OP_NONE;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.View.VISIBLE;
-
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.hardware.display.DisplayManagerGlobal;
-import android.testing.DexmakerShareClassLoaderRule;
-import android.util.Log;
-import android.view.Display;
-import android.view.DisplayInfo;
-import org.junit.Assert;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.view.IWindow;
-import android.view.WindowManager;
-
-import static android.app.AppOpsManager.OP_NONE;
import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
+import static android.view.View.VISIBLE;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
@@ -52,10 +34,29 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+
import static org.mockito.Mockito.mock;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.hardware.display.DisplayManagerGlobal;
+import android.testing.DexmakerShareClassLoaderRule;
+import android.util.Log;
+import android.view.Display;
+import android.view.DisplayInfo;
+import android.view.IWindow;
+import android.view.WindowManager;
+
+import androidx.test.InstrumentationRegistry;
+
import com.android.server.AttributeCache;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+
import java.util.HashSet;
import java.util.LinkedList;
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
index e3b717435052..3732486f4a07 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTokenTests.java
@@ -16,23 +16,24 @@
package com.android.server.wm;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for the {@link WindowToken} class.
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java
index 50852548f525..bbc6550d5753 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTracingTest.java
@@ -29,12 +29,13 @@ import static org.mockito.Mockito.verifyZeroInteractions;
import android.content.Context;
import android.platform.test.annotations.Presubmit;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.proto.ProtoOutputStream;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.internal.util.Preconditions;
import com.android.server.wm.WindowManagerTraceProto;
diff --git a/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java
index 547be551c842..8f9fb1b7d5ec 100644
--- a/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/ZOrderingTests.java
@@ -27,19 +27,19 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.filters.FlakyTest;
-import android.support.test.runner.AndroidJUnit4;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java b/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java
index d0f0fe315bcf..75b4d2f25dbf 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/utils/InsetUtilsTest.java
@@ -20,9 +20,9 @@ import static junit.framework.Assert.assertEquals;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.Pair;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java b/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java
index 6bbc7eb56688..5d08920b43d0 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java
@@ -24,14 +24,12 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.FlakyTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Pair;
-import com.android.server.wm.utils.RotationCache.RotationDependentComputation;
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
-import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java b/services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java
index f7addf6c77f9..9ce3dca7e096 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java
@@ -25,11 +25,12 @@ import static org.junit.Assert.assertNotEquals;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Size;
import android.view.DisplayCutout;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
index ae0b0f9326d0..7e7decfa8e3b 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
@@ -20,7 +20,7 @@ LOCAL_MODULE_TAGS := tests
LOCAL_COMPATIBILITY_SUITE := device-tests
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator
+LOCAL_STATIC_JAVA_LIBRARIES := androidx-test ub-uiautomator
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_SRC_FILES += ../../src/com/android/server/pm/SuspendPackagesTest.java
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 7abf49e2c1f9..59eab3f7ceb4 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -411,7 +411,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
@Test
public void testLights() throws Exception {
NotificationRecord r = getLightsNotification();
- r.setImportance(NotificationManager.IMPORTANCE_DEFAULT, "for testing");
+ r.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
mService.buzzBeepBlinkLocked(r);
@@ -454,7 +454,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
@Test
public void testNoInterruptionForMin() throws Exception {
NotificationRecord r = getBeepyNotification();
- r.setImportance(NotificationManager.IMPORTANCE_MIN, "foo");
+ r.setSystemImportance(NotificationManager.IMPORTANCE_MIN);
mService.buzzBeepBlinkLocked(r);
@@ -1015,7 +1015,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
@Test
public void testA11yMinInitialPost() throws Exception {
NotificationRecord r = getQuietNotification();
- r.setImportance(IMPORTANCE_MIN, "");
+ r.setSystemImportance(IMPORTANCE_MIN);
mService.buzzBeepBlinkLocked(r);
verify(mAccessibilityService, never()).sendAccessibilityEvent(any(), anyInt());
}
@@ -1072,7 +1072,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
@Test
public void testLightsUnimportant() {
NotificationRecord r = getLightsNotification();
- r.setImportance(IMPORTANCE_LOW, "testing");
+ r.setSystemImportance(IMPORTANCE_LOW);
mService.buzzBeepBlinkLocked(r);
verifyNeverLights();
assertFalse(r.isInterruptive());
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/CriticalNotificationExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/CriticalNotificationExtractorTest.java
new file mode 100644
index 000000000000..1409da1a9031
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/notification/CriticalNotificationExtractorTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+import android.testing.TestableContext;
+
+import com.android.server.UiServiceTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class CriticalNotificationExtractorTest extends UiServiceTestCase {
+ @Mock
+ private PackageManager mPackageManagerClient;
+ private TestableContext mContext = spy(getContext());
+ private CriticalNotificationExtractor mExtractor;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext.setMockPackageManager(mPackageManagerClient);
+ mExtractor = new CriticalNotificationExtractor();
+ }
+
+ /** confirm there is no affect on notifcations if the automotive feature flag is not set */
+ @Test
+ public void testExtractCritically_nonsupporting() throws Exception {
+ when(mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0))
+ .thenReturn(false);
+ mExtractor.initialize(mContext, null);
+
+ assertCriticality(Notification.CATEGORY_CAR_EMERGENCY,
+ CriticalNotificationExtractor.NORMAL);
+
+ assertCriticality(Notification.CATEGORY_CAR_WARNING, CriticalNotificationExtractor.NORMAL);
+
+ assertCriticality(Notification.CATEGORY_CAR_INFORMATION,
+ CriticalNotificationExtractor.NORMAL);
+
+ assertCriticality(Notification.CATEGORY_CALL,
+ CriticalNotificationExtractor.NORMAL);
+ }
+
+ @Test
+ public void testExtractCritically() throws Exception {
+ when(mPackageManagerClient.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0))
+ .thenReturn(true);
+ mExtractor.initialize(mContext, null);
+
+ assertCriticality(Notification.CATEGORY_CAR_EMERGENCY,
+ CriticalNotificationExtractor.CRITICAL);
+
+ assertCriticality(Notification.CATEGORY_CAR_WARNING,
+ CriticalNotificationExtractor.CRITICAL_LOW);
+
+ assertCriticality(Notification.CATEGORY_CAR_INFORMATION,
+ CriticalNotificationExtractor.NORMAL);
+
+ assertCriticality(Notification.CATEGORY_CALL,
+ CriticalNotificationExtractor.NORMAL);
+ }
+
+ private void assertCriticality(String cat, int criticality) {
+ NotificationRecord info = generateRecord(cat);
+ mExtractor.process(info);
+ assertThat(info.getCriticality(), is(criticality));
+ }
+
+
+ private NotificationRecord generateRecord(String category) {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setCategory(category)
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null, System.currentTimeMillis());
+ return new NotificationRecord(getContext(), sbn, channel);
+ }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
index 73d5961ee90b..abc6e3cf46bf 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
@@ -79,7 +79,7 @@ public class ImportanceExtractorTest extends UiServiceTestCase {
//
@Test
- public void testAppPreferenceChannelNone() throws Exception {
+ public void testAppPreferenceChannelNone() {
ImportanceExtractor extractor = new ImportanceExtractor();
extractor.setConfig(mConfig);
@@ -93,12 +93,12 @@ public class ImportanceExtractorTest extends UiServiceTestCase {
extractor.process(r);
- assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, r.getUserImportance());
+ assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, r.getImportance());
assertEquals(notificationImportance, r.getImportance());
}
@Test
- public void testAppPreferenceChannelPreference() throws Exception {
+ public void testAppPreferenceChannelPreference() {
ImportanceExtractor extractor = new ImportanceExtractor();
extractor.setConfig(mConfig);
@@ -111,6 +111,6 @@ public class ImportanceExtractorTest extends UiServiceTestCase {
extractor.process(r);
- assertEquals(r.getUserImportance(), NotificationManager.IMPORTANCE_HIGH);
+ assertEquals(r.getImportance(), NotificationManager.IMPORTANCE_HIGH);
}
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
index 7ee050174d3c..b30bb4b37c12 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
@@ -110,7 +110,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordMinCall = new NotificationRecord(mContext, new StatusBarNotification(callPkg,
callPkg, 1, "minCall", callUid, callUid, n1,
new UserHandle(userId), "", 2000), getDefaultChannel());
- mRecordMinCall.setUserImportance(NotificationManager.IMPORTANCE_MIN);
+ mRecordMinCall.setSystemImportance(NotificationManager.IMPORTANCE_MIN);
Notification n2 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_CALL)
@@ -119,7 +119,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordHighCall = new NotificationRecord(mContext, new StatusBarNotification(callPkg,
callPkg, 1, "highcall", callUid, callUid, n2,
new UserHandle(userId), "", 1999), getDefaultChannel());
- mRecordHighCall.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
+ mRecordHighCall.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
Notification n3 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setStyle(new Notification.MediaStyle()
@@ -128,14 +128,14 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordDefaultMedia = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "media", uid2, uid2, n3, new UserHandle(userId),
"", 1499), getDefaultChannel());
- mRecordDefaultMedia.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
+ mRecordDefaultMedia.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n4 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setStyle(new Notification.MessagingStyle("sender!")).build();
mRecordInlineReply = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "inlinereply", uid2, uid2, n4, new UserHandle(userId),
"", 1599), getDefaultChannel());
- mRecordInlineReply.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
+ mRecordInlineReply.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
mRecordInlineReply.setPackagePriority(Notification.PRIORITY_MAX);
if (smsPkg != null) {
@@ -144,7 +144,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordSms = new NotificationRecord(mContext, new StatusBarNotification(smsPkg,
smsPkg, 1, "sms", smsUid, smsUid, n5, new UserHandle(userId),
"", 1299), getDefaultChannel());
- mRecordSms.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
+ mRecordSms.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
}
Notification n6 = new Notification.Builder(mContext, TEST_CHANNEL_ID).build();
@@ -152,20 +152,20 @@ public class NotificationComparatorTest extends UiServiceTestCase {
pkg2, 1, "starred", uid2, uid2, n6, new UserHandle(userId),
"", 1259), getDefaultChannel());
mRecordStarredContact.setContactAffinity(ValidateNotificationPeople.STARRED_CONTACT);
- mRecordStarredContact.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
+ mRecordStarredContact.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n7 = new Notification.Builder(mContext, TEST_CHANNEL_ID).build();
mRecordContact = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "contact", uid2, uid2, n7, new UserHandle(userId),
"", 1259), getDefaultChannel());
mRecordContact.setContactAffinity(ValidateNotificationPeople.VALID_CONTACT);
- mRecordContact.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
+ mRecordContact.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n8 = new Notification.Builder(mContext, TEST_CHANNEL_ID).build();
mRecordUrgent = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "urgent", uid2, uid2, n8, new UserHandle(userId),
"", 1258), getDefaultChannel());
- mRecordUrgent.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
+ mRecordUrgent.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
Notification n9 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_MESSAGE)
@@ -175,7 +175,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordCheater = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "cheater", uid2, uid2, n9, new UserHandle(userId),
"", 9258), getDefaultChannel());
- mRecordCheater.setUserImportance(NotificationManager.IMPORTANCE_LOW);
+ mRecordCheater.setSystemImportance(NotificationManager.IMPORTANCE_LOW);
mRecordCheater.setPackagePriority(Notification.PRIORITY_MAX);
Notification n10 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -183,7 +183,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordEmail = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "email", uid2, uid2, n10, new UserHandle(userId),
"", 1599), getDefaultChannel());
- mRecordEmail.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
+ mRecordEmail.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
Notification n11 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_MESSAGE)
@@ -192,7 +192,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordCheaterColorized = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "cheater", uid2, uid2, n11, new UserHandle(userId),
"", 9258), getDefaultChannel());
- mRecordCheaterColorized.setUserImportance(NotificationManager.IMPORTANCE_LOW);
+ mRecordCheaterColorized.setSystemImportance(NotificationManager.IMPORTANCE_LOW);
Notification n12 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_MESSAGE)
@@ -202,7 +202,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mNoMediaSessionMedia = new NotificationRecord(mContext, new StatusBarNotification(
pkg2, pkg2, 1, "cheater", uid2, uid2, n12, new UserHandle(userId),
"", 9258), getDefaultChannel());
- mNoMediaSessionMedia.setUserImportance(NotificationManager.IMPORTANCE_DEFAULT);
+ mNoMediaSessionMedia.setSystemImportance(NotificationManager.IMPORTANCE_DEFAULT);
Notification n13 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setFlag(Notification.FLAG_FOREGROUND_SERVICE, true)
@@ -211,7 +211,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordColorized = new NotificationRecord(mContext, new StatusBarNotification(pkg2,
pkg2, 1, "colorized", uid2, uid2, n13,
new UserHandle(userId), "", 1999), getDefaultChannel());
- mRecordHighCall.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
+ mRecordHighCall.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
Notification n14 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setCategory(Notification.CATEGORY_CALL)
@@ -221,7 +221,7 @@ public class NotificationComparatorTest extends UiServiceTestCase {
mRecordColorizedCall = new NotificationRecord(mContext, new StatusBarNotification(callPkg,
callPkg, 1, "colorizedCall", callUid, callUid, n14,
new UserHandle(userId), "", 1999), getDefaultChannel());
- mRecordColorizedCall.setUserImportance(NotificationManager.IMPORTANCE_HIGH);
+ mRecordColorizedCall.setSystemImportance(NotificationManager.IMPORTANCE_HIGH);
}
@Test
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 0cbb1aa8ee48..4dcb8cf8b327 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -73,7 +73,6 @@ import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
import android.app.IUriGrantsManager;
-import android.app.admin.DeviceAdminInfo;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.usage.UsageStatsManagerInternal;
import android.companion.ICompanionDeviceManager;
@@ -727,6 +726,25 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testBlockedNotifications_blockedByAssistant() throws Exception {
+ when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);
+
+ NotificationChannel channel = new NotificationChannel("id", "name",
+ NotificationManager.IMPORTANCE_HIGH);
+ NotificationRecord r = generateNotificationRecord(channel);
+ mService.addEnqueuedNotification(r);
+
+ r.setAssistantImportance(IMPORTANCE_NONE);
+
+ NotificationManagerService.PostNotificationRunnable runnable =
+ mService.new PostNotificationRunnable(r.getKey());
+ runnable.run();
+ waitForIdle();
+
+ verify(mUsageStats, never()).registerPostedByApp(any());
+ }
+
+ @Test
public void testEnqueueNotificationWithTag_PopulatesGetActiveNotifications() throws Exception {
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null).getNotification(), 0);
@@ -2494,6 +2512,27 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testAssistantIBlockingTriggersCancel() throws Exception {
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ mService.addNotification(r);
+ NotificationManagerService.WorkerHandler handler = mock(
+ NotificationManagerService.WorkerHandler.class);
+ mService.setHandler(handler);
+
+ Bundle signals = new Bundle();
+ signals.putInt(Adjustment.KEY_IMPORTANCE, IMPORTANCE_NONE);
+ Adjustment adjustment = new Adjustment(
+ r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier());
+ when(mAssistants.isSameUser(any(), anyInt())).thenReturn(true);
+ mBinderService.applyAdjustmentFromAssistant(null, adjustment);
+
+ waitForIdle();
+
+ verify(handler, timeout(300).times(0)).scheduleSendRankingUpdate();
+ verify(handler, times(1)).scheduleCancelNotification(any());
+ }
+
+ @Test
public void testApplyEnqueuedAdjustmentFromAssistant_singleUser() throws Exception {
final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
mService.addEnqueuedNotification(r);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index 6be633ec6cdc..11b086ca441c 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -16,6 +16,9 @@
package com.android.server.notification;
import static android.app.NotificationChannel.USER_LOCKED_IMPORTANCE;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.service.notification.NotificationListenerService.Ranking
.USER_SENTIMENT_NEGATIVE;
import static android.service.notification.NotificationListenerService.Ranking
@@ -306,14 +309,14 @@ public class NotificationRecordTest extends UiServiceTestCase {
@Test
public void testImportance_locked_preUpgrade() throws Exception {
- defaultChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ defaultChannel.setImportance(IMPORTANCE_LOW);
defaultChannel.lockFields(USER_LOCKED_IMPORTANCE);
StatusBarNotification sbn = getNotification(PKG_N_MR1, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /* defaultLights */, null /* group */);
NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
- assertEquals(NotificationManager.IMPORTANCE_LOW, record.getImportance());
+ assertEquals(IMPORTANCE_LOW, record.getImportance());
}
@Test
@@ -718,4 +721,73 @@ public class NotificationRecordTest extends UiServiceTestCase {
record.setSmartActions(smartActions);
assertEquals(smartActions, record.getSmartActions());
}
+
+ @Test
+ public void testUpdateNotificationChannel() {
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ assertEquals(channel.getImportance(), record.getImportance());
+
+ record.updateNotificationChannel(
+ new NotificationChannel(channelId, "", channel.getImportance() - 1));
+
+ assertEquals(channel.getImportance() - 1, record.getImportance());
+ }
+
+ @Test
+ public void testCalculateImportance_systemImportance() {
+ channel.setImportance(IMPORTANCE_HIGH);
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ record.setSystemImportance(IMPORTANCE_LOW);
+ assertEquals(IMPORTANCE_LOW, record.getImportance());
+
+ record = new NotificationRecord(mMockContext, sbn, channel);
+ channel.lockFields(USER_LOCKED_IMPORTANCE);
+
+ record.setSystemImportance(IMPORTANCE_LOW);
+ assertEquals(IMPORTANCE_LOW, record.getImportance());
+ }
+
+ @Test
+ public void testCalculateImportance_asstImportance() {
+ channel.setImportance(IMPORTANCE_HIGH);
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ record.setAssistantImportance(IMPORTANCE_LOW);
+ assertEquals(IMPORTANCE_LOW, record.getImportance());
+
+ // assistant ignored if user expressed preference
+ record = new NotificationRecord(mMockContext, sbn, channel);
+ channel.lockFields(USER_LOCKED_IMPORTANCE);
+
+ record.setAssistantImportance(IMPORTANCE_LOW);
+ assertEquals(channel.getImportance(), record.getImportance());
+ }
+
+ @Test
+ public void testCalculateImportance_asstImportanceChannelUpdate() {
+ channel.setImportance(IMPORTANCE_HIGH);
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ record.setAssistantImportance(IMPORTANCE_LOW);
+ assertEquals(IMPORTANCE_LOW, record.getImportance());
+
+ record.updateNotificationChannel(
+ new NotificationChannel(channelId, "", IMPORTANCE_DEFAULT));
+
+ assertEquals(IMPORTANCE_LOW, record.getImportance());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 7e0fcc908015..5638cb360c78 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -203,8 +203,42 @@ public class RankingHelperTest extends UiServiceTestCase {
}
@Test
+ public void testSortShouldRespectCritical() throws Exception {
+ ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(7);
+ NotificationRecord critical = generateRecord(0);
+ NotificationRecord critical_ish = generateRecord(1);
+ NotificationRecord critical_notAtAll = generateRecord(100);
+
+ notificationList.add(critical_ish);
+ notificationList.add(mRecordGroupGSortA);
+ notificationList.add(critical_notAtAll);
+ notificationList.add(mRecordGroupGSortB);
+ notificationList.add(mRecordNoGroup);
+ notificationList.add(mRecordNoGroupSortA);
+ notificationList.add(critical);
+ mHelper.sort(notificationList);
+
+ assertTrue(mHelper.indexOf(notificationList, critical) == 0);
+ assertTrue(mHelper.indexOf(notificationList, critical_ish) == 1);
+ assertTrue(mHelper.indexOf(notificationList, critical_notAtAll) == 6);
+ }
+
+ private NotificationRecord generateRecord(int criticality) {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null, System.currentTimeMillis());
+ NotificationRecord notificationRecord = new NotificationRecord(getContext(), sbn, channel);
+ notificationRecord.setCriticality(criticality);
+ return notificationRecord;
+ }
+
+ @Test
public void testFindAfterRankingWithASplitGroup() throws Exception {
- ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(3);
+ ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(4);
notificationList.add(mRecordGroupGSortA);
notificationList.add(mRecordGroupGSortB);
notificationList.add(mRecordNoGroup);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
index 96ac93536a8a..110e3fe5eb24 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
@@ -333,6 +333,17 @@ public class ScheduleCalendarTest extends UiServiceTestCase {
}
@Test
+ public void testMaybeSetNextAlarm_expiredOldAlarm() {
+ mScheduleInfo.exitAtAlarm = true;
+ mScheduleInfo.nextAlarm = 998;
+ mScheduleCalendar.setSchedule(mScheduleInfo);
+
+ mScheduleCalendar.maybeSetNextAlarm(1000, 1001);
+
+ assertEquals(1001, mScheduleInfo.nextAlarm);
+ }
+
+ @Test
@FlakyTest
public void testIsInSchedule_inScheduleOvernight() {
Calendar cal = new GregorianCalendar();
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index 24beb59849de..8cff6f945075 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -63,7 +63,6 @@ import com.android.internal.R;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.util.FastXmlSerializer;
import com.android.server.UiServiceTestCase;
-import android.util.Slog;
import org.junit.Before;
import org.junit.Test;
@@ -615,7 +614,37 @@ public class ZenModeHelperTest extends UiServiceTestCase {
}
@Test
- public void testReadXml() throws Exception {
+ public void testReadXmlRestore() throws Exception {
+ setupZenConfig();
+
+ // one enabled automatic rule
+ ArrayMap<String, ZenModeConfig.ZenRule> automaticRules = new ArrayMap<>();
+ ZenModeConfig.ZenRule customRule = new ZenModeConfig.ZenRule();
+ final ScheduleInfo customRuleInfo = new ScheduleInfo();
+ customRule.enabled = true;
+ customRule.creationTime = 0;
+ customRule.id = "customRule";
+ customRule.name = "Custom Rule";
+ customRule.zenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
+ customRule.component = new ComponentName("test", "test");
+ customRule.conditionId = ZenModeConfig.toScheduleConditionId(customRuleInfo);
+ automaticRules.put("customRule", customRule);
+ mZenModeHelperSpy.mConfig.automaticRules = automaticRules;
+
+ ZenModeConfig original = mZenModeHelperSpy.mConfig.copy();
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(false, null);
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(
+ new ByteArrayInputStream(baos.toByteArray())), null);
+ parser.nextTag();
+ mZenModeHelperSpy.readXml(parser, true);
+ assertEquals(original.hashCode(), mZenModeHelperSpy.mConfig.hashCode());
+ assertEquals(original, mZenModeHelperSpy.mConfig);
+ }
+
+ @Test
+ public void testReadXmlRulesNotOverriden() throws Exception {
setupZenConfig();
// automatic zen rule is enabled on upgrade so rules should not be overriden to default
@@ -629,8 +658,6 @@ public class ZenModeHelperTest extends UiServiceTestCase {
enabledAutoRule.put("customRule", customRule);
mZenModeHelperSpy.mConfig.automaticRules = enabledAutoRule;
- ZenModeConfig expected = mZenModeHelperSpy.mConfig.copy();
-
// set previous version
ByteArrayOutputStream baos = writeXmlAndPurge(false, 5);
XmlPullParser parser = Xml.newPullParser();
@@ -783,17 +810,17 @@ public class ZenModeHelperTest extends UiServiceTestCase {
public void testReadXmlAllDisabledRulesResetDefaultRules() throws Exception {
setupZenConfig();
- // all automatic zen rules are diabled on upgrade (and default rules don't already exist)
+ // all automatic zen rules are disabled on upgrade (and default rules don't already exist)
// so rules should be overriden by default rules
- ArrayMap<String, ZenModeConfig.ZenRule> enabledAutoRule = new ArrayMap<>();
+ ArrayMap<String, ZenModeConfig.ZenRule> disabledAutoRule = new ArrayMap<>();
ZenModeConfig.ZenRule customRule = new ZenModeConfig.ZenRule();
final ScheduleInfo weeknights = new ScheduleInfo();
customRule.enabled = false;
customRule.name = "Custom Rule";
customRule.zenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
customRule.conditionId = ZenModeConfig.toScheduleConditionId(weeknights);
- enabledAutoRule.put("customRule", customRule);
- mZenModeHelperSpy.mConfig.automaticRules = enabledAutoRule;
+ disabledAutoRule.put("customRule", customRule);
+ mZenModeHelperSpy.mConfig.automaticRules = disabledAutoRule;
// set previous version
ByteArrayOutputStream baos = writeXmlAndPurge(false, 5);
@@ -927,12 +954,7 @@ public class ZenModeHelperTest extends UiServiceTestCase {
mZenModeHelperSpy.mConfig.allowEvents = true;
mZenModeHelperSpy.mConfig.allowRepeatCallers= true;
mZenModeHelperSpy.mConfig.suppressedVisualEffects = SUPPRESSED_EFFECT_BADGE;
- mZenModeHelperSpy.mConfig.manualRule = new ZenModeConfig.ZenRule();
- mZenModeHelperSpy.mConfig.manualRule.zenMode =
- Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
- mZenModeHelperSpy.mConfig.manualRule.component = new ComponentName("a", "a");
- mZenModeHelperSpy.mConfig.manualRule.enabled = true;
- mZenModeHelperSpy.mConfig.manualRule.snoozing = true;
+ mZenModeHelperSpy.mConfig.manualRule = null;
}
private void setupZenConfigMaintained() {
diff --git a/telephony/java/android/telephony/CellIdentity.java b/telephony/java/android/telephony/CellIdentity.java
index 2a41829dcc2f..c240dbb684e6 100644
--- a/telephony/java/android/telephony/CellIdentity.java
+++ b/telephony/java/android/telephony/CellIdentity.java
@@ -17,14 +17,11 @@
package android.telephony;
import android.annotation.CallSuper;
-import android.annotation.IntDef;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
/**
@@ -32,44 +29,6 @@ import java.util.Objects;
* CellIdentityXxx which represents cell identity for specific network access technology.
*/
public abstract class CellIdentity implements Parcelable {
- /**
- * Cell identity type
- * @hide
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = "TYPE_", value = {TYPE_GSM, TYPE_CDMA, TYPE_LTE, TYPE_WCDMA, TYPE_TDSCDMA})
- public @interface Type {}
-
- /**
- * Unknown cell identity type
- * @hide
- */
- public static final int TYPE_UNKNOWN = 0;
- /**
- * GSM cell identity type
- * @hide
- */
- public static final int TYPE_GSM = 1;
- /**
- * CDMA cell identity type
- * @hide
- */
- public static final int TYPE_CDMA = 2;
- /**
- * LTE cell identity type
- * @hide
- */
- public static final int TYPE_LTE = 3;
- /**
- * WCDMA cell identity type
- * @hide
- */
- public static final int TYPE_WCDMA = 4;
- /**
- * TDS-CDMA cell identity type
- * @hide
- */
- public static final int TYPE_TDSCDMA = 5;
/** @hide */
public static final int INVALID_CHANNEL_NUMBER = -1;
@@ -138,7 +97,9 @@ public abstract class CellIdentity implements Parcelable {
* @hide
* @return The type of the cell identity
*/
- public @Type int getType() { return mType; }
+ public @CellInfo.Type int getType() {
+ return mType;
+ }
/**
* Returns the channel number of the cell identity.
@@ -217,11 +178,12 @@ public abstract class CellIdentity implements Parcelable {
public CellIdentity createFromParcel(Parcel in) {
int type = in.readInt();
switch (type) {
- case TYPE_GSM: return CellIdentityGsm.createFromParcelBody(in);
- case TYPE_WCDMA: return CellIdentityWcdma.createFromParcelBody(in);
- case TYPE_CDMA: return CellIdentityCdma.createFromParcelBody(in);
- case TYPE_LTE: return CellIdentityLte.createFromParcelBody(in);
- case TYPE_TDSCDMA: return CellIdentityTdscdma.createFromParcelBody(in);
+ case CellInfo.TYPE_GSM: return CellIdentityGsm.createFromParcelBody(in);
+ case CellInfo.TYPE_WCDMA: return CellIdentityWcdma.createFromParcelBody(in);
+ case CellInfo.TYPE_CDMA: return CellIdentityCdma.createFromParcelBody(in);
+ case CellInfo.TYPE_LTE: return CellIdentityLte.createFromParcelBody(in);
+ case CellInfo.TYPE_TDSCDMA:
+ return CellIdentityTdscdma.createFromParcelBody(in);
default: throw new IllegalArgumentException("Bad Cell identity Parcel");
}
}
diff --git a/telephony/java/android/telephony/CellIdentityCdma.java b/telephony/java/android/telephony/CellIdentityCdma.java
index 58a2c455636b..28090666ea68 100644
--- a/telephony/java/android/telephony/CellIdentityCdma.java
+++ b/telephony/java/android/telephony/CellIdentityCdma.java
@@ -54,7 +54,7 @@ public final class CellIdentityCdma extends CellIdentity {
* @hide
*/
public CellIdentityCdma() {
- super(TAG, TYPE_CDMA, null, null, null, null);
+ super(TAG, CellInfo.TYPE_CDMA, null, null, null, null);
mNetworkId = Integer.MAX_VALUE;
mSystemId = Integer.MAX_VALUE;
mBasestationId = Integer.MAX_VALUE;
@@ -94,7 +94,7 @@ public final class CellIdentityCdma extends CellIdentity {
*/
public CellIdentityCdma(int nid, int sid, int bid, int lon, int lat, String alphal,
String alphas) {
- super(TAG, TYPE_CDMA, null, null, alphal, alphas);
+ super(TAG, CellInfo.TYPE_CDMA, null, null, alphal, alphas);
mNetworkId = nid;
mSystemId = sid;
mBasestationId = bid;
@@ -213,7 +213,7 @@ public final class CellIdentityCdma extends CellIdentity {
@Override
public void writeToParcel(Parcel dest, int flags) {
if (DBG) log("writeToParcel(Parcel, int): " + toString());
- super.writeToParcel(dest, TYPE_CDMA);
+ super.writeToParcel(dest, CellInfo.TYPE_CDMA);
dest.writeInt(mNetworkId);
dest.writeInt(mSystemId);
dest.writeInt(mBasestationId);
@@ -223,7 +223,7 @@ public final class CellIdentityCdma extends CellIdentity {
/** Construct from Parcel, type has already been processed */
private CellIdentityCdma(Parcel in) {
- super(TAG, TYPE_CDMA, in);
+ super(TAG, CellInfo.TYPE_CDMA, in);
mNetworkId = in.readInt();
mSystemId = in.readInt();
mBasestationId = in.readInt();
diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java
index c697880faced..4031254ab071 100644
--- a/telephony/java/android/telephony/CellIdentityGsm.java
+++ b/telephony/java/android/telephony/CellIdentityGsm.java
@@ -42,7 +42,7 @@ public final class CellIdentityGsm extends CellIdentity {
* @hide
*/
public CellIdentityGsm() {
- super(TAG, TYPE_GSM, null, null, null, null);
+ super(TAG, CellInfo.TYPE_GSM, null, null, null, null);
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mArfcn = Integer.MAX_VALUE;
@@ -92,7 +92,7 @@ public final class CellIdentityGsm extends CellIdentity {
*/
public CellIdentityGsm(int lac, int cid, int arfcn, int bsic, String mccStr,
String mncStr, String alphal, String alphas) {
- super(TAG, TYPE_GSM, mccStr, mncStr, alphal, alphas);
+ super(TAG, CellInfo.TYPE_GSM, mccStr, mncStr, alphal, alphas);
mLac = lac;
mCid = cid;
mArfcn = arfcn;
@@ -237,7 +237,7 @@ public final class CellIdentityGsm extends CellIdentity {
@Override
public void writeToParcel(Parcel dest, int flags) {
if (DBG) log("writeToParcel(Parcel, int): " + toString());
- super.writeToParcel(dest, TYPE_GSM);
+ super.writeToParcel(dest, CellInfo.TYPE_GSM);
dest.writeInt(mLac);
dest.writeInt(mCid);
dest.writeInt(mArfcn);
@@ -246,7 +246,7 @@ public final class CellIdentityGsm extends CellIdentity {
/** Construct from Parcel, type has already been processed */
private CellIdentityGsm(Parcel in) {
- super(TAG, TYPE_GSM, in);
+ super(TAG, CellInfo.TYPE_GSM, in);
mLac = in.readInt();
mCid = in.readInt();
mArfcn = in.readInt();
diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java
index 177fcedf8c15..52573727e1c6 100644
--- a/telephony/java/android/telephony/CellIdentityLte.java
+++ b/telephony/java/android/telephony/CellIdentityLte.java
@@ -44,7 +44,7 @@ public final class CellIdentityLte extends CellIdentity {
* @hide
*/
public CellIdentityLte() {
- super(TAG, TYPE_LTE, null, null, null, null);
+ super(TAG, CellInfo.TYPE_LTE, null, null, null, null);
mCi = Integer.MAX_VALUE;
mPci = Integer.MAX_VALUE;
mTac = Integer.MAX_VALUE;
@@ -99,7 +99,7 @@ public final class CellIdentityLte extends CellIdentity {
*/
public CellIdentityLte(int ci, int pci, int tac, int earfcn, int bandwidth, String mccStr,
String mncStr, String alphal, String alphas) {
- super(TAG, TYPE_LTE, mccStr, mncStr, alphal, alphas);
+ super(TAG, CellInfo.TYPE_LTE, mccStr, mncStr, alphal, alphas);
mCi = ci;
mPci = pci;
mTac = tac;
@@ -241,7 +241,7 @@ public final class CellIdentityLte extends CellIdentity {
@Override
public void writeToParcel(Parcel dest, int flags) {
if (DBG) log("writeToParcel(Parcel, int): " + toString());
- super.writeToParcel(dest, TYPE_LTE);
+ super.writeToParcel(dest, CellInfo.TYPE_LTE);
dest.writeInt(mCi);
dest.writeInt(mPci);
dest.writeInt(mTac);
@@ -251,7 +251,7 @@ public final class CellIdentityLte extends CellIdentity {
/** Construct from Parcel, type has already been processed */
private CellIdentityLte(Parcel in) {
- super(TAG, TYPE_LTE, in);
+ super(TAG, CellInfo.TYPE_LTE, in);
mCi = in.readInt();
mPci = in.readInt();
mTac = in.readInt();
diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java
index b99fe466ec46..21b9601bcad9 100644
--- a/telephony/java/android/telephony/CellIdentityTdscdma.java
+++ b/telephony/java/android/telephony/CellIdentityTdscdma.java
@@ -40,7 +40,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
* @hide
*/
public CellIdentityTdscdma() {
- super(TAG, TYPE_TDSCDMA, null, null, null, null);
+ super(TAG, CellInfo.TYPE_TDSCDMA, null, null, null, null);
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mCpid = Integer.MAX_VALUE;
@@ -75,7 +75,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
*/
public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid, int uarfcn,
String alphal, String alphas) {
- super(TAG, TYPE_TDSCDMA, mcc, mnc, alphal, alphas);
+ super(TAG, CellInfo.TYPE_TDSCDMA, mcc, mnc, alphal, alphas);
mLac = lac;
mCid = cid;
mCpid = cpid;
@@ -175,7 +175,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
@Override
public void writeToParcel(Parcel dest, int flags) {
if (DBG) log("writeToParcel(Parcel, int): " + toString());
- super.writeToParcel(dest, TYPE_TDSCDMA);
+ super.writeToParcel(dest, CellInfo.TYPE_TDSCDMA);
dest.writeInt(mLac);
dest.writeInt(mCid);
dest.writeInt(mCpid);
@@ -184,7 +184,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
/** Construct from Parcel, type has already been processed */
private CellIdentityTdscdma(Parcel in) {
- super(TAG, TYPE_TDSCDMA, in);
+ super(TAG, CellInfo.TYPE_TDSCDMA, in);
mLac = in.readInt();
mCid = in.readInt();
mCpid = in.readInt();
diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java
index 43f9406be79e..a4ac8e30d02e 100644
--- a/telephony/java/android/telephony/CellIdentityWcdma.java
+++ b/telephony/java/android/telephony/CellIdentityWcdma.java
@@ -42,7 +42,7 @@ public final class CellIdentityWcdma extends CellIdentity {
* @hide
*/
public CellIdentityWcdma() {
- super(TAG, TYPE_TDSCDMA, null, null, null, null);
+ super(TAG, CellInfo.TYPE_WCDMA, null, null, null, null);
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mPsc = Integer.MAX_VALUE;
@@ -93,7 +93,7 @@ public final class CellIdentityWcdma extends CellIdentity {
*/
public CellIdentityWcdma (int lac, int cid, int psc, int uarfcn,
String mccStr, String mncStr, String alphal, String alphas) {
- super(TAG, TYPE_WCDMA, mccStr, mncStr, alphal, alphas);
+ super(TAG, CellInfo.TYPE_WCDMA, mccStr, mncStr, alphal, alphas);
mLac = lac;
mCid = cid;
mPsc = psc;
@@ -227,7 +227,7 @@ public final class CellIdentityWcdma extends CellIdentity {
@Override
public void writeToParcel(Parcel dest, int flags) {
if (DBG) log("writeToParcel(Parcel, int): " + toString());
- super.writeToParcel(dest, TYPE_WCDMA);
+ super.writeToParcel(dest, CellInfo.TYPE_WCDMA);
dest.writeInt(mLac);
dest.writeInt(mCid);
dest.writeInt(mPsc);
@@ -236,7 +236,7 @@ public final class CellIdentityWcdma extends CellIdentity {
/** Construct from Parcel, type has already been processed */
private CellIdentityWcdma(Parcel in) {
- super(TAG, TYPE_WCDMA, in);
+ super(TAG, CellInfo.TYPE_WCDMA, in);
mLac = in.readInt();
mCid = in.readInt();
mPsc = in.readInt();
diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java
index bffeb170792e..6b320f4352cc 100644
--- a/telephony/java/android/telephony/CellInfo.java
+++ b/telephony/java/android/telephony/CellInfo.java
@@ -29,17 +29,43 @@ import java.lang.annotation.RetentionPolicy;
*/
public abstract class CellInfo implements Parcelable {
- // Type fields for parceling
- /** @hide */
- protected static final int TYPE_GSM = 1;
- /** @hide */
- protected static final int TYPE_CDMA = 2;
- /** @hide */
- protected static final int TYPE_LTE = 3;
- /** @hide */
- protected static final int TYPE_WCDMA = 4;
- /** @hide */
- protected static final int TYPE_TDCDMA = 5;
+ /**
+ * Cell identity type
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = "TYPE_", value = {TYPE_GSM, TYPE_CDMA, TYPE_LTE, TYPE_WCDMA, TYPE_TDSCDMA})
+ public @interface Type {}
+ /**
+ * Unknown cell identity type
+ * @hide
+ */
+ public static final int TYPE_UNKNOWN = 0;
+ /**
+ * GSM cell identity type
+ * @hide
+ */
+ public static final int TYPE_GSM = 1;
+ /**
+ * CDMA cell identity type
+ * @hide
+ */
+ public static final int TYPE_CDMA = 2;
+ /**
+ * LTE cell identity type
+ * @hide
+ */
+ public static final int TYPE_LTE = 3;
+ /**
+ * WCDMA cell identity type
+ * @hide
+ */
+ public static final int TYPE_WCDMA = 4;
+ /**
+ * TD-SCDMA cell identity type
+ * @hide
+ */
+ public static final int TYPE_TDSCDMA = 5;
// Type to distinguish where time stamp gets recorded.
@@ -161,6 +187,7 @@ public abstract class CellInfo implements Parcelable {
public int getTimeStampType() {
return mTimeStampType;
}
+
/** @hide */
public void setTimeStampType(int timeStampType) {
if (timeStampType < TIMESTAMP_TYPE_UNKNOWN || timeStampType > TIMESTAMP_TYPE_JAVA_RIL) {
@@ -272,7 +299,7 @@ public abstract class CellInfo implements Parcelable {
case TYPE_CDMA: return CellInfoCdma.createFromParcelBody(in);
case TYPE_LTE: return CellInfoLte.createFromParcelBody(in);
case TYPE_WCDMA: return CellInfoWcdma.createFromParcelBody(in);
- case TYPE_TDCDMA: return CellInfoTdscdma.createFromParcelBody(in);
+ case TYPE_TDSCDMA: return CellInfoTdscdma.createFromParcelBody(in);
default: throw new RuntimeException("Bad CellInfo Parcel");
}
}
diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java
index 4fb1bce1cb8f..40cadde364dc 100644
--- a/telephony/java/android/telephony/CellInfoTdscdma.java
+++ b/telephony/java/android/telephony/CellInfoTdscdma.java
@@ -110,7 +110,7 @@ public final class CellInfoTdscdma extends CellInfo implements Parcelable {
/** Implement the Parcelable interface */
@Override
public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags, TYPE_TDCDMA);
+ super.writeToParcel(dest, flags, TYPE_TDSCDMA);
mCellIdentityTdscdma.writeToParcel(dest, flags);
mCellSignalStrengthTdscdma.writeToParcel(dest, flags);
}
diff --git a/telephony/java/android/telephony/NeighboringCellInfo.java b/telephony/java/android/telephony/NeighboringCellInfo.java
index 25851e32f6c6..b7ccee5871d0 100644
--- a/telephony/java/android/telephony/NeighboringCellInfo.java
+++ b/telephony/java/android/telephony/NeighboringCellInfo.java
@@ -16,16 +16,16 @@
package android.telephony;
-import android.os.Parcel;
-import android.os.Parcelable;
-import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
-import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
-import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
+import android.os.Parcel;
+import android.os.Parcelable;
/**
@@ -100,6 +100,39 @@ public class NeighboringCellInfo implements Parcelable
mCid = cid;
}
+ /** @hide */
+ public NeighboringCellInfo(final CellInfoGsm info) {
+ mNetworkType = TelephonyManager.NETWORK_TYPE_GPRS;
+
+ mRssi = info.getCellSignalStrength().getAsuLevel();
+ if (mRssi == Integer.MAX_VALUE) mRssi = UNKNOWN_RSSI;
+
+ mLac = info.getCellIdentity().getLac();
+ if (mLac == Integer.MAX_VALUE) mLac = UNKNOWN_CID;
+
+ mCid = info.getCellIdentity().getCid();
+ if (mCid == Integer.MAX_VALUE) mCid = UNKNOWN_CID;
+
+ mPsc = UNKNOWN_CID;
+ }
+
+ /** @hide */
+ public NeighboringCellInfo(final CellInfoWcdma info) {
+ mNetworkType = TelephonyManager.NETWORK_TYPE_UMTS;
+
+ mRssi = info.getCellSignalStrength().getAsuLevel();
+ if (mRssi == Integer.MAX_VALUE) mRssi = UNKNOWN_RSSI;
+
+ mLac = info.getCellIdentity().getLac();
+ if (mLac == Integer.MAX_VALUE) mLac = UNKNOWN_CID;
+
+ mCid = info.getCellIdentity().getCid();
+ if (mCid == Integer.MAX_VALUE) mCid = UNKNOWN_CID;
+
+ mPsc = info.getCellIdentity().getPsc();
+ if (mPsc == Integer.MAX_VALUE) mPsc = UNKNOWN_CID;
+ }
+
/**
* Initialize the object from rssi, location string, and radioType
* radioType is one of following
diff --git a/telephony/java/android/telephony/PreciseDisconnectCause.java b/telephony/java/android/telephony/PreciseDisconnectCause.java
index 46e2adbcfa7f..2acaf34dbb30 100644
--- a/telephony/java/android/telephony/PreciseDisconnectCause.java
+++ b/telephony/java/android/telephony/PreciseDisconnectCause.java
@@ -332,6 +332,8 @@ public class PreciseDisconnectCause {
public static final int SIP_NOT_REACHABLE = 1320;
/** Others */
public static final int SIP_CLIENT_ERROR = 1321;
+ /** 481 : Transaction Does Not Exist */
+ public static final int SIP_TRANSACTION_DOES_NOT_EXIST = 1322;
/** 5xx responses
* 501 : Server Internal Error
*/
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index d76e39b83801..2bc43d410174 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -135,25 +135,25 @@ public class SubscriptionInfo implements Parcelable {
private String mCardId;
/**
- * @hide
+ * Whether the subscription is opportunistic.
*/
- public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
- CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
- Bitmap icon, String mcc, String mnc, String countryIso) {
- this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
- roaming, icon, mcc, mnc, countryIso, false /* isEmbedded */,
- null /* accessRules */, null /* accessRules */);
- }
+ private boolean mIsOpportunistic;
+
+ /**
+ * SubId of the parent subscription, if there is one.
+ */
+ private int mParentSubId;
/**
* @hide
*/
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
- Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
- @Nullable UiccAccessRule[] accessRules) {
+ Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
+ @Nullable UiccAccessRule[] accessRules, String cardId) {
this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
- roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, null /* cardId */);
+ roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardId,
+ false, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
}
/**
@@ -162,7 +162,8 @@ public class SubscriptionInfo implements Parcelable {
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
- @Nullable UiccAccessRule[] accessRules, String cardId) {
+ @Nullable UiccAccessRule[] accessRules, String cardId, boolean isOpportunistic,
+ int parentSubId) {
this.mId = id;
this.mIccId = iccId;
this.mSimSlotIndex = simSlotIndex;
@@ -179,6 +180,8 @@ public class SubscriptionInfo implements Parcelable {
this.mIsEmbedded = isEmbedded;
this.mAccessRules = accessRules;
this.mCardId = cardId;
+ this.mIsOpportunistic = isOpportunistic;
+ this.mParentSubId = parentSubId;
}
/**
@@ -369,6 +372,29 @@ public class SubscriptionInfo implements Parcelable {
}
/**
+ * An opportunistic subscription connects to a network that is
+ * limited in functionality and / or coverage.
+ *
+ * @return whether subscription is opportunistic.
+ */
+ public boolean isOpportunistic() {
+ return mIsOpportunistic;
+ }
+
+ /**
+ * Used in scenarios where a child subscription is bundled with a primary parent subscription.
+ * The child subscription will typically be opportunistic (see {@link #isOpportunistic()})
+ * and will be used to provide data services where available, with the parent being the primary
+ * fallback subscription.
+ *
+ * @return subId of parent subscription if it’s bundled with a primary subscription.
+ * If there isn't one, {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}
+ */
+ public int getParentSubId() {
+ return mParentSubId;
+ }
+
+ /**
* Checks whether the app with the given context is authorized to manage this subscription
* according to its metadata. Only supported for embedded subscriptions (if {@link #isEmbedded}
* returns true).
@@ -460,10 +486,12 @@ public class SubscriptionInfo implements Parcelable {
boolean isEmbedded = source.readBoolean();
UiccAccessRule[] accessRules = source.createTypedArray(UiccAccessRule.CREATOR);
String cardId = source.readString();
+ boolean isOpportunistic = source.readBoolean();
+ int parentSubId = source.readInt();
return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName,
nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso,
- isEmbedded, accessRules, cardId);
+ isEmbedded, accessRules, cardId, isOpportunistic, parentSubId);
}
@Override
@@ -490,6 +518,8 @@ public class SubscriptionInfo implements Parcelable {
dest.writeBoolean(mIsEmbedded);
dest.writeTypedArray(mAccessRules, flags);
dest.writeString(mCardId);
+ dest.writeBoolean(mIsOpportunistic);
+ dest.writeInt(mParentSubId);
}
@Override
@@ -522,6 +552,7 @@ public class SubscriptionInfo implements Parcelable {
+ " dataRoaming=" + mDataRoaming + " iconBitmap=" + mIconBitmap + " mcc " + mMcc
+ " mnc " + mMnc + " isEmbedded " + mIsEmbedded
+ " accessRules " + Arrays.toString(mAccessRules)
- + " cardId=" + cardIdToPrint + "}";
+ + " cardId=" + cardIdToPrint + " isOpportunistic " + mIsOpportunistic
+ + " parentSubId=" + mParentSubId + "}";
}
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 8aa5bf659be2..151b936604fd 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -29,6 +29,7 @@ import android.annotation.SuppressAutoDoc;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.app.BroadcastOptions;
+import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
@@ -43,6 +44,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.telephony.euicc.EuiccManager;
import android.util.DisplayMetrics;
import com.android.internal.telephony.IOnSubscriptionsChangedListener;
@@ -433,6 +435,24 @@ public class SubscriptionManager {
public static final String WFC_IMS_ROAMING_ENABLED = "wfc_ims_roaming_enabled";
/**
+ * TelephonyProvider column name for whether a subscription is opportunistic, that is,
+ * whether the network it connects to is limited in functionality or coverage.
+ * For example, CBRS.
+ * IS_EMBEDDED should always be true.
+ * <p>Type: INTEGER (int), 1 for opportunistic or 0 for non-opportunistic.
+ * @hide
+ */
+ public static final String IS_OPPORTUNISTIC = "is_opportunistic";
+
+ /**
+ * TelephonyProvider column name for subId of parent subscription of an opportunistic
+ * subscription.
+ * if the parent sub id is valid, then is_opportunistic should always to true.
+ * @hide
+ */
+ public static final String PARENT_SUB_ID = "parent_sub_id";
+
+ /**
* Broadcast Action: The user has changed one of the default subs related to
* data, phone calls, or sms</p>
*
@@ -1940,6 +1960,91 @@ public class SubscriptionManager {
return false;
}
+ /**
+ * Set preferred default data.
+ * Set on which slot default data will be on.
+ *
+ * @param slotId which slot is preferred to for cellular data.
+ * @hide
+ *
+ */
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ public void setPreferredData(int slotId) {
+ if (VDBG) logd("[setPreferredData]+ slotId:" + slotId);
+ setSubscriptionPropertyHelper(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
+ "setPreferredData", (iSub)-> iSub.setPreferredData(slotId));
+ }
+
+ /**
+ * Get User downloaded Profiles.
+ *
+ * Provide all available user downloaded profile on the phone.
+ * @param slotId on which phone the switch will operate on
+ */
+ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ List<SubscriptionInfo> getOpportunisticSubscriptions(int slotId) {
+ String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
+ List<SubscriptionInfo> subInfoList = null;
+
+ try {
+ ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
+ if (iSub != null) {
+ subInfoList = iSub.getOpportunisticSubscriptions(slotId, pkgForDebug);
+ }
+ } catch (RemoteException ex) {
+ // ignore it
+ }
+
+ if (subInfoList == null) {
+ subInfoList = new ArrayList<>();
+ }
+
+ return subInfoList;
+ }
+
+ /**
+ * Switch to a certain subscription
+ *
+ * @param subId sub id
+ * @param callbackIntent pending intent that will be sent after operation is done.
+ */
+ @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
+ public void switchToSubscription(int subId, PendingIntent callbackIntent) {
+ EuiccManager euiccManager = new EuiccManager(mContext);
+ euiccManager.switchToSubscription(subId, callbackIntent);
+ }
+
+ /**
+ * Set opportunistic by simInfo index
+ *
+ * @param opportunistic whether it’s opportunistic subscription.
+ * @param subId the unique SubscriptionInfo index in database
+ * @return the number of records updated
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ public int setOpportunistic(boolean opportunistic, int subId) {
+ if (VDBG) logd("[setOpportunistic]+ opportunistic:" + opportunistic + " subId:" + subId);
+ return setSubscriptionPropertyHelper(subId, "setOpportunistic",
+ (iSub)-> iSub.setOpportunistic(opportunistic, subId));
+ }
+
+ /**
+ * Set parent subId by simInfo index
+ *
+ * @param parentSubId subId of its parent subscription.
+ * @param subId the unique SubscriptionInfo index in database
+ * @return the number of records updated
+ * @hide
+ *
+ */
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ public int setParentSubId(int parentSubId, int subId) {
+ if (VDBG) logd("[setParentSubId]+ parentSubId:" + parentSubId + " subId:" + subId);
+ return setSubscriptionPropertyHelper(subId, "parentSubId",
+ (iSub)-> iSub.setParentSubId(parentSubId, subId));
+ }
+
private interface CallISubMethodHelper {
int callMethod(ISub iSub) throws RemoteException;
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index b2eb5e03db31..ae3f7a27e15b 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -1544,7 +1544,7 @@ public class TelephonyManager {
* @return List of NeighboringCellInfo or null if info unavailable.
*
* @deprecated Use {@link #getAllCellInfo} which returns a superset of the information
- * from NeighboringCellInfo.
+ * from NeighboringCellInfo, including LTE cell information.
*/
@Deprecated
@RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
@@ -6648,14 +6648,12 @@ public class TelephonyManager {
@Deprecated
public boolean isTtyModeSupported() {
try {
- ITelephony telephony = getITelephony();
- if (telephony != null) {
- return telephony.isTtyModeSupported();
+ TelecomManager telecomManager = TelecomManager.from(mContext);
+ if (telecomManager != null) {
+ return telecomManager.isTtySupported();
}
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling ITelephony#isTtyModeSupported", e);
} catch (SecurityException e) {
- Log.e(TAG, "Permission error calling ITelephony#isTtyModeSupported", e);
+ Log.e(TAG, "Permission error calling TelecomManager#isTtySupported", e);
}
return false;
}
diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java
index 81f2fe7f4ed8..662cc7a652ad 100644
--- a/telephony/java/android/telephony/ims/ImsReasonInfo.java
+++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java
@@ -163,6 +163,8 @@ public final class ImsReasonInfo implements Parcelable {
public static final int CODE_SIP_NOT_REACHABLE = 341;
// Others
public static final int CODE_SIP_CLIENT_ERROR = 342;
+ // 481 Transaction Does Not Exist
+ public static final int CODE_SIP_TRANSACTION_DOES_NOT_EXIST = 343;
// 5xx responses
// 501 : Server Internal Error
public static final int CODE_SIP_SERVER_INTERNAL_ERROR = 351;
diff --git a/telephony/java/android/telephony/ims/ImsSsInfo.java b/telephony/java/android/telephony/ims/ImsSsInfo.java
index c6f8622f3fd9..e924a2521617 100644
--- a/telephony/java/android/telephony/ims/ImsSsInfo.java
+++ b/telephony/java/android/telephony/ims/ImsSsInfo.java
@@ -16,10 +16,14 @@
package android.telephony.ims;
+import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Provides the result to the update operation for the supplementary service configuration.
*
@@ -34,6 +38,30 @@ public final class ImsSsInfo implements Parcelable {
public static final int DISABLED = 0;
public static final int ENABLED = 1;
+ /**
+ * Provision status of service
+ */
+ /** @hide */
+ @IntDef({
+ SERVICE_PROVISIONING_UNKNOWN,
+ SERVICE_NOT_PROVISIONED,
+ SERVICE_PROVISIONED
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ServiceProvisionStatus {}
+ /**
+ * Unknown provision status for the service.
+ */
+ public static final int SERVICE_PROVISIONING_UNKNOWN = (-1);
+ /**
+ * Service is not provisioned.
+ */
+ public static final int SERVICE_NOT_PROVISIONED = 0;
+ /**
+ * Service is provisioned.
+ */
+ public static final int SERVICE_PROVISIONED = 1;
+
// 0: disabled, 1: enabled
/** @hide */
// TODO: Make private, do not modify this field directly, use getter!
@@ -41,6 +69,8 @@ public final class ImsSsInfo implements Parcelable {
/** @hide */
// TODO: Make private, do not modify this field directly, use getter!
public String mIcbNum;
+ /** @hide */
+ public int mProvisionStatus = SERVICE_PROVISIONING_UNKNOWN;
/**@hide*/
// TODO: Remove! Do not use this constructor, instead use public version.
@@ -74,16 +104,30 @@ public final class ImsSsInfo implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mStatus);
out.writeString(mIcbNum);
+ out.writeInt(mProvisionStatus);
}
@Override
public String toString() {
- return super.toString() + ", Status: " + ((mStatus == 0) ? "disabled" : "enabled");
+ return super.toString() + ", Status: " + ((mStatus == 0) ? "disabled" : "enabled")
+ + ", ProvisionStatus: " + provisionStatusToString(mProvisionStatus);
+ }
+
+ private static String provisionStatusToString(int pStatus) {
+ switch (pStatus) {
+ case SERVICE_NOT_PROVISIONED:
+ return "Service not provisioned";
+ case SERVICE_PROVISIONED:
+ return "Service provisioned";
+ default:
+ return "Service provisioning unknown";
+ }
}
private void readFromParcel(Parcel in) {
mStatus = in.readInt();
mIcbNum = in.readString();
+ mProvisionStatus = in.readInt();
}
public static final Creator<ImsSsInfo> CREATOR =
@@ -112,4 +156,15 @@ public final class ImsSsInfo implements Parcelable {
public String getIcbNum() {
return mIcbNum;
}
+
+ /**
+ * @return Supplementary Service Provision status. Valid Values are:
+ * {@link #SERVICE_PROVISIONING_UNKNOWN},
+ * {@link #SERVICE_NOT_PROVISIONED},
+ * {@link #SERVICE_PROVISIONED}
+ */
+ @ServiceProvisionStatus
+ public int getProvisionStatus() {
+ return mProvisionStatus;
+ }
}
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index 5e015e069f4a..6521f0b41cb2 100755
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -156,6 +156,42 @@ interface ISub {
*/
int setDataRoaming(int roaming, int subId);
+ /**
+ * Switch to a certain subscription
+ *
+ * @param opportunistic whether it’s opportunistic subscription.
+ * @param subId the unique SubscriptionInfo index in database
+ * @return the number of records updated
+ */
+ int setOpportunistic(boolean opportunistic, int subId);
+
+ /**
+ * Set parent subId by simInfo index
+ *
+ * @param parentSubId: subId of its parent subscription.
+ * @param subId the unique SubscriptionInfo index in database
+ * @return the number of records updated
+ */
+ int setParentSubId(int parentSubId, int subId);
+
+ /**
+ * Set preferred default data.
+ * Set on which slot default data will be on.
+ *
+ * @param slotId which slot is preferred to for cellular data.
+ * @hide
+ *
+ */
+ int setPreferredData(int slotId);
+
+ /**
+ * Get User downloaded Profiles.
+ *
+ * Provide all available user downloaded profile on the phone.
+ * @param slotId on which phone the switch will operate on
+ */
+ List<SubscriptionInfo> getOpportunisticSubscriptions(int slotId, String callingPackage);
+
int getSlotIndex(int subId);
int[] getSubId(int slotIndex);
@@ -186,7 +222,7 @@ interface ISub {
int[] getActiveSubIdList();
- void setSubscriptionProperty(int subId, String propKey, String propValue);
+ int setSubscriptionProperty(int subId, String propKey, String propValue);
String getSubscriptionProperty(int subId, String propKey, String callingPackage);
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index 51369d06bf46..5ecb43ebf112 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -15,7 +15,6 @@
*/
package com.android.internal.telephony;
-import android.content.Intent;
import android.content.Intent;
import android.telephony.SubscriptionManager;
diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp
index 8ebde752bc4b..f4b0124abcda 100644
--- a/tools/aapt2/SdkConstants.cpp
+++ b/tools/aapt2/SdkConstants.cpp
@@ -25,8 +25,8 @@ using android::StringPiece;
namespace aapt {
-static const char* sDevelopmentSdkCodeName = "P";
-static ApiVersion sDevelopmentSdkLevel = 28;
+static const char* sDevelopmentSdkCodeName = "Q";
+static ApiVersion sDevelopmentSdkLevel = 10000;
static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = {
{0x021c, 1},
@@ -54,6 +54,7 @@ static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = {
{0x0530, SDK_NOUGAT_MR1},
{0x0568, SDK_O},
{0x056d, SDK_O_MR1},
+ {0x0586, SDK_P},
};
static bool less_entry_id(const std::pair<uint16_t, ApiVersion>& p, uint16_t entryId) {
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 36b5578d1deb..2ba2cf7926b0 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -288,44 +288,48 @@ static bool CompileTable(IAaptContext* context, const CompileOptions& options,
Printer r_txt_printer(&fout_text);
for (const auto& package : table.packages) {
- for (const auto& type : package->types) {
- for (const auto& entry : type->entries) {
- // Check access modifiers.
- switch(entry->visibility.level) {
- case Visibility::Level::kUndefined :
- r_txt_printer.Print("default ");
- break;
- case Visibility::Level::kPublic :
- r_txt_printer.Print("public ");
- break;
- case Visibility::Level::kPrivate :
- r_txt_printer.Print("private ");
- }
+ // Only print resources defined locally, e.g. don't write android attributes.
+ if (package->name.empty()) {
+ for (const auto& type : package->types) {
+ for (const auto& entry : type->entries) {
+ // Check access modifiers.
+ switch (entry->visibility.level) {
+ case Visibility::Level::kUndefined :
+ r_txt_printer.Print("default ");
+ break;
+ case Visibility::Level::kPublic :
+ r_txt_printer.Print("public ");
+ break;
+ case Visibility::Level::kPrivate :
+ r_txt_printer.Print("private ");
+ }
- if (type->type != ResourceType::kStyleable) {
- r_txt_printer.Print("int ");
- r_txt_printer.Print(to_string(type->type));
- r_txt_printer.Print(" ");
- r_txt_printer.Println(entry->name);
- } else {
- r_txt_printer.Print("int[] styleable ");
- r_txt_printer.Println(entry->name);
-
- if (!entry->values.empty()) {
- auto styleable = static_cast<const Styleable*>(entry->values.front()->value.get());
- for (const auto& attr : styleable->entries) {
- // The visibility of the children under the styleable does not matter as they are
- // nested under their parent and use its visibility.
- r_txt_printer.Print("default int styleable ");
- r_txt_printer.Print(entry->name);
- // If the package name is present, also include it in the mangled name (e.g.
- // "android")
- if (!attr.name.value().package.empty()) {
+ if (type->type != ResourceType::kStyleable) {
+ r_txt_printer.Print("int ");
+ r_txt_printer.Print(to_string(type->type));
+ r_txt_printer.Print(" ");
+ r_txt_printer.Println(entry->name);
+ } else {
+ r_txt_printer.Print("int[] styleable ");
+ r_txt_printer.Println(entry->name);
+
+ if (!entry->values.empty()) {
+ auto styleable =
+ static_cast<const Styleable*>(entry->values.front()->value.get());
+ for (const auto& attr : styleable->entries) {
+ // The visibility of the children under the styleable does not matter as they are
+ // nested under their parent and use its visibility.
+ r_txt_printer.Print("default int styleable ");
+ r_txt_printer.Print(entry->name);
+ // If the package name is present, also include it in the mangled name (e.g.
+ // "android")
+ if (!attr.name.value().package.empty()) {
+ r_txt_printer.Print("_");
+ r_txt_printer.Print(MakePackageSafeName(attr.name.value().package));
+ }
r_txt_printer.Print("_");
- r_txt_printer.Print(MakePackageSafeName(attr.name.value().package));
+ r_txt_printer.Println(attr.name.value().entry);
}
- r_txt_printer.Print("_");
- r_txt_printer.Println(attr.name.value().entry);
}
}
}
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index c94b8473ea87..119f56a5013c 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -470,6 +470,10 @@ ResourceFile::Type XmlFileTypeForOutputFormat(OutputFormat format) {
return ResourceFile::Type::kUnknown;
}
+static auto kDrawableVersions = std::map<std::string, ApiVersion>{
+ { "adaptive-icon" , SDK_O },
+};
+
bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archive_writer) {
bool error = false;
std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> config_sorted_files;
@@ -567,6 +571,20 @@ bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archiv
FileOperation& file_op = map_entry.second;
if (file_op.xml_to_flatten) {
+ // Check minimum sdk versions supported for drawables
+ auto drawable_entry = kDrawableVersions.find(file_op.xml_to_flatten->root->name);
+ if (drawable_entry != kDrawableVersions.end()) {
+ if (drawable_entry->second > context_->GetMinSdkVersion()
+ && drawable_entry->second > config.sdkVersion) {
+ context_->GetDiagnostics()->Error(DiagMessage(file_op.xml_to_flatten->file.source)
+ << "<" << drawable_entry->first << "> elements "
+ << "require a sdk version of at least "
+ << (int16_t) drawable_entry->second);
+ error = true;
+ continue;
+ }
+ }
+
std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
LinkAndVersionXmlFile(table, &file_op);
if (versioned_docs.empty()) {
diff --git a/tools/aapt2/configuration/ConfigurationParser_test.cpp b/tools/aapt2/configuration/ConfigurationParser_test.cpp
index febbb2ed11a0..ccaea4e2a771 100644
--- a/tools/aapt2/configuration/ConfigurationParser_test.cpp
+++ b/tools/aapt2/configuration/ConfigurationParser_test.cpp
@@ -703,35 +703,24 @@ TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_InvalidVersion) {
}
TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) {
- static constexpr const char* xml = R"xml(
+ auto doc = test::BuildXmlDom(R"xml(
<android-sdk
- label="P"
+ label="Q"
minSdkVersion="25"
- targetSdkVersion="%s"
- maxSdkVersion="%s">
- </android-sdk>)xml";
-
- const auto& dev_sdk = GetDevelopmentSdkCodeNameAndVersion();
- const char* codename = dev_sdk.first.data();
- const ApiVersion& version = dev_sdk.second;
-
- auto doc = test::BuildXmlDom(StringPrintf(xml, codename, codename));
+ targetSdkVersion="Q"
+ maxSdkVersion="Q">
+ </android-sdk>)xml");
PostProcessingConfiguration config;
- bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
- ASSERT_TRUE(ok);
-
+ ASSERT_TRUE(AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_));
ASSERT_EQ(1ul, config.android_sdks.size());
- ASSERT_EQ(1u, config.android_sdks.count("P"));
-
- auto& out = config.android_sdks["P"];
+ ASSERT_EQ(1u, config.android_sdks.count("Q"));
AndroidSdk sdk;
sdk.min_sdk_version = 25;
- sdk.target_sdk_version = version;
- sdk.max_sdk_version = version;
-
- ASSERT_EQ(sdk, out);
+ sdk.target_sdk_version = 10000;
+ sdk.max_sdk_version = 10000;
+ ASSERT_EQ(sdk, config.android_sdks["Q"]);
}
TEST_F(ConfigurationParserTest, GlTextureGroupAction) {