summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk1
-rw-r--r--api/test-current.txt1
-rw-r--r--cmds/bootanimation/BootAnimationUtil.cpp2
-rw-r--r--cmds/bootanimation/bootanimation_main.cpp2
-rw-r--r--core/java/android/accounts/AbstractAccountAuthenticator.java13
-rw-r--r--core/java/android/accounts/AccountManager.java7
-rw-r--r--core/java/android/app/ActivityThread.java23
-rw-r--r--core/java/android/app/ContextImpl.java11
-rw-r--r--core/java/android/app/NotificationChannel.java12
-rw-r--r--core/java/android/app/admin/DeviceAdminReceiver.java6
-rw-r--r--core/java/android/content/res/ResourcesImpl.java97
-rw-r--r--core/java/android/hardware/SensorManager.java7
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java30
-rw-r--r--core/java/android/hardware/location/NanoApp.java4
-rw-r--r--core/java/android/net/ITetheringStatsProvider.aidl33
-rw-r--r--core/java/android/os/Debug.java71
-rw-r--r--core/java/android/os/INetworkManagementService.aidl13
-rw-r--r--core/java/android/os/RecoverySystem.java4
-rw-r--r--core/java/android/security/IKeystoreService.aidl2
-rw-r--r--core/java/android/text/TextLine.java103
-rw-r--r--core/java/android/text/format/Formatter.java251
-rw-r--r--core/java/android/view/View.java1
-rw-r--r--core/java/android/view/ViewConfiguration.java5
-rw-r--r--core/java/android/view/ViewRootImpl.java6
-rw-r--r--core/java/android/webkit/WebViewClient.java18
-rw-r--r--core/java/android/widget/Editor.java6
-rw-r--r--core/java/android/widget/RelativeLayout.java2
-rw-r--r--core/java/android/widget/SelectionActionModeHelper.java23
-rw-r--r--core/java/android/widget/TextInputTimePickerView.java4
-rw-r--r--core/java/android/widget/TextView.java8
-rw-r--r--core/java/com/android/internal/app/ResolverComparator.java11
-rw-r--r--core/java/com/android/internal/colorextraction/ColorExtractor.java2
-rw-r--r--core/java/com/android/internal/colorextraction/types/Tonal.java587
-rw-r--r--core/java/com/android/internal/util/CollectionUtils.java106
-rw-r--r--core/java/com/android/internal/util/FunctionalUtils.java11
-rw-r--r--core/java/com/android/internal/view/FloatingActionMode.java13
-rw-r--r--core/java/com/android/server/BootReceiver.java1
-rw-r--r--core/jni/android/graphics/Paint.cpp12
-rw-r--r--core/jni/android_os_Debug.cpp56
-rw-r--r--core/res/AndroidManifest.xml5
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.pngbin1367 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.pngbin1368 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.pngbin1363 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.pngbin1378 -> 337 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.pngbin1379 -> 340 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.pngbin1378 -> 346 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.pngbin1392 -> 343 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.pngbin1291 -> 323 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.pngbin1319 -> 321 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.pngbin1336 -> 329 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.pngbin1356 -> 349 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.pngbin1353 -> 366 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.pngbin1417 -> 356 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.pngbin1463 -> 366 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.pngbin1421 -> 333 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.pngbin1463 -> 351 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.pngbin1501 -> 358 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.pngbin1541 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.pngbin1551 -> 364 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.pngbin1547 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.pngbin1578 -> 367 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.pngbin1555 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.pngbin1578 -> 366 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.pngbin1566 -> 359 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.pngbin1564 -> 370 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.pngbin1557 -> 370 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.pngbin1519 -> 367 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.pngbin1530 -> 367 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.pngbin1528 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.pngbin1517 -> 371 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.pngbin1524 -> 372 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.pngbin1336 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.pngbin1336 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.pngbin1337 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.pngbin1347 -> 337 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.pngbin1355 -> 340 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.pngbin0 -> 346 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.pngbin1368 -> 349 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.pngbin1254 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.pngbin1291 -> 336 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.pngbin1312 -> 329 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.pngbin1322 -> 353 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.pngbin0 -> 366 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.pngbin1388 -> 361 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.pngbin1442 -> 376 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.pngbin1389 -> 344 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.pngbin1433 -> 351 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.pngbin1466 -> 349 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.pngbin0 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.pngbin1514 -> 364 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.pngbin1527 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.pngbin1553 -> 367 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.pngbin1530 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.pngbin1540 -> 366 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.pngbin0 -> 359 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.pngbin1537 -> 370 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.pngbin1535 -> 370 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.pngbin1500 -> 367 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.pngbin1501 -> 367 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.pngbin1498 -> 373 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.pngbin0 -> 371 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.pngbin1492 -> 372 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.pngbin1367 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.pngbin1368 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.pngbin1363 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.pngbin1378 -> 337 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.pngbin1379 -> 340 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.pngbin1378 -> 346 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.pngbin1392 -> 343 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.pngbin1291 -> 316 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.pngbin1319 -> 321 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.pngbin1336 -> 329 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.pngbin1356 -> 353 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.pngbin1344 -> 336 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.pngbin1365 -> 339 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.pngbin1378 -> 342 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.pngbin1292 -> 318 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.pngbin1326 -> 321 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.pngbin1325 -> 324 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.pngbin1334 -> 328 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.pngbin1340 -> 336 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.pngbin1353 -> 335 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.pngbin1376 -> 333 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.pngbin1348 -> 340 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.pngbin1368 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.pngbin1358 -> 333 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.pngbin1356 -> 328 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.pngbin1363 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.pngbin1356 -> 337 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.pngbin1368 -> 327 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.pngbin1358 -> 331 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.pngbin1362 -> 328 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.pngbin1367 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.pngbin1336 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.pngbin1336 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.pngbin1337 -> 332 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.pngbin1347 -> 337 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.pngbin1355 -> 340 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.pngbin1344 -> 346 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.pngbin1368 -> 349 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.pngbin1254 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.pngbin1291 -> 336 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.pngbin1312 -> 329 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.pngbin1322 -> 353 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.pngbin1320 -> 336 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.pngbin1339 -> 338 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.pngbin1362 -> 348 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.pngbin1271 -> 312 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.pngbin1296 -> 321 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.pngbin1295 -> 324 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.pngbin1307 -> 328 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.pngbin1317 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.pngbin1325 -> 335 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.pngbin1344 -> 330 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.pngbin1324 -> 340 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.pngbin1338 -> 356 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.pngbin1330 -> 333 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.pngbin1339 -> 346 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.pngbin1338 -> 354 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.pngbin1335 -> 338 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.pngbin1340 -> 327 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.pngbin1332 -> 331 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.pngbin1332 -> 328 bytes
-rw-r--r--core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.pngbin1336 -> 330 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.pngbin942 -> 274 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.pngbin948 -> 273 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.pngbin939 -> 272 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.pngbin937 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.pngbin946 -> 274 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.pngbin956 -> 273 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.pngbin955 -> 274 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.pngbin937 -> 252 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.pngbin940 -> 263 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.pngbin964 -> 262 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.pngbin965 -> 268 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.pngbin945 -> 260 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.pngbin981 -> 290 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.pngbin1013 -> 295 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.pngbin999 -> 283 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.pngbin1032 -> 288 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.pngbin1054 -> 288 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.pngbin1061 -> 292 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.pngbin1058 -> 289 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.pngbin1067 -> 295 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.pngbin1069 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.pngbin1069 -> 299 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.pngbin1063 -> 302 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.pngbin1064 -> 304 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.pngbin1055 -> 301 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.pngbin1045 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.pngbin1045 -> 299 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.pngbin1034 -> 286 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.pngbin1039 -> 290 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.pngbin1027 -> 300 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.pngbin1028 -> 299 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.pngbin934 -> 267 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.pngbin931 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.pngbin926 -> 269 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.pngbin924 -> 256 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.pngbin926 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.pngbin0 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.pngbin939 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.pngbin921 -> 249 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.pngbin925 -> 259 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.pngbin949 -> 254 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.pngbin938 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.pngbin0 -> 255 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.pngbin967 -> 286 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.pngbin993 -> 288 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.pngbin983 -> 273 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.pngbin1016 -> 282 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.pngbin1032 -> 281 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.pngbin0 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.pngbin1036 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.pngbin1048 -> 299 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.pngbin1042 -> 292 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.pngbin1052 -> 291 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.pngbin1040 -> 293 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.pngbin0 -> 298 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.pngbin1029 -> 300 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.pngbin1021 -> 299 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.pngbin1019 -> 294 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.pngbin1009 -> 290 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.pngbin1018 -> 290 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.pngbin0 -> 291 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.pngbin1001 -> 288 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.pngbin942 -> 274 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.pngbin948 -> 273 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.pngbin939 -> 272 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.pngbin937 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.pngbin946 -> 274 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.pngbin956 -> 273 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.pngbin955 -> 274 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.pngbin937 -> 252 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.pngbin940 -> 263 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.pngbin964 -> 262 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.pngbin965 -> 268 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.pngbin945 -> 258 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.pngbin962 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.pngbin965 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.pngbin938 -> 255 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.pngbin946 -> 267 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.pngbin952 -> 268 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.pngbin953 -> 270 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.pngbin952 -> 267 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.pngbin958 -> 275 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.pngbin946 -> 267 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.pngbin945 -> 267 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.pngbin951 -> 281 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.pngbin952 -> 271 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.pngbin949 -> 270 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.pngbin939 -> 272 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.pngbin951 -> 266 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.pngbin943 -> 278 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.pngbin944 -> 275 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.pngbin943 -> 281 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.pngbin942 -> 274 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.pngbin934 -> 267 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.pngbin931 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.pngbin926 -> 269 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.pngbin924 -> 256 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.pngbin926 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.pngbin936 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.pngbin939 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.pngbin921 -> 249 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.pngbin925 -> 259 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.pngbin949 -> 254 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.pngbin938 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.pngbin940 -> 256 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.pngbin951 -> 261 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.pngbin947 -> 263 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.pngbin921 -> 250 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.pngbin931 -> 263 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.pngbin937 -> 263 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.pngbin940 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.pngbin937 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.pngbin944 -> 271 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.pngbin934 -> 261 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.pngbin937 -> 259 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.pngbin936 -> 270 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.pngbin940 -> 270 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.pngbin936 -> 272 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.pngbin931 -> 264 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.pngbin932 -> 262 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.pngbin929 -> 262 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.pngbin936 -> 261 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.pngbin930 -> 265 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.pngbin934 -> 267 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.pngbin1772 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.pngbin1779 -> 407 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.pngbin1789 -> 415 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.pngbin1769 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.pngbin1804 -> 421 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.pngbin1820 -> 422 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.pngbin1812 -> 429 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.pngbin1654 -> 375 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.pngbin1695 -> 395 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.pngbin1730 -> 396 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.pngbin1772 -> 413 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.pngbin1771 -> 446 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.pngbin1869 -> 454 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.pngbin1945 -> 463 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.pngbin1849 -> 453 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.pngbin1910 -> 436 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.pngbin1958 -> 440 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.pngbin1997 -> 442 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.pngbin2016 -> 460 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.pngbin2036 -> 446 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.pngbin2069 -> 451 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.pngbin2058 -> 453 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.pngbin2062 -> 448 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.pngbin2074 -> 462 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.pngbin2055 -> 463 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.pngbin2059 -> 451 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.pngbin2029 -> 457 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.pngbin2022 -> 472 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.pngbin2011 -> 458 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.pngbin1998 -> 443 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.pngbin1999 -> 450 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.pngbin1748 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.pngbin1753 -> 406 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.pngbin1765 -> 415 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.pngbin1750 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.pngbin1770 -> 421 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.pngbin0 -> 422 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.pngbin1789 -> 418 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.pngbin1601 -> 375 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.pngbin1659 -> 395 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.pngbin1691 -> 396 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.pngbin1741 -> 413 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.pngbin0 -> 446 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.pngbin1836 -> 461 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.pngbin1911 -> 466 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.pngbin1822 -> 451 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.pngbin1873 -> 436 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.pngbin1929 -> 439 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.pngbin0 -> 442 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.pngbin1981 -> 462 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.pngbin1991 -> 446 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.pngbin2026 -> 451 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.pngbin2016 -> 449 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.pngbin2028 -> 448 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.pngbin0 -> 462 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.pngbin2021 -> 463 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.pngbin2015 -> 450 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.pngbin1986 -> 457 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.pngbin1980 -> 449 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.pngbin1978 -> 448 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.pngbin0 -> 443 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.pngbin1945 -> 454 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.pngbin1772 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.pngbin1779 -> 407 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.pngbin1789 -> 415 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.pngbin1769 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.pngbin1804 -> 421 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.pngbin1820 -> 422 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.pngbin1812 -> 429 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.pngbin1654 -> 375 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.pngbin1695 -> 395 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.pngbin1730 -> 396 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.pngbin1772 -> 413 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.pngbin1753 -> 419 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.pngbin1779 -> 428 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.pngbin1818 -> 420 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.pngbin1683 -> 400 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.pngbin1700 -> 405 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.pngbin1712 -> 403 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.pngbin1729 -> 408 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.pngbin1745 -> 403 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.pngbin1755 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.pngbin1783 -> 410 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.pngbin1758 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.pngbin1772 -> 399 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.pngbin1796 -> 414 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.pngbin1784 -> 411 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.pngbin1788 -> 406 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.pngbin1781 -> 403 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.pngbin1776 -> 399 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.pngbin1790 -> 405 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.pngbin1769 -> 412 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.pngbin1772 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.pngbin1748 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.pngbin1753 -> 406 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.pngbin1765 -> 415 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.pngbin1750 -> 401 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.pngbin1770 -> 421 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.pngbin1779 -> 426 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.pngbin1789 -> 418 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.pngbin1601 -> 375 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.pngbin1659 -> 395 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.pngbin1691 -> 396 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.pngbin1741 -> 413 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.pngbin1727 -> 419 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.pngbin1759 -> 433 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.pngbin1800 -> 417 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.pngbin1652 -> 400 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.pngbin1666 -> 397 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.pngbin1694 -> 403 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.pngbin1695 -> 414 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.pngbin1714 -> 403 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.pngbin1719 -> 410 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.pngbin1732 -> 410 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.pngbin1734 -> 411 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.pngbin1749 -> 399 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.pngbin1757 -> 414 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.pngbin1748 -> 411 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.pngbin1756 -> 406 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.pngbin1738 -> 403 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.pngbin1740 -> 399 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.pngbin1764 -> 407 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.pngbin1736 -> 403 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.pngbin1748 -> 401 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.pngbin2685 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.pngbin2693 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.pngbin2687 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.pngbin2683 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.pngbin2723 -> 561 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.pngbin2687 -> 568 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.pngbin2738 -> 580 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.pngbin2389 -> 504 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.pngbin2439 -> 516 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.pngbin2530 -> 533 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.pngbin2585 -> 547 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.pngbin2672 -> 610 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.pngbin2770 -> 605 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.pngbin2966 -> 635 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.pngbin2684 -> 584 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.pngbin2830 -> 582 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.pngbin2928 -> 592 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.pngbin2993 -> 595 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.pngbin3046 -> 606 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.pngbin3073 -> 610 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.pngbin3094 -> 601 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.pngbin3098 -> 623 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.pngbin3144 -> 617 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.pngbin3147 -> 619 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.pngbin3148 -> 619 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.pngbin3151 -> 610 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.pngbin3117 -> 617 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.pngbin3096 -> 621 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.pngbin3101 -> 621 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.pngbin3073 -> 629 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.pngbin3069 -> 631 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.pngbin2569 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.pngbin2570 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.pngbin2569 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.pngbin2562 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.pngbin2625 -> 561 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.pngbin0 -> 568 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.pngbin2657 -> 580 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.pngbin2286 -> 504 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.pngbin2340 -> 516 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.pngbin2418 -> 533 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.pngbin2505 -> 547 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.pngbin0 -> 605 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.pngbin2644 -> 605 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.pngbin2829 -> 634 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.pngbin2568 -> 603 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.pngbin2692 -> 582 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.pngbin2789 -> 590 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.pngbin0 -> 600 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.pngbin2881 -> 606 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.pngbin2917 -> 610 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.pngbin2949 -> 601 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.pngbin2983 -> 623 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.pngbin2989 -> 617 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.pngbin0 -> 619 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.pngbin2996 -> 617 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.pngbin2989 -> 606 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.pngbin2948 -> 617 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.pngbin2958 -> 621 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.pngbin2937 -> 621 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.pngbin0 -> 622 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.pngbin2941 -> 631 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.pngbin2685 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.pngbin2693 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.pngbin2687 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.pngbin2683 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.pngbin2723 -> 561 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.pngbin2687 -> 568 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.pngbin2738 -> 580 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.pngbin2389 -> 504 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.pngbin2439 -> 516 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.pngbin2530 -> 533 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.pngbin2585 -> 547 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.pngbin2620 -> 568 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.pngbin2621 -> 579 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.pngbin2744 -> 585 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.pngbin2419 -> 519 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.pngbin2470 -> 528 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.pngbin2501 -> 531 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.pngbin2549 -> 546 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.pngbin2571 -> 551 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.pngbin2578 -> 544 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.pngbin2602 -> 537 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.pngbin2598 -> 555 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.pngbin2645 -> 551 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.pngbin2650 -> 543 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.pngbin2646 -> 546 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.pngbin2656 -> 540 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.pngbin2659 -> 547 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.pngbin2675 -> 561 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.pngbin2681 -> 546 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.pngbin2695 -> 562 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.pngbin2685 -> 564 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.pngbin2569 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.pngbin2570 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.pngbin2569 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.pngbin2562 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.pngbin2625 -> 571 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.pngbin2586 -> 579 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.pngbin2657 -> 580 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.pngbin2286 -> 504 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.pngbin2340 -> 516 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.pngbin2418 -> 533 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.pngbin2505 -> 547 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.pngbin2539 -> 568 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.pngbin2526 -> 581 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.pngbin2655 -> 585 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.pngbin2328 -> 519 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.pngbin2374 -> 528 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.pngbin2403 -> 531 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.pngbin2443 -> 537 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.pngbin2461 -> 551 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.pngbin2470 -> 544 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.pngbin2495 -> 537 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.pngbin2501 -> 555 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.pngbin2520 -> 556 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.pngbin2531 -> 543 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.pngbin2521 -> 546 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.pngbin2529 -> 552 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.pngbin2515 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.pngbin2554 -> 561 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.pngbin2561 -> 555 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.pngbin2572 -> 564 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.pngbin2569 -> 557 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.pngbin2259 -> 699 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.pngbin2245 -> 706 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.pngbin2252 -> 704 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.pngbin2283 -> 705 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.pngbin2311 -> 720 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.pngbin2347 -> 733 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.pngbin2474 -> 754 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.pngbin2029 -> 652 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.pngbin2105 -> 663 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.pngbin2191 -> 686 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.pngbin2259 -> 708 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.pngbin2426 -> 710 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.pngbin2592 -> 808 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.pngbin2733 -> 833 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.pngbin2434 -> 727 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.pngbin2478 -> 746 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.pngbin2533 -> 759 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.pngbin2536 -> 757 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.pngbin2559 -> 768 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.pngbin2589 -> 775 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.pngbin2600 -> 781 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.pngbin2616 -> 783 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.pngbin2599 -> 779 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.pngbin2619 -> 774 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.pngbin2613 -> 778 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.pngbin2594 -> 791 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.pngbin2595 -> 796 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.pngbin2602 -> 786 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.pngbin2607 -> 785 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.pngbin2596 -> 785 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.pngbin2604 -> 778 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.pngbin2005 -> 699 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.pngbin2011 -> 706 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.pngbin2029 -> 703 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.pngbin2064 -> 703 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.pngbin2064 -> 718 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.pngbin2067 -> 730 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.pngbin2172 -> 754 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.pngbin1872 -> 652 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.pngbin1928 -> 663 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.pngbin1981 -> 686 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.pngbin2061 -> 708 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.pngbin2213 -> 712 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.pngbin2458 -> 809 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.pngbin2661 -> 820 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.pngbin2361 -> 728 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.pngbin2369 -> 747 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.pngbin2414 -> 761 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.pngbin2422 -> 757 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.pngbin2466 -> 768 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.pngbin2499 -> 775 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.pngbin2509 -> 780 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.pngbin2524 -> 783 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.pngbin2506 -> 779 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.pngbin2528 -> 774 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.pngbin2523 -> 778 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.pngbin2508 -> 790 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.pngbin2501 -> 796 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.pngbin2430 -> 786 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.pngbin2388 -> 785 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.pngbin2345 -> 782 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.pngbin2337 -> 778 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.pngbin2259 -> 699 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.pngbin2245 -> 706 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.pngbin2252 -> 704 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.pngbin2283 -> 705 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.pngbin2311 -> 720 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.pngbin2347 -> 733 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.pngbin2474 -> 754 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.pngbin2029 -> 652 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.pngbin2105 -> 663 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.pngbin2191 -> 686 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.pngbin2259 -> 708 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.pngbin2314 -> 713 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.pngbin2374 -> 734 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.pngbin2458 -> 755 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.pngbin2116 -> 669 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.pngbin2159 -> 676 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.pngbin2187 -> 682 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.pngbin2197 -> 682 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.pngbin2206 -> 687 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.pngbin2215 -> 694 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.pngbin2244 -> 697 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.pngbin2234 -> 698 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.pngbin2242 -> 710 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.pngbin2249 -> 698 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.pngbin2236 -> 700 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.pngbin2226 -> 700 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.pngbin2239 -> 696 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.pngbin2231 -> 706 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.pngbin2255 -> 700 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.pngbin2245 -> 696 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.pngbin2259 -> 699 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.pngbin2005 -> 699 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.pngbin2011 -> 706 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.pngbin2029 -> 703 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.pngbin2064 -> 703 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.pngbin2064 -> 718 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.pngbin2067 -> 730 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.pngbin2172 -> 754 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.pngbin1872 -> 652 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.pngbin1928 -> 663 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.pngbin1981 -> 686 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.pngbin2061 -> 708 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.pngbin2062 -> 713 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.pngbin2114 -> 734 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.pngbin2244 -> 764 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.pngbin1938 -> 669 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.pngbin1946 -> 675 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.pngbin1978 -> 683 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.pngbin1970 -> 682 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.pngbin2015 -> 687 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.pngbin1998 -> 699 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.pngbin2008 -> 697 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.pngbin2001 -> 703 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.pngbin1997 -> 711 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.pngbin2001 -> 698 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.pngbin2006 -> 700 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.pngbin2010 -> 700 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.pngbin1991 -> 703 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.pngbin2001 -> 703 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.pngbin2021 -> 700 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.pngbin2008 -> 697 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.pngbin2005 -> 699 bytes
-rw-r--r--core/res/res/drawable/scrollbar_handle_material.xml3
-rw-r--r--core/res/res/values-bs/strings.xml4
-rw-r--r--core/res/res/values-es/strings.xml6
-rw-r--r--core/res/res/values-eu/strings.xml3
-rw-r--r--core/res/res/values-fr-rCA/strings.xml3
-rw-r--r--core/res/res/values-fr/strings.xml2
-rw-r--r--core/res/res/values-gl/strings.xml3
-rw-r--r--core/res/res/values-hi/strings.xml6
-rw-r--r--core/res/res/values-hy/strings.xml4
-rw-r--r--core/res/res/values-iw/strings.xml3
-rw-r--r--core/res/res/values-lo/strings.xml3
-rw-r--r--core/res/res/values-sl/strings.xml3
-rw-r--r--core/res/res/values-tr/strings.xml3
-rw-r--r--core/res/res/values-zh-rCN/strings.xml5
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/strings.xml20
-rw-r--r--core/res/res/values/symbols.xml6
-rw-r--r--core/res/res/values/themes_material.xml4
-rw-r--r--core/res/res/xml/color_extraction.xml348
-rw-r--r--core/tests/coretests/src/android/widget/TextViewActivityTest.java23
-rw-r--r--core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java53
-rw-r--r--graphics/java/android/graphics/Bitmap.java12
-rw-r--r--graphics/java/android/graphics/Paint.java21
-rw-r--r--keystore/java/android/security/KeyStore.java8
-rw-r--r--legacy-test/jarjar-rules.txt1
-rw-r--r--libs/hwui/hwui/Canvas.cpp21
-rw-r--r--libs/hwui/hwui/Paint.h4
-rw-r--r--packages/BackupRestoreConfirmation/res/values-hy/strings.xml12
-rw-r--r--packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java60
-rw-r--r--packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java22
-rw-r--r--packages/PrintSpooler/res/values-bs/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml14
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java7
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java28
-rw-r--r--packages/Shell/src/com/android/shell/BugreportProgressService.java1
-rw-r--r--packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml2
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml2
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml4
-rw-r--r--packages/SystemUI/res/values-de/strings.xml2
-rw-r--r--packages/SystemUI/res/values-el/strings.xml2
-rw-r--r--packages/SystemUI/res/values-es/strings.xml8
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml3
-rw-r--r--packages/SystemUI/res/values-in/strings.xml2
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SystemUI/res/values/config.xml6
-rw-r--r--packages/SystemUI/res/values/dimens.xml3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java70
-rw-r--r--packages/SystemUI/src/com/android/systemui/ImageWallpaper.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/CellTileView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java21
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java5
-rw-r--r--proto/src/ipconnectivity.proto188
-rw-r--r--proto/src/metrics_constants.proto18
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java3
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/FillUi.java5
-rw-r--r--services/backup/java/com/android/server/backup/BackupPasswordManager.java307
-rw-r--r--services/backup/java/com/android/server/backup/DataChangedJournal.java142
-rw-r--r--services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java262
-rw-r--r--services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java2
-rw-r--r--services/backup/java/com/android/server/backup/internal/BackupHandler.java3
-rw-r--r--services/backup/java/com/android/server/backup/internal/PerformBackupTask.java10
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java4
-rw-r--r--services/backup/java/com/android/server/backup/utils/DataStreamCodec.java40
-rw-r--r--services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java78
-rw-r--r--services/backup/java/com/android/server/backup/utils/PasswordUtils.java3
-rw-r--r--services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java49
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java43
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java65
-rw-r--r--services/core/java/com/android/server/SystemServiceManager.java29
-rw-r--r--services/core/java/com/android/server/TextServicesManagerService.java2
-rw-r--r--services/core/java/com/android/server/Watchdog.java5
-rw-r--r--services/core/java/com/android/server/accounts/AccountManagerService.java22
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java42
-rw-r--r--services/core/java/com/android/server/camera/CameraServiceProxy.java143
-rw-r--r--services/core/java/com/android/server/camera/CameraStatsJobService.java77
-rw-r--r--services/core/java/com/android/server/connectivity/Tethering.java7
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/OffloadController.java102
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java42
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerState.java8
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java3
-rw-r--r--services/core/java/com/android/server/notification/ZenModeFiltering.java7
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java25
-rw-r--r--services/core/jni/com_android_server_VibratorService.cpp10
-rw-r--r--services/core/jni/com_android_server_am_BatteryStatsService.cpp10
-rw-r--r--services/core/jni/com_android_server_power_PowerManagerService.cpp36
-rw-r--r--services/java/com/android/server/SystemServer.java13
-rw-r--r--services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java17
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java232
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java132
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java86
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java55
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java15
-rw-r--r--telephony/java/android/telephony/MbmsDownloadManager.java87
-rw-r--r--telephony/java/android/telephony/MbmsStreamingManager.java44
-rwxr-xr-xtelephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl2
-rw-r--r--telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java2
-rw-r--r--telephony/java/android/telephony/mbms/MbmsException.java125
-rw-r--r--telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java15
-rw-r--r--telephony/java/android/telephony/mbms/MbmsUtils.java5
-rw-r--r--telephony/java/android/telephony/mbms/StreamingService.java53
-rwxr-xr-xtelephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl8
-rwxr-xr-xtelephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl3
-rw-r--r--telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java59
-rw-r--r--telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java17
-rw-r--r--tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java30
-rw-r--r--tests/net/java/com/android/server/connectivity/TetheringTest.java1
-rw-r--r--tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java116
781 files changed, 4042 insertions, 1421 deletions
diff --git a/Android.mk b/Android.mk
index 1a36d185548b..2d8739b5384f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -238,6 +238,7 @@ LOCAL_SRC_FILES += \
core/java/android/net/INetworkScoreService.aidl \
core/java/android/net/INetworkStatsService.aidl \
core/java/android/net/INetworkStatsSession.aidl \
+ core/java/android/net/ITetheringStatsProvider.aidl \
core/java/android/net/nsd/INsdManager.aidl \
core/java/android/nfc/IAppCallback.aidl \
core/java/android/nfc/INfcAdapter.aidl \
diff --git a/api/test-current.txt b/api/test-current.txt
index c2a1231ee2f9..171fa6650dcd 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -46190,6 +46190,7 @@ package android.view {
method public void setFocusable(int);
method public void setFocusableInTouchMode(boolean);
method public void setFocusedByDefault(boolean);
+ method public final void setFocusedInCluster();
method public void setForeground(android.graphics.drawable.Drawable);
method public void setForegroundGravity(int);
method public void setForegroundTintList(android.content.res.ColorStateList);
diff --git a/cmds/bootanimation/BootAnimationUtil.cpp b/cmds/bootanimation/BootAnimationUtil.cpp
index 377d6ce372f2..7718daf61d81 100644
--- a/cmds/bootanimation/BootAnimationUtil.cpp
+++ b/cmds/bootanimation/BootAnimationUtil.cpp
@@ -29,7 +29,7 @@ bool bootAnimationDisabled() {
char value[PROPERTY_VALUE_MAX];
property_get("debug.sf.nobootanimation", value, "0");
if (atoi(value) > 0) {
- return false;
+ return true;
}
property_get("ro.boot.quiescent", value, "0");
diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp
index daac5887a500..8501982d071c 100644
--- a/cmds/bootanimation/bootanimation_main.cpp
+++ b/cmds/bootanimation/bootanimation_main.cpp
@@ -157,8 +157,10 @@ int main()
// create the boot animation object
sp<BootAnimation> boot = new BootAnimation(new AudioAnimationCallbacks());
+ ALOGV("Boot animation set up. Joining pool.");
IPCThreadState::self()->joinThreadPool();
}
+ ALOGV("Boot animation exit");
return 0;
}
diff --git a/core/java/android/accounts/AbstractAccountAuthenticator.java b/core/java/android/accounts/AbstractAccountAuthenticator.java
index 87e512c31bfa..bf9bd79e63ef 100644
--- a/core/java/android/accounts/AbstractAccountAuthenticator.java
+++ b/core/java/android/accounts/AbstractAccountAuthenticator.java
@@ -547,7 +547,9 @@ public abstract class AbstractAccountAuthenticator {
* @param authTokenType the type of auth token to retrieve after adding the account, may be null
* @param requiredFeatures a String array of authenticator-specific features that the added
* account must support, may be null
- * @param options a Bundle of authenticator-specific options, may be null
+ * @param options a Bundle of authenticator-specific options. It always contains
+ * {@link AccountManager#KEY_CALLER_PID} and {@link AccountManager#KEY_CALLER_UID}
+ * fields which will let authenticator know the identity of the caller.
* @return a Bundle result or null if the result is to be returned via the response. The result
* will contain either:
* <ul>
@@ -603,21 +605,24 @@ public abstract class AbstractAccountAuthenticator {
* addition {@link AbstractAccountAuthenticator} implementations that declare themselves
* {@code android:customTokens=true} may also provide a non-negative {@link
* #KEY_CUSTOM_TOKEN_EXPIRY} long value containing the expiration timestamp of the expiration
- * time (in millis since the unix epoch).
+ * time (in millis since the unix epoch), tokens will be cached in memory based on
+ * application's packageName/signature for however long that was specified.
* <p>
* Implementers should assume that tokens will be cached on the basis of account and
* authTokenType. The system may ignore the contents of the supplied options Bundle when
* determining to re-use a cached token. Furthermore, implementers should assume a supplied
* expiration time will be treated as non-binding advice.
* <p>
- * Finally, note that for android:customTokens=false authenticators, tokens are cached
+ * Finally, note that for {@code android:customTokens=false} authenticators, tokens are cached
* indefinitely until some client calls {@link
* AccountManager#invalidateAuthToken(String,String)}.
*
* @param response to send the result back to the AccountManager, will never be null
* @param account the account whose credentials are to be retrieved, will never be null
* @param authTokenType the type of auth token to retrieve, will never be null
- * @param options a Bundle of authenticator-specific options, may be null
+ * @param options a Bundle of authenticator-specific options. It always contains
+ * {@link AccountManager#KEY_CALLER_PID} and {@link AccountManager#KEY_CALLER_UID}
+ * fields which will let authenticator know the identity of the caller.
* @return a Bundle result or null if the result is to be returned via the response.
* @throws NetworkErrorException if the authenticator could not honor the request due to a
* network error
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index a446296fe393..a209d2809ac3 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -242,10 +242,13 @@ public class AccountManager {
public static final String KEY_LAST_AUTHENTICATED_TIME = "lastAuthenticatedTime";
/**
- * Authenticators using 'customTokens' option will also get the UID of the
- * caller
+ * The UID of caller app.
*/
public static final String KEY_CALLER_UID = "callerUid";
+
+ /**
+ * The process id of caller app.
+ */
public static final String KEY_CALLER_PID = "callerPid";
/**
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 3d2e0619af92..21270c50f8f2 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -6423,9 +6423,9 @@ public final class ActivityThread {
private <T> T instantiate(ClassLoader cl, String className, Context c,
Instantiator<T> instantiator)
throws ClassNotFoundException, IllegalAccessException, InstantiationException {
- if (c.getApplicationContext() instanceof Application) {
- T a = instantiator.instantiate((Application) c.getApplicationContext(),
- cl, className);
+ Application app = getApp(c);
+ if (app != null) {
+ T a = instantiator.instantiate(app, cl, className);
if (a != null) return a;
}
return (T) cl.loadClass(className).newInstance();
@@ -6434,14 +6434,25 @@ public final class ActivityThread {
private <T> T instantiate(ClassLoader cl, String className, Intent intent, Context c,
IntentInstantiator<T> instantiator)
throws ClassNotFoundException, IllegalAccessException, InstantiationException {
- if (c.getApplicationContext() instanceof Application) {
- T a = instantiator.instantiate((Application) c.getApplicationContext(),
- cl, className, intent);
+ Application app = getApp(c);
+ if (app != null) {
+ T a = instantiator.instantiate(app, cl, className, intent);
if (a != null) return a;
}
return (T) cl.loadClass(className).newInstance();
}
+ private Application getApp(Context c) {
+ // We need this shortcut to avoid actually calling getApplicationContext() on an Application
+ // because the Application may not return itself for getApplicationContext() because the
+ // API doesn't enforce it.
+ if (c instanceof Application) return (Application) c;
+ if (c.getApplicationContext() instanceof Application) {
+ return (Application) c.getApplicationContext();
+ }
+ return null;
+ }
+
private interface Instantiator<T> {
T instantiate(Application app, ClassLoader cl, String className)
throws ClassNotFoundException, IllegalAccessException, InstantiationException;
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 9c9d6556598c..c48be7705706 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -60,12 +60,10 @@ import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.IStorageManager;
-import android.os.storage.StorageManager;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -621,7 +619,8 @@ class ContextImpl extends Context {
@Override
public File getExternalFilesDir(String type) {
// Operates on primary external storage
- return getExternalFilesDirs(type)[0];
+ final File[] dirs = getExternalFilesDirs(type);
+ return (dirs != null && dirs.length > 0) ? dirs[0] : null;
}
@Override
@@ -638,7 +637,8 @@ class ContextImpl extends Context {
@Override
public File getObbDir() {
// Operates on primary external storage
- return getObbDirs()[0];
+ final File[] dirs = getObbDirs();
+ return (dirs != null && dirs.length > 0) ? dirs[0] : null;
}
@Override
@@ -672,7 +672,8 @@ class ContextImpl extends Context {
@Override
public File getExternalCacheDir() {
// Operates on primary external storage
- return getExternalCacheDirs()[0];
+ final File[] dirs = getExternalCacheDirs();
+ return (dirs != null && dirs.length > 0) ? dirs[0] : null;
}
@Override
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 143d147ab4e7..d6e36914ac6c 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -15,11 +15,6 @@
*/
package android.app;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlSerializer;
-
import android.annotation.SystemApi;
import android.app.NotificationManager.Importance;
import android.content.Intent;
@@ -31,6 +26,11 @@ import android.provider.Settings;
import android.service.notification.NotificationListenerService;
import android.text.TextUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
+
import java.io.IOException;
import java.util.Arrays;
@@ -743,7 +743,7 @@ public final class NotificationChannel implements Parcelable {
private static String longArrayToString(long[] values) {
StringBuffer sb = new StringBuffer();
- if (values != null) {
+ if (values != null && values.length > 0) {
for (int i = 0; i < values.length - 1; i++) {
sb.append(values[i]).append(DELIMITER);
}
diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java
index 5a356d9d4a6d..d0d98c9fb10f 100644
--- a/core/java/android/app/admin/DeviceAdminReceiver.java
+++ b/core/java/android/app/admin/DeviceAdminReceiver.java
@@ -659,13 +659,13 @@ public class DeviceAdminReceiver extends BroadcastReceiver {
* managed provisioning.
*
* <p>When provisioning of a managed profile is complete, the managed profile is hidden until
- * the profile owner calls {DevicePolicyManager#setProfileEnabled(ComponentName admin)}.
+ * the profile owner calls {@link DevicePolicyManager#setProfileEnabled(ComponentName admin)}.
* Typically a profile owner will enable the profile when it has finished any additional setup
- * such as adding an account by using the {@link AccountManager} and calling apis to bring the
+ * such as adding an account by using the {@link AccountManager} and calling APIs to bring the
* profile into the desired state.
*
* <p> Note that provisioning completes without waiting for any server interactions, so the
- * profile owner needs to wait for data to be available if required (e.g. android device ids or
+ * profile owner needs to wait for data to be available if required (e.g. Android device IDs or
* other data that is set as a result of server interactions).
*
* <p>From version {@link android.os.Build.VERSION_CODES#O}, when managed provisioning has
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 23591c7893fb..a8b8c4b5cd43 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -15,9 +15,6 @@
*/
package android.content.res;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.animation.Animator;
import android.animation.StateListAnimator;
import android.annotation.AnyRes;
@@ -32,7 +29,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.Config;
import android.content.res.Configuration.NativeConfig;
import android.content.res.Resources.NotFoundException;
-import android.graphics.FontFamily;
+import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -40,8 +37,9 @@ import android.graphics.drawable.DrawableContainer;
import android.icu.text.PluralRules;
import android.os.Build;
import android.os.LocaleList;
+import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.Trace;
-import android.text.FontConfig;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -51,10 +49,12 @@ import android.util.TypedValue;
import android.util.Xml;
import android.view.DisplayAdjustments;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
-import java.util.List;
import java.util.Locale;
/**
@@ -72,9 +72,20 @@ public class ResourcesImpl {
private static final boolean DEBUG_LOAD = false;
private static final boolean DEBUG_CONFIG = false;
- private static final boolean TRACE_FOR_PRELOAD = false;
- private static final boolean TRACE_FOR_MISS_PRELOAD = false;
+ static final String TAG_PRELOAD = TAG + ".preload";
+
+ private static final boolean TRACE_FOR_PRELOAD = false; // Do we still need it?
+ private static final boolean TRACE_FOR_MISS_PRELOAD = false; // Do we still need it?
+
+ public static final boolean TRACE_FOR_DETAILED_PRELOAD =
+ SystemProperties.getBoolean("debug.trace_resource_preload", false);
+
+ /** Used only when TRACE_FOR_DETAILED_PRELOAD is true. */
+ private static int sPreloadTracingNumLoadedDrawables;
+ private long mPreloadTracingPreloadStartTime;
+ private long mPreloadTracingStartBitmapSize;
+ private long mPreloadTracingStartBitmapCount;
private static final int ID_OTHER = 0x01000004;
@@ -593,6 +604,16 @@ public class ResourcesImpl {
Drawable dr;
boolean needsNewDrawableAfterCache = false;
if (cs != null) {
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ // Log only framework resources
+ if (((id >>> 24) == 0x1) && (android.os.Process.myUid() != 0)) {
+ final String name = getResourceName(id);
+ if (name != null) {
+ Log.d(TAG_PRELOAD, "Hit preloaded FW drawable #"
+ + Integer.toHexString(id) + " " + name);
+ }
+ }
+ }
dr = cs.newDrawable(wrapper);
} else if (isColorDrawable) {
dr = new ColorDrawable(value.data);
@@ -744,6 +765,18 @@ public class ResourcesImpl {
}
}
+ // For prelaod tracing.
+ long startTime = 0;
+ int startBitmapCount = 0;
+ long startBitmapSize = 0;
+ int startDrwableCount = 0;
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ startTime = System.nanoTime();
+ startBitmapCount = Bitmap.sPreloadTracingNumInstantiatedBitmaps;
+ startBitmapSize = Bitmap.sPreloadTracingTotalBitmapsSize;
+ startDrwableCount = sPreloadTracingNumLoadedDrawables;
+ }
+
if (DEBUG_LOAD) {
Log.v(TAG, "Loading drawable for cookie " + value.assetCookie + ": " + file);
}
@@ -772,6 +805,37 @@ public class ResourcesImpl {
}
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ if (((id >>> 24) == 0x1)) {
+ final String name = getResourceName(id);
+ if (name != null) {
+ final long time = System.nanoTime() - startTime;
+ final int loadedBitmapCount =
+ Bitmap.sPreloadTracingNumInstantiatedBitmaps - startBitmapCount;
+ final long loadedBitmapSize =
+ Bitmap.sPreloadTracingTotalBitmapsSize - startBitmapSize;
+ final int loadedDrawables =
+ sPreloadTracingNumLoadedDrawables - startDrwableCount;
+
+ sPreloadTracingNumLoadedDrawables++;
+
+ final boolean isRoot = (android.os.Process.myUid() == 0);
+
+ Log.d(TAG_PRELOAD,
+ (isRoot ? "Preloaded FW drawable #"
+ : "Loaded non-preloaded FW drawable #")
+ + Integer.toHexString(id)
+ + " " + name
+ + " " + file
+ + " " + dr.getClass().getCanonicalName()
+ + " #nested_drawables= " + loadedDrawables
+ + " #bitmaps= " + loadedBitmapCount
+ + " total_bitmap_size= " + loadedBitmapSize
+ + " in[us] " + (time / 1000));
+ }
+ }
+ }
+
return dr;
}
@@ -1102,6 +1166,13 @@ public class ResourcesImpl {
mPreloading = true;
mConfiguration.densityDpi = DisplayMetrics.DENSITY_DEVICE;
updateConfiguration(null, null, null);
+
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ mPreloadTracingPreloadStartTime = SystemClock.uptimeMillis();
+ mPreloadTracingStartBitmapSize = Bitmap.sPreloadTracingTotalBitmapsSize;
+ mPreloadTracingStartBitmapCount = Bitmap.sPreloadTracingNumInstantiatedBitmaps;
+ Log.d(TAG_PRELOAD, "Preload starting");
+ }
}
}
@@ -1111,6 +1182,16 @@ public class ResourcesImpl {
*/
void finishPreloading() {
if (mPreloading) {
+ if (TRACE_FOR_DETAILED_PRELOAD) {
+ final long time = SystemClock.uptimeMillis() - mPreloadTracingPreloadStartTime;
+ final long size =
+ Bitmap.sPreloadTracingTotalBitmapsSize - mPreloadTracingStartBitmapSize;
+ final long count = Bitmap.sPreloadTracingNumInstantiatedBitmaps
+ - mPreloadTracingStartBitmapCount;
+ Log.d(TAG_PRELOAD, "Preload finished, "
+ + count + " bitmaps of " + size + " bytes in " + time + " ms");
+ }
+
mPreloading = false;
flushLayoutCache();
}
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 4bc62b1d04d3..e1cd451ba2a8 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -894,8 +894,9 @@ public abstract class SensorManager {
* to free up resource in sensor system associated with the direct channel.
*
* @param mem A {@link android.os.MemoryFile} shared memory object.
- * @return A {@link android.hardware.SensorDirectChannel} object if successful, null otherwise.
+ * @return A {@link android.hardware.SensorDirectChannel} object.
* @throws NullPointerException when mem is null.
+ * @throws UncheckedIOException if not able to create channel.
* @see SensorDirectChannel#close()
* @see #configureDirectChannel(SensorDirectChannel, Sensor, int)
*/
@@ -916,9 +917,9 @@ public abstract class SensorManager {
* to free up resource in sensor system associated with the direct channel.
*
* @param mem A {@link android.hardware.HardwareBuffer} shared memory object.
- * @return A {@link android.hardware.SensorDirectChannel} object if successful,
- * null otherwise.
+ * @return A {@link android.hardware.SensorDirectChannel} object.
* @throws NullPointerException when mem is null.
+ * @throws UncheckedIOException if not able to create channel.
* @see SensorDirectChannel#close()
* @see #configureDirectChannel(SensorDirectChannel, Sensor, int)
*/
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 1b150bfca63a..90bf896c2225 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -16,28 +16,29 @@
package android.hardware.camera2;
-import android.annotation.RequiresPermission;
-import android.annotation.SystemService;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemService;
import android.content.Context;
-import android.hardware.ICameraService;
-import android.hardware.ICameraServiceListener;
import android.hardware.CameraInfo;
import android.hardware.CameraStatus;
+import android.hardware.ICameraService;
+import android.hardware.ICameraServiceListener;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.legacy.CameraDeviceUserShim;
import android.hardware.camera2.legacy.LegacyMetadataMapper;
-import android.os.IBinder;
import android.os.Binder;
import android.os.DeadObjectException;
import android.os.Handler;
+import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceSpecificException;
-import android.util.Log;
+import android.os.SystemProperties;
import android.util.ArrayMap;
+import android.util.Log;
import java.util.ArrayList;
@@ -210,7 +211,9 @@ public final class CameraManager {
public CameraCharacteristics getCameraCharacteristics(@NonNull String cameraId)
throws CameraAccessException {
CameraCharacteristics characteristics = null;
-
+ if (CameraManagerGlobal.sCameraServiceDisabled) {
+ throw new IllegalArgumentException("No cameras available on device");
+ }
synchronized (mLock) {
/*
* Get the camera characteristics from the camera service directly if it supports it,
@@ -462,6 +465,9 @@ public final class CameraManager {
"Handler argument is null, but no looper exists in the calling thread");
}
}
+ if (CameraManagerGlobal.sCameraServiceDisabled) {
+ throw new IllegalArgumentException("No cameras available on device");
+ }
openCameraDeviceUserAsync(cameraId, callback, handler, clientUid);
}
@@ -507,6 +513,9 @@ public final class CameraManager {
*/
public void setTorchMode(@NonNull String cameraId, boolean enabled)
throws CameraAccessException {
+ if (CameraManagerGlobal.sCameraServiceDisabled) {
+ throw new IllegalArgumentException("No cameras available on device");
+ }
CameraManagerGlobal.get().setTorchMode(cameraId, enabled);
}
@@ -745,6 +754,9 @@ public final class CameraManager {
private CameraManagerGlobal() {
}
+ public static final boolean sCameraServiceDisabled =
+ SystemProperties.getBoolean("config.disable_cameraservice", false);
+
public static CameraManagerGlobal get() {
return gCameraManager;
}
@@ -764,7 +776,7 @@ public final class CameraManager {
public ICameraService getCameraService() {
synchronized(mLock) {
connectCameraServiceLocked();
- if (mCameraService == null) {
+ if (mCameraService == null && !sCameraServiceDisabled) {
Log.e(TAG, "Camera service is unavailable");
}
return mCameraService;
@@ -779,7 +791,7 @@ public final class CameraManager {
*/
private void connectCameraServiceLocked() {
// Only reconnect if necessary
- if (mCameraService != null) return;
+ if (mCameraService != null || sCameraServiceDisabled) return;
Log.i(TAG, "Connecting to camera service");
diff --git a/core/java/android/hardware/location/NanoApp.java b/core/java/android/hardware/location/NanoApp.java
index d5d428e95080..0465defc41ef 100644
--- a/core/java/android/hardware/location/NanoApp.java
+++ b/core/java/android/hardware/location/NanoApp.java
@@ -56,10 +56,10 @@ public class NanoApp {
* {@link #setAppBinary(byte[])} and {@link #setAppId(long)} must be called
* prior to passing this object to any managers.
*
- * @see #NanoApp(int, byte[])
+ * @see #NanoApp(long, byte[])
*/
public NanoApp() {
- this(0, null);
+ this(0L, null);
mAppIdSet = false;
}
diff --git a/core/java/android/net/ITetheringStatsProvider.aidl b/core/java/android/net/ITetheringStatsProvider.aidl
new file mode 100644
index 000000000000..769086da42b4
--- /dev/null
+++ b/core/java/android/net/ITetheringStatsProvider.aidl
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+package android.net;
+
+import android.net.NetworkStats;
+
+/**
+ * Interface that allows NetworkManagementService to query for tethering statistics.
+ *
+ * TODO: this does not really need to be an interface since Tethering runs in the same process
+ * as NetworkManagementService. Consider refactoring Tethering to use direct access to
+ * NetworkManagementService instead of using INetworkManagementService, and then deleting this
+ * interface.
+ *
+ * @hide
+ */
+interface ITetheringStatsProvider {
+ NetworkStats getTetherStats();
+}
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index de5974216f71..b46c6b1620b1 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -223,28 +223,69 @@ public final class Debug
/** @hide */
public static final int OTHER_OTHER_MEMTRACK = 16;
+ // Needs to be declared here for the DVK_STAT ranges below.
+ /** @hide */
+ public static final int NUM_OTHER_STATS = 17;
+
+ // Dalvik subsections.
/** @hide */
public static final int OTHER_DALVIK_NORMAL = 17;
/** @hide */
public static final int OTHER_DALVIK_LARGE = 18;
/** @hide */
- public static final int OTHER_DALVIK_LINEARALLOC = 19;
+ public static final int OTHER_DALVIK_ZYGOTE = 19;
+ /** @hide */
+ public static final int OTHER_DALVIK_NON_MOVING = 20;
+ // Section begins and ends for dumpsys, relative to the DALVIK categories.
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DALVIK_START =
+ OTHER_DALVIK_NORMAL - NUM_OTHER_STATS;
/** @hide */
- public static final int OTHER_DALVIK_ACCOUNTING = 20;
+ public static final int OTHER_DVK_STAT_DALVIK_END =
+ OTHER_DALVIK_NON_MOVING - NUM_OTHER_STATS;
+
+ // Dalvik Other subsections.
+ /** @hide */
+ public static final int OTHER_DALVIK_OTHER_LINEARALLOC = 21;
+ /** @hide */
+ public static final int OTHER_DALVIK_OTHER_ACCOUNTING = 22;
/** @hide */
- public static final int OTHER_DALVIK_CODE_CACHE = 21;
+ public static final int OTHER_DALVIK_OTHER_CODE_CACHE = 23;
/** @hide */
- public static final int OTHER_DALVIK_ZYGOTE = 22;
+ public static final int OTHER_DALVIK_OTHER_COMPILER_METADATA = 24;
/** @hide */
- public static final int OTHER_DALVIK_NON_MOVING = 23;
+ public static final int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE = 25;
/** @hide */
- public static final int OTHER_DALVIK_INDIRECT_REFERENCE_TABLE = 24;
+ public static final int OTHER_DVK_STAT_DALVIK_OTHER_START =
+ OTHER_DALVIK_OTHER_LINEARALLOC - NUM_OTHER_STATS;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DALVIK_OTHER_END =
+ OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE - NUM_OTHER_STATS;
+ // Dex subsections (Boot vdex, App dex, and App vdex).
/** @hide */
- public static final int NUM_OTHER_STATS = 17;
+ public static final int OTHER_DEX_BOOT_VDEX = 26;
+ /** @hide */
+ public static final int OTHER_DEX_APP_DEX = 27;
+ /** @hide */
+ public static final int OTHER_DEX_APP_VDEX = 28;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DEX_START = OTHER_DEX_BOOT_VDEX - NUM_OTHER_STATS;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_DEX_END = OTHER_DEX_APP_VDEX - NUM_OTHER_STATS;
+
+ // Art subsections (App image, boot image).
+ /** @hide */
+ public static final int OTHER_ART_APP = 29;
+ /** @hide */
+ public static final int OTHER_ART_BOOT = 30;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_ART_START = OTHER_ART_APP - NUM_OTHER_STATS;
+ /** @hide */
+ public static final int OTHER_DVK_STAT_ART_END = OTHER_ART_BOOT - NUM_OTHER_STATS;
/** @hide */
- public static final int NUM_DVK_STATS = 8;
+ public static final int NUM_DVK_STATS = 14;
/** @hide */
public static final int NUM_CATEGORIES = 8;
@@ -408,12 +449,18 @@ public final class Debug
case OTHER_OTHER_MEMTRACK: return "Other mtrack";
case OTHER_DALVIK_NORMAL: return ".Heap";
case OTHER_DALVIK_LARGE: return ".LOS";
- case OTHER_DALVIK_LINEARALLOC: return ".LinearAlloc";
- case OTHER_DALVIK_ACCOUNTING: return ".GC";
- case OTHER_DALVIK_CODE_CACHE: return ".JITCache";
case OTHER_DALVIK_ZYGOTE: return ".Zygote";
case OTHER_DALVIK_NON_MOVING: return ".NonMoving";
- case OTHER_DALVIK_INDIRECT_REFERENCE_TABLE: return ".IndirectRef";
+ case OTHER_DALVIK_OTHER_LINEARALLOC: return ".LinearAlloc";
+ case OTHER_DALVIK_OTHER_ACCOUNTING: return ".GC";
+ case OTHER_DALVIK_OTHER_CODE_CACHE: return ".JITCache";
+ case OTHER_DALVIK_OTHER_COMPILER_METADATA: return ".CompilerMetadata";
+ case OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE: return ".IndirectRef";
+ case OTHER_DEX_BOOT_VDEX: return ".Boot vdex";
+ case OTHER_DEX_APP_DEX: return ".App dex";
+ case OTHER_DEX_APP_VDEX: return ".App vdex";
+ case OTHER_ART_APP: return ".App art";
+ case OTHER_ART_BOOT: return ".Boot art";
default: return "????";
}
}
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index 92e78bc8d977..3de217494ac5 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -20,6 +20,7 @@ package android.os;
import android.net.InterfaceConfiguration;
import android.net.INetd;
import android.net.INetworkManagementEventObserver;
+import android.net.ITetheringStatsProvider;
import android.net.Network;
import android.net.NetworkStats;
import android.net.RouteInfo;
@@ -207,6 +208,18 @@ interface INetworkManagementService
void disableNat(String internalInterface, String externalInterface);
/**
+ * Registers a {@code ITetheringStatsProvider} to provide tethering statistics.
+ * All registered providers will be called in order, and their results will be added together.
+ * Netd is always registered as a tethering stats provider.
+ */
+ void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name);
+
+ /**
+ * Unregisters a previously-registered {@code ITetheringStatsProvider}.
+ */
+ void unregisterTetheringStatsProvider(ITetheringStatsProvider provider);
+
+ /**
** PPPD
**/
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 1f8de044b280..7fa1c5acb688 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -751,7 +751,9 @@ public class RecoverySystem {
// Block until the ordered broadcast has completed.
condition.block();
- wipeEuiccData(context, wipeEuicc);
+ // TODO(b/63693573): Uncomment this once the pSIM slot is restored as needed
+ // after the ensuing boot. Currently you end up stuck on the eSIM.
+ // wipeEuiccData(context, wipeEuicc);
String shutdownArg = null;
if (shutdown) {
diff --git a/core/java/android/security/IKeystoreService.aidl b/core/java/android/security/IKeystoreService.aidl
index bfc8636c70a4..42282ac2858b 100644
--- a/core/java/android/security/IKeystoreService.aidl
+++ b/core/java/android/security/IKeystoreService.aidl
@@ -48,7 +48,7 @@ interface IKeystoreService {
byte[] sign(String name, in byte[] data);
int verify(String name, in byte[] data, in byte[] signature);
byte[] get_pubkey(String name);
- int grant(String name, int granteeUid);
+ String grant(String name, int granteeUid);
int ungrant(String name, int granteeUid);
long getmtime(String name, int uid);
int duplicate(String srcKey, int srcUid, String destKey, int destUid);
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 1aaf73e6e12c..2dbff100375a 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -72,8 +72,8 @@ class TextLine {
private final SpanSet<ReplacementSpan> mReplacementSpanSpanSet =
new SpanSet<ReplacementSpan>(ReplacementSpan.class);
- private final UnderlineInfo mUnderlineInfo = new UnderlineInfo();
- private final ArrayList<UnderlineInfo> mUnderlines = new ArrayList();
+ private final DecorationInfo mDecorationInfo = new DecorationInfo();
+ private final ArrayList<DecorationInfo> mDecorations = new ArrayList();
private static final TextLine[] sCached = new TextLine[3];
@@ -704,9 +704,9 @@ class TextLine {
fmi.leading = Math.max(fmi.leading, previousLeading);
}
- private static void drawUnderline(TextPaint wp, Canvas c, int color, float thickness,
- float xleft, float xright, float baseline) {
- final float underlineTop = baseline + wp.baselineShift + wp.getUnderlinePosition();
+ private static void drawStroke(TextPaint wp, Canvas c, int color, float position,
+ float thickness, float xleft, float xright, float baseline) {
+ final float strokeTop = baseline + wp.baselineShift + position;
final int previousColor = wp.getColor();
final Paint.Style previousStyle = wp.getStyle();
@@ -716,7 +716,7 @@ class TextLine {
wp.setAntiAlias(true);
wp.setColor(color);
- c.drawRect(xleft, underlineTop, xright, underlineTop + thickness, wp);
+ c.drawRect(xleft, strokeTop, xright, strokeTop + thickness, wp);
wp.setStyle(previousStyle);
wp.setColor(previousColor);
@@ -750,7 +750,7 @@ class TextLine {
* @param fmi receives metrics information, can be null
* @param needWidth true if the width of the run is needed
* @param offset the offset for the purpose of measuring
- * @param underlines the list of locations and paremeters for drawing underlines
+ * @param decorations the list of locations and paremeters for drawing decorations
* @return the signed width of the run based on the run direction; only
* valid if needWidth is true
*/
@@ -758,7 +758,7 @@ class TextLine {
int contextStart, int contextEnd, boolean runIsRtl,
Canvas c, float x, int top, int y, int bottom,
FontMetricsInt fmi, boolean needWidth, int offset,
- @Nullable ArrayList<UnderlineInfo> underlines) {
+ @Nullable ArrayList<DecorationInfo> decorations) {
wp.setWordSpacing(mAddedWidth);
// Get metrics first (even for empty strings or "0" width runs)
@@ -773,8 +773,8 @@ class TextLine {
float totalWidth = 0;
- final int numUnderlines = underlines == null ? 0 : underlines.size();
- if (needWidth || (c != null && (wp.bgColor != 0 || numUnderlines != 0 || runIsRtl))) {
+ final int numDecorations = decorations == null ? 0 : decorations.size();
+ if (needWidth || (c != null && (wp.bgColor != 0 || numDecorations != 0 || runIsRtl))) {
totalWidth = getRunAdvance(wp, start, end, contextStart, contextEnd, runIsRtl, offset);
}
@@ -800,37 +800,44 @@ class TextLine {
wp.setColor(previousColor);
}
- if (numUnderlines != 0) {
- for (int i = 0; i < numUnderlines; i++) {
- final UnderlineInfo info = underlines.get(i);
-
- final int underlineStart = Math.max(info.start, start);
- final int underlineEnd = Math.min(info.end, offset);
- float underlineStartAdvance = getRunAdvance(
- wp, start, end, contextStart, contextEnd, runIsRtl, underlineStart);
- float underlineEndAdvance = getRunAdvance(
- wp, start, end, contextStart, contextEnd, runIsRtl, underlineEnd);
- final float underlineXLeft, underlineXRight;
+ if (numDecorations != 0) {
+ for (int i = 0; i < numDecorations; i++) {
+ final DecorationInfo info = decorations.get(i);
+
+ final int decorationStart = Math.max(info.start, start);
+ final int decorationEnd = Math.min(info.end, offset);
+ float decorationStartAdvance = getRunAdvance(
+ wp, start, end, contextStart, contextEnd, runIsRtl, decorationStart);
+ float decorationEndAdvance = getRunAdvance(
+ wp, start, end, contextStart, contextEnd, runIsRtl, decorationEnd);
+ final float decorationXLeft, decorationXRight;
if (runIsRtl) {
- underlineXLeft = rightX - underlineEndAdvance;
- underlineXRight = rightX - underlineStartAdvance;
+ decorationXLeft = rightX - decorationEndAdvance;
+ decorationXRight = rightX - decorationStartAdvance;
} else {
- underlineXLeft = leftX + underlineStartAdvance;
- underlineXRight = leftX + underlineEndAdvance;
+ decorationXLeft = leftX + decorationStartAdvance;
+ decorationXRight = leftX + decorationEndAdvance;
}
// Theoretically, there could be cases where both Paint's and TextPaint's
// setUnderLineText() are called. For backward compatibility, we need to draw
// both underlines, the one with custom color first.
if (info.underlineColor != 0) {
- drawUnderline(wp, c, info.underlineColor, info.underlineThickness,
- underlineXLeft, underlineXRight, y);
+ drawStroke(wp, c, info.underlineColor, wp.getUnderlinePosition(),
+ info.underlineThickness, decorationXLeft, decorationXRight, y);
}
if (info.isUnderlineText) {
final float thickness =
Math.max(((Paint) wp).getUnderlineThickness(), 1.0f);
- drawUnderline(wp, c, wp.getColor(), thickness,
- underlineXLeft, underlineXRight, y);
+ drawStroke(wp, c, wp.getColor(), wp.getUnderlinePosition(), thickness,
+ decorationXLeft, decorationXRight, y);
+ }
+
+ if (info.isStrikeThruText) {
+ final float thickness =
+ Math.max(((Paint) wp).getStrikeThruThickness(), 1.0f);
+ drawStroke(wp, c, wp.getColor(), wp.getStrikeThruPosition(), thickness,
+ decorationXLeft, decorationXRight, y);
}
}
}
@@ -919,20 +926,22 @@ class TextLine {
return result;
}
- private static final class UnderlineInfo {
+ private static final class DecorationInfo {
+ public boolean isStrikeThruText;
public boolean isUnderlineText;
public int underlineColor;
public float underlineThickness;
public int start = -1;
public int end = -1;
- public boolean hasUnderline() {
- return isUnderlineText || underlineColor != 0;
+ public boolean hasDecoration() {
+ return isStrikeThruText || isUnderlineText || underlineColor != 0;
}
// Copies the info, but not the start and end range.
- public UnderlineInfo copyInfo() {
- final UnderlineInfo copy = new UnderlineInfo();
+ public DecorationInfo copyInfo() {
+ final DecorationInfo copy = new DecorationInfo();
+ copy.isStrikeThruText = isStrikeThruText;
copy.isUnderlineText = isUnderlineText;
copy.underlineColor = underlineColor;
copy.underlineThickness = underlineThickness;
@@ -940,7 +949,11 @@ class TextLine {
}
}
- private void extractUnderlineInfo(@NonNull TextPaint paint, @NonNull UnderlineInfo info) {
+ private void extractDecorationInfo(@NonNull TextPaint paint, @NonNull DecorationInfo info) {
+ info.isStrikeThruText = paint.isStrikeThruText();
+ if (info.isStrikeThruText) {
+ paint.setStrikeThruText(false);
+ }
info.isUnderlineText = paint.isUnderlineText();
if (info.isUnderlineText) {
paint.setUnderlineText(false);
@@ -1047,8 +1060,8 @@ class TextLine {
activePaint.set(mPaint);
int activeStart = i;
int activeEnd = mlimit;
- final UnderlineInfo underlineInfo = mUnderlineInfo;
- mUnderlines.clear();
+ final DecorationInfo decorationInfo = mDecorationInfo;
+ mDecorations.clear();
for (int j = i, jnext; j < mlimit; j = jnext) {
jnext = mCharacterStyleSpanSet.getNextTransition(mStart + j, mStart + inext) -
mStart;
@@ -1064,7 +1077,7 @@ class TextLine {
span.updateDrawState(wp);
}
- extractUnderlineInfo(wp, underlineInfo);
+ extractDecorationInfo(wp, decorationInfo);
if (j == i) {
// First chunk of text. We can't handle it yet, since we may need to merge it
@@ -1079,24 +1092,24 @@ class TextLine {
activeStart, activeEnd, mPaint.getHyphenEdit()));
x += handleText(activePaint, activeStart, activeEnd, i, inext, runIsRtl, c, x,
top, y, bottom, fmi, needWidth || activeEnd < measureLimit,
- Math.min(activeEnd, mlimit), mUnderlines);
+ Math.min(activeEnd, mlimit), mDecorations);
activeStart = j;
activePaint.set(wp);
- mUnderlines.clear();
+ mDecorations.clear();
} else {
// The present TextPaint is substantially equal to the last TextPaint except
- // perhaps for underlines. We just need to expand the active piece of text to
+ // perhaps for decorations. We just need to expand the active piece of text to
// include the present chunk, which we always do anyway. We don't need to save
// wp to activePaint, since they are already equal.
}
activeEnd = jnext;
- if (underlineInfo.hasUnderline()) {
- final UnderlineInfo copy = underlineInfo.copyInfo();
+ if (decorationInfo.hasDecoration()) {
+ final DecorationInfo copy = decorationInfo.copyInfo();
copy.start = j;
copy.end = jnext;
- mUnderlines.add(copy);
+ mDecorations.add(copy);
}
}
// Handle the final piece of text.
@@ -1104,7 +1117,7 @@ class TextLine {
activeStart, activeEnd, mPaint.getHyphenEdit()));
x += handleText(activePaint, activeStart, activeEnd, i, inext, runIsRtl, c, x,
top, y, bottom, fmi, needWidth || activeEnd < measureLimit,
- Math.min(activeEnd, mlimit), mUnderlines);
+ Math.min(activeEnd, mlimit), mDecorations);
}
return x - originalX;
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index e5bc32bb4f0a..fc56455236a2 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -20,7 +20,11 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
+import android.icu.text.DecimalFormat;
import android.icu.text.MeasureFormat;
+import android.icu.text.NumberFormat;
+import android.icu.text.UnicodeSet;
+import android.icu.text.UnicodeSetSpanner;
import android.icu.util.Measure;
import android.icu.util.MeasureUnit;
import android.net.NetworkUtils;
@@ -28,6 +32,7 @@ import android.text.BidiFormatter;
import android.text.TextUtils;
import android.view.View;
+import java.math.BigDecimal;
import java.util.Locale;
/**
@@ -37,6 +42,8 @@ import java.util.Locale;
public final class Formatter {
/** {@hide} */
+ public static final int FLAG_DEFAULT = 0;
+ /** {@hide} */
public static final int FLAG_SHORTER = 1 << 0;
/** {@hide} */
public static final int FLAG_CALCULATE_ROUNDED = 1 << 1;
@@ -58,7 +65,9 @@ public final class Formatter {
return context.getResources().getConfiguration().getLocales().get(0);
}
- /* Wraps the source string in bidi formatting characters in RTL locales */
+ /**
+ * Wraps the source string in bidi formatting characters in RTL locales.
+ */
private static String bidiWrap(@NonNull Context context, String source) {
final Locale locale = localeFromContext(context);
if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) {
@@ -87,12 +96,7 @@ public final class Formatter {
* @return formatted string with the number
*/
public static String formatFileSize(@Nullable Context context, long sizeBytes) {
- if (context == null) {
- return "";
- }
- final BytesResult res = formatBytes(context.getResources(), sizeBytes, 0);
- return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix,
- res.value, res.units));
+ return formatFileSize(context, sizeBytes, FLAG_DEFAULT);
}
/**
@@ -100,88 +104,191 @@ public final class Formatter {
* (showing fewer digits of precision).
*/
public static String formatShortFileSize(@Nullable Context context, long sizeBytes) {
+ return formatFileSize(context, sizeBytes, FLAG_SHORTER);
+ }
+
+ private static String formatFileSize(@Nullable Context context, long sizeBytes, int flags) {
if (context == null) {
return "";
}
- final BytesResult res = formatBytes(context.getResources(), sizeBytes, FLAG_SHORTER);
- return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix,
- res.value, res.units));
+ final RoundedBytesResult res = RoundedBytesResult.roundBytes(sizeBytes, flags);
+ return bidiWrap(context, formatRoundedBytesResult(context, res));
}
- /** {@hide} */
- public static BytesResult formatBytes(Resources res, long sizeBytes, int flags) {
- final boolean isNegative = (sizeBytes < 0);
- float result = isNegative ? -sizeBytes : sizeBytes;
- int suffix = com.android.internal.R.string.byteShort;
- long mult = 1;
- if (result > 900) {
- suffix = com.android.internal.R.string.kilobyteShort;
- mult = 1000;
- result = result / 1000;
+ private static String getSuffixOverride(@NonNull Resources res, MeasureUnit unit) {
+ if (unit == MeasureUnit.BYTE) {
+ return res.getString(com.android.internal.R.string.byteShort);
+ } else { // unit == PETABYTE
+ return res.getString(com.android.internal.R.string.petabyteShort);
}
- if (result > 900) {
- suffix = com.android.internal.R.string.megabyteShort;
- mult *= 1000;
- result = result / 1000;
+ }
+
+ private static NumberFormat getNumberFormatter(Locale locale, int fractionDigits) {
+ final NumberFormat numberFormatter = NumberFormat.getInstance(locale);
+ numberFormatter.setMinimumFractionDigits(fractionDigits);
+ numberFormatter.setMaximumFractionDigits(fractionDigits);
+ numberFormatter.setGroupingUsed(false);
+ if (numberFormatter instanceof DecimalFormat) {
+ // We do this only for DecimalFormat, since in the general NumberFormat case, calling
+ // setRoundingMode may throw an exception.
+ numberFormatter.setRoundingMode(BigDecimal.ROUND_HALF_UP);
}
- if (result > 900) {
- suffix = com.android.internal.R.string.gigabyteShort;
- mult *= 1000;
- result = result / 1000;
+ return numberFormatter;
+ }
+
+ private static String deleteFirstFromString(String source, String toDelete) {
+ final int location = source.indexOf(toDelete);
+ if (location == -1) {
+ return source;
+ } else {
+ return source.substring(0, location)
+ + source.substring(location + toDelete.length(), source.length());
}
- if (result > 900) {
- suffix = com.android.internal.R.string.terabyteShort;
- mult *= 1000;
- result = result / 1000;
+ }
+
+ private static String formatMeasureShort(Locale locale, NumberFormat numberFormatter,
+ float value, MeasureUnit units) {
+ final MeasureFormat measureFormatter = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT, numberFormatter);
+ return measureFormatter.format(new Measure(value, units));
+ }
+
+ private static final UnicodeSetSpanner SPACES_AND_CONTROLS =
+ new UnicodeSetSpanner(new UnicodeSet("[[:Zs:][:Cf:]]").freeze());
+
+ private static String formatRoundedBytesResult(
+ @NonNull Context context, @NonNull RoundedBytesResult input) {
+ final Locale locale = localeFromContext(context);
+ final NumberFormat numberFormatter = getNumberFormatter(locale, input.fractionDigits);
+ if (input.units == MeasureUnit.BYTE || input.units == PETABYTE) {
+ // ICU spells out "byte" instead of "B", and can't format petabytes yet.
+ final String formattedNumber = numberFormatter.format(input.value);
+ return context.getString(com.android.internal.R.string.fileSizeSuffix,
+ formattedNumber, getSuffixOverride(context.getResources(), input.units));
+ } else {
+ return formatMeasureShort(locale, numberFormatter, input.value, input.units);
}
- if (result > 900) {
- suffix = com.android.internal.R.string.petabyteShort;
- mult *= 1000;
- result = result / 1000;
+ }
+
+ /** {@hide} */
+ public static BytesResult formatBytes(Resources res, long sizeBytes, int flags) {
+ final RoundedBytesResult rounded = RoundedBytesResult.roundBytes(sizeBytes, flags);
+ final Locale locale = res.getConfiguration().getLocales().get(0);
+ final NumberFormat numberFormatter = getNumberFormatter(locale, rounded.fractionDigits);
+ final String formattedNumber = numberFormatter.format(rounded.value);
+ final String units;
+ if (rounded.units == MeasureUnit.BYTE || rounded.units == PETABYTE) {
+ // ICU spells out "byte" instead of "B", and can't format petabytes yet.
+ units = getSuffixOverride(res, rounded.units);
+ } else {
+ // Since ICU does not give us access to the pattern, we need to extract the unit string
+ // from ICU, which we do by taking out the formatted number out of the formatted string
+ // and trimming the result of spaces and controls.
+ final String formattedMeasure = formatMeasureShort(
+ locale, numberFormatter, rounded.value, rounded.units);
+ final String numberRemoved = deleteFirstFromString(formattedMeasure, formattedNumber);
+ units = SPACES_AND_CONTROLS.trim(numberRemoved).toString();
}
- // Note we calculate the rounded long by ourselves, but still let String.format()
- // compute the rounded value. String.format("%f", 0.1) might not return "0.1" due to
- // floating point errors.
- final int roundFactor;
- final String roundFormat;
- if (mult == 1 || result >= 100) {
- roundFactor = 1;
- roundFormat = "%.0f";
- } else if (result < 1) {
- roundFactor = 100;
- roundFormat = "%.2f";
- } else if (result < 10) {
- if ((flags & FLAG_SHORTER) != 0) {
- roundFactor = 10;
- roundFormat = "%.1f";
- } else {
- roundFactor = 100;
- roundFormat = "%.2f";
+ return new BytesResult(formattedNumber, units, rounded.roundedBytes);
+ }
+
+ /**
+ * ICU doesn't support PETABYTE yet. Fake it so that we can treat all units the same way.
+ * {@hide}
+ */
+ public static final MeasureUnit PETABYTE = MeasureUnit.internalGetInstance(
+ "digital", "petabyte");
+
+ /** {@hide} */
+ public static class RoundedBytesResult {
+ public final float value;
+ public final MeasureUnit units;
+ public final int fractionDigits;
+ public final long roundedBytes;
+
+ private RoundedBytesResult(
+ float value, MeasureUnit units, int fractionDigits, long roundedBytes) {
+ this.value = value;
+ this.units = units;
+ this.fractionDigits = fractionDigits;
+ this.roundedBytes = roundedBytes;
+ }
+
+ /**
+ * Returns a RoundedBytesResult object based on the input size in bytes and the rounding
+ * flags. The result can be used for formatting.
+ */
+ public static RoundedBytesResult roundBytes(long sizeBytes, int flags) {
+ final boolean isNegative = (sizeBytes < 0);
+ float result = isNegative ? -sizeBytes : sizeBytes;
+ MeasureUnit units = MeasureUnit.BYTE;
+ long mult = 1;
+ if (result > 900) {
+ units = MeasureUnit.KILOBYTE;
+ mult = 1000;
+ result = result / 1000;
+ }
+ if (result > 900) {
+ units = MeasureUnit.MEGABYTE;
+ mult *= 1000;
+ result = result / 1000;
+ }
+ if (result > 900) {
+ units = MeasureUnit.GIGABYTE;
+ mult *= 1000;
+ result = result / 1000;
+ }
+ if (result > 900) {
+ units = MeasureUnit.TERABYTE;
+ mult *= 1000;
+ result = result / 1000;
}
- } else { // 10 <= result < 100
- if ((flags & FLAG_SHORTER) != 0) {
+ if (result > 900) {
+ units = PETABYTE;
+ mult *= 1000;
+ result = result / 1000;
+ }
+ // Note we calculate the rounded long by ourselves, but still let NumberFormat compute
+ // the rounded value. NumberFormat.format(0.1) might not return "0.1" due to floating
+ // point errors.
+ final int roundFactor;
+ final int roundDigits;
+ if (mult == 1 || result >= 100) {
roundFactor = 1;
- roundFormat = "%.0f";
- } else {
+ roundDigits = 0;
+ } else if (result < 1) {
roundFactor = 100;
- roundFormat = "%.2f";
+ roundDigits = 2;
+ } else if (result < 10) {
+ if ((flags & FLAG_SHORTER) != 0) {
+ roundFactor = 10;
+ roundDigits = 1;
+ } else {
+ roundFactor = 100;
+ roundDigits = 2;
+ }
+ } else { // 10 <= result < 100
+ if ((flags & FLAG_SHORTER) != 0) {
+ roundFactor = 1;
+ roundDigits = 0;
+ } else {
+ roundFactor = 100;
+ roundDigits = 2;
+ }
}
- }
-
- if (isNegative) {
- result = -result;
- }
- final String roundedString = String.format(roundFormat, result);
- // Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like 80PB so
- // it's okay (for now)...
- final long roundedBytes =
- (flags & FLAG_CALCULATE_ROUNDED) == 0 ? 0
- : (((long) Math.round(result * roundFactor)) * mult / roundFactor);
+ if (isNegative) {
+ result = -result;
+ }
- final String units = res.getString(suffix);
+ // Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like
+ // 80PB so it's okay (for now)...
+ final long roundedBytes =
+ (flags & FLAG_CALCULATE_ROUNDED) == 0 ? 0
+ : (((long) Math.round(result * roundFactor)) * mult / roundFactor);
- return new BytesResult(roundedString, units, roundedBytes);
+ return new RoundedBytesResult(result, units, roundDigits, roundedBytes);
+ }
}
/**
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 52251214d611..6af01f66ac6e 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -10180,6 +10180,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @hide
*/
+ @TestApi
public final void setFocusedInCluster() {
setFocusedInCluster(findKeyboardNavigationCluster());
}
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 4def0d02c225..574137b30f1e 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -35,7 +35,7 @@ public class ViewConfiguration {
* Defines the width of the horizontal scrollbar and the height of the vertical scrollbar in
* dips
*/
- private static final int SCROLL_BAR_SIZE = 10;
+ private static final int SCROLL_BAR_SIZE = 4;
/**
* Duration of the fade when scrollbars fade away in milliseconds
@@ -354,7 +354,8 @@ public class ViewConfiguration {
mEdgeSlop = (int) (sizeAndDensity * EDGE_SLOP + 0.5f);
mFadingEdgeLength = (int) (sizeAndDensity * FADING_EDGE_LENGTH + 0.5f);
- mScrollbarSize = (int) (density * SCROLL_BAR_SIZE + 0.5f);
+ mScrollbarSize = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.config_scrollbarSize);
mDoubleTapSlop = (int) (sizeAndDensity * DOUBLE_TAP_SLOP + 0.5f);
mWindowTouchSlop = (int) (sizeAndDensity * WINDOW_TOUCH_SLOP + 0.5f);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index e38a55f76b7d..05f9da5e2867 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -28,7 +28,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
import android.Manifest;
import android.animation.LayoutTransition;
import android.annotation.NonNull;
-import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ResourcesManager;
@@ -214,11 +213,8 @@ public final class ViewRootImpl implements ViewParent,
/**
* Always assign focus if a focusable View is available.
- *
- * @hide
*/
- @TestApi
- public static boolean sAlwaysAssignFocus;
+ private static boolean sAlwaysAssignFocus;
/**
* This list must only be modified by the main thread, so a lock is only needed when changing
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index da064d4d47a1..e7e539c7f01c 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -16,6 +16,7 @@
package android.webkit;
+import android.annotation.IntDef;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Message;
@@ -23,6 +24,9 @@ import android.view.InputEvent;
import android.view.KeyEvent;
import android.view.ViewRootImpl;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
public class WebViewClient {
/**
@@ -237,6 +241,16 @@ public class WebViewClient {
/** Resource load was cancelled by Safe Browsing */
public static final int ERROR_UNSAFE_RESOURCE = -16;
+ /** @hide */
+ @IntDef({
+ SAFE_BROWSING_THREAT_UNKNOWN,
+ SAFE_BROWSING_THREAT_MALWARE,
+ SAFE_BROWSING_THREAT_PHISHING,
+ SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SafeBrowsingThreat {}
+
/** The resource was blocked for an unknown reason */
public static final int SAFE_BROWSING_THREAT_UNKNOWN = 0;
/** The resource was blocked because it contains malware */
@@ -521,8 +535,8 @@ public class WebViewClient {
* SAFE_BROWSING_THREAT_* value.
* @param callback Applications must invoke one of the callback methods.
*/
- public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType,
- SafeBrowsingResponse callback) {
+ public void onSafeBrowsingHit(WebView view, WebResourceRequest request,
+ @SafeBrowsingThreat int threatType, SafeBrowsingResponse callback) {
callback.showInterstitial(/* allowReporting */ true);
}
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index f21545fe8636..04a826514a83 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -1387,7 +1387,7 @@ public class Editor {
if (mTextActionMode != null) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_MOVE:
- hideFloatingToolbar();
+ hideFloatingToolbar(ActionMode.DEFAULT_HIDE_DURATION);
break;
case MotionEvent.ACTION_UP: // fall through
case MotionEvent.ACTION_CANCEL:
@@ -1396,10 +1396,10 @@ public class Editor {
}
}
- private void hideFloatingToolbar() {
+ void hideFloatingToolbar(int duration) {
if (mTextActionMode != null) {
mTextView.removeCallbacks(mShowFloatingToolbar);
- mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION);
+ mTextActionMode.hide(duration);
}
}
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 33e65214996b..75fc53864101 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -486,7 +486,7 @@ public class RelativeLayout extends ViewGroup {
if (targetSdkVersion < Build.VERSION_CODES.KITKAT) {
width = Math.max(width, myWidth - params.mLeft);
} else {
- width = Math.max(width, myWidth - params.mLeft - params.leftMargin);
+ width = Math.max(width, myWidth - params.mLeft + params.leftMargin);
}
} else {
if (targetSdkVersion < Build.VERSION_CODES.KITKAT) {
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 142412ac8ccb..3f4ce4462ad1 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -68,9 +68,7 @@ final class SelectionActionModeHelper {
public void startActionModeAsync(boolean adjustSelection) {
cancelAsyncTask();
- if (isNoOpTextClassifier() || !hasSelection()) {
- // No need to make an async call for a no-op TextClassifier.
- // Do not call the TextClassifier if there is no selection.
+ if (skipTextClassification()) {
startActionMode(null);
} else {
resetTextClassificationHelper(true /* resetSelectionTag */);
@@ -88,9 +86,7 @@ final class SelectionActionModeHelper {
public void invalidateActionModeAsync() {
cancelAsyncTask();
- if (isNoOpTextClassifier() || !hasSelection()) {
- // No need to make an async call for a no-op TextClassifier.
- // Do not call the TextClassifier if there is no selection.
+ if (skipTextClassification()) {
invalidateActionMode(null);
} else {
resetTextClassificationHelper(false /* resetSelectionTag */);
@@ -132,13 +128,16 @@ final class SelectionActionModeHelper {
mTextClassification = null;
}
- private boolean isNoOpTextClassifier() {
- return mEditor.getTextView().getTextClassifier() == TextClassifier.NO_OP;
- }
-
- private boolean hasSelection() {
+ private boolean skipTextClassification() {
final TextView textView = mEditor.getTextView();
- return textView.getSelectionEnd() > textView.getSelectionStart();
+ // No need to make an async call for a no-op TextClassifier.
+ final boolean noOpTextClassifier = textView.getTextClassifier() == TextClassifier.NO_OP;
+ // Do not call the TextClassifier if there is no selection.
+ final boolean noSelection = textView.getSelectionEnd() == textView.getSelectionStart();
+ // Do not call the TextClassifier if this is a password field.
+ final boolean password = textView.hasPasswordTransformationMethod()
+ || TextView.isPasswordInputType(textView.getInputType());
+ return noOpTextClassifier || noSelection || password;
}
private void startActionMode(@Nullable SelectionResult result) {
diff --git a/core/java/android/widget/TextInputTimePickerView.java b/core/java/android/widget/TextInputTimePickerView.java
index 11b7514d6ac8..0cf8faad1c57 100644
--- a/core/java/android/widget/TextInputTimePickerView.java
+++ b/core/java/android/widget/TextInputTimePickerView.java
@@ -17,6 +17,7 @@
package android.widget;
import android.content.Context;
+import android.os.LocaleList;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
@@ -141,6 +142,9 @@ public class TextInputTimePickerView extends RelativeLayout {
new InputFilter.LengthFilter(maxCharLength)});
mMinuteEditText.setFilters(new InputFilter[] {
new InputFilter.LengthFilter(maxCharLength)});
+ final LocaleList locales = mContext.getResources().getConfiguration().getLocales();
+ mHourEditText.setImeHintLocales(locales);
+ mMinuteEditText.setImeHintLocales(locales);
}
boolean validateInput() {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 9a924890fcd7..69edbbba1386 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -374,6 +374,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private static final int KEY_DOWN_HANDLED_BY_KEY_LISTENER = 1;
private static final int KEY_DOWN_HANDLED_BY_MOVEMENT_METHOD = 2;
+ private static final int FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY = 500;
+
// System wide time for last cut, copy or text changed action.
static long sLastCutCopyOrTextChangedTime;
@@ -5674,7 +5676,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return mTransformation instanceof PasswordTransformationMethod;
}
- private static boolean isPasswordInputType(int inputType) {
+ static boolean isPasswordInputType(int inputType) {
final int variation =
inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION);
return variation
@@ -11138,6 +11140,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
boolean selectAllText() {
+ if (mEditor != null) {
+ // Hide the toolbar before changing the selection to avoid flickering.
+ mEditor.hideFloatingToolbar(FLOATING_TOOLBAR_SELECT_ALL_REFRESH_DELAY);
+ }
final int length = mText.length();
Selection.setSelection((Spannable) mText, 0, length);
return length > 0;
diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java
index eda63b3da5b7..378826dc1deb 100644
--- a/core/java/com/android/internal/app/ResolverComparator.java
+++ b/core/java/com/android/internal/app/ResolverComparator.java
@@ -375,8 +375,15 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
try {
int selectedPos = new ArrayList<ComponentName>(mTargetsDict.keySet())
.indexOf(componentName);
- logMetrics(selectedPos);
- if (selectedPos > 0) {
+ if (selectedPos >= 0 && mTargets != null) {
+ final float selectedProbability = getScore(componentName);
+ int order = 0;
+ for (ResolverTarget target : mTargets) {
+ if (target.getSelectProbability() > selectedProbability) {
+ order++;
+ }
+ }
+ logMetrics(order);
mRanker.train(mTargets, selectedPos);
} else {
if (DEBUG) {
diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java
index 04819a5999eb..2648604291d9 100644
--- a/core/java/com/android/internal/colorextraction/ColorExtractor.java
+++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java
@@ -51,7 +51,7 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener
private WallpaperColors mLockColors;
public ColorExtractor(Context context) {
- this(context, new Tonal());
+ this(context, new Tonal(context));
}
@VisibleForTesting
diff --git a/core/java/com/android/internal/colorextraction/types/Tonal.java b/core/java/com/android/internal/colorextraction/types/Tonal.java
index e78ca3844bed..dbc086c21304 100644
--- a/core/java/com/android/internal/colorextraction/types/Tonal.java
+++ b/core/java/com/android/internal/colorextraction/types/Tonal.java
@@ -19,15 +19,22 @@ package com.android.internal.colorextraction.types;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.WallpaperColors;
+import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.util.MathUtils;
import android.util.Range;
+import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.graphics.ColorUtils;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -49,9 +56,23 @@ public class Tonal implements ExtractionType {
public static final int MAIN_COLOR_DARK = 0xff212121;
public static final int SECONDARY_COLOR_DARK = 0xff000000;
+ private final TonalPalette mGreyPalette;
+ private final ArrayList<TonalPalette> mTonalPalettes;
+ private final ArrayList<ColorRange> mBlacklistedColors;
+
// Temporary variable to avoid allocations
private float[] mTmpHSL = new float[3];
+ public Tonal(Context context) {
+
+ ConfigParser parser = new ConfigParser(context);
+ mTonalPalettes = parser.getTonalPalettes();
+ mBlacklistedColors = parser.getBlacklistedColors();
+
+ mGreyPalette = mTonalPalettes.get(0);
+ mTonalPalettes.remove(0);
+ }
+
/**
* Grab colors from WallpaperColors and set them into GradientColors.
* Also applies the default gradient in case extraction fails.
@@ -220,7 +241,7 @@ public class Tonal implements ExtractionType {
if (DEBUG) {
Log.d(TAG, "Gradients: \n\tNormal " + outColorsNormal + "\n\tDark " + outColorsDark
- + "\n\tExtra dark: " + outColorsExtraDark);
+ + "\n\tExtra dark: " + outColorsExtraDark);
}
return true;
@@ -266,7 +287,8 @@ public class Tonal implements ExtractionType {
* @return true if color should be avoided
*/
private boolean isBlacklisted(float[] hsl) {
- for (ColorRange badRange: BLACKLISTED_COLORS) {
+ for (int i = mBlacklistedColors.size() - 1; i >= 0; i--) {
+ ColorRange badRange = mBlacklistedColors.get(i);
if (badRange.containsColor(hsl[0], hsl[1], hsl[2])) {
return true;
}
@@ -322,19 +344,25 @@ public class Tonal implements ExtractionType {
return minErrorIndex;
}
+ @VisibleForTesting
+ public List<ColorRange> getBlacklistedColors() {
+ return mBlacklistedColors;
+ }
+
@Nullable
- private static TonalPalette findTonalPalette(float h, float s) {
+ private TonalPalette findTonalPalette(float h, float s) {
// Fallback to a grey palette if the color is too desaturated.
// This avoids hue shifts.
if (s < 0.05f) {
- return GREY_PALETTE;
+ return mGreyPalette;
}
TonalPalette best = null;
float error = Float.POSITIVE_INFINITY;
- for (int i = 0; i < TONAL_PALETTES.length; i++) {
- final TonalPalette candidate = TONAL_PALETTES[i];
+ final int tonalPalettesCount = mTonalPalettes.size();
+ for (int i = 0; i < tonalPalettesCount; i++) {
+ final TonalPalette candidate = mTonalPalettes.get(i);
if (h >= candidate.minHue && h <= candidate.maxHue) {
best = candidate;
@@ -388,7 +416,6 @@ public class Tonal implements ExtractionType {
+ Arrays.toString(h) + " s: " + Arrays.toString(s) + " l: "
+ Arrays.toString(l));
}
-
this.h = h;
this.s = s;
this.l = l;
@@ -406,430 +433,6 @@ public class Tonal implements ExtractionType {
}
}
- // Data definition of Material Design tonal palettes
- // When the sort type is set to TONAL, these palettes are used to find
- // a best fit. Each palette is defined as 22 HSL colors
- private static final TonalPalette[] TONAL_PALETTES = {
- new TonalPalette(
- new float[] {1f, 1f, 0.991f, 0.991f, 0.9833333333333333f, 0f, 0f, 0f,
- 0.01134380453752181f, 0.015625000000000003f, 0.024193548387096798f,
- 0.027397260273972573f, 0.017543859649122865f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 0.8434782608695652f, 1f, 1f, 1f, 1f,
- 1f},
- new float[] {0.04f, 0.09f, 0.14f, 0.2f, 0.27450980392156865f,
- 0.34901960784313724f, 0.4235294117647059f, 0.5490196078431373f,
- 0.6254901960784314f, 0.6862745098039216f, 0.7568627450980392f,
- 0.8568627450980393f, 0.9254901960784314f}
- ),
- new TonalPalette(
- new float[] {0.638f, 0.638f, 0.6385767790262171f, 0.6301169590643275f,
- 0.6223958333333334f, 0.6151079136690647f, 0.6065400843881856f,
- 0.5986964618249534f, 0.5910746812386157f, 0.5833333333333334f,
- 0.5748031496062993f, 0.5582010582010583f},
- new float[] {1f, 1f, 1f, 1f, 0.9014084507042253f, 0.8128654970760234f,
- 0.7979797979797981f, 0.7816593886462883f, 0.778723404255319f, 1f, 1f,
- 1f},
- new float[] {0.05f, 0.12f, 0.17450980392156862f, 0.2235294117647059f,
- 0.2784313725490196f, 0.3352941176470588f, 0.388235294117647f,
- 0.44901960784313727f, 0.5392156862745098f, 0.6509803921568628f,
- 0.7509803921568627f, 0.8764705882352941f}
- ),
- new TonalPalette(
- new float[] {0.563f, 0.569f, 0.5666f, 0.5669934640522876f, 0.5748031496062993f,
- 0.5595238095238095f, 0.5473118279569893f, 0.5393258426966292f,
- 0.5315955766192734f, 0.524031007751938f, 0.5154711673699016f,
- 0.508080808080808f, 0.5f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0.8847736625514403f, 1f, 1f,
- 1f},
- new float[] {0.07f, 0.12f, 0.16f, 0.2f, 0.24901960784313726f,
- 0.27450980392156865f, 0.30392156862745096f, 0.34901960784313724f,
- 0.4137254901960784f, 0.47647058823529415f, 0.5352941176470588f,
- 0.6764705882352942f, 0.8f}
- ),
- new TonalPalette(
- new float[] {0.508f, 0.511f, 0.508f, 0.508f, 0.5082304526748972f,
- 0.5069444444444444f, 0.5f, 0.5f, 0.5f, 0.48724954462659376f,
- 0.4800347222222222f, 0.4755134281200632f, 0.4724409448818897f,
- 0.4671052631578947f},
- new float[] {1f, 1f, 1f, 1f, 1f, 0.8888888888888887f, 0.9242424242424242f, 1f,
- 1f, 0.8133333333333332f, 0.7868852459016393f, 1f, 1f, 1f},
- new float[] {0.04f, 0.06f, 0.08f, 0.12f, 0.1588235294117647f,
- 0.21176470588235297f, 0.25882352941176473f, 0.3f, 0.34901960784313724f,
- 0.44117647058823534f, 0.5215686274509804f, 0.5862745098039216f,
- 0.7509803921568627f, 0.8509803921568627f}
- ),
- new TonalPalette(
- new float[] {0.333f, 0.333f, 0.333f, 0.3333333333333333f, 0.3333333333333333f,
- 0.34006734006734f, 0.34006734006734f, 0.34006734006734f,
- 0.34259259259259256f, 0.3475783475783476f, 0.34767025089605735f,
- 0.3467741935483871f, 0.3703703703703704f},
- new float[] {0.70f, 0.72f, 0.69f, 0.6703296703296703f, 0.728813559322034f,
- 0.5657142857142856f, 0.5076923076923077f, 0.3944223107569721f,
- 0.6206896551724138f, 0.8931297709923666f, 1f, 1f, 1f},
- new float[] {0.05f, 0.08f, 0.14f, 0.1784313725490196f, 0.23137254901960785f,
- 0.3431372549019608f, 0.38235294117647056f, 0.49215686274509807f,
- 0.6588235294117647f, 0.7431372549019608f, 0.8176470588235294f,
- 0.8784313725490196f, 0.9294117647058824f}
- ),
- new TonalPalette(
- new float[] {0.161f, 0.163f, 0.163f, 0.162280701754386f, 0.15032679738562088f,
- 0.15879265091863518f, 0.16236559139784948f, 0.17443868739205526f,
- 0.17824074074074076f, 0.18674698795180725f, 0.18692449355432778f,
- 0.1946778711484594f, 0.18604651162790695f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f},
- new float[] {0.05f, 0.08f, 0.11f, 0.14901960784313725f, 0.2f,
- 0.24901960784313726f, 0.30392156862745096f, 0.3784313725490196f,
- 0.4235294117647059f, 0.48823529411764705f, 0.6450980392156863f,
- 0.7666666666666666f, 0.8313725490196078f}
- ),
- new TonalPalette(
- new float[] {0.108f, 0.105f, 0.105f, 0.105f, 0.10619469026548674f,
- 0.11924686192468618f, 0.13046448087431692f, 0.14248366013071895f,
- 0.1506024096385542f, 0.16220238095238093f, 0.16666666666666666f,
- 0.16666666666666666f, 0.162280701754386f, 0.15686274509803924f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f},
- new float[] {0.17f, 0.22f, 0.28f, 0.35f, 0.44313725490196076f,
- 0.46862745098039216f, 0.47843137254901963f, 0.5f, 0.5117647058823529f,
- 0.5607843137254902f, 0.6509803921568628f, 0.7509803921568627f,
- 0.8509803921568627f, 0.9f}
- ),
- new TonalPalette(
- new float[] {0.036f, 0.036f, 0.036f, 0.036f, 0.03561253561253561f,
- 0.05098039215686275f, 0.07516339869281045f, 0.09477124183006536f,
- 0.1150326797385621f, 0.134640522875817f, 0.14640522875816991f,
- 0.1582397003745319f, 0.15773809523809523f, 0.15359477124183002f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f},
- new float[] {0.19f, 0.26f, 0.34f, 0.39f, 0.4588235294117647f, 0.5f, 0.5f, 0.5f,
- 0.5f, 0.5f, 0.5f, 0.6509803921568628f, 0.7803921568627451f, 0.9f}
- ),
- new TonalPalette(
- new float[] {0.955f, 0.961f, 0.958f, 0.9596491228070175f, 0.9593837535014005f,
- 0.9514767932489452f, 0.943859649122807f, 0.9396825396825397f,
- 0.9395424836601307f, 0.9393939393939394f, 0.9362745098039216f,
- 0.9754098360655739f, 0.9824561403508771f},
- new float[] {0.87f, 0.85f, 0.85f, 0.84070796460177f, 0.8206896551724138f,
- 0.7979797979797981f, 0.7661290322580644f, 0.9051724137931036f,
- 1f, 1f, 1f, 1f, 1f},
- new float[] {0.06f, 0.11f, 0.16f, 0.22156862745098038f, 0.2843137254901961f,
- 0.388235294117647f, 0.48627450980392156f, 0.5450980392156863f,
- 0.6f, 0.6764705882352942f, 0.8f, 0.8803921568627451f,
- 0.9254901960784314f}
- ),
- new TonalPalette(
- new float[] {0.866f, 0.855f, 0.841025641025641f, 0.8333333333333334f,
- 0.8285256410256411f, 0.821522309711286f, 0.8083333333333333f,
- 0.8046594982078853f, 0.8005822416302766f, 0.7842377260981912f,
- 0.7771084337349398f, 0.7747747747747749f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f,
- 0.737142857142857f, 0.6434108527131781f, 0.46835443037974644f},
- new float[] {0.05f, 0.08f, 0.12745098039215685f, 0.15490196078431373f,
- 0.20392156862745098f, 0.24901960784313726f, 0.3137254901960784f,
- 0.36470588235294116f, 0.44901960784313727f, 0.6568627450980392f,
- 0.7470588235294118f, 0.8450980392156863f}
- ),
- new TonalPalette(
- new float[] {0.925f, 0.93f, 0.938f, 0.947f, 0.955952380952381f,
- 0.9681069958847737f, 0.9760479041916167f, 0.9873563218390804f, 0f, 0f,
- 0.009057971014492771f, 0.026748971193415648f,
- 0.041666666666666616f, 0.05303030303030304f},
- new float[] {1f, 1f, 1f, 1f, 1f, 0.8350515463917526f, 0.6929460580912863f,
- 0.6387665198237885f, 0.6914893617021276f, 0.7583892617449666f,
- 0.8070175438596495f, 0.9310344827586209f, 1f, 1f},
- new float[] {0.10f, 0.13f, 0.17f, 0.2f, 0.27450980392156865f,
- 0.3803921568627451f, 0.4725490196078432f, 0.5549019607843138f,
- 0.6313725490196078f, 0.707843137254902f, 0.7764705882352941f,
- 0.8294117647058823f, 0.9058823529411765f, 0.9568627450980391f}
- ),
- new TonalPalette(
- new float[] {0.733f, 0.736f, 0.744f, 0.7514619883040936f, 0.7679738562091503f,
- 0.7802083333333333f, 0.7844311377245509f, 0.796875f,
- 0.8165618448637316f, 0.8487179487179487f, 0.8582375478927203f,
- 0.8562091503267975f, 0.8666666666666667f},
- new float[] {1f, 1f, 1f, 1f, 1f, 0.8163265306122449f, 0.6653386454183268f,
- 0.7547169811320753f, 0.929824561403509f, 0.9558823529411766f,
- 0.9560439560439562f, 1f, 1f},
- new float[] {0.07f, 0.12f, 0.17f, 0.2235294117647059f, 0.3f,
- 0.38431372549019605f, 0.492156862745098f, 0.5843137254901961f,
- 0.6647058823529411f, 0.7333333333333334f, 0.8215686274509804f, 0.9f,
- 0.9411764705882353f}
- ),
- new TonalPalette(
- new float[] {0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f,
- 0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f,
- 0.6666666666666666f, 0.6666666666666666f, 0.6666666666666666f,
- 0.6666666666666666f, 0.6666666666666666f},
- new float[] {0.25f, 0.24590163934426232f, 0.17880794701986752f,
- 0.14606741573033713f, 0.13761467889908252f, 0.14893617021276592f,
- 0.16756756756756758f, 0.20312500000000017f, 0.26086956521739135f,
- 0.29999999999999966f, 0.5000000000000004f},
- new float[] {0.18f, 0.2392156862745098f, 0.296078431372549f,
- 0.34901960784313724f, 0.4274509803921569f, 0.5392156862745098f,
- 0.6372549019607843f, 0.7490196078431373f, 0.8196078431372549f,
- 0.8823529411764706f, 0.9372549019607843f}
- ),
- new TonalPalette(
- new float[] {0.938f, 0.944f, 0.952f, 0.961f, 0.9678571428571429f,
- 0.9944812362030905f, 0f, 0f,
- 0.0047348484848484815f, 0.00316455696202532f, 0f,
- 0.9980392156862745f, 0.9814814814814816f, 0.9722222222222221f},
- new float[] {1f, 1f, 1f, 1f, 1f, 0.7023255813953488f, 0.6638655462184874f,
- 0.6521739130434782f, 0.7719298245614035f, 0.8315789473684211f,
- 0.6867469879518071f, 0.7264957264957265f, 0.8181818181818182f,
- 0.8181818181818189f},
- new float[] {0.08f, 0.13f, 0.18f, 0.23f, 0.27450980392156865f,
- 0.4215686274509804f,
- 0.4666666666666667f, 0.503921568627451f, 0.5529411764705883f,
- 0.6274509803921569f, 0.6745098039215687f, 0.7705882352941176f,
- 0.892156862745098f, 0.9568627450980391f}
- ),
- new TonalPalette(
- new float[] {0.88f, 0.888f, 0.897f, 0.9052287581699346f, 0.9112021857923498f,
- 0.9270152505446624f, 0.9343137254901961f, 0.9391534391534391f,
- 0.9437984496124031f, 0.943661971830986f, 0.9438943894389439f,
- 0.9426229508196722f, 0.9444444444444444f},
- new float[] {1f, 1f, 1f, 1f, 0.8133333333333332f, 0.7927461139896375f,
- 0.7798165137614679f, 0.7777777777777779f, 0.8190476190476191f,
- 0.8255813953488372f, 0.8211382113821142f, 0.8133333333333336f,
- 0.8000000000000006f},
- new float[] {0.08f, 0.12f, 0.16f, 0.2f, 0.29411764705882354f,
- 0.3784313725490196f, 0.42745098039215684f, 0.4764705882352941f,
- 0.5882352941176471f, 0.6627450980392157f, 0.7588235294117647f,
- 0.8529411764705882f, 0.9411764705882353f}
- ),
- new TonalPalette(
- new float[] {0.669f, 0.680f, 0.6884057971014492f, 0.6974789915966387f,
- 0.7079889807162534f, 0.7154471544715447f, 0.7217741935483872f,
- 0.7274143302180687f, 0.7272727272727273f, 0.7258064516129031f,
- 0.7252252252252251f, 0.7333333333333333f},
- new float[] {0.81f, 0.81f, 0.8214285714285715f, 0.6878612716763006f,
- 0.6080402010050251f, 0.5774647887323943f, 0.5391304347826086f,
- 0.46724890829694316f, 0.4680851063829788f, 0.462686567164179f,
- 0.45679012345678977f, 0.4545454545454551f},
- new float[] {0.12f, 0.16f, 0.2196078431372549f, 0.33921568627450976f,
- 0.39019607843137255f, 0.4176470588235294f, 0.45098039215686275f,
- 0.5509803921568628f, 0.6313725490196078f, 0.7372549019607844f,
- 0.8411764705882353f, 0.9352941176470588f}
- ),
- new TonalPalette(
- new float[] {0.6470588235294118f, 0.6516666666666667f, 0.6464174454828661f,
- 0.6441441441441442f, 0.6432748538011696f, 0.6416666666666667f,
- 0.6402439024390243f, 0.6412429378531074f, 0.6435185185185186f,
- 0.6428571428571429f},
- new float[] {0.8095238095238095f, 0.6578947368421053f, 0.5721925133689839f,
- 0.5362318840579711f, 0.5f, 0.4424778761061947f, 0.44086021505376327f,
- 0.44360902255639095f, 0.4499999999999997f, 0.4375000000000006f},
- new float[] {0.16470588235294117f, 0.2980392156862745f, 0.36666666666666664f,
- 0.40588235294117647f, 0.44705882352941173f,
- 0.5568627450980392f, 0.6352941176470588f, 0.7392156862745098f,
- 0.8431372549019608f, 0.9372549019607843f}
- ),
- new TonalPalette(
- new float[] {0.469f, 0.46732026143790845f, 0.4718614718614719f,
- 0.4793650793650794f, 0.48071625344352614f, 0.4829683698296837f,
- 0.484375f, 0.4841269841269842f, 0.48444444444444457f,
- 0.48518518518518516f, 0.4907407407407408f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 0.6274509803921569f, 0.41832669322709176f,
- 0.41899441340782106f, 0.4128440366972478f, 0.4090909090909088f},
- new float[] {0.07f, 0.1f, 0.15098039215686274f, 0.20588235294117646f,
- 0.2372549019607843f, 0.26862745098039215f, 0.4f, 0.5078431372549019f,
- 0.6490196078431372f, 0.7862745098039216f, 0.9137254901960784f}
- ),
- new TonalPalette(
- new float[] {0.542f, 0.5444444444444444f, 0.5555555555555556f,
- 0.5555555555555556f, 0.553763440860215f, 0.5526315789473684f,
- 0.5555555555555556f, 0.5555555555555555f, 0.5555555555555556f,
- 0.5512820512820514f, 0.5666666666666667f},
- new float[] {0.25f, 0.24590163934426232f, 0.19148936170212766f,
- 0.1791044776119403f, 0.18343195266272191f, 0.18446601941747576f,
- 0.1538461538461539f, 0.15625000000000003f, 0.15328467153284678f,
- 0.15662650602409653f, 0.151515151515151f},
- new float[] {0.05f, 0.1196078431372549f, 0.1843137254901961f,
- 0.2627450980392157f,
- 0.33137254901960783f, 0.403921568627451f, 0.5411764705882354f,
- 0.6235294117647059f, 0.7313725490196079f, 0.8372549019607843f,
- 0.9352941176470588f}
- ),
- new TonalPalette(
- new float[] {0.022222222222222223f, 0.02469135802469136f, 0.031249999999999997f,
- 0.03947368421052631f, 0.04166666666666668f,
- 0.043650793650793655f, 0.04411764705882352f, 0.04166666666666652f,
- 0.04444444444444459f, 0.05555555555555529f},
- new float[] {0.33333333333333337f, 0.2783505154639175f, 0.2580645161290323f,
- 0.25675675675675674f, 0.2528735632183908f, 0.17500000000000002f,
- 0.15315315315315312f, 0.15189873417721522f,
- 0.15789473684210534f, 0.15789473684210542f},
- new float[] {0.08823529411764705f, 0.19019607843137254f, 0.2431372549019608f,
- 0.2901960784313725f, 0.3411764705882353f, 0.47058823529411764f,
- 0.5647058823529412f, 0.6901960784313725f, 0.8137254901960784f,
- 0.9254901960784314f}
- ),
- new TonalPalette(
- new float[] {0.027f, 0.03f, 0.038f, 0.044f, 0.050884955752212385f,
- 0.07254901960784313f, 0.0934640522875817f,
- 0.10457516339869281f, 0.11699346405228758f,
- 0.1255813953488372f, 0.1268939393939394f, 0.12533333333333332f,
- 0.12500000000000003f, 0.12777777777777777f},
- new float[] {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f},
- new float[] {0.25f, 0.3f, 0.35f, 0.4f, 0.44313725490196076f, 0.5f, 0.5f, 0.5f,
- 0.5f, 0.5784313725490196f,
- 0.6549019607843137f, 0.7549019607843137f, 0.8509803921568627f,
- 0.9411764705882353f}
- )
- };
-
- private static final TonalPalette GREY_PALETTE = new TonalPalette(
- new float[]{0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f},
- new float[]{0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f},
- new float[]{0.08f, 0.11f, 0.14901960784313725f, 0.2f, 0.2980392156862745f, 0.4f,
- 0.4980392156862745f, 0.6196078431372549f, 0.7176470588235294f,
- 0.8196078431372549f, 0.9176470588235294f, 0.9490196078431372f}
- );
-
- @SuppressWarnings("WeakerAccess")
- @VisibleForTesting
- public static final ColorRange[] BLACKLISTED_COLORS = new ColorRange[] {
-
- // Red
- new ColorRange(
- new Range<>(0f, 20f) /* H */,
- new Range<>(0.7f, 1f) /* S */,
- new Range<>(0.21f, 0.79f)) /* L */,
- new ColorRange(
- new Range<>(0f, 20f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.355f, 0.653f)),
-
- // Red Orange
- new ColorRange(
- new Range<>(20f, 40f),
- new Range<>(0.7f, 1f),
- new Range<>(0.28f, 0.643f)),
- new ColorRange(
- new Range<>(20f, 40f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.414f, 0.561f)),
- new ColorRange(
- new Range<>(20f, 40f),
- new Range<>(0f, 3f),
- new Range<>(0.343f, 0.584f)),
-
- // Orange
- new ColorRange(
- new Range<>(40f, 60f),
- new Range<>(0.7f, 1f),
- new Range<>(0.173f, 0.349f)),
- new ColorRange(
- new Range<>(40f, 60f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.233f, 0.427f)),
- new ColorRange(
- new Range<>(40f, 60f),
- new Range<>(0f, 0.3f),
- new Range<>(0.231f, 0.484f)),
-
- // Yellow 60
- new ColorRange(
- new Range<>(60f, 80f),
- new Range<>(0.7f, 1f),
- new Range<>(0.488f, 0.737f)),
- new ColorRange(
- new Range<>(60f, 80f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.673f, 0.837f)),
-
- // Yellow Green 80
- new ColorRange(
- new Range<>(80f, 100f),
- new Range<>(0.7f, 1f),
- new Range<>(0.469f, 0.61f)),
-
- // Yellow green 100
- new ColorRange(
- new Range<>(100f, 120f),
- new Range<>(0.7f, 1f),
- new Range<>(0.388f, 0.612f)),
- new ColorRange(
- new Range<>(100f, 120f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.424f, 0.541f)),
-
- // Green
- new ColorRange(
- new Range<>(120f, 140f),
- new Range<>(0.7f, 1f),
- new Range<>(0.375f, 0.52f)),
- new ColorRange(
- new Range<>(120f, 140f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.435f, 0.524f)),
-
- // Green Blue 140
- new ColorRange(
- new Range<>(140f, 160f),
- new Range<>(0.7f, 1f),
- new Range<>(0.496f, 0.641f)),
-
- // Seafoam
- new ColorRange(
- new Range<>(160f, 180f),
- new Range<>(0.7f, 1f),
- new Range<>(0.496f, 0.567f)),
-
- // Cyan
- new ColorRange(
- new Range<>(180f, 200f),
- new Range<>(0.7f, 1f),
- new Range<>(0.52f, 0.729f)),
-
- // Blue
- new ColorRange(
- new Range<>(220f, 240f),
- new Range<>(0.7f, 1f),
- new Range<>(0.396f, 0.571f)),
- new ColorRange(
- new Range<>(220f, 240f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.425f, 0.551f)),
-
- // Blue Purple 240
- new ColorRange(
- new Range<>(240f, 260f),
- new Range<>(0.7f, 1f),
- new Range<>(0.418f, 0.639f)),
- new ColorRange(
- new Range<>(220f, 240f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.441f, 0.576f)),
-
- // Blue Purple 260
- new ColorRange(
- new Range<>(260f, 280f),
- new Range<>(0.3f, 1f), // Bigger range
- new Range<>(0.461f, 0.553f)),
-
- // Fuchsia
- new ColorRange(
- new Range<>(300f, 320f),
- new Range<>(0.7f, 1f),
- new Range<>(0.484f, 0.588f)),
- new ColorRange(
- new Range<>(300f, 320f),
- new Range<>(0.3f, 0.7f),
- new Range<>(0.48f, 0.592f)),
-
- // Pink
- new ColorRange(
- new Range<>(320f, 340f),
- new Range<>(0.7f, 1f),
- new Range<>(0.466f, 0.629f)),
-
- // Soft red
- new ColorRange(
- new Range<>(340f, 360f),
- new Range<>(0.7f, 1f),
- new Range<>(0.437f, 0.596f))
- };
-
/**
* Representation of an HSL color range.
* <ul>
@@ -874,4 +477,124 @@ public class Tonal implements ExtractionType {
return String.format("H: %s, S: %s, L %s", mHue, mSaturation, mLightness);
}
}
-}
+
+ @VisibleForTesting
+ public static class ConfigParser {
+ private final ArrayList<TonalPalette> mTonalPalettes;
+ private final ArrayList<ColorRange> mBlacklistedColors;
+
+ public ConfigParser(Context context) {
+ mTonalPalettes = new ArrayList<>();
+ mBlacklistedColors = new ArrayList<>();
+
+ // Load all palettes and the blacklist from an XML.
+ try {
+ XmlPullParser parser = context.getResources().getXml(R.xml.color_extraction);
+ int eventType = parser.getEventType();
+ while (eventType != XmlPullParser.END_DOCUMENT) {
+ if (eventType == XmlPullParser.START_DOCUMENT ||
+ eventType == XmlPullParser.END_TAG) {
+ // just skip
+ } else if (eventType == XmlPullParser.START_TAG) {
+ String tagName = parser.getName();
+ if (tagName.equals("palettes")) {
+ parsePalettes(parser);
+ } else if (tagName.equals("blacklist")) {
+ parseBlacklist(parser);
+ }
+ } else {
+ throw new XmlPullParserException("Invalid XML event " + eventType + " - "
+ + parser.getName(), parser, null);
+ }
+ eventType = parser.next();
+ }
+ } catch (XmlPullParserException | IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public ArrayList<TonalPalette> getTonalPalettes() {
+ return mTonalPalettes;
+ }
+
+ public ArrayList<ColorRange> getBlacklistedColors() {
+ return mBlacklistedColors;
+ }
+
+ private void parseBlacklist(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, null, "blacklist");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ // Starts by looking for the entry tag
+ if (name.equals("range")) {
+ mBlacklistedColors.add(readRange(parser));
+ parser.next();
+ } else {
+ throw new XmlPullParserException("Invalid tag: " + name, parser, null);
+ }
+ }
+ }
+
+ private ColorRange readRange(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, null, "range");
+ float[] h = readFloatArray(parser.getAttributeValue(null, "h"));
+ float[] s = readFloatArray(parser.getAttributeValue(null, "s"));
+ float[] l = readFloatArray(parser.getAttributeValue(null, "l"));
+
+ if (h == null || s == null || l == null) {
+ throw new XmlPullParserException("Incomplete range tag.", parser, null);
+ }
+
+ return new ColorRange(new Range<>(h[0], h[1]), new Range<>(s[0], s[1]),
+ new Range<>(l[0], l[1]));
+ }
+
+ private void parsePalettes(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, null, "palettes");
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ continue;
+ }
+ String name = parser.getName();
+ // Starts by looking for the entry tag
+ if (name.equals("palette")) {
+ mTonalPalettes.add(readPalette(parser));
+ parser.next();
+ } else {
+ throw new XmlPullParserException("Invalid tag: " + name);
+ }
+ }
+ }
+
+ private TonalPalette readPalette(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ parser.require(XmlPullParser.START_TAG, null, "palette");
+
+ float[] h = readFloatArray(parser.getAttributeValue(null, "h"));
+ float[] s = readFloatArray(parser.getAttributeValue(null, "s"));
+ float[] l = readFloatArray(parser.getAttributeValue(null, "l"));
+
+ if (h == null || s == null || l == null) {
+ throw new XmlPullParserException("Incomplete range tag.", parser, null);
+ }
+
+ return new TonalPalette(h, s, l);
+ }
+
+ private float[] readFloatArray(String attributeValue)
+ throws IOException, XmlPullParserException {
+ String[] tokens = attributeValue.replaceAll(" ", "").replaceAll("\n", "").split(",");
+ float[] numbers = new float[tokens.length];
+ for (int i = 0; i < tokens.length; i++) {
+ numbers[i] = Float.parseFloat(tokens[i]);
+ }
+ return numbers;
+ }
+ }
+} \ No newline at end of file
diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java
index a7fdb27e03b8..dbb6e93de7d4 100644
--- a/core/java/com/android/internal/util/CollectionUtils.java
+++ b/core/java/com/android/internal/util/CollectionUtils.java
@@ -21,13 +21,16 @@ import static com.android.internal.util.ArrayUtils.isEmpty;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.ArraySet;
+import android.util.ExceptionUtils;
+
+import com.android.internal.util.FunctionalUtils.ThrowingConsumer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
-import java.util.function.Function;
+import java.util.function.*;
import java.util.stream.Stream;
/**
@@ -58,6 +61,32 @@ public class CollectionUtils {
}
/**
+ * @see #filter(List, java.util.function.Predicate)
+ */
+ public static @NonNull <T> Set<T> filter(@Nullable Set<T> set,
+ java.util.function.Predicate<? super T> predicate) {
+ if (set == null || set.size() == 0) return Collections.emptySet();
+ ArraySet<T> result = null;
+ if (set instanceof ArraySet) {
+ ArraySet<T> arraySet = (ArraySet<T>) set;
+ int size = arraySet.size();
+ for (int i = 0; i < size; i++) {
+ final T item = arraySet.valueAt(i);
+ if (predicate.test(item)) {
+ result = ArrayUtils.add(result, item);
+ }
+ }
+ } else {
+ for (T item : set) {
+ if (predicate.test(item)) {
+ result = ArrayUtils.add(result, item);
+ }
+ }
+ }
+ return emptyIfNull(result);
+ }
+
+ /**
* Returns a list of items resulting from applying the given function to each element of the
* provided list.
*
@@ -77,6 +106,27 @@ public class CollectionUtils {
}
/**
+ * @see #map(List, Function)
+ */
+ public static @NonNull <I, O> Set<O> map(@Nullable Set<I> cur,
+ Function<? super I, ? extends O> f) {
+ if (isEmpty(cur)) return Collections.emptySet();
+ ArraySet<O> result = new ArraySet<>();
+ if (cur instanceof ArraySet) {
+ ArraySet<I> arraySet = (ArraySet<I>) cur;
+ int size = arraySet.size();
+ for (int i = 0; i < size; i++) {
+ result.add(f.apply(arraySet.valueAt(i)));
+ }
+ } else {
+ for (I item : cur) {
+ result.add(f.apply(item));
+ }
+ }
+ return result;
+ }
+
+ /**
* {@link #map(List, Function)} + {@link #filter(List, java.util.function.Predicate)}
*
* Calling this is equivalent (but more memory efficient) to:
@@ -180,6 +230,17 @@ public class CollectionUtils {
}
/**
+ * @see #add(List, Object)
+ */
+ public static @NonNull <T> Set<T> add(@Nullable Set<T> cur, T val) {
+ if (cur == null || cur == Collections.emptySet()) {
+ cur = new ArraySet<>();
+ }
+ cur.add(val);
+ return cur;
+ }
+
+ /**
* Similar to {@link List#remove}, but with support for list values of {@code null} and
* {@link Collections#emptyList}
*/
@@ -192,9 +253,52 @@ public class CollectionUtils {
}
/**
+ * @see #remove(List, Object)
+ */
+ public static @NonNull <T> Set<T> remove(@Nullable Set<T> cur, T val) {
+ if (isEmpty(cur)) {
+ return emptyIfNull(cur);
+ }
+ cur.remove(val);
+ return cur;
+ }
+
+ /**
* @return a list that will not be affected by mutations to the given original list.
*/
public static @NonNull <T> List<T> copyOf(@Nullable List<T> cur) {
return isEmpty(cur) ? Collections.emptyList() : new ArrayList<>(cur);
}
+
+ /**
+ * @return a list that will not be affected by mutations to the given original list.
+ */
+ public static @NonNull <T> Set<T> copyOf(@Nullable Set<T> cur) {
+ return isEmpty(cur) ? Collections.emptySet() : new ArraySet<>(cur);
+ }
+
+ /**
+ * Applies {@code action} to each element in {@code cur}
+ *
+ * This avoids creating an iterator if the given set is an {@link ArraySet}
+ */
+ public static <T> void forEach(@Nullable Set<T> cur, @Nullable ThrowingConsumer<T> action) {
+ if (cur == null || action == null) return;
+ int size = cur.size();
+ if (size == 0) return;
+ try {
+ if (cur instanceof ArraySet) {
+ ArraySet<T> arraySet = (ArraySet<T>) cur;
+ for (int i = 0; i < size; i++) {
+ action.accept(arraySet.valueAt(i));
+ }
+ } else {
+ for (T t : cur) {
+ action.accept(t);
+ }
+ }
+ } catch (Exception e) {
+ throw ExceptionUtils.propagate(e);
+ }
+ }
}
diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java
index 9aeb0415b5fc..cdef97e84f62 100644
--- a/core/java/com/android/internal/util/FunctionalUtils.java
+++ b/core/java/com/android/internal/util/FunctionalUtils.java
@@ -45,4 +45,15 @@ public class FunctionalUtils {
public interface ThrowingSupplier<T> {
T get() throws Exception;
}
+
+ /**
+ * An equivalent of {@link java.util.function.Consumer} that allows throwing checked exceptions
+ *
+ * This can be used to specify a lambda argument without forcing all the checked exceptions
+ * to be handled within it
+ */
+ @FunctionalInterface
+ public interface ThrowingConsumer<T> {
+ void accept(T t) throws Exception;
+ }
}
diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java
index ff211b6c2d62..497e7b08d881 100644
--- a/core/java/com/android/internal/view/FloatingActionMode.java
+++ b/core/java/com/android/internal/view/FloatingActionMode.java
@@ -295,6 +295,8 @@ public final class FloatingActionMode extends ActionMode {
*/
private static final class FloatingToolbarVisibilityHelper {
+ private static final long MIN_SHOW_DURATION_FOR_MOVE_HIDE = 500;
+
private final FloatingToolbar mToolbar;
private boolean mHideRequested;
@@ -304,6 +306,8 @@ public final class FloatingActionMode extends ActionMode {
private boolean mActive;
+ private long mLastShowTime;
+
public FloatingToolbarVisibilityHelper(FloatingToolbar toolbar) {
mToolbar = Preconditions.checkNotNull(toolbar);
}
@@ -327,7 +331,13 @@ public final class FloatingActionMode extends ActionMode {
}
public void setMoving(boolean moving) {
- mMoving = moving;
+ // Avoid unintended flickering by allowing the toolbar to show long enough before
+ // triggering the 'moving' flag - which signals a hide.
+ final boolean showingLongEnough =
+ System.currentTimeMillis() - mLastShowTime > MIN_SHOW_DURATION_FOR_MOVE_HIDE;
+ if (!moving || showingLongEnough) {
+ mMoving = moving;
+ }
}
public void setOutOfBounds(boolean outOfBounds) {
@@ -347,6 +357,7 @@ public final class FloatingActionMode extends ActionMode {
mToolbar.hide();
} else {
mToolbar.show();
+ mLastShowTime = System.currentTimeMillis();
}
}
}
diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java
index 2cf58d7ac465..4f9e8a51b9a4 100644
--- a/core/java/com/android/server/BootReceiver.java
+++ b/core/java/com/android/server/BootReceiver.java
@@ -143,7 +143,6 @@ public class BootReceiver extends BroadcastReceiver {
try {
return FileUtils.readTextFile(lastHeaderFile, 0, null);
} catch (IOException e) {
- Slog.e(TAG, "Error reading " + lastHeaderFile, e);
return null;
}
}
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index b93697398020..3ecbcc37f49b 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -985,6 +985,16 @@ namespace PaintGlue {
}
}
+ static jfloat getStrikeThruPosition(jlong paintHandle, jlong typefaceHandle) {
+ const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize();
+ return SkScalarToFloat(Paint::kStdStrikeThru_Top * textSize);
+ }
+
+ static jfloat getStrikeThruThickness(jlong paintHandle, jlong typefaceHandle) {
+ const SkScalar textSize = reinterpret_cast<Paint*>(paintHandle)->getTextSize();
+ return SkScalarToFloat(Paint::kStdStrikeThru_Thickness * textSize);
+ }
+
static void setShadowLayer(jlong paintHandle, jfloat radius,
jfloat dx, jfloat dy, jint color) {
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
@@ -1098,6 +1108,8 @@ static const JNINativeMethod methods[] = {
{"nDescent","(JJ)F", (void*) PaintGlue::descent},
{"nGetUnderlinePosition","(JJ)F", (void*) PaintGlue::getUnderlinePosition},
{"nGetUnderlineThickness","(JJ)F", (void*) PaintGlue::getUnderlineThickness},
+ {"nGetStrikeThruPosition","(JJ)F", (void*) PaintGlue::getStrikeThruPosition},
+ {"nGetStrikeThruThickness","(JJ)F", (void*) PaintGlue::getStrikeThruThickness},
{"nSetShadowLayer", "(JFFFI)V", (void*)PaintGlue::setShadowLayer},
{"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer}
};
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 16a923098a27..6c2b4609ebc7 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -81,14 +81,27 @@ enum {
HEAP_GL,
HEAP_OTHER_MEMTRACK,
+ // Dalvik extra sections (heap).
HEAP_DALVIK_NORMAL,
HEAP_DALVIK_LARGE,
- HEAP_DALVIK_LINEARALLOC,
- HEAP_DALVIK_ACCOUNTING,
- HEAP_DALVIK_CODE_CACHE,
HEAP_DALVIK_ZYGOTE,
HEAP_DALVIK_NON_MOVING,
- HEAP_DALVIK_INDIRECT_REFERENCE_TABLE,
+
+ // Dalvik other extra sections.
+ HEAP_DALVIK_OTHER_LINEARALLOC,
+ HEAP_DALVIK_OTHER_ACCOUNTING,
+ HEAP_DALVIK_OTHER_CODE_CACHE,
+ HEAP_DALVIK_OTHER_COMPILER_METADATA,
+ HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE,
+
+ // Boot vdex / app dex / app vdex
+ HEAP_DEX_BOOT_VDEX,
+ HEAP_DEX_APP_DEX,
+ HEAP_DEX_APP_VDEX,
+
+ // App art, boot art.
+ HEAP_ART_APP,
+ HEAP_ART_BOOT,
_NUM_HEAP,
_NUM_EXCLUSIVE_HEAP = HEAP_OTHER_MEMTRACK+1,
@@ -297,15 +310,30 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss)
whichHeap = HEAP_TTF;
is_swappable = true;
} else if ((nameLen > 4 && strstr(name, ".dex") != NULL) ||
- (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0) ||
- (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0)) {
+ (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0)) {
whichHeap = HEAP_DEX;
+ subHeap = HEAP_DEX_APP_DEX;
+ is_swappable = true;
+ } else if (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0) {
+ whichHeap = HEAP_DEX;
+ // Handle system@framework@boot* and system/framework/boot*
+ if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) {
+ subHeap = HEAP_DEX_BOOT_VDEX;
+ } else {
+ subHeap = HEAP_DEX_APP_VDEX;
+ }
is_swappable = true;
} else if (nameLen > 4 && strcmp(name+nameLen-4, ".oat") == 0) {
whichHeap = HEAP_OAT;
is_swappable = true;
} else if (nameLen > 4 && strcmp(name+nameLen-4, ".art") == 0) {
whichHeap = HEAP_ART;
+ // Handle system@framework@boot* and system/framework/boot*
+ if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) {
+ subHeap = HEAP_ART_BOOT;
+ } else {
+ subHeap = HEAP_ART_APP;
+ }
is_swappable = true;
} else if (strncmp(name, "/dev/", 5) == 0) {
if (strncmp(name, "/dev/kgsl-3d0", 13) == 0) {
@@ -314,7 +342,7 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss)
if (strncmp(name, "/dev/ashmem/dalvik-", 19) == 0) {
whichHeap = HEAP_DALVIK_OTHER;
if (strstr(name, "/dev/ashmem/dalvik-LinearAlloc") == name) {
- subHeap = HEAP_DALVIK_LINEARALLOC;
+ subHeap = HEAP_DALVIK_OTHER_LINEARALLOC;
} else if ((strstr(name, "/dev/ashmem/dalvik-alloc space") == name) ||
(strstr(name, "/dev/ashmem/dalvik-main space") == name)) {
// This is the regular Dalvik heap.
@@ -332,13 +360,14 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss)
whichHeap = HEAP_DALVIK;
subHeap = HEAP_DALVIK_ZYGOTE;
} else if (strstr(name, "/dev/ashmem/dalvik-indirect ref") == name) {
- subHeap = HEAP_DALVIK_INDIRECT_REFERENCE_TABLE;
+ subHeap = HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE;
} else if (strstr(name, "/dev/ashmem/dalvik-jit-code-cache") == name ||
- strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name ||
- strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) {
- subHeap = HEAP_DALVIK_CODE_CACHE;
+ strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name) {
+ subHeap = HEAP_DALVIK_OTHER_CODE_CACHE;
+ } else if (strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) {
+ subHeap = HEAP_DALVIK_OTHER_COMPILER_METADATA;
} else {
- subHeap = HEAP_DALVIK_ACCOUNTING; // Default to accounting.
+ subHeap = HEAP_DALVIK_OTHER_ACCOUNTING; // Default to accounting.
}
} else if (strncmp(name, "/dev/ashmem/CursorWindow", 24) == 0) {
whichHeap = HEAP_CURSOR;
@@ -423,7 +452,8 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss)
stats[whichHeap].sharedClean += shared_clean;
stats[whichHeap].swappedOut += swapped_out;
stats[whichHeap].swappedOutPss += swapped_out_pss;
- if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER) {
+ if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER ||
+ whichHeap == HEAP_DEX || whichHeap == HEAP_ART) {
stats[subHeap].pss += pss;
stats[subHeap].swappablePss += swappable_pss;
stats[subHeap].privateDirty += private_dirty;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6e4bcef031bc..3e3585b0508d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -3849,6 +3849,11 @@
<service android:name="com.android.server.PreloadsFileCacheExpirationJobService"
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
+
+ <service android:name="com.android.server.camera.CameraStatsJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
</application>
</manifest>
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png
index ddfd5ede5804..5aa4e98dee7e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png
index 7ab09d121854..2afba7fb686d 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png
index 8cdf2c3901dc..94c696ca2a47 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png
index e1721fc8cf61..2bbc0e0091ba 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png
index f64d2c700a3a..1554f45e6de1 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png
index c312fd89cacd..f7f9bec695e2 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png
index 5cb787c0fb89..caf35d090f59 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png
index 2e759dfcb37d..428b6cf0026b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png
index b4c1b63bdf27..5bba9bb54f99 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png
index 53b435de7612..d5623753cc6b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png
index 58d81c0ff1b7..a083bd2f3905 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png
index 3834afdea9cc..cdd80c8ff876 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png
index de0f726bad0b..f38ba5069f05 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png
index d8c095dc1db3..92d58870b204 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png
index e053b97d00f8..e5fb30641a70 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png
index 7feb4ae47b3f..ae625880ca88 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png
index caed47b2b644..952eda0c708b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png
index b38c2abbc887..d51aa427e59e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png
index a1b947f542db..95a696f871e0 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png
index b7016fa67dfd..a9435e375f30 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png
index f4b22530f011..851168a3ba29 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png
index 1d9943f7e6b2..c0e15e9ebff6 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png
index 685da616a5a3..41a7b9c186b1 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png
index 8e34fdcd71d8..8618f96262f7 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png
index 3bc67c35e8e6..81488d17c100 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png
index 78e3c42a5abd..6b635c994959 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png
index bfc42fdb9091..8a7e4fca8498 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png
index cbe0c18c0417..6f7d3a23f6e5 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png
index 8f68ecbc52f7..fc6caf57d350 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png
index 324f74f8aca3..3554271c091d 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png
index 9e9435a34a35..6c82a8924bd1 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png
index 9558f21326f1..d6daf80223a3 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png
index 1b1fe4dd22af..41275f109aa4 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png
index db5fbdc06f18..b63b7c3c5a6e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png
index 39c5f673c961..403d1b7a8043 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png
index a166aaeec9c6..a19aa06bd7a6 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 000000000000..33d4dbf2447b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png
index 243e7aabd8e6..ad89fa1453f6 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png
index a04df8cdb609..9a970c8801a7 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png
index 97eee99969ec..5c7121722b57 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png
index 77f13e2227fe..181c8122b140 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png
index 62346b452e49..1b285a735957 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 000000000000..00f1c62cdfea
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png
index 7411d2494bb7..f86cca719f59 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png
index edd8f35da9af..4e47fc8be440 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png
index 3f17c956944f..8b33f2ce3228 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png
index 6a4521a1f481..451bda75c08c 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png
index 16f6f9cc7862..dedbff18655b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 000000000000..d6be31c4987a
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png
index 15819d89afa3..bfd1900c6e97 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png
index 433f7c5f960c..003f13dadc38 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png
index 8c925bc1f1ae..55647603c424 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png
index b509204c2232..ebc1ae139076 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png
index 30cddc6babdf..92a92300b01b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 000000000000..6f5c84a9749e
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png
index 0ff15ea35b66..ba4ab1d0bdb7 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png
index 21489b2a0105..f246835f83be 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png
index 57df6e14b8b9..04b790baf44e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png
index d8821ad06bca..63e0d79b5a11 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png
index 8222d289652c..89027f4c9483 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 000000000000..4b4870b1669b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png
index fe85c1d44857..1dae891a13f2 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png
index 1f180adb5bc6..5aa4e98dee7e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png
index b27556a1414d..2afba7fb686d 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png
index 1235c5dd8b9f..94c696ca2a47 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png
index cd60ff412c50..2bbc0e0091ba 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png
index 96f3272a57c3..1554f45e6de1 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png
index 93b78fc73469..f7f9bec695e2 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png
index 5ec23a0e8380..caf35d090f59 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png
index ed5bed86a949..4c36c708cd04 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png
index 1842d3bf8a0a..5bba9bb54f99 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png
index 538d42072118..d5623753cc6b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png
index abd8ed3ef468..19b7700e9cdd 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png
index 3d5a1738d248..d86fe79d501b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png
index 0ad076f5897c..c38e4be2a6c8 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png
index 392aa232f49f..4ea1ce3dc56e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png
index 6f64e23cbf97..b49e12c1a3de 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png
index 92f932c8c364..5ce70642a017 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png
index 14a07f05b8e7..ebc0b5003971 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png
index 4f2ef7319484..04af4599df46 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png
index 4b110fa7afa6..862f22d6ed58 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png
index 9162814f1217..9d8f434f61f9 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png
index 48631d85965f..099703e06497 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png
index 67720fdc0b5c..64637438c4f8 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png
index b237c01f69d7..c3808eb3c562 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png
index f265ac90fdd1..14215bb84901 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png
index 05e81394f2c5..0720a34e1817 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png
index d64eba8dbf36..08d94b0367d8 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png
index cee235f4f3c3..58bd80badde2 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png
index ba6ce2fc3c7d..0c7a1f3f79a9 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png
index 38b822a9daf7..1a8c1e6496aa 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png
index 4639678da518..10bc6c48f299 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png
index 1f180adb5bc6..5aa4e98dee7e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png
index 18d83e9731d6..d6daf80223a3 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png
index 85b2ca6d6dd7..41275f109aa4 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png
index f72387297fe1..b63b7c3c5a6e 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png
index aa12de28ee06..403d1b7a8043 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png
index 841bcd9084ed..a19aa06bd7a6 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png
index 0d50319fd31a..33d4dbf2447b 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png
index 965a3ad08f47..ad89fa1453f6 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png
index 9a5a60a60074..9a970c8801a7 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png
index 79107fd27eda..5c7121722b57 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png
index 712b827d8d35..181c8122b140 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png
index 410f684a175f..1b285a735957 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png
index d84e60745de1..4a916880be7f 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png
index 9f8f46f0a064..4a3bc21e4525 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png
index c9e01ba1e354..84d944dbe617 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png
index a9a5f08cb7cd..8fe61bc6d499 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png
index 2218d2d109b1..d1a99062f9d7 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png
index db4ead0eebdd..3de70e3042c6 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png
index bbeedbc68f02..a2caa3170b91 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png
index c3f5036b16d1..984e0b17bb63 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png
index 370e49c6b96d..1a20df84b483 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png
index f1ca743d50ef..2ffe3f791c89 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png
index 63c14259fac1..87f788062498 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png
index d0ee3febfd63..39f1db7838fb 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png
index 936d5de72544..e1501fe6c7f5 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png
index 703aba97dc80..1ac9df6ca012 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png
index 2f0aacb93c34..486225b8586f 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png
index f975916eaacb..e2aec2bd8617 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png
index a81d8f845ed0..c63ee047ceaf 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png
index 6419d9027774..2f92d6173ca8 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png
index 801e5f65b6be..9b7c06560480 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png
index 18d83e9731d6..d6daf80223a3 100644
--- a/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png
+++ b/core/res/res/drawable-hdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png
index c6e2e53e501f..49d353df0ed3 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png
index c573cd835ab4..ca1bf45e9205 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png
index a2a31f771dd9..69611bc2e463 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png
index 9f5561fa4f96..53e0f64ad360 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png
index 2067c4401f82..bcf2a18b619d 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png
index d32a2fd9aaac..937f5a0ffe1b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png
index 6982586266bd..5a5e2d58063b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png
index a868a0c3e1e4..82cf33cf9a04 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png
index 64fc4946284e..522b331ef5cc 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png
index 752155a6834d..23723a38d458 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png
index f20c33e012be..313b6d2f54be 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png
index 37cb41232af4..cfbc110287f7 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png
index fe332bf89090..2b2c628ea382 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png
index 62c6cd697e3c..260adcaa5f72 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png
index bd7ad0c901e2..cadb1c5d189c 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png
index eb30288adf6a..b91e79997231 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png
index f6499d7b631b..19edb967ae98 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png
index e0e04a3ebe75..e7b20cc3efed 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png
index 7b8cb18c5b19..7ea341e3d5a0 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png
index 8a11c7a1e4c9..fb8b55627dba 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png
index 3525a4b8dde6..91016aaea105 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png
index 91fa1cd3ffc2..c51481ac0886 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png
index 5743b6b94d6f..80d09e29e5ba 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png
index ca095f733034..c4ad65fc9fb8 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png
index cfbc6b653c24..060be80bd2c3 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png
index 88563fe9e35b..e45e858132a2 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png
index 93f8826c80ca..55c3959bceed 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png
index c10996c0da1c..9c11d9967c00 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png
index c070849046ca..d3c334bb5486 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png
index 2dd4589d84d8..a3164c9ef124 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png
index 02dd21b3b5d0..b5507604d51d 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png
index 46fea5b24aa8..d5efab4ad17a 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png
index fbca13ed48ae..74d39acf56b7 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png
index 71ae1206561e..3775cefae334 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png
index 706787056ac0..d960a394b6ff 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png
index 6484f4b031da..6101cdf0f80a 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 000000000000..fca6c9678410
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png
index 06f65280fb90..b2bdc468722f 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png
index 4c6a2364b788..9d8335e02496 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png
index 973675217432..459376589c45 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png
index 7b9440861dfa..d740810d1c74 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png
index f588e9796400..7b8a7fcb3e0e 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 000000000000..e5d3c6823e94
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png
index 375d27eb87dd..b264a999b707 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png
index 9f52306fc448..0232d72d0526 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png
index 4f219e4f3bdd..2aa94bb31334 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png
index 6928e4ea7786..693f6c6f1add 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png
index 7dab339ac4d3..b7aea5c341b9 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 000000000000..217cb3de802c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png
index 71f9afa933ee..933f338e1218 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png
index c8dba8d5f8f8..a2ced7181060 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png
index 5923869dd88b..4303ca429a96 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png
index 5c2e9d3246ff..c4d955974968 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png
index 74464bab2eb8..a6e278bae2f9 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 000000000000..19bf6c2f2cef
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png
index 73b6e12f5182..c6c2163e12ea 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png
index e88bf8bfe64b..fe872389ea4d 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png
index c55137084a49..229c489aa539 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png
index 82380e5a9ca4..64155d9790a3 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png
index aed77cbd7b91..cb4c0ed9e2b2 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 000000000000..a85c70c92592
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png
index bf8bedf55922..d99afbf72f47 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png
index 9ef3ea60d13d..49d353df0ed3 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png
index a6bf744b0151..ca1bf45e9205 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png
index 0bca0a25b468..69611bc2e463 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png
index 2850d0bf2368..53e0f64ad360 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png
index 28045ef42ec5..bcf2a18b619d 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png
index 148c6844cd1b..937f5a0ffe1b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png
index b3f7cf512d25..5a5e2d58063b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png
index 1c3976402744..82cf33cf9a04 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png
index f7bfb79f7c17..522b331ef5cc 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png
index a68989098180..23723a38d458 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png
index b86016429c9f..313b6d2f54be 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png
index 76ea54c79072..db37fc53790a 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png
index 44a818abd3ee..79941dce4845 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png
index 40a8654019d8..3361fe2ae354 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png
index 02c69892d184..5649d0f691e6 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png
index 0749100540bb..801b562b80ea 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png
index c820e4a50ded..38e14080d3e4 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png
index 081f548b4e76..f99797dd73b7 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png
index bbdc3c80f858..7048711dbfc1 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png
index 1f9653f918e6..6f608047ed3b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png
index 2f8bdf513c27..da3a23bf1c67 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png
index 1400616f9e3f..4007ed1bd75e 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png
index 887e00d05da1..518d2b9ee2a0 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png
index 84eab6485b94..d821697d75c7 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png
index 6815686a9c13..aa19608164d6 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png
index 1cab25914002..81bf08c79316 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png
index c5d149a42061..1bb7aecd3a29 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png
index 22495c56aab9..864795cf9321 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png
index cc60f354c04d..ed07e9fb890c 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png
index cff5567c2a7e..a188260090d5 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png
index 9ef3ea60d13d..49d353df0ed3 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png
index cbcc75a3ce52..d5efab4ad17a 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png
index 52a5ee8df01f..74d39acf56b7 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png
index 528554aea0ed..3775cefae334 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png
index 28b0f41f0da4..d960a394b6ff 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png
index 772d39e9bbe3..6101cdf0f80a 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png
index c87eecf948a5..fca6c9678410 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png
index d98025442ebc..b2bdc468722f 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png
index d38af8e959ac..9d8335e02496 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png
index 92087b7dd2df..459376589c45 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png
index 5b161a269769..d740810d1c74 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png
index 62a925ffd8d3..7b8a7fcb3e0e 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png
index 6b8ac608cc9f..aadb0cdc0970 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png
index cfcdfaccde33..628e63dd5449 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png
index e124d271cbbb..dfc63ae305a1 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png
index 98cb9334300f..450ead15d35b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png
index d2867c1e237f..64249585037b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png
index df22da999d60..c5b7fa4277c0 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png
index 376ebf6b6c05..13fcf6f4c2d4 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png
index 3178adbb7157..5be9c699e67c 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png
index fc9a8e2f47c0..3de2194ddb7a 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png
index 41768523400e..c40a2cfd3d27 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png
index c598e69af1b9..9923ccd371c8 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png
index e186799c3e1f..8a000c1872db 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png
index 532bfba8a272..3680cede4dfa 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png
index b47cf1f4e353..d014f5ea8fcf 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png
index 95fed6cacb5d..a8aefdbb3440 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png
index 9097ffad545d..4716d66ec97b 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png
index cfd8d068e129..fdeaf4f52c03 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png
index 2013328caec2..9accc7a8a498 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png
index 39d8e5be519f..1f0a327f91ac 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png
index cbcc75a3ce52..d5efab4ad17a 100644
--- a/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png
+++ b/core/res/res/drawable-mdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png
index 4c54483dc335..0907a1e8b1aa 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png
index ea059cfe2490..365d96e4eacf 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png
index 3f4d55485306..7191add8b4a9 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png
index e6dbf9b752db..fd8a5dff27bc 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png
index 6e173ddc466b..9ae573be0ec1 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png
index 8ae261f16fc9..a41d549dd0a5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png
index 07040a28d6c4..4faef9853ba5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png
index 2a35082605bd..337372c10980 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png
index dc790f33778a..a78de95cd866 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png
index 47c7f7e720bb..74f891287946 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png
index 0f21484e26ef..0b868fb92fd2 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png
index 89e811ca1065..8c381cc68b3b 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png
index 7da883a52a5f..17e40a0b0b5d 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png
index 928fd3044cb3..5280b2fc15d3 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png
index d9718df33f61..dfe29ce64773 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png
index 85289ccec47d..663d361b0acc 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png
index a36ba095266a..5e2ecdf66307 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png
index 234d92f91c9c..8d6c1f243eed 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png
index 156a7273f602..4edd1acb0013 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png
index 4e9e5ede65e2..af45ea74bb1a 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png
index 04162890147f..f0757561d8e0 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png
index 01c1798d6770..69bd8775bdca 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png
index 9dfb7b3aa254..8c956bb6706e 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png
index af378045c750..76bf9ab8d68f 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png
index 08a5e4161bd0..1a7f9a13132f 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png
index 428e20cf53de..1275eaa508c1 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png
index c57b40ce4b4b..c4ed71defa7f 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png
index 5c06f4620f0d..03252d77af9c 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png
index 3eac7d47f93f..ea8ee855796c 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png
index ac970b00b7f8..b024c4e68eff 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png
index df1e54c3f1dd..35516f6d21a4 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png
index 495606cc3294..dbd985495bc5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png
index b4604c514b38..f0c30b10e79c 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png
index 72c1f6e0a8b5..f21743b18161 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png
index 117c5b5161fd..0b96ae0b6634 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png
index e8cbbb8e760e..2e5407ff2a8c 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 000000000000..0beb38973c4d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png
index 35341d712c3a..a41586e5a929 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png
index 8f17e37948d3..709f6501f0c7 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png
index 93a977f2befd..494a7165c531 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png
index 2ebed2a2e54e..9ec48f4ad21d 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png
index dfa06434a163..f4c22b14cc57 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 000000000000..6fd600f48d9b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png
index dd2d79a71fee..cfee3e1f927d 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png
index e9064d5c11c0..cc79904e3fe1 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png
index 50cf467af43b..28c7441da0f6 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png
index 7be4fba78c30..6c7e53435deb 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png
index ba828043995d..e7d20d751b8a 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 000000000000..ea492d2b76ab
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png
index 220cbccacee1..92c6ad85e507 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png
index bbb16bacbfde..f666d8930d98 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png
index 8f6c739f640e..c2b600de2f5d 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png
index 9ab0656d14c0..31736aaca08b 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png
index 9bea94e33c9b..3032ef0c0134 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 000000000000..1d5cbc012bb6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png
index baa05f77d6bb..84ebcc3676bf 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png
index 35d8280c638b..505aadf7f2d7 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png
index 76900eeb2136..3b8c662c91c5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png
index 9f86a59d323a..d650c07f749a 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png
index f9a6d4c9490f..3caa40d1db15 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 000000000000..d3f8ea616044
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png
index 235e12d83405..b54396c39da7 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png
index 1d85b667c57e..0907a1e8b1aa 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png
index 856292fc2c64..365d96e4eacf 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png
index 68223c3920ca..7191add8b4a9 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png
index db58987c1528..fd8a5dff27bc 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png
index 668789a28267..9ae573be0ec1 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png
index 268879e4f983..a41d549dd0a5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png
index 72096a75d093..4faef9853ba5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png
index 04cce3d9ae3f..337372c10980 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png
index 573e6d6b6f2f..a78de95cd866 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png
index 64556a41e7d2..74f891287946 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png
index 4a0d428a6a57..0b868fb92fd2 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png
index c3ab54bdbb0e..90ca46c80594 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png
index b431a09d5806..db0201973d84 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png
index 6a0f0af6f26b..ce5ee81a329a 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png
index 1c69324cb484..3dcbef6a6079 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png
index 7d90e57d7887..7646f1831231 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png
index 59a41215084e..c16cac96f868 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png
index 2baf7f6325b9..7dbc57cd70fc 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png
index 66c61d424b66..39d17e04ae57 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png
index 8a77aa513fe0..ad0e12128a7b 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png
index 6820b623bd52..30ea5dfd1431 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png
index ce4a1c706f44..151a2223dbef 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png
index fe765c49c8f2..7d4e66068793 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png
index 85897efe18a3..8e26d54bfd85 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png
index 7a68cf7edc23..e85f2394349a 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png
index bf0a05371016..81f38ac32a5c 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png
index 5bb46b30e8d1..5a50e6ac56c5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png
index cc9cf53b4eea..6069dadd5af2 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png
index c98d4e59cc4e..37cc4c6a5549 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png
index 43bb757028e4..aff0d4c3ef8d 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png
index 1d85b667c57e..0907a1e8b1aa 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png
index 231aec4f7960..dbd985495bc5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png
index e20c2a288f1c..f0c30b10e79c 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png
index 9c247a68a2c6..f21743b18161 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png
index 2a5da5f41cd2..0b96ae0b6634 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png
index 31224e178ae0..2e5407ff2a8c 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png
index 1a792fbe6bdf..302fafa14873 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png
index 9c9190dd0704..a41586e5a929 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png
index 07b666c2f334..709f6501f0c7 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png
index 8cc43fd28cbd..494a7165c531 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png
index 7f8a8017e77b..9ec48f4ad21d 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png
index fe321acd8438..f4c22b14cc57 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png
index a37741cc0ec0..7d72685f8c65 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png
index 395bebd74e60..4c545efd2c01 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png
index 746580deb32c..a8e9b007f24b 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png
index b279cf2f2ee9..b67140d9e94b 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png
index d99a66ec5390..166bdaeb942e 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png
index e0232dcc8562..1bda465b4148 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png
index de27b754e163..cc8ec51fa963 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png
index e2e2c475998b..cf2013c61140 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png
index 53cc9a6b540a..daa1ca17c7df 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png
index 1b2422c9960e..56355d9bebf7 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png
index 8d03f5590565..42657ec39ab4 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png
index e938e3a700a2..53e4121c0be6 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png
index d3c0395a6313..f6e9ffa00ab9 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png
index f8b5ab3e38e1..a313e16015cc 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png
index aa935f894c67..40034b6512e0 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png
index 7a536897cc12..678f9725eecf 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png
index 31cee6454e7c..d2a37073d8b8 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png
index 98db967c9629..427c52e3ea4f 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png
index 5b05e0f69727..8a4d80759435 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png
index 231aec4f7960..dbd985495bc5 100644
--- a/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png
+++ b/core/res/res/drawable-xhdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png
index 80ffc08bac67..97949c66b112 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png
index 5640697ebbb4..3f35bcd9bb15 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png
index c1ec38a8477c..0ed20948bca7 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png
index 781f4699644d..7fa7f010af2d 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png
index 9edcb9fd5171..b7e1ea164a96 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png
index fe9eee463f11..ff079326e9ad 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png
index e5155fef3766..4a7b283bf4ca 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png
index e1bf3b8265b6..41c4443cf05c 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png
index 4ec553a107f9..461fa4622a0d 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png
index 67685b48f585..f96d1f010de9 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png
index 527dbde5ba0d..87a9b49722d2 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png
index 77f9e4657d1d..96b536653900 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png
index a0395a157aa7..532a86dd35f7 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png
index 26e73070c25e..9f37eb266f02 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png
index 632457f7ac37..2437e0e80a01 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png
index d80234ad5bad..79bc6ce0d6ed 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png
index 4297fefd3227..9dbbe2f712c2 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png
index a646b4a621eb..1da48b863b17 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png
index fc49b39aaf20..89635820b32a 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png
index bfa795ebe0c6..ec4be833f959 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png
index 70f49a9fef1c..4658fc3ad101 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png
index 7d1d7c7addc5..3ecd6bd1409a 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png
index 94692f02f179..565e8deec640 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png
index f38d3fb2e861..9c5c607cb7f1 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png
index 3bc7ab93ba41..87b84a7c33b9 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png
index b644a7787ccd..9e12e5bb7998 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png
index 478828349bab..85e8791bdd33 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png
index dedfebcf3966..a7bd75d73764 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png
index be40ac1d85f9..204f3936ebf6 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png
index d4376f501f8e..78f787abcdb1 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png
index aca83dacae4e..a2e61c2cb0ab 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png
index c3f20e520de0..80d5155c0fbd 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png
index 49d5421bb032..8ec05aeee823 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png
index 33c3956f3673..42cd13cf7e57 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png
index aa349f6d1ed2..f43727f0138e 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png
index af6117a417b9..e61a05c074c6 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png
new file mode 100644
index 000000000000..8dc5976ad6b7
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png
index e7e8d2a1a98d..ead968ed5d75 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png
index 5470a0422450..52aa7d52f033 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png
index d73361aa2c9d..58986d450b96 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png
index eba4134376d1..42d6c7ce51da 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png
index c27f694807ec..e7e0e60d1e05 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png
new file mode 100644
index 000000000000..75bd261f2b85
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png
index c60098ef41bc..5207dac42a19 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png
index 302614521441..c2f69e79f7bb 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png
index 377e026106e0..167f8824bd25 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png
index f69791636329..d6a85f2442c0 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png
index f5df91c23c78..cb0390dc5681 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png
new file mode 100644
index 000000000000..6a65d158f89d
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png
index d2b5e76d42e0..8086a55f1cbf 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png
index 213f37ecf756..eee4115746c4 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png
index 23ba68e1aa39..d214ad1eea50 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png
index 58267608f7c9..ac56ac46e1e3 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png
index 1f66a8e19453..49af14e70b58 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png
new file mode 100644
index 000000000000..5003095b4e97
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png
index af64c3c9725d..62054a0e1146 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png
index 8284f706b404..4c83dd483684 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png
index 18c513e50df4..a55f8e414735 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png
index d6d6b1734b05..81567b7e691b 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png
index 89b9d3a0c024..40474754575e 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png
new file mode 100644
index 000000000000..23db45a064e8
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png
index 1ae65d0f27c0..e7d9961a11c0 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png
index 9acbd296eb58..97949c66b112 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png
index 5de2581409ca..3f35bcd9bb15 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png
index 9a566b8b9948..0ed20948bca7 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png
index bceaead08e6e..7fa7f010af2d 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png
index faa78ec6c87b..b7e1ea164a96 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png
index 78f84346d052..ff079326e9ad 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png
index 7746465ae3d8..4a7b283bf4ca 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png
index 1df1530af807..41c4443cf05c 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png
index ae9702a85a48..461fa4622a0d 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png
index f637e79abfea..f96d1f010de9 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png
index fa8f06290099..87a9b49722d2 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png
index a780ae4a5418..685a340b5216 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png
index cb2a15a14e97..b49c30e85173 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png
index 7588633e73db..aa92d9ed7952 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png
index bbcedcc96148..73d487cc2432 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png
index c521567dd69b..f427d0c4a3f9 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png
index 6add7d38d16e..8fbaa08778af 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png
index e907da57a658..1f0fcd67ee8a 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png
index 733af5f15e1c..80c905a91181 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png
index cf990dba052c..9b27fa38626f 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png
index c025fffb7af4..24f2b75803f6 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png
index 443fcd8c334f..f499d0a6fcdb 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png
index 5532128118a7..e22ca9bb42a5 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png
index 2800b0078e7c..596ca8b67250 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png
index 31fd5de8fe38..363a4d647736 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png
index 8a7c4f964d6f..10e275bdb90f 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png
index f4258ccd4306..aa87c9e5cd9c 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png
index 5d87f0c41559..77a2b8f56d4a 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png
index 366537e770f9..f6108d95c30d 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png
index 6326ac5ed0b5..e3a6a20d3376 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png
index 9acbd296eb58..fa6dc9aacd49 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png
index 5d4273d62d9a..80d5155c0fbd 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png
index 4524cb18a4c2..8ec05aeee823 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png
index 766caeff3323..42cd13cf7e57 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png
index c25cc84d5bfc..f43727f0138e 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png
index 8b02b5ab8d95..849638b1ed4f 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png
index efc4d557547a..06e21b06a1ec 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png
index a504cb515fd2..ead968ed5d75 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png
index 093531c90427..52aa7d52f033 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png
index f847e1b3fcec..58986d450b96 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png
index 35d97efa0b4e..42d6c7ce51da 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png
index 140b74b88a13..e7e0e60d1e05 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png
index da14c62aa486..933be303500d 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png
index f7ae5e7944f7..b39230f429cb 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png
index 2251e146a62e..01492c44a2e8 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png
index 131c64d50896..b56aa16538a7 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png
index 92ac75af36d1..bdd3d2c74e0f 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png
index 2d8ebc4ec871..b76d5d70f521 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png
index 1b804bb7f891..5fb12e763b12 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png
index 5457baa5b84b..64fe3c53ec61 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png
index 47d5bd4843aa..68fd05155db4 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png
index acadb307d5c9..a4fd4cc9a400 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png
index f17cb4af83c3..40b02f06c3dc 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png
index 3766cb9383c5..fcd6ddb844c8 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png
index 307e313b7c1a..cb250dddd69d 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png
index 850e96a768d1..43d211921b62 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png
index ec3127854ff2..bdcaf69feb71 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png
index 56b1c0f1f3cf..3d2bff466008 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png
index 47cf5787389a..290e7d906049 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png
index a9ffc25fbf6b..6c670fb9068a 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png
index 96e450223b84..e93c824660c9 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png
index 5d4273d62d9a..80d5155c0fbd 100644
--- a/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png
+++ b/core/res/res/drawable-xxhdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png
index 81af491ff1d6..5561c6275711 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png
index 2a003905d215..9eff17e594b4 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png
index 87b5f5aa72c8..67923e25999c 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png
index 0a0d97f1ae02..1aa0e98965c1 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png
index c4f0a3857c1e..7cd549df58c3 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png
index e084de37413f..2c14d79181b6 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png
index 899c37d6def3..9f061a5331a0 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png
index 7ff2f313659b..fe1523086df5 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png
index 737ff623382f..220a4fed4b64 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png
index 5125e4fcc1eb..77aac4cb6daa 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png
index 3a7d3b7edad7..bf691881dc3c 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png
index 6d05101572d8..22197da7f540 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png
index 99f93cfbd9e3..380e9298a0d0 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png
index a4a258e820ae..d93a600938bd 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png
index 35e58d5ecff6..3709d5fa21d5 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png
index 4b012b629971..2a5019b59195 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png
index eaa8cf4c9969..f75a0720e711 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png
index 389637ef9730..c8dcd0da0269 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png
index 4e3484ebde31..172775e7db1f 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png
index 12c6b8365b31..2f081fd81e9a 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png
index a3eb0f11cce9..cb4c55b9deed 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png
index 8a98d5fe6282..de155f6ae4ff 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png
index 68960384d4ab..2cc028d8b576 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png
index 2a0e403c42c9..e848d08f6852 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png
index 5043219ceb26..584c2f8c197f 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png
index 58b5eeff3923..c9299be66fb6 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png
index 553209cc3f2d..8abcbd69ad42 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png
index 48a38b52484e..ee53e472e9d7 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png
index ead8201da714..b10d23a26c19 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png
index cb6a80b68e9b..65a23632c952 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png
index b7bcbb9956f9..2b7347282253 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png
index 8397f98c3e22..6a656b855186 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png
index eb5e3cfa728f..7d3a3b6b3461 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png
index 8aaa830b1c85..6b22554baf95 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png
index 668df6619dff..0a9245c6db7b 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png
index abbe1cecb1ce..f9a7f6c93714 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png
index 85a1d17e7c9a..ac396ed23c13 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png
index e2beede5b3f4..8c15241d09d5 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png
index 726bf50a7f56..e6a75e217481 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png
index cdf76217c7c8..90280a926217 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png
index f69cfd5063f4..d9a4632bb320 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png
index 51ba70e447c0..b1ae68b5fdb4 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png
index 69e0b671febb..e5cba8f18e14 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png
index 8b12a77cb509..611faeb14ba5 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png
index 95c5074d09c6..dfada4df313f 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png
index 26ee16002bac..6118202120e2 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png
index a651506de656..60d51994d058 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png
index 58978c62b965..ee0b672c5bfd 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png
index f5cf8f771a9d..5a97f67416ca 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png
index b35afdd19605..9237a7d516fe 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png
index 222abf4910bf..4d4c663064bd 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png
index c71b11f97483..141f9f6e1f48 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png
index b96abd9e371b..2baa531f5cf5 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png
index 6aedd05ad60a..7a911d5a22cc 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png
index 84e5f94f149d..a760b85ff924 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png
index 95d38b41889e..5c15a879a9b1 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png
index 469001642ce2..36a9f1fe8e17 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png
index 60f9f48c72a2..03e8c9f7c2dc 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png
index 32bcf2778381..533c69498f6f 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png
index 11e51f30e14a..ead60f5e6fef 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png
index 43f51fe6f379..0a8534f56507 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png
index 8d6d3ddd5e33..fa69ad0a39c2 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connected_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png
index 81af491ff1d6..5561c6275711 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png
index 2a003905d215..9eff17e594b4 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png
index 87b5f5aa72c8..67923e25999c 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png
index 0a0d97f1ae02..1aa0e98965c1 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png
index c4f0a3857c1e..7cd549df58c3 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png
index e084de37413f..2c14d79181b6 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png
index 899c37d6def3..9f061a5331a0 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png
index 7ff2f313659b..fe1523086df5 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png
index 737ff623382f..220a4fed4b64 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png
index 5125e4fcc1eb..77aac4cb6daa 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png
index 3a7d3b7edad7..bf691881dc3c 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png
index 6369e1f17649..98b04487e0f7 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png
index 759be2541134..a92641958a6b 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png
index 51e4386b4610..53f6e3ed1d64 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png
index d52b63f791d0..4a2d1b1768f2 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png
index 8e41ba9a326c..22cce05577c7 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png
index c7c63dce5425..d40db2168eb1 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png
index 18cefd6d777d..0a95b7ef7c76 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png
index 48bb6c96c6ae..08698bde6d28 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png
index 11a09139b4e4..698d23ad1793 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png
index c1e6b511cb7e..36ed854751e0 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png
index afd3b9d98ed5..2c0d9252e8e7 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png
index 97e0dab40765..747b90162a90 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png
index 483046b3f718..bae86656ce2d 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png
index 3c492d9cf2f9..fd7b1a88af81 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png
index 4eecaace99ea..03f624e33c5d 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png
index ce234e6023fb..d2a06ed167f9 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png
index 95f25c32c357..c5b2a165b824 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png
index 9f880db049f2..8b045cb1d798 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png
index 3a7551e454a1..522ec676aa93 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png
index 81af491ff1d6..5561c6275711 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_dark_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png
index 8397f98c3e22..6a656b855186 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_00_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png
index eb5e3cfa728f..7d3a3b6b3461 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_01_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png
index 8aaa830b1c85..6b22554baf95 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_02_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png
index 668df6619dff..0a9245c6db7b 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_03_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png
index abbe1cecb1ce..f9a7f6c93714 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_04_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png
index 85a1d17e7c9a..ac396ed23c13 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_05_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png
index e2beede5b3f4..8c15241d09d5 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_06_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png
index 726bf50a7f56..e6a75e217481 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_07_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png
index cdf76217c7c8..90280a926217 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_08_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png
index f69cfd5063f4..d9a4632bb320 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_09_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png
index 51ba70e447c0..b1ae68b5fdb4 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_10_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png
index 9c817429cb4f..e3ce3fd3d3db 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_11_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png
index 939cd54c195b..42482a45fd5e 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_12_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png
index 03615c3962d1..ff30f9877138 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_13_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png
index d9d9374aa0fc..0ddcb5515bad 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_14_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png
index e81e8c237ebf..46ec435d158f 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_15_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png
index bfb261aa2e64..d95fd77adacf 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_16_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png
index 03171d0ef012..f116a1fa1951 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_17_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png
index d0d97db3c3c6..957db7fc9c97 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_18_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png
index 3c3e9dd2deba..624ec473b5e8 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_19_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png
index 4bd347af5789..362fba40c74e 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_20_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png
index 28f32777ffa5..24032b979b5e 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_21_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png
index 30beb557beaf..6e4c83c2ea58 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_22_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png
index df5f1ce9ac08..1d2a09e4b904 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_23_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png
index 6985c8c68f36..7b05dfaac1ba 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_24_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png
index 337089888d12..30de74a12996 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_25_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png
index 6ef6a2c8953d..b08b782f1f09 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_26_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png
index 60e5ef962209..e52a1aa381a0 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_27_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png
index 76a675cde09f..2c311f56adaa 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_28_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png
index c92dcd405017..efdf5fca48bd 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_29_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png
index 8397f98c3e22..6a656b855186 100644
--- a/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png
+++ b/core/res/res/drawable-xxxhdpi/ic_media_route_connecting_light_30_mtrl.png
Binary files differ
diff --git a/core/res/res/drawable/scrollbar_handle_material.xml b/core/res/res/drawable/scrollbar_handle_material.xml
index 33efbbac8690..f020112d1329 100644
--- a/core/res/res/drawable/scrollbar_handle_material.xml
+++ b/core/res/res/drawable/scrollbar_handle_material.xml
@@ -19,7 +19,4 @@
android:shape="rectangle">
<solid
android:color="#84ffffff" />
- <size
- android:width="4dp"
- android:height="4dp" />
</shape>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 186cbbf3837e..1c1ec2565254 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1509,7 +1509,7 @@
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"Koristi prečicu"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
- <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string>
+ <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string>
<string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da promijenite funkcije, dodirnite i držite dugme Pristupačnost."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string>
<string name="user_switched" msgid="3768006783166984410">"Trenutni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
@@ -1736,7 +1736,7 @@
<string name="user_creation_adding" msgid="4482658054622099197">"Da li dozvoljavate da <xliff:g id="APP">%1$s</xliff:g> kreira novog korisnika za <xliff:g id="ACCOUNT">%2$s</xliff:g> (Korisnik sa ovim nalogom već postoji)?"</string>
<string name="language_selection_title" msgid="2680677278159281088">"Dodaj jezik"</string>
<string name="country_selection_title" msgid="2954859441620215513">"Izbor regije"</string>
- <string name="search_language_hint" msgid="7042102592055108574">"Ukucajte ime jezika"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Upišite ime jezika"</string>
<string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženo"</string>
<string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index e8df21f36558..6c5e7e566398 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1296,7 +1296,7 @@
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Toca para salir del modo coche."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir Internet/Zona Wi-Fi activado"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir conexión/Zona Wi-Fi activada"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Toca para configurar."</string>
<string name="back_button_label" msgid="2300470004503343439">"Atrás"</string>
<string name="next_button_label" msgid="1080555104677992408">"Siguiente"</string>
@@ -1383,7 +1383,7 @@
<string name="data_usage_mobile_limit_snoozed_title" msgid="279240572165412168">"Límite de datos móviles superado"</string>
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Límite de datos Wi-Fi superado"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"Límite superado en <xliff:g id="SIZE">%s</xliff:g>"</string>
- <string name="data_usage_restricted_title" msgid="5965157361036321914">"Conexiones automáticas restringidas"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"Datos en segundo plano restringidos"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Toca para quitar la restricción."</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificado de seguridad"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Este certificado es válido."</string>
@@ -1618,7 +1618,7 @@
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado por el administrador"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Actualizado por el administrador"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"Eliminado por el administrador"</string>
- <string name="battery_saver_description" msgid="1960431123816253034">"Para mejorar la duración de la batería, la función de ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
+ <string name="battery_saver_description" msgid="1960431123816253034">"Para mejorar la duración de la batería, la función de ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de los datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
<string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar ahorro de datos?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 36922d985056..b5234a8e3154 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1770,8 +1770,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Ebakuatu kostaldeak eta ibaialdeak berehala eta joan toki seguru batera, adibidez, toki garai batera."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Ez larritu eta bilatu babesleku bat inguruan."</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"Larrialdi-mezuen proba"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Erantzun"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"Ez da onartzen SIM txartela"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Ez dago SIM txartelik"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index a39bc3ff5b4e..c6881825bfe1 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1769,8 +1769,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Évacuez immédiatement les zones côtières et les rives des fleuves, et réfugiez-vous dans un endroit plus sécuritaire, comme un terrain surélevé."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Restez calme et cherchez un abri à proximité."</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"Test de messages d\'urgence"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Répondre"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"Carte SIM non autorisée"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Carte SIM non configurée"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 728de0546f1d..a5c9b0f9c4fb 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1420,7 +1420,7 @@
<string name="media_route_button_content_description" msgid="591703006349356016">"Caster"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"Connexion à l\'appareil"</string>
<string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Caster l\'écran sur l\'appareil"</string>
- <string name="media_route_chooser_searching" msgid="4776236202610828706">"Recherche d\'appareils en cours…"</string>
+ <string name="media_route_chooser_searching" msgid="4776236202610828706">"Recherche d\'appareils…"</string>
<string name="media_route_chooser_extended_settings" msgid="87015534236701604">"Paramètres"</string>
<string name="media_route_controller_disconnect" msgid="8966120286374158649">"Déconnecter"</string>
<string name="media_route_status_scanning" msgid="7279908761758293783">"Analyse en cours..."</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 09104db004e4..8db169b0276e 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1770,8 +1770,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Abandona de inmediato rexións costeiras e situadas na beira de ríos para dirixirte a un lugar máis seguro, como un terreo elevado."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Mantén a calma e busca refuxio cerca."</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"Proba de mensaxes de emerxencia"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Responder"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"Non se admite a tarxeta SIM"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Non se introduciu ningunha tarxeta SIM"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index f0732d41fd37..bffede48084f 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -837,7 +837,7 @@
<string name="save_password_remember" msgid="6491879678996749466">"याद रखें"</string>
<string name="save_password_never" msgid="8274330296785855105">"कभी नहीं"</string>
<string name="open_permission_deny" msgid="7374036708316629800">"आपके पास इस पेज को खोलने की अनुमति नहीं है."</string>
- <string name="text_copied" msgid="4985729524670131385">"लेख की क्‍लिपबोर्ड पर प्रतिलिपि बनाई गई."</string>
+ <string name="text_copied" msgid="4985729524670131385">"लेख को क्‍लिपबोर्ड पर कॉपी किया गया."</string>
<string name="more_item_label" msgid="4650918923083320495">"अधिक"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"मेनू+"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string>
@@ -954,12 +954,12 @@
<string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll" msgid="6876518925844129331">"सभी को चुनें"</string>
<string name="cut" msgid="3092569408438626261">"काटें"</string>
- <string name="copy" msgid="2681946229533511987">"प्रतिलिपि बनाएं"</string>
+ <string name="copy" msgid="2681946229533511987">"कॉपी करें"</string>
<string name="paste" msgid="5629880836805036433">"चिपकाएं"</string>
<string name="paste_as_plain_text" msgid="5427792741908010675">"सादे पाठ के रूप में चिपकाएं"</string>
<string name="replace" msgid="5781686059063148930">"बदलें•"</string>
<string name="delete" msgid="6098684844021697789">"हटाएं"</string>
- <string name="copyUrl" msgid="2538211579596067402">"URL की प्रतिलिपि बनाएं"</string>
+ <string name="copyUrl" msgid="2538211579596067402">"URL को कॉपी करें"</string>
<string name="selectTextMode" msgid="1018691815143165326">"लेख को चुनें"</string>
<string name="undo" msgid="7905788502491742328">"वापस लाएं"</string>
<string name="redo" msgid="7759464876566803888">"फिर से करें"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 5b741ca5fb21..7cf7507e9100 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -567,8 +567,8 @@
<string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"Կարգավորել, որ սարքի համընդհանուր պրոքսի-սերվերն օգտագործվի, երբ քաղաքականությունը միացված է: Միայն սարքի սեփականատերը կարող է կարգավորել համընդհանուր պրոքսի-սերվերը:"</string>
<string name="policylab_expirePassword" msgid="5610055012328825874">"Նշել էկր կողպ գաղտնաբ սպառումը"</string>
<string name="policydesc_expirePassword" msgid="5367525762204416046">"Փոխել էկրանի կողպման գաղտնաբառի, PIN-ի կամ նախշի փոփոխման հաճախականությունը:"</string>
- <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Կարգավորել պահոցի կոդավորումը"</string>
- <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Պահանջել, որ պահվող հավելվածների տվյալները լինեն կոդավորված:"</string>
+ <string name="policylab_encryptedStorage" msgid="8901326199909132915">"Կարգավորել պահոցի գաղտնագրումը"</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Պահանջել, որ պահվող հավելվածների տվյալները լինեն գաղտնագրված:"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Կասեցնել տեսախցիկները"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Կանխել բոլոր սարքերի ֆոտոխցիկների օգտագործումը:"</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Անջատել կողպման գործառույթները"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 938b03aac6fd..426442c0734c 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1837,8 +1837,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"יש להתפנות מיידית מאזורים הסמוכים לחופים ולנהרות למקום בטוח יותר, כגון שטח גבוה יותר."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"הישאר רגוע וחפש מחסה בקרבת מקום."</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"בדיקה של הודעות חירום"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"השב"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"‏כרטיס ה-SIM לא מורשה"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"‏כרטיס ה-SIM לא מזוהה"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index affd2874990d..52d5b0b4b8cf 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1769,8 +1769,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"ອົບພະຍົບອອກຈາກເຂດຊາຍຝັ່ງທະເລ ແລະ ບໍລິເວນແມ່ນ້ຳໄປບ່ອນທີ່ປອດໄພກວ່າ ເຊັ່ນ: ບ່ອນສູງ ໂດຍທັນທີ."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"ໃຈເຢັນໆ ແລະ ຊອກຫາບ່ອນພັກຢູ່ໃກ້ໆ."</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"ທົດສອບຂໍ້ຄວາມສຸກເສີນ"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"ຕອບກັບ"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ SIM"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"ບໍ່ມີການນຳໃຊ້ SIM"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 48baf056fa3b..ac24366aadc1 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1837,8 +1837,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Takoj se umaknite z obalnih območij in bregov rek na varnejše mesto, na primer na višje ležeča mesta."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Ostanite mirni in poiščite zavetje v bližini."</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"Preskus sporočil v sili"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Odgovor"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"Kartica SIM ni dovoljena"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"Kartica SIM ni omogočena za uporabo"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index aa6356248b73..48c714b64658 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1769,8 +1769,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"Kıyı kesimlerini ve nehir kenarlarını hemen boşaltarak yüksek yerler gibi daha güvenli bölgelere gidin."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"Sakin olun ve yakınlarda sığınabileceğiniz bir yer bulun."</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"Acil durum mesajları testi"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"Yanıtla"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"SIM\'e izin verilmiyor"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"SIM için temel hazırlık yapılmadı"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 0a39be07eb22..dc0395adf6dd 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -999,7 +999,7 @@
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"使用%1$s分享"</string>
<string name="whichSendApplicationLabel" msgid="4579076294675975354">"分享"</string>
<string name="whichSendToApplication" msgid="8272422260066642057">"通过以下应用发送"</string>
- <string name="whichSendToApplicationNamed" msgid="7768387871529295325">"通过1$s发送"</string>
+ <string name="whichSendToApplicationNamed" msgid="7768387871529295325">"通过%1$s发送"</string>
<string name="whichSendToApplicationLabel" msgid="8878962419005813500">"发送"</string>
<string name="whichHomeApplication" msgid="4307587691506919691">"选择主屏幕应用"</string>
<string name="whichHomeApplicationNamed" msgid="4493438593214760979">"将“%1$s”设为主屏幕应用"</string>
@@ -1769,8 +1769,7 @@
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"请立即从沿海和河滨区域撤离到高地等较安全的地方。"</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"请保持冷静,并寻找附近的避难地点。"</string>
<string name="etws_primary_default_message_test" msgid="2709597093560037455">"紧急消息测试"</string>
- <!-- no translation found for notification_reply_button_accessibility (3621714652387814344) -->
- <skip />
+ <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"回复"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="7729819349669603406">"不受允许的 SIM 卡"</string>
<string name="mmcc_imsi_unknown_in_hlr" msgid="6321202257374418726">"未配置的 SIM 卡"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 10ffa5d74df7..ceb7ccdca190 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1990,6 +1990,10 @@
<!-- Amount of time in ms the user needs to press the relevant key to bring up the global actions dialog -->
<integer name="config_globalActionsKeyTimeout">500</integer>
+ <!-- Default width of a vertical scrollbar and height of a horizontal scrollbar.
+ Takes effect only if the scrollbar drawables have no intrinsic size. -->
+ <dimen name="config_scrollbarSize">4dp</dimen>
+
<!-- Distance that should be scrolled, per axis value, in response to a horizontal
{@link MotionEvent#ACTION_SCROLL} event. -->
<dimen name="config_horizontalScrollFactor">64dp</dimen>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 18e8af7836d2..8c26db43fc41 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -20,23 +20,13 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Suffix added to a number to signify size in bytes. -->
<string name="byteShort">B</string>
- <!-- Suffix added to a number to signify size in kilobytes (1000 bytes).
- If you retain the Latin script for the localization, please use the lowercase
- 'k', as it signifies 1000 bytes as opposed to 1024 bytes. -->
- <string name="kilobyteShort">kB</string>
- <!-- Suffix added to a number to signify size in megabytes. -->
- <string name="megabyteShort">MB</string>
- <!-- Suffix added to a number to signify size in gigabytes. -->
- <string name="gigabyteShort">GB</string>
- <!-- Suffix added to a number to signify size in terabytes. -->
- <string name="terabyteShort">TB</string>
<!-- Suffix added to a number to signify size in petabytes. -->
<string name="petabyteShort">PB</string>
- <!-- Format string used to add a suffix like "kB" or "MB" to a number
- to display a size in kilobytes, megabytes, or other size units.
- Some languages (like French) will want to add a space between
- the placeholders. -->
- <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="MB">%2$s</xliff:g></string>
+ <!-- Format string used to add a suffix like "B" or "PB" to a number
+ to display a size in bytes or petabytes.
+ Some languages may want to remove the space between the placeholders
+ or replace it with a non-breaking space. -->
+ <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="B">%2$s</xliff:g></string>
<!-- Used in Contacts for a field that has no label and in Note Pad
for a note with no name. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 8a7d8e3e8293..beab29aff1c5 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -451,6 +451,7 @@
<java-symbol type="dimen" name="config_viewConfigurationTouchSlop" />
<java-symbol type="dimen" name="config_viewMinFlingVelocity" />
<java-symbol type="dimen" name="config_viewMaxFlingVelocity" />
+ <java-symbol type="dimen" name="config_scrollbarSize" />
<java-symbol type="dimen" name="config_horizontalScrollFactor" />
<java-symbol type="dimen" name="config_verticalScrollFactor" />
<java-symbol type="dimen" name="config_scrollFactor" />
@@ -677,7 +678,6 @@
<java-symbol type="string" name="fileSizeSuffix" />
<java-symbol type="string" name="force_close" />
<java-symbol type="string" name="gadget_host_error_inflating" />
- <java-symbol type="string" name="gigabyteShort" />
<java-symbol type="string" name="gpsNotifMessage" />
<java-symbol type="string" name="gpsNotifTicker" />
<java-symbol type="string" name="gpsNotifTitle" />
@@ -733,7 +733,6 @@
<java-symbol type="string" name="keyboardview_keycode_enter" />
<java-symbol type="string" name="keyboardview_keycode_mode_change" />
<java-symbol type="string" name="keyboardview_keycode_shift" />
- <java-symbol type="string" name="kilobyteShort" />
<java-symbol type="string" name="last_month" />
<java-symbol type="string" name="launchBrowserDefault" />
<java-symbol type="string" name="lock_to_app_toast" />
@@ -754,7 +753,6 @@
<java-symbol type="string" name="lockscreen_emergency_call" />
<java-symbol type="string" name="lockscreen_return_to_call" />
<java-symbol type="string" name="low_memory" />
- <java-symbol type="string" name="megabyteShort" />
<java-symbol type="string" name="midnight" />
<java-symbol type="string" name="mismatchPin" />
<java-symbol type="string" name="mmiComplete" />
@@ -957,7 +955,6 @@
<java-symbol type="string" name="sync_really_delete" />
<java-symbol type="string" name="sync_too_many_deletes_desc" />
<java-symbol type="string" name="sync_undo_deletes" />
- <java-symbol type="string" name="terabyteShort" />
<java-symbol type="string" name="text_copied" />
<java-symbol type="string" name="time_of_day" />
<java-symbol type="string" name="time_picker_decrement_hour_button" />
@@ -1472,6 +1469,7 @@
<java-symbol type="xml" name="global_keys" />
<java-symbol type="xml" name="default_zen_mode_config" />
<java-symbol type="xml" name="sms_7bit_translation_table" />
+ <java-symbol type="xml" name="color_extraction" />
<java-symbol type="raw" name="color_fade_vert" />
<java-symbol type="raw" name="color_fade_frag" />
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 86abe9782c09..9dafa7a02849 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -214,7 +214,7 @@ please see themes_device_defaults.xml.
<!-- Scrollbar attributes -->
<item name="scrollbarFadeDuration">250</item>
<item name="scrollbarDefaultDelayBeforeFade">400</item>
- <item name="scrollbarSize">10dp</item>
+ <item name="scrollbarSize">@dimen/config_scrollbarSize</item>
<item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item>
<item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item>
<item name="scrollbarTrackHorizontal">@null</item>
@@ -582,7 +582,7 @@ please see themes_device_defaults.xml.
<!-- Scrollbar attributes -->
<item name="scrollbarFadeDuration">250</item>
<item name="scrollbarDefaultDelayBeforeFade">400</item>
- <item name="scrollbarSize">10dp</item>
+ <item name="scrollbarSize">@dimen/config_scrollbarSize</item>
<item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item>
<item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item>
<item name="scrollbarTrackHorizontal">@null</item>
diff --git a/core/res/res/xml/color_extraction.xml b/core/res/res/xml/color_extraction.xml
new file mode 100644
index 000000000000..7d52b20f7614
--- /dev/null
+++ b/core/res/res/xml/color_extraction.xml
@@ -0,0 +1,348 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+
+<colorextraction>
+ <!-- List of material color palettes in HSL -->
+ <palettes>
+ <!-- Grey scale -->
+ <palette h="0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f"
+ s="0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f"
+ l="0.08f, 0.11f, 0.14901960784313725f, 0.2f, 0.2980392156862745f, 0.4f,
+ 0.4980392156862745f, 0.6196078431372549f, 0.7176470588235294f,
+ 0.8196078431372549f, 0.9176470588235294f, 0.9490196078431372f"/>
+ <!-- All colors -->
+ <palette h="1,1,0.991,0.991,0.9833333333333333,0,0,0,
+ 0.01134380453752181,0.015625000000000003,0.024193548387096798,
+ 0.027397260273972573,0.017543859649122865"
+ s="1,1,1,1,1,1,1,0.8434782608695652,1,1,1,1,1"
+ l="0.04,0.09,0.14,0.2,0.27450980392156865,
+ 0.34901960784313724,0.4235294117647059,0.5490196078431373,
+ 0.6254901960784314,0.6862745098039216,0.7568627450980392,
+ 0.8568627450980393,0.9254901960784314"/>
+ <palette h="0.638,0.638,0.6385767790262171,0.6301169590643275,
+ 0.6223958333333334,0.6151079136690647,0.6065400843881856,
+ 0.5986964618249534,0.5910746812386157,0.5833333333333334,
+ 0.5748031496062993,0.5582010582010583"
+ s="1,1,1,1,0.9014084507042253,0.8128654970760234,
+ 0.7979797979797981,0.7816593886462883,0.778723404255319,1,1,1"
+ l="0.05,0.12,0.17450980392156862,0.2235294117647059,
+ 0.2784313725490196,0.3352941176470588,0.388235294117647,
+ 0.44901960784313727,0.5392156862745098,0.6509803921568628,
+ 0.7509803921568627,0.8764705882352941"/>
+ <palette h="0.563,0.569,0.5666,0.5669934640522876,0.5748031496062993,
+ 0.5595238095238095,0.5473118279569893,0.5393258426966292,
+ 0.5315955766192734,0.524031007751938,0.5154711673699016,
+ 0.508080808080808,0.5"
+ s="1,1,1,1,1,1,1,1,1,0.8847736625514403,1,1,1"
+ l="0.07,0.12,0.16,0.2,0.24901960784313726,
+ 0.27450980392156865,0.30392156862745096,0.34901960784313724,
+ 0.4137254901960784,0.47647058823529415,0.5352941176470588,
+ 0.6764705882352942,0.8"/>
+ <palette h="0.508,0.511,0.508,0.508,0.5082304526748972,
+ 0.5069444444444444,0.5,0.5,0.5,0.48724954462659376,
+ 0.4800347222222222,0.4755134281200632,0.4724409448818897,
+ 0.4671052631578947"
+ s="1,1,1,1,1,0.8888888888888887,0.9242424242424242,1,
+ 1,0.8133333333333332,0.7868852459016393,1,1,1"
+ l="0.04,0.06,0.08,0.12,0.1588235294117647,
+ 0.21176470588235297,0.25882352941176473,0.3,0.34901960784313724,
+ 0.44117647058823534,0.5215686274509804,0.5862745098039216,
+ 0.7509803921568627,0.8509803921568627"/>
+ <palette h="0.333,0.333,0.333,0.3333333333333333,0.3333333333333333,
+ 0.34006734006734,0.34006734006734,0.34006734006734,
+ 0.34259259259259256,0.3475783475783476,0.34767025089605735,
+ 0.3467741935483871,0.3703703703703704"
+ s="0.70,0.72,0.69,0.6703296703296703,0.728813559322034,
+ 0.5657142857142856,0.5076923076923077,0.3944223107569721,
+ 0.6206896551724138,0.8931297709923666,1,1,1"
+ l="0.05,0.08,0.14,0.1784313725490196,0.23137254901960785,
+ 0.3431372549019608,0.38235294117647056,0.49215686274509807,
+ 0.6588235294117647,0.7431372549019608,0.8176470588235294,
+ 0.8784313725490196,0.9294117647058824"/>
+ <palette h="0.161,0.163,0.163,0.162280701754386,0.15032679738562088,
+ 0.15879265091863518,0.16236559139784948,0.17443868739205526,
+ 0.17824074074074076,0.18674698795180725,0.18692449355432778,
+ 0.1946778711484594,0.18604651162790695"
+ s="1,1,1,1,1,1,1,1,1,1,1,1,1"
+ l="0.05,0.08,0.11,0.14901960784313725,0.2,
+ 0.24901960784313726,0.30392156862745096,0.3784313725490196,
+ 0.4235294117647059,0.48823529411764705,0.6450980392156863,
+ 0.7666666666666666,0.8313725490196078"/>
+ <palette h="0.108,0.105,0.105,0.105,0.10619469026548674,
+ 0.11924686192468618,0.13046448087431692,0.14248366013071895,
+ 0.1506024096385542,0.16220238095238093,0.16666666666666666,
+ 0.16666666666666666,0.162280701754386,0.15686274509803924"
+ s="1,1,1,1,1,1,1,1,1,1,1,1,1,1"
+ l="0.17,0.22,0.28,0.35,0.44313725490196076,
+ 0.46862745098039216,0.47843137254901963,0.5,0.5117647058823529,
+ 0.5607843137254902,0.6509803921568628,0.7509803921568627,
+ 0.8509803921568627,0.9"/>
+ <palette h="0.036,0.036,0.036,0.036,0.03561253561253561,
+ 0.05098039215686275,0.07516339869281045,0.09477124183006536,
+ 0.1150326797385621,0.134640522875817,0.14640522875816991,
+ 0.1582397003745319,0.15773809523809523,0.15359477124183002"
+ s="1,1,1,1,1,1,1,1,1,1,1,1,1,1"
+ l="0.19,0.26,0.34,0.39,0.4588235294117647,0.5,0.5,0.5,
+ 0.5,0.5,0.5,0.6509803921568628,0.7803921568627451,0.9"/>
+ <palette h="0.955,0.961,0.958,0.9596491228070175,0.9593837535014005,
+ 0.9514767932489452,0.943859649122807,0.9396825396825397,
+ 0.9395424836601307,0.9393939393939394,0.9362745098039216,
+ 0.9754098360655739,0.9824561403508771"
+ s="0.87,0.85,0.85,0.84070796460177,0.8206896551724138,
+ 0.7979797979797981,0.7661290322580644,0.9051724137931036,
+ 1,1,1,1,1"
+ l="0.06,0.11,0.16,0.22156862745098038,0.2843137254901961,
+ 0.388235294117647,0.48627450980392156,0.5450980392156863,
+ 0.6,0.6764705882352942,0.8,0.8803921568627451,
+ 0.9254901960784314"/>
+ <palette h="0.866,0.855,0.841025641025641,0.8333333333333334,
+ 0.8285256410256411,0.821522309711286,0.8083333333333333,
+ 0.8046594982078853,0.8005822416302766,0.7842377260981912,
+ 0.7771084337349398,0.7747747747747749"
+ s="1,1,1,1,1,1,1,1,1,
+ 0.737142857142857,0.6434108527131781,0.46835443037974644"
+ l="0.05,0.08,0.12745098039215685,0.15490196078431373,
+ 0.20392156862745098,0.24901960784313726,0.3137254901960784,
+ 0.36470588235294116,0.44901960784313727,0.6568627450980392,
+ 0.7470588235294118,0.8450980392156863"/>
+ <palette h="0.925,0.93,0.938,0.947,0.955952380952381,
+ 0.9681069958847737,0.9760479041916167,0.9873563218390804,0,0,
+ 0.009057971014492771,0.026748971193415648,
+ 0.041666666666666616,0.05303030303030304"
+ s="1,1,1,1,1,0.8350515463917526,0.6929460580912863,
+ 0.6387665198237885,0.6914893617021276,0.7583892617449666,
+ 0.8070175438596495,0.9310344827586209,1,1"
+ l="0.10,0.13,0.17,0.2,0.27450980392156865,
+ 0.3803921568627451,0.4725490196078432,0.5549019607843138,
+ 0.6313725490196078,0.707843137254902,0.7764705882352941,
+ 0.8294117647058823,0.9058823529411765,0.9568627450980391"/>
+ <palette h="0.733,0.736,0.744,0.7514619883040936,0.7679738562091503,
+ 0.7802083333333333,0.7844311377245509,0.796875,
+ 0.8165618448637316,0.8487179487179487,0.8582375478927203,
+ 0.8562091503267975,0.8666666666666667"
+ s="1,1,1,1,1,0.8163265306122449,0.6653386454183268,
+ 0.7547169811320753,0.929824561403509,0.9558823529411766,
+ 0.9560439560439562,1,1"
+ l="0.07,0.12,0.17,0.2235294117647059,0.3,
+ 0.38431372549019605,0.492156862745098,0.5843137254901961,
+ 0.6647058823529411,0.7333333333333334,0.8215686274509804,0.9,
+ 0.9411764705882353"/>
+ <palette h="0.6666666666666666,0.6666666666666666,0.6666666666666666,
+ 0.6666666666666666,0.6666666666666666,0.6666666666666666,
+ 0.6666666666666666,0.6666666666666666,0.6666666666666666,
+ 0.6666666666666666,0.6666666666666666"
+ s="0.25,0.24590163934426232,0.17880794701986752,
+ 0.14606741573033713,0.13761467889908252,0.14893617021276592,
+ 0.16756756756756758,0.20312500000000017,0.26086956521739135,
+ 0.29999999999999966,0.5000000000000004"
+ l="0.18,0.2392156862745098,0.296078431372549,
+ 0.34901960784313724,0.4274509803921569,0.5392156862745098,
+ 0.6372549019607843,0.7490196078431373,0.8196078431372549,
+ 0.8823529411764706,0.9372549019607843"/>
+ <palette h="0.938,0.944,0.952,0.961,0.9678571428571429,
+ 0.9944812362030905,0,0,
+ 0.0047348484848484815,0.00316455696202532,0,
+ 0.9980392156862745,0.9814814814814816,0.9722222222222221"
+ s="1,1,1,1,1,0.7023255813953488,0.6638655462184874,
+ 0.6521739130434782,0.7719298245614035,0.8315789473684211,
+ 0.6867469879518071,0.7264957264957265,0.8181818181818182,
+ 0.8181818181818189"
+ l="0.08,0.13,0.18,0.23,0.27450980392156865,
+ 0.4215686274509804,
+ 0.4666666666666667,0.503921568627451,0.5529411764705883,
+ 0.6274509803921569,0.6745098039215687,0.7705882352941176,
+ 0.892156862745098,0.9568627450980391"/>
+ <palette h="0.88,0.888,0.897,0.9052287581699346,0.9112021857923498,
+ 0.9270152505446624,0.9343137254901961,0.9391534391534391,
+ 0.9437984496124031,0.943661971830986,0.9438943894389439,
+ 0.9426229508196722,0.9444444444444444"
+ s="1,1,1,1,0.8133333333333332,0.7927461139896375,
+ 0.7798165137614679,0.7777777777777779,0.8190476190476191,
+ 0.8255813953488372,0.8211382113821142,0.8133333333333336,
+ 0.8000000000000006"
+ l="0.08,0.12,0.16,0.2,0.29411764705882354,
+ 0.3784313725490196,0.42745098039215684,0.4764705882352941,
+ 0.5882352941176471,0.6627450980392157,0.7588235294117647,
+ 0.8529411764705882,0.9411764705882353"/>
+ <palette h="0.669,0.680,0.6884057971014492,0.6974789915966387,
+ 0.7079889807162534,0.7154471544715447,0.7217741935483872,
+ 0.7274143302180687,0.7272727272727273,0.7258064516129031,
+ 0.7252252252252251,0.7333333333333333"
+ s="0.81,0.81,0.8214285714285715,0.6878612716763006,
+ 0.6080402010050251,0.5774647887323943,0.5391304347826086,
+ 0.46724890829694316,0.4680851063829788,0.462686567164179,
+ 0.45679012345678977,0.4545454545454551"
+ l="0.12,0.16,0.2196078431372549,0.33921568627450976,
+ 0.39019607843137255,0.4176470588235294,0.45098039215686275,
+ 0.5509803921568628,0.6313725490196078,0.7372549019607844,
+ 0.8411764705882353,0.9352941176470588"/>
+ <palette h="0.6470588235294118,0.6516666666666667,0.6464174454828661,
+ 0.6441441441441442,0.6432748538011696,0.6416666666666667,
+ 0.6402439024390243,0.6412429378531074,0.6435185185185186,
+ 0.6428571428571429"
+ s="0.8095238095238095,0.6578947368421053,0.5721925133689839,
+ 0.5362318840579711,0.5,0.4424778761061947,0.44086021505376327,
+ 0.44360902255639095,0.4499999999999997,0.4375000000000006"
+ l="0.16470588235294117,0.2980392156862745,0.36666666666666664,
+ 0.40588235294117647,0.44705882352941173,
+ 0.5568627450980392,0.6352941176470588,0.7392156862745098,
+ 0.8431372549019608,0.9372549019607843"/>
+ <palette h="0.469,0.46732026143790845,0.4718614718614719,
+ 0.4793650793650794,0.48071625344352614,0.4829683698296837,
+ 0.484375,0.4841269841269842,0.48444444444444457,
+ 0.48518518518518516,0.4907407407407408"
+ s="1,1,1,1,1,1,0.6274509803921569,0.41832669322709176,
+ 0.41899441340782106,0.4128440366972478,0.4090909090909088"
+ l="0.07,0.1,0.15098039215686274,0.20588235294117646,
+ 0.2372549019607843,0.26862745098039215,0.4,0.5078431372549019,
+ 0.6490196078431372,0.7862745098039216,0.9137254901960784"/>
+ <palette h="0.542,0.5444444444444444,0.5555555555555556,
+ 0.5555555555555556,0.553763440860215,0.5526315789473684,
+ 0.5555555555555556,0.5555555555555555,0.5555555555555556,
+ 0.5512820512820514,0.5666666666666667"
+ s="0.25,0.24590163934426232,0.19148936170212766,
+ 0.1791044776119403,0.18343195266272191,0.18446601941747576,
+ 0.1538461538461539,0.15625000000000003,0.15328467153284678,
+ 0.15662650602409653,0.151515151515151"
+ l="0.05,0.1196078431372549,0.1843137254901961,
+ 0.2627450980392157,
+ 0.33137254901960783,0.403921568627451,0.5411764705882354,
+ 0.6235294117647059,0.7313725490196079,0.8372549019607843,
+ 0.9352941176470588"/>
+ <palette h="0.022222222222222223,0.02469135802469136,0.031249999999999997,
+ 0.03947368421052631,0.04166666666666668,
+ 0.043650793650793655,0.04411764705882352,0.04166666666666652,
+ 0.04444444444444459,0.05555555555555529"
+ s="0.33333333333333337,0.2783505154639175,0.2580645161290323,
+ 0.25675675675675674,0.2528735632183908,0.17500000000000002,
+ 0.15315315315315312,0.15189873417721522,
+ 0.15789473684210534,0.15789473684210542"
+ l="0.08823529411764705,0.19019607843137254,0.2431372549019608,
+ 0.2901960784313725,0.3411764705882353,0.47058823529411764,
+ 0.5647058823529412,0.6901960784313725,0.8137254901960784,
+ 0.9254901960784314"/>
+ <palette h="0.027,0.03,0.038,0.044,0.050884955752212385,
+ 0.07254901960784313,0.0934640522875817,
+ 0.10457516339869281,0.11699346405228758,
+ 0.1255813953488372,0.1268939393939394,0.12533333333333332,
+ 0.12500000000000003,0.12777777777777777"
+ s="1,1,1,1,1,1,1,1,1,1,1,1,1,1"
+ l="0.25,0.3,0.35,0.4,0.44313725490196076,0.5,0.5,0.5,
+ 0.5,0.5784313725490196,
+ 0.6549019607843137,0.7549019607843137,0.8509803921568627,
+ 0.9411764705882353"/>
+ </palettes>
+ <blacklist>
+ <!-- Red -->
+ <range h="0, 20"
+ s="0.7, 1"
+ l="0.21, 0.79"/>
+ <range h="0, 20"
+ s="0.3, 0.7"
+ l="0.355, 0.653"/>
+ <!-- Red Orange -->
+ <range h="20, 40"
+ s="0.7, 1"
+ l="0.28, 0.643"/>
+ <range h="20, 40"
+ s="0.3, 0.7"
+ l="0.414, 0.561"/>
+ <range h="20, 40"
+ s="0, 3"
+ l="0.343, 0.584"/>
+ <!-- Orange -->
+ <range h="40, 60"
+ s="0.7, 1"
+ l="0.173, 0.349"/>
+ <range h="40, 60"
+ s="0.3, 0.7"
+ l="0.233, 0.427"/>
+ <range h="40, 60"
+ s="0, 0.3"
+ l="0.231, 0.484"/>
+ <!-- Yellow 60 -->
+ <range h="60, 80"
+ s="0.7, 1"
+ l="0.488, 0.737"/>
+ <range h="60, 80"
+ s="0.3, 0.7"
+ l="0.673, 0.837"/>
+ <!-- Yellow Green 80 -->
+ <range h="80, 100"
+ s="0.7, 1"
+ l="0.469, 0.61"/>
+ <!-- Yellow green 100 -->
+ <range h="100, 120"
+ s="0.7, 1"
+ l="0.388, 0.612"/>
+ <range h="100, 120"
+ s="0.3, 0.7"
+ l="0.424, 0.541"/>
+ <!-- Green -->
+ <range h="120, 140"
+ s="0.7, 1"
+ l="0.375, 0.52"/>
+ <range h="120, 140"
+ s="0.3, 0.7"
+ l="0.435, 0.524"/>
+ <!-- Green Blue 140 -->
+ <range h="140, 160"
+ s="0.7, 1"
+ l="0.496, 0.641"/>
+ <!-- Seaoam -->
+ <range h="160, 180"
+ s="0.7, 1"
+ l="0.496, 0.567"/>
+ <!-- Cyan -->
+ <range h="180, 200"
+ s="0.7, 1"
+ l="0.52, 0.729"/>
+ <!-- Blue -->
+ <range h="220, 240"
+ s="0.7, 1"
+ l="0.396, 0.571"/>
+ <range h="220, 240"
+ s="0.3, 0.7"
+ l="0.425, 0.551"/>
+ <!-- Blue Purple 240 -->
+ <range h="240, 260"
+ s="0.7, 1"
+ l="0.418, 0.639"/>
+ <range h="220, 240"
+ s="0.3, 0.7"
+ l="0.441, 0.576"/>
+ <!-- Blue Purple 260 -->
+ <range h="260, 280"
+ s="0.3, 1"
+ l="0.461, 0.553"/>
+ <!-- Fuchsia -->
+ <range h="300, 320"
+ s="0.7, 1"
+ l="0.484, 0.588"/>
+ <range h="300, 320"
+ s="0.3, 0.7"
+ l="0.48, 0.592"/>
+ <!-- Pink -->
+ <range h="320, 340"
+ s="0.7, 1"
+ l="0.466, 0.629"/>
+ <!-- Soft red -->
+ <range h="340, 360"
+ s="0.7, 1"
+ l="0.437, 0.596"/>
+ </blacklist>
+</colorextraction> \ No newline at end of file
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index d69b1e4e4922..56c72d214347 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -786,7 +786,7 @@ public class TextViewActivityTest {
@Test
public void testAssistItemIsAtIndexZero() throws Throwable {
- mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null);
+ useSystemDefaultTextClassifier();
final TextView textView = mActivity.findViewById(R.id.textview);
mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback(
new ActionMode.Callback() {
@@ -822,6 +822,23 @@ public class TextViewActivityTest {
}
@Test
+ public void testNoAssistItemForPasswordField() throws Throwable {
+ useSystemDefaultTextClassifier();
+ final TextView textView = mActivity.findViewById(R.id.textview);
+ mActivityRule.runOnUiThread(() -> {
+ textView.setInputType(
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+ });
+ mInstrumentation.waitForIdleSync();
+ final String password = "afigbo@android.com";
+
+ onView(withId(R.id.textview)).perform(replaceText(password));
+ onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(password.indexOf('@')));
+ sleepForFloatingToolbarPopup();
+ assertFloatingToolbarDoesNotContainItem(android.R.id.textAssist);
+ }
+
+ @Test
public void testPastePlainText_menuAction() {
initializeClipboardWithText(TextStyle.STYLED);
@@ -848,6 +865,10 @@ public class TextViewActivityTest {
mActivity.getString(com.android.internal.R.string.paste_as_plain_text));
}
+ private void useSystemDefaultTextClassifier() {
+ mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null);
+ }
+
private void initializeClipboardWithText(TextStyle textStyle) {
final ClipData clip;
switch (textStyle) {
diff --git a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java b/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
index 5206c9b553a6..3825e3f3f9ea 100644
--- a/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
+++ b/core/tests/coretests/src/android/widget/espresso/FloatingToolbarEspressoUtils.java
@@ -23,29 +23,31 @@ import static android.support.test.espresso.matcher.RootMatchers.withDecorView;
import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
-import static android.support.test.espresso.matcher.ViewMatchers.withTagValue;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withTagValue;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
-import android.view.MenuItem;
-import android.view.ViewGroup;
-import java.util.ArrayList;
-import java.util.List;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
import android.support.test.espresso.NoMatchingRootException;
import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.ViewInteraction;
+import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
import com.android.internal.widget.FloatingToolbar;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Espresso utility methods for the floating toolbar.
*/
@@ -177,6 +179,39 @@ public class FloatingToolbarEspressoUtils {
}
/**
+ * Asserts that the floating toolbar does not contain a menu item with the specified id.
+ *
+ * @param menuItemId id of the menu item
+ * @throws AssertionError if the assertion fails
+ */
+ public static void assertFloatingToolbarDoesNotContainItem(final int menuItemId) {
+ onFloatingToolBar().check(matches(new TypeSafeMatcher<View>() {
+ @Override
+ public boolean matchesSafely(View view) {
+ return !hasMenuItemWithSpecifiedId(view);
+ }
+
+ @Override
+ public void describeTo(Description description) {}
+
+ private boolean hasMenuItemWithSpecifiedId(View view) {
+ if (view.getTag() instanceof MenuItem
+ && ((MenuItem) view.getTag()).getItemId() == menuItemId) {
+ return true;
+ } else if (view instanceof ViewGroup) {
+ ViewGroup viewGroup = (ViewGroup) view;
+ for (int i = 0; i < viewGroup.getChildCount(); i++) {
+ if (hasMenuItemWithSpecifiedId(viewGroup.getChildAt(i))) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ }));
+ }
+
+ /**
* Click specified item on the floating tool bar.
*
* @param itemLabel label of the item.
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index d586db438765..57c75490ec47 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -21,6 +21,7 @@ import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
+import android.content.res.ResourcesImpl;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.StrictMode;
@@ -82,6 +83,12 @@ public final class Bitmap implements Parcelable {
private static volatile int sDefaultDensity = -1;
+ /** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */
+ public static volatile int sPreloadTracingNumInstantiatedBitmaps;
+
+ /** @hide Used only when ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD is true. */
+ public static volatile long sPreloadTracingTotalBitmapsSize;
+
/**
* For backwards compatibility, allows the app layer to change the default
* density when running old apps.
@@ -128,6 +135,11 @@ public final class Bitmap implements Parcelable {
NativeAllocationRegistry registry = new NativeAllocationRegistry(
Bitmap.class.getClassLoader(), nativeGetNativeFinalizer(), nativeSize);
registry.registerNativeAllocation(this, nativeBitmap);
+
+ if (ResourcesImpl.TRACE_FOR_DETAILED_PRELOAD) {
+ sPreloadTracingNumInstantiatedBitmaps++;
+ sPreloadTracingTotalBitmapsSize += nativeSize;
+ }
}
/**
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 1fd56974783e..aa9227c9bb08 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -852,6 +852,23 @@ public class Paint {
}
/**
+ * Distance from top of the strike-through line to the baseline. Negative values mean above the
+ * baseline. This method returns where the strike-through line should be drawn independent of if
+ * the strikeThruText bit is set at the moment.
+ * @hide
+ */
+ public float getStrikeThruPosition() {
+ return nGetStrikeThruPosition(mNativePaint, mNativeTypeface);
+ }
+
+ /**
+ * @hide
+ */
+ public float getStrikeThruThickness() {
+ return nGetStrikeThruThickness(mNativePaint, mNativeTypeface);
+ }
+
+ /**
* Helper for setFlags(), setting or clearing the STRIKE_THRU_TEXT_FLAG bit
*
* @param strikeThruText true to set the strikeThruText bit in the paint's
@@ -2997,5 +3014,9 @@ public class Paint {
@CriticalNative
private static native float nGetUnderlineThickness(long paintPtr, long typefacePtr);
@CriticalNative
+ private static native float nGetStrikeThruPosition(long paintPtr, long typefacePtr);
+ @CriticalNative
+ private static native float nGetStrikeThruThickness(long paintPtr, long typefacePtr);
+ @CriticalNative
private static native void nSetTextSize(long paintPtr, float textSize);
}
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index bfd1422ddca4..ccf9de0abdb4 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -341,12 +341,14 @@ public class KeyStore {
}
}
- public boolean grant(String key, int uid) {
+ public String grant(String key, int uid) {
try {
- return mBinder.grant(key, uid) == NO_ERROR;
+ String grantAlias = mBinder.grant(key, uid);
+ if (grantAlias == "") return null;
+ return grantAlias;
} catch (RemoteException e) {
Log.w(TAG, "Cannot connect to keystore", e);
- return false;
+ return null;
}
}
diff --git a/legacy-test/jarjar-rules.txt b/legacy-test/jarjar-rules.txt
index 9077e6f8ba26..fd8555c8931c 100644
--- a/legacy-test/jarjar-rules.txt
+++ b/legacy-test/jarjar-rules.txt
@@ -1,2 +1,3 @@
rule junit.** repackaged.junit.@1
rule android.test.** repackaged.android.test.@1
+rule com.android.internal.util.** repackaged.com.android.internal.util.@1
diff --git a/libs/hwui/hwui/Canvas.cpp b/libs/hwui/hwui/Canvas.cpp
index 4507c5018c26..e754daf7c42e 100644
--- a/libs/hwui/hwui/Canvas.cpp
+++ b/libs/hwui/hwui/Canvas.cpp
@@ -35,6 +35,13 @@ Canvas* Canvas::create_recording_canvas(int width, int height, uirenderer::Rende
return new uirenderer::RecordingCanvas(width, height);
}
+static inline void drawStroke(SkScalar left, SkScalar right, SkScalar top, SkScalar thickness,
+ const SkPaint& paint, Canvas* canvas) {
+ const SkScalar strokeWidth = fmax(thickness, 1.0f);
+ const SkScalar bottom = top + strokeWidth;
+ canvas->drawRect(left, top, right, bottom, paint);
+}
+
void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& paint) {
uint32_t flags;
SkDrawFilter* drawFilter = getDrawFilter();
@@ -46,7 +53,6 @@ void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint&
flags = paint.getFlags();
}
if (flags & (SkPaint::kUnderlineText_ReserveFlag | SkPaint::kStrikeThruText_ReserveFlag)) {
-
const SkScalar left = x;
const SkScalar right = x + length;
if (flags & SkPaint::kUnderlineText_ReserveFlag) {
@@ -60,18 +66,15 @@ void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint&
if (!metrics.hasUnderlineThickness(&thickness)) {
thickness = paint.getTextSize() * Paint::kStdUnderline_Thickness;
}
- const float strokeWidth = fmax(thickness, 1.0f);
const SkScalar top = y + position;
- const SkScalar bottom = top + strokeWidth;
- drawRect(left, top, right, bottom, paint);
+ drawStroke(left, right, top, thickness, paint, this);
}
if (flags & SkPaint::kStrikeThruText_ReserveFlag) {
const float textSize = paint.getTextSize();
- const float position = textSize * Paint::kStdStrikeThru_Offset;
- const float strokeWidth = fmax(textSize * Paint::kStdUnderline_Thickness, 1.0f);
- const SkScalar top = y + position - 0.5f * strokeWidth;
- const SkScalar bottom = y + position + 0.5f * strokeWidth;
- drawRect(left, top, right, bottom, paint);
+ const float position = textSize * Paint::kStdStrikeThru_Top;
+ const SkScalar thickness = textSize * Paint::kStdStrikeThru_Thickness;
+ const SkScalar top = y + position;
+ drawStroke(left, right, top, thickness, paint, this);
}
}
}
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index 4305025272b2..a5d83a0ca018 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -37,6 +37,10 @@ public:
constexpr static float kStdUnderline_Top =
kStdUnderline_Offset - 0.5f * kStdUnderline_Thickness;
+ constexpr static float kStdStrikeThru_Thickness = kStdUnderline_Thickness;
+ constexpr static float kStdStrikeThru_Top =
+ kStdStrikeThru_Offset - 0.5f * kStdStrikeThru_Thickness;
+
Paint();
Paint(const Paint& paint);
Paint(const SkPaint& paint); // NOLINT(implicit)
diff --git a/packages/BackupRestoreConfirmation/res/values-hy/strings.xml b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
index a054068d1ce0..285c15d49a05 100644
--- a/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-hy/strings.xml
@@ -25,12 +25,12 @@
<string name="allow_restore_button_label" msgid="3081286752277127827">"Վերականգնել իմ տվյալները"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Չվերականգնել"</string>
<string name="current_password_text" msgid="8268189555578298067">"Խնդրում ենք մուտքագրել ձեր ընթացիկ պահուստային գաղտնաբառը ներքևում`"</string>
- <string name="device_encryption_restore_text" msgid="1570864916855208992">"Խնդրում ենք մուտքագրել ձեր սարքի կոդավորված գաղտնաբառը ներքևում:"</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"Խնդրում ենք մուտքագրել ձեր սարքի կոդավորված գաղտնաբառը ներքևում: Այն նաև կօգտագործվի պահուստային արխիվի կոդավորման համար:"</string>
- <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները կոդավորելու համար: Եթե ​​այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"Եթե ​​ցանկանում եք կոդավորել ամբողջական պահուստավորված տվյալները, մուտքագրեք գաղտնաբառ ստորև`"</string>
- <string name="backup_enc_password_required" msgid="7889652203371654149">"Քանի որ ձեր սարքը կոդավորված է, դուք պետք է կոդավորեք նաև ձեր պահուստը: Խնդրում ենք ստորև սահմանել գաղտնաբառը՝"</string>
- <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե ​​վերականգնվող տվյալները կոդավորված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Խնդրում ենք մուտքագրել ձեր սարքի գաղտնագրման գաղտնաբառը ներքևում:"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Խնդրում ենք մուտքագրել ձեր սարքի գաղտնագրման գաղտնաբառը ներքևում: Այն նաև կօգտագործվի պահուստային արխիվի գաղտնագրման համար:"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"Խնդրում ենք մուտքագրել գաղտնաբառը` ամբողջական պահուստավորվող տվյալները գաղտնագրելու համար: Եթե ​​այն դատարկ թողնեք, ապա կօգտագործվի ձեր առկա պահուստավորման գաղտնաբառը`"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Եթե ​​ցանկանում եք գաղտնագրել ամբողջական պահուստավորված տվյալները, մուտքագրեք գաղտնաբառ ստորև`"</string>
+ <string name="backup_enc_password_required" msgid="7889652203371654149">"Քանի որ ձեր սարքը գաղտնագրված է, դուք պետք է գաղտնագրեք նաև ձեր պահուստը: Խնդրում ենք ստորև սահմանել գաղտնաբառը՝"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"Եթե ​​վերականգնվող տվյալները գաղտնագրված են, խնդրում ենք մուտքագրել գաղտնաբառը ստորև`"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Պահուստավորումը սկսվում է..."</string>
<string name="toast_backup_ended" msgid="3818080769548726424">"Պահուստավորումն ավարտվեց"</string>
<string name="toast_restore_started" msgid="7881679218971277385">"Վերականգնումը մեկնարկեց..."</string>
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index a7e14909f1b6..be87ed2ed887 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -31,6 +31,7 @@ import android.net.NetworkRequest;
import android.net.Proxy;
import android.net.Uri;
import android.net.http.SslError;
+import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.ArrayMap;
@@ -57,6 +58,7 @@ import java.net.URL;
import java.lang.InterruptedException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.Objects;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -286,6 +288,18 @@ public class CaptivePortalLoginActivity extends Activity {
return null;
}
+ private static String host(URL url) {
+ if (url == null) {
+ return null;
+ }
+ return url.getHost();
+ }
+
+ private static String sanitizeURL(URL url) {
+ // In non-Debug build, only show host to avoid leaking private info.
+ return Build.IS_DEBUGGABLE ? Objects.toString(url) : host(url);
+ }
+
private void testForCaptivePortal() {
// TODO: reuse NetworkMonitor facilities for consistent captive portal detection.
new Thread(new Runnable() {
@@ -339,6 +353,8 @@ public class CaptivePortalLoginActivity extends Activity {
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
getResources().getDisplayMetrics());
private int mPagesLoaded;
+ // the host of the page that this webview is currently loading. Can be null when undefined.
+ private String mHostname;
// If we haven't finished cleaning up the history, don't allow going back.
public boolean allowBack() {
@@ -346,8 +362,8 @@ public class CaptivePortalLoginActivity extends Activity {
}
@Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- if (url.contains(mBrowserBailOutToken)) {
+ public void onPageStarted(WebView view, String urlString, Bitmap favicon) {
+ if (urlString.contains(mBrowserBailOutToken)) {
mLaunchBrowser = true;
done(Result.WANTED_AS_IS);
return;
@@ -355,11 +371,17 @@ public class CaptivePortalLoginActivity extends Activity {
// The first page load is used only to cause the WebView to
// fetch the proxy settings. Don't update the URL bar, and
// don't check if the captive portal is still there.
- if (mPagesLoaded == 0) return;
+ if (mPagesLoaded == 0) {
+ return;
+ }
+ final URL url = makeURL(urlString);
+ Log.d(TAG, "onPageSarted: " + sanitizeURL(url));
+ mHostname = host(url);
// For internally generated pages, leave URL bar listing prior URL as this is the URL
// the page refers to.
- if (!url.startsWith(INTERNAL_ASSETS)) {
- getActionBar().setSubtitle(getHeaderSubtitle(url));
+ if (!urlString.startsWith(INTERNAL_ASSETS)) {
+ String subtitle = (url != null) ? getHeaderSubtitle(url) : urlString;
+ getActionBar().setSubtitle(subtitle);
}
getProgressBar().setVisibility(View.VISIBLE);
testForCaptivePortal();
@@ -401,15 +423,18 @@ public class CaptivePortalLoginActivity extends Activity {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+ final URL url = makeURL(error.getUrl());
+ final String host = host(url);
+ Log.d(TAG, String.format("SSL error: %s, url: %s, certificate: %s",
+ error.getPrimaryError(), sanitizeURL(url), error.getCertificate()));
+ if (url == null || !Objects.equals(host, mHostname)) {
+ // Ignore ssl errors for resources coming from a different hostname than the page
+ // that we are currently loading, and only cancel the request.
+ handler.cancel();
+ return;
+ }
logMetricsEvent(MetricsEvent.CAPTIVE_PORTAL_LOGIN_ACTIVITY_SSL_ERROR);
- Log.w(TAG, "SSL error (error: " + error.getPrimaryError() + " host: " +
- // Only show host to avoid leaking private info.
- Uri.parse(error.getUrl()).getHost() + " certificate: " +
- error.getCertificate() + "); displaying SSL warning.");
final String sslErrorPage = makeSslErrorPage();
- if (VDBG) {
- Log.d(TAG, sslErrorPage);
- }
view.loadDataWithBaseURL(INTERNAL_ASSETS, sslErrorPage, "text/HTML", "UTF-8", null);
}
@@ -502,16 +527,13 @@ public class CaptivePortalLoginActivity extends Activity {
return getString(R.string.action_bar_title, info.getExtraInfo().replaceAll("^\"|\"$", ""));
}
- private String getHeaderSubtitle(String urlString) {
- URL url = makeURL(urlString);
- if (url == null) {
- return urlString;
- }
+ private String getHeaderSubtitle(URL url) {
+ String host = host(url);
final String https = "https";
if (https.equals(url.getProtocol())) {
- return https + "://" + url.getHost();
+ return https + "://" + host;
}
- return url.getHost();
+ return host;
}
private void logMetricsEvent(int event) {
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
index 0cf21d236041..30c1fff5e6ee 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
@@ -55,6 +55,8 @@ public class DeviceChooserActivity extends Activity {
Log.e(LOG_TAG, "About to show UI, but no devices to show");
}
+ mPairButton = findViewById(R.id.button_pair);
+
if (getService().mRequest.isSingleDevice()) {
setContentView(R.layout.device_confirmation);
final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0);
@@ -62,9 +64,12 @@ public class DeviceChooserActivity extends Activity {
R.string.confirmation_title,
getCallingAppName(),
selectedDevice.getDisplayName()), 0));
+ mPairButton.setOnClickListener(v -> onDeviceConfirmed(getService().mSelectedDevice));
getService().mSelectedDevice = selectedDevice;
+ onSelectionUpdate();
} else {
setContentView(R.layout.device_chooser);
+ mPairButton.setVisibility(View.GONE);
setTitle(Html.fromHtml(getString(R.string.chooser_title, getCallingAppName()), 0));
mDeviceListView = findViewById(R.id.device_list);
final DeviceDiscoveryService.DevicesAdapter adapter = getService().mDevicesAdapter;
@@ -72,16 +77,12 @@ public class DeviceChooserActivity extends Activity {
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
- updatePairButtonEnabled();
+ onSelectionUpdate();
}
});
mDeviceListView.addFooterView(getProgressBar(), null, false);
}
- mPairButton = findViewById(R.id.button_pair);
- mPairButton.setOnClickListener(v -> onPairTapped(getService().mSelectedDevice));
- updatePairButtonEnabled();
-
mCancelButton = findViewById(R.id.button_cancel);
mCancelButton.setOnClickListener(v -> cancel());
}
@@ -134,15 +135,20 @@ public class DeviceChooserActivity extends Activity {
return r.getDimensionPixelSize(R.dimen.padding);
}
- private void updatePairButtonEnabled() {
- mPairButton.setEnabled(getService().mSelectedDevice != null);
+ private void onSelectionUpdate() {
+ DeviceFilterPair selectedDevice = getService().mSelectedDevice;
+ if (mPairButton.getVisibility() != View.VISIBLE && selectedDevice != null) {
+ onDeviceConfirmed(selectedDevice);
+ } else {
+ mPairButton.setEnabled(selectedDevice != null);
+ }
}
private DeviceDiscoveryService getService() {
return DeviceDiscoveryService.sInstance;
}
- protected void onPairTapped(DeviceFilterPair selectedDevice) {
+ protected void onDeviceConfirmed(DeviceFilterPair selectedDevice) {
getService().onDeviceSelected(
getCallingPackage(), getDeviceMacAddress(selectedDevice.device));
setResult(RESULT_OK,
diff --git a/packages/PrintSpooler/res/values-bs/strings.xml b/packages/PrintSpooler/res/values-bs/strings.xml
index d3f1b80088c0..2e9bfa317c64 100644
--- a/packages/PrintSpooler/res/values-bs/strings.xml
+++ b/packages/PrintSpooler/res/values-bs/strings.xml
@@ -53,7 +53,7 @@
<string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Okvir za pretraživanje je prikazan"</string>
<string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Okvir za pretraživanje je skriven"</string>
<string name="print_add_printer" msgid="1088656468360653455">"Dodaj štampač"</string>
- <string name="print_select_printer" msgid="7388760939873368698">"Izaberite štampač"</string>
+ <string name="print_select_printer" msgid="7388760939873368698">"Odaberite štampač"</string>
<string name="print_forget_printer" msgid="5035287497291910766">"Zaboravi ovaj štampač"</string>
<plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
<item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> štampač je pronađen</item>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 56627031286b..00bb4a98a5ef 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -36,7 +36,7 @@
<string name="wifi_no_internet" msgid="3880396223819116454">"No hi ha accés a Internet"</string>
<string name="saved_network" msgid="4352716707126620811">"Desat per <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="connected_via_network_scorer" msgid="5713793306870815341">"Connectada automàticament a través de: %1$s"</string>
- <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de la xarxa"</string>
+ <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Connectada automàticament a través d\'un proveïdor de valoració de xarxes"</string>
<string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string>
<string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string>
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connectada, sense Internet"</string>
@@ -186,7 +186,7 @@
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"Transferència agressiva de Wi-Fi a mòbil"</string>
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permet sempre cerca de Wi-Fi en ininerància"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Dades mòbils sempre actives"</string>
- <string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per a la compartició de xarxa"</string>
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"Acceleració per maquinari per compartir la xarxa"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactiva el volum absolut"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Activa el so al mateix canal"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versió AVRCP de Bluetooth"</string>
@@ -218,7 +218,7 @@
<string name="allow_mock_location_summary" msgid="317615105156345626">"Permet les ubicacions simulades"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"Inspecció d\'atributs de visualització"</string>
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantén les dades mòbils sempre actives, fins i tot quan la Wi‑Fi està activada (per canviar de xarxa ràpidament)."</string>
- <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Fes servir l\'acceleració per maquinari per a la compartició de xarxa, si està disponible"</string>
+ <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Fes servir l\'acceleració per maquinari per compartir la xarxa, si està disponible"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"Voleu permetre la depuració USB?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"La depuració USB només està indicada per a activitats de desenvolupament. Fes-la servir intercanviar dades entre l\'ordinador i el dispositiu, per instal·lar aplicacions al dispositiu sense rebre notificacions i per llegir dades de registre."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"Vols revocar l\'accés a la depuració d\'USB dels ordinadors que has autoritzat anteriorment?"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index e2e0e6212499..4a6f12d75f73 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -104,11 +104,11 @@
<string name="process_kernel_label" msgid="3916858646836739323">"SO Android"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Aplicaciones eliminadas"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Usuarios y aplicaciones eliminados"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"Compartir por USB"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"Compartir conexión por USB"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Zona Wi-Fi portátil"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Compartir por Bluetooth"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Compartir Internet"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Compartir Internet y zona Wi-Fi"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Compartir conexión por Bluetooth"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Compartir conexión"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Compartir conexión y zona Wi-Fi"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Todas las aplicaciones de trabajo"</string>
<string name="user_guest" msgid="8475274842845401871">"Invitado"</string>
<string name="unknown" msgid="1592123443519355854">"Desconocido"</string>
@@ -162,7 +162,7 @@
<string name="development_settings_summary" msgid="1815795401632854041">"Establecer opciones de desarrollo de aplicaciones"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"Las opciones de desarrollador no están disponibles para este usuario"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"Los ajustes de VPN no están disponibles para este usuario"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"Los ajustes para compartir Internet no están disponibles para este usuario"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"Los ajustes para compartir conexión no están disponibles para este usuario"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Los ajustes del nombre de punto de acceso no están disponibles para este usuario"</string>
<string name="enable_adb" msgid="7982306934419797485">"Depuración por USB"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"Activar el modo de depuración cuando el dispositivo esté conectado por USB"</string>
@@ -186,7 +186,7 @@
<string name="wifi_aggressive_handover" msgid="5309131983693661320">"Transferencia agresiva de Wi-Fi a móvil"</string>
<string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Permitir siempre búsquedas de Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Datos móviles siempre activos"</string>
- <string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración por hardware para conexión mediante dispositivo portátil"</string>
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración por hardware para conexión compartida"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Inhabilitar volumen absoluto"</string>
<string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Habilitar tono de llamada por Bluetooth"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP del Bluetooth"</string>
@@ -218,7 +218,7 @@
<string name="allow_mock_location_summary" msgid="317615105156345626">"Permitir ubicaciones simuladas"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"Inspección de atributos de vista"</string>
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantén los datos móviles siempre activos, aunque la conexión Wi‑Fi esté activada (para cambiar de red rápidamente)."</string>
- <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Usar la aceleración por hardware para conexión mediante dispositivo portátil si está disponible"</string>
+ <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Usar la conexión compartida con aceleración por hardware si está disponible"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"¿Permitir depuración por USB?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"La depuración por USB solo está indicada para actividades de desarrollo. Puedes utilizarla para intercambiar datos entre el ordenador y el dispositivo, para instalar aplicaciones en el dispositivo sin recibir notificaciones y para leer datos de registro."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"¿Quieres revocar el acceso a la depuración por USB de todos los ordenadores que has autorizado?"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index 7bbc598a0a0e..e0a88e4cf206 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -725,7 +725,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
}
- if (WifiTracker.sVerboseLogging > 0) {
+ if (WifiTracker.sVerboseLogging) {
// Add RSSI/band information for this config, what was seen up to 6 seconds ago
// verbose WiFi Logging is only turned on thru developers settings
if (mInfo != null && mNetworkInfo != null) { // This is the active connection
@@ -1166,8 +1166,9 @@ public class AccessPoint implements Comparable<AccessPoint> {
if (nc != null) {
if (nc.hasCapability(nc.NET_CAPABILITY_CAPTIVE_PORTAL)) {
- return context.getString(
- com.android.internal.R.string.network_available_sign_in);
+ int id = context.getResources()
+ .getIdentifier("network_available_sign_in", "string", "android");
+ return context.getString(id);
} else if (!nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
return context.getString(R.string.wifi_connected_no_internet);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 5a35da96375a..f0ac31fde23d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -68,11 +68,13 @@ public class WifiTracker {
// TODO(b/36733768): Remove flag includeSaved and includePasspoints.
private static final String TAG = "WifiTracker";
- private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean DBG() {
+ return Log.isLoggable(TAG, Log.DEBUG);
+ }
/** verbose logging flag. this flag is set thru developer debugging options
* and used so as to assist with in-the-field WiFi connectivity debugging */
- public static int sVerboseLogging = 0;
+ public static boolean sVerboseLogging;
// TODO: Allow control of this?
// Combo scans can take 5-6s to complete - set to 10s.
@@ -193,7 +195,7 @@ public class WifiTracker {
mConnectivityManager = connectivityManager;
// check if verbose logging has been turned on or off
- sVerboseLogging = mWifiManager.getVerboseLoggingLevel();
+ sVerboseLogging = (mWifiManager.getVerboseLoggingLevel() > 0);
mFilter = new IntentFilter();
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
@@ -251,16 +253,12 @@ public class WifiTracker {
List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
updateAccessPointsLocked(newScanResults, configs);
- if (DBG) {
- Log.d(TAG, "force update - internal access point list:\n" + mInternalAccessPoints);
- }
-
// Synchronously copy access points
mMainHandler.removeMessages(MainHandler.MSG_ACCESS_POINT_CHANGED);
mMainHandler.handleMessage(
Message.obtain(mMainHandler, MainHandler.MSG_ACCESS_POINT_CHANGED));
- if (DBG) {
- Log.d(TAG, "force update - external access point list:\n" + mAccessPoints);
+ if (sVerboseLogging) {
+ Log.i(TAG, "force update - external access point list:\n" + mAccessPoints);
}
}
}
@@ -338,7 +336,7 @@ public class WifiTracker {
private void requestScoresForNetworkKeys(Collection<NetworkKey> keys) {
if (keys.isEmpty()) return;
- if (DBG) {
+ if (DBG()) {
Log.d(TAG, "Requesting scores for Network Keys: " + keys);
}
mNetworkScoreManager.requestScores(keys.toArray(new NetworkKey[keys.size()]));
@@ -443,19 +441,19 @@ public class WifiTracker {
}
if (mScanId > NUM_SCANS_TO_CONFIRM_AP_LOSS) {
- if (DBG) Log.d(TAG, "------ Dumping SSIDs that were expired on this scan ------");
+ if (DBG()) Log.d(TAG, "------ Dumping SSIDs that were expired on this scan ------");
Integer threshold = mScanId - NUM_SCANS_TO_CONFIRM_AP_LOSS;
for (Iterator<Map.Entry<String, Integer>> it = mSeenBssids.entrySet().iterator();
it.hasNext(); /* nothing */) {
Map.Entry<String, Integer> e = it.next();
if (e.getValue() < threshold) {
ScanResult result = mScanResultCache.get(e.getKey());
- if (DBG) Log.d(TAG, "Removing " + e.getKey() + ":(" + result.SSID + ")");
+ if (DBG()) Log.d(TAG, "Removing " + e.getKey() + ":(" + result.SSID + ")");
mScanResultCache.remove(e.getKey());
it.remove();
}
}
- if (DBG) Log.d(TAG, "---- Done Dumping SSIDs that were expired on this scan ----");
+ if (DBG()) Log.d(TAG, "---- Done Dumping SSIDs that were expired on this scan ----");
}
return mScanResultCache.values();
@@ -609,7 +607,7 @@ public class WifiTracker {
Collections.sort(accessPoints);
// Log accesspoints that were deleted
- if (DBG) {
+ if (DBG()) {
Log.d(TAG, "------ Dumping SSIDs that were not seen on this scan ------");
for (AccessPoint prevAccessPoint : mInternalAccessPoints) {
if (prevAccessPoint.getSsid() == null)
@@ -1064,7 +1062,7 @@ public class WifiTracker {
oldAccessPoints.put(accessPoint.mId, accessPoint);
}
- if (DBG) {
+ if (DBG()) {
Log.d(TAG, "Starting to copy AP items on the MainHandler");
}
synchronized (mLock) {
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 988b9865c7ec..a8b184c3f204 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -1060,7 +1060,6 @@ public class BugreportProgressService extends Service {
}
return new Notification.Builder(context, NOTIFICATION_CHANNEL_ID)
.addExtras(sNotificationBundle)
- .setCategory(Notification.CATEGORY_SYSTEM)
.setSmallIcon(
isTv(context) ? R.drawable.ic_bug_report_black_24dp
: com.android.internal.R.drawable.stat_sys_adb)
diff --git a/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml b/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml
index fd385fcc71fa..fffa0bd621e5 100644
--- a/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml
+++ b/packages/SystemUI/res-keyguard/drawable/ic_access_alarms_big.xml
@@ -19,6 +19,6 @@ Copyright (C) 2017 The Android Open Source Project
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:fillColor="?attr/bgProtectSecondaryTextColor"
+ android:fillColor="@android:color/white"
android:pathData="M21.35,6.49c-0.35,0.42 -0.98,0.47 -1.4,0.12l-3.07,-2.57a1,1 0,1 1,1.29 -1.53l3.07,2.57c0.42,0.35 0.47,0.98 0.11,1.41zM7.24,2.63a1,1 0,0 0,-1.41 -0.13L2.77,5.07A0.996,0.996 0,1 0,4.05 6.6l3.06,-2.57c0.43,-0.35 0.48,-0.98 0.13,-1.4zM11.75,8c-0.41,0 -0.75,0.34 -0.75,0.75v4.68c0,0.35 0.18,0.68 0.49,0.86l3.65,2.19c0.34,0.2 0.78,0.1 0.98,-0.24a0.71,0.71 0,0 0,-0.25 -0.99l-3.37,-2v-4.5c0,-0.41 -0.34,-0.75 -0.75,-0.75zM12,5.9c-3.91,0 -7.1,3.18 -7.1,7.1s3.19,7.1 7.1,7.1 7.1,-3.18 7.1,-7.1 -3.19,-7.1 -7.1,-7.1M12,4a9,9 0,1 1,-0.001 18.001A9,9 0,0 1,12 4z" />
</vector>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
index a0850f492531..7d12504604c8 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
@@ -39,6 +39,8 @@
android:layout_height="wrap_content"
android:drawablePadding="6dp"
android:drawableStart="@drawable/ic_access_alarms_big"
+ android:drawableTint="?attr/bgProtectSecondaryTextColor"
+ android:drawableTintMode="src_in"
android:textColor="?attr/bgProtectSecondaryTextColor"
android:letterSpacing="0.15"
style="@style/widget_label"
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 451c2f702305..337b68fed758 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -97,7 +97,7 @@
<string name="phone_label" msgid="2320074140205331708">"otvori telefon"</string>
<string name="voice_assist_label" msgid="3956854378310019854">"otvori glasovnu pomoć"</string>
<string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string>
- <string name="recents_caption_resize" msgid="3517056471774958200">"Izaberite novi raspored zadataka"</string>
+ <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string>
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme za uvećavanje u slučaju nekompatibilnosti."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Uvećani prikaz manjeg ekrana na većem ekranu."</string>
@@ -355,7 +355,7 @@
<string name="description_target_search" msgid="3091587249776033139">"Pretraživanje"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Povucite gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Povucite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="zen_priority_introduction" msgid="1149025108714420281">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste izabrali za reprodukciju, uključujući muziku, videozapise i igre."</string>
+ <string name="zen_priority_introduction" msgid="1149025108714420281">"Neće vas ometati zvukovi i vibracije, osim alarma, podsjetnika, događaja i pozivalaca koje odredite. I dalje ćete čuti sve što ste odabrali za reprodukciju, uključujući muziku, videozapise i igre."</string>
<string name="zen_alarms_introduction" msgid="4934328096749380201">"Neće vas ometati zvukovi i vibracije, osim alarma. I dalje ćete čuti sve što izaberete za reprodukciju, uključujući muziku, videozapise i igre."</string>
<string name="zen_priority_customize_button" msgid="7948043278226955063">"Prilagodi"</string>
<string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Ovim se blokiraju SVI zvukovi i vibracije, uključujući alarme, muziku, videozapise i igre. I dalje ćete moći obavljati pozive."</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 0e32df5df0ea..ed5756400fb2 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -314,7 +314,7 @@
<string name="quick_settings_more_settings" msgid="326112621462813682">"Weitere Einstellungen"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Fertig"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Verbunden"</string>
- <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Verbunden, Akkustand <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Verbunden, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Verbindung wird hergestellt…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 99cbb9346fee..c206d8693bec 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -310,7 +310,7 @@
<string name="quick_settings_more_settings" msgid="326112621462813682">"Περισσότερες ρυθμίσεις"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Τέλος"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Συνδέθηκε"</string>
- <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Σύνδεση, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Συνδεδεμένη, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Σύνδεση…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Πρόσδεση"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Σημείο πρόσβασης Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 5575ddaf3a1c..c479cfe15841 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -155,7 +155,7 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"Datos móviles"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Datos móviles activados"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Datos móviles desactivados"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartir por Bluetooth"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartir conexión por Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"La red VPN está activada."</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"No hay tarjeta SIM."</string>
@@ -314,7 +314,7 @@
<string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string>
<string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Conectado (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartir Internet"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartir conexión"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificaciones"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Linterna"</string>
@@ -407,7 +407,7 @@
<string name="user_remove_user_message" msgid="1453218013959498039">"Se eliminarán todas las aplicaciones y todos los datos de este usuario."</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"Quitar"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string>
- <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y el envío de datos en segundo plano"</string>
+ <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y los datos en segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactivar ahorro de batería"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string>
@@ -589,7 +589,7 @@
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string>
<string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ahorro de batería no disponible mientras se carga el dispositivo"</string>
<string name="battery_detail_switch_title" msgid="6285872470260795421">"Ahorro de batería"</string>
- <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y las conexiones automáticas"</string>
+ <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y los datos en segundo plano"</string>
<string name="keyboard_key_button_template" msgid="6230056639734377300">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="2243500072071305073">"Inicio"</string>
<string name="keyboard_key_back" msgid="2337450286042721351">"Atrás"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 122bacad44c3..820fdb366226 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -312,8 +312,7 @@
<string name="quick_settings_more_settings" msgid="326112621462813682">"Ezarpen gehiago"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Eginda"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Konektatuta"</string>
- <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) -->
- <skip />
+ <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Konektatzen…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Konexioa partekatzea"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Sare publikoa"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 51d356e2d60a..12ff89de7212 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -310,7 +310,7 @@
<string name="quick_settings_more_settings" msgid="326112621462813682">"Setelan lainnya"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"Selesai"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Tersambung"</string>
- <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Terhubung, daya baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Menambatkan"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 22a1464ac4cb..ba5816beb127 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -534,7 +534,7 @@
<string name="tuner_warning" msgid="8730648121973575701">"‏System UI Tuner מספק לך דרכים נוספות להתאים אישית את ממשק המשתמש של Android. התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"התכונות הניסיוניות האלה עשויות להשתנות, להתקלקל או להיעלם בגרסאות עתידיות. המשך בזהירות."</string>
<string name="got_it" msgid="2239653834387972602">"הבנתי"</string>
- <string name="tuner_toast" msgid="603429811084428439">"‏מזל טוב! System UI Tuner נוסף ל\'הגדרות\'"</string>
+ <string name="tuner_toast" msgid="603429811084428439">"‏מזל טוב! ה-System UI Tuner נוסף ל\'הגדרות\'"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"הסר מההגדרות"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"‏האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?"</string>
<string name="activity_not_found" msgid="348423244327799974">"האפליקציה אינה מותקנת במכשיר"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 4065ff687b11..b8588d9fd823 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -310,8 +310,7 @@
<string name="quick_settings_more_settings" msgid="326112621462813682">"更多设置"</string>
<string name="quick_settings_done" msgid="3402999958839153376">"完成"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"已连接"</string>
- <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) -->
- <skip />
+ <string name="quick_settings_connected_battery_level" msgid="4136051440381328892">"已连接,电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"正在连接…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"网络共享"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 02a2e8fc5313..38b2969265cb 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -267,6 +267,12 @@
<!-- Doze: alpha to apply to small icons when dozing -->
<integer name="doze_small_icon_alpha">222</integer><!-- 87% of 0xff -->
+ <!-- Doze: the brightness value to use for the lower brightness AOD mode -->
+ <integer name="config_doze_aod_brightness_low">6</integer>
+
+ <!-- Doze: the brightness value to use for the higher brightness AOD mode -->
+ <integer name="config_doze_aod_brightness_high">27</integer>
+
<!-- Doze: whether the double tap sensor reports 2D touch coordinates -->
<bool name="doze_double_tap_reports_touch_coordinates">false</bool>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index b02f189681bb..f060c69f1d35 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -831,6 +831,9 @@
burn-in on AOD -->
<dimen name="burn_in_prevention_offset_y">50dp</dimen>
+ <!-- padding between the notification stack and the keyguard status view when dozing -->
+ <dimen name="dozing_stack_padding">10dp</dimen>
+
<dimen name="corner_size">16dp</dimen>
<dimen name="top_padding">0dp</dimen>
<dimen name="bottom_padding">48dp</dimen>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 2262869603cd..5005f9dd7db2 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -19,9 +19,11 @@ package com.android.keyguard;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
+import android.graphics.PorterDuff;
import android.os.UserHandle;
import android.support.v4.graphics.ColorUtils;
import android.text.TextUtils;
@@ -56,11 +58,14 @@ public class KeyguardStatusView extends GridLayout {
private TextView mOwnerInfo;
private ViewGroup mClockContainer;
private ChargingView mBatteryDoze;
+ private View mKeyguardStatusArea;
private View[] mVisibleInDoze;
private boolean mPulsing;
- private float mDarkAmount;
+ private float mDarkAmount = 0;
private int mTextColor;
+ private int mDateTextColor;
+ private int mAlarmTextColor;
private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
@@ -126,8 +131,11 @@ public class KeyguardStatusView extends GridLayout {
mClockView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext));
mOwnerInfo = findViewById(R.id.owner_info);
mBatteryDoze = findViewById(R.id.battery_doze);
- mVisibleInDoze = new View[]{mBatteryDoze, mClockView};
+ mKeyguardStatusArea = findViewById(R.id.keyguard_status_area);
+ mVisibleInDoze = new View[]{mBatteryDoze, mClockView, mKeyguardStatusArea};
mTextColor = mClockView.getCurrentTextColor();
+ mDateTextColor = mDateView.getCurrentTextColor();
+ mAlarmTextColor = mAlarmStatusView.getCurrentTextColor();
boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive();
setEnableMarquee(shouldMarquee);
@@ -186,8 +194,7 @@ public class KeyguardStatusView extends GridLayout {
}
public int getClockBottom() {
- return mClockView.getBottom() +
- ((MarginLayoutParams) mClockView.getLayoutParams()).bottomMargin;
+ return mKeyguardStatusArea.getBottom();
}
public float getClockTextSize() {
@@ -304,6 +311,10 @@ public class KeyguardStatusView extends GridLayout {
updateDozeVisibleViews();
mBatteryDoze.setDark(dark);
mClockView.setTextColor(ColorUtils.blendARGB(mTextColor, Color.WHITE, darkAmount));
+ mDateView.setTextColor(ColorUtils.blendARGB(mDateTextColor, Color.WHITE, darkAmount));
+ int blendedAlarmColor = ColorUtils.blendARGB(mAlarmTextColor, Color.WHITE, darkAmount);
+ mAlarmStatusView.setTextColor(blendedAlarmColor);
+ mAlarmStatusView.setCompoundDrawableTintList(ColorStateList.valueOf(blendedAlarmColor));
}
public void setPulsing(boolean pulsing) {
diff --git a/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java b/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java
index c38288299597..6296297a81c2 100644
--- a/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java
+++ b/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java
@@ -14,56 +14,74 @@
package com.android.systemui;
+import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.IDockedStackListener;
import android.view.WindowManagerGlobal;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
import java.util.function.Consumer;
/**
* Utility wrapper to listen for whether or not a docked stack exists, to be
* used for things like the different overview icon in that mode.
*/
-public class DockedStackExistsListener extends IDockedStackListener.Stub {
+public class DockedStackExistsListener {
private static final String TAG = "DockedStackExistsListener";
- private final Consumer<Boolean> mCallback;
+ private static ArrayList<WeakReference<Consumer<Boolean>>> sCallbacks = new ArrayList<>();
- private DockedStackExistsListener(Consumer<Boolean> callback) {
- mCallback = callback;
- }
+ static {
+ try {
+ WindowManagerGlobal.getWindowManagerService().registerDockedStackListener(
+ new IDockedStackListener.Stub() {
+ @Override
+ public void onDividerVisibilityChanged(boolean b) throws RemoteException {
- @Override
- public void onDividerVisibilityChanged(boolean visible) throws RemoteException {
- }
+ }
- @Override
- public void onDockedStackExistsChanged(final boolean exists) throws RemoteException {
- mCallback.accept(exists);
- }
+ @Override
+ public void onDockedStackExistsChanged(boolean exists)
+ throws RemoteException {
+ DockedStackExistsListener.onDockedStackExistsChanged(exists);
+ }
- @Override
- public void onDockedStackMinimizedChanged(boolean minimized, long animDuration,
- boolean isHomeStackResizable) throws RemoteException {
- }
+ @Override
+ public void onDockedStackMinimizedChanged(boolean b, long l, boolean b1)
+ throws RemoteException {
+
+ }
+
+ @Override
+ public void onAdjustedForImeChanged(boolean b, long l)
+ throws RemoteException {
+
+ }
+
+ @Override
+ public void onDockSideChanged(int i) throws RemoteException {
- @Override
- public void onAdjustedForImeChanged(boolean adjustedForIme, long animDuration)
- throws RemoteException {
+ }
+ });
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed registering docked stack exists listener", e);
+ }
}
- @Override
- public void onDockSideChanged(int newDockSide) throws RemoteException {
+
+ private static void onDockedStackExistsChanged(boolean exists) {
+ synchronized (sCallbacks) {
+ sCallbacks.removeIf(wf -> wf.get() == null);
+ sCallbacks.forEach(wf -> wf.get().accept(exists));
+ }
}
public static void register(Consumer<Boolean> callback) {
- try {
- WindowManagerGlobal.getWindowManagerService().registerDockedStackListener(
- new DockedStackExistsListener(callback));
- } catch (RemoteException e) {
- Log.e(TAG, "Failed registering docked stack exists listener", e);
+ synchronized (sCallbacks) {
+ sCallbacks.add(new WeakReference<>(callback));
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 6571294cdb92..907a79e723ac 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -199,7 +199,7 @@ public class ImageWallpaper extends WallpaperService {
// Load background image dimensions, if we haven't saved them yet
if (mBackgroundWidth <= 0 || mBackgroundHeight <= 0) {
// Need to load the image to get dimensions
- loadWallpaper(forDraw, true /* needsReset */);
+ loadWallpaper(forDraw, false /* needsReset */);
if (DEBUG) {
Log.d(TAG, "Reloading, redoing updateSurfaceSize later.");
}
diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
index 3c895abd5e88..44cf003b3dcb 100644
--- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
+++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
@@ -42,7 +42,7 @@ public class SysuiColorExtractor extends ColorExtractor {
private final GradientColors mWpHiddenColors;
public SysuiColorExtractor(Context context) {
- this(context, new Tonal(), true);
+ this(context, new Tonal(context), true);
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index e461986da5e0..28a45aae6892 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -23,6 +23,9 @@ import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Handler;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.R;
+
/**
* Controls the screen brightness when dozing.
*/
@@ -34,6 +37,9 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen
private final Sensor mLightSensor;
private boolean mRegistered;
+ private final int mHighBrightness;
+ private final int mLowBrightness;
+
public DozeScreenBrightness(Context context, DozeMachine.Service service,
SensorManager sensorManager, Sensor lightSensor, Handler handler) {
mContext = context;
@@ -41,6 +47,11 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen
mSensorManager = sensorManager;
mLightSensor = lightSensor;
mHandler = handler;
+
+ mLowBrightness = context.getResources().getInteger(
+ R.integer.config_doze_aod_brightness_low);
+ mHighBrightness = context.getResources().getInteger(
+ R.integer.config_doze_aod_brightness_high);
}
@Override
@@ -67,7 +78,17 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen
@Override
public void onSensorChanged(SensorEvent event) {
if (mRegistered) {
- mDozeService.setDozeScreenBrightness(Math.max(1, (int) event.values[0]));
+ mDozeService.setDozeScreenBrightness(computeBrightness((int) event.values[0]));
+ }
+ }
+
+ private int computeBrightness(int sensorValue) {
+ // The sensor reports 0 for off, 1 for low brightness and 2 for high brightness.
+ // We currently use DozeScreenState for screen off, so we treat off as low brightness.
+ if (sensorValue >= 2) {
+ return mHighBrightness;
+ } else {
+ return mLowBrightness;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java b/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java
index 4ff10e975b1a..18fb423b87a5 100644
--- a/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java
+++ b/packages/SystemUI/src/com/android/systemui/fragments/ExtensionFragmentListener.java
@@ -45,6 +45,7 @@ public class ExtensionFragmentListener<T extends FragmentBase> implements Consum
mFragmentHostManager.getFragmentManager().beginTransaction()
.replace(id, (Fragment) mExtension.get(), mTag)
.commit();
+ mExtension.clearItem(false);
}
@Override
@@ -57,6 +58,7 @@ public class ExtensionFragmentListener<T extends FragmentBase> implements Consum
} catch (ClassCastException e) {
Log.e(TAG, extension.getClass().getName() + " must be a Fragment", e);
}
+ mExtension.clearItem(true);
}
public static <T> void attachExtensonToFragment(View view, String tag, int id,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java b/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java
index 5b3ec08ce752..3d8f9ffe79d7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/CellTileView.java
@@ -16,12 +16,14 @@ package com.android.systemui.qs;
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.service.quicksettings.Tile;
import android.widget.ImageView;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QSTile.Icon;
import com.android.systemui.plugins.qs.QSTile.State;
+import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.phone.SignalDrawable;
import java.util.Objects;
@@ -35,7 +37,8 @@ public class CellTileView extends SignalTileView {
public CellTileView(Context context) {
super(context);
mSignalDrawable = new SignalDrawable(mContext);
- mSignalDrawable.setDarkIntensity(isDark(mContext));
+ mSignalDrawable.setColors(QSTileImpl.getColorForState(context, Tile.STATE_UNAVAILABLE),
+ QSTileImpl.getColorForState(context, Tile.STATE_ACTIVE));
mSignalDrawable.setIntrinsicSize(context.getResources().getDimensionPixelSize(
R.dimen.qs_tile_icon_size));
}
@@ -48,10 +51,6 @@ public class CellTileView extends SignalTileView {
}
}
- private static int isDark(Context context) {
- return Utils.getColorAttr(context, android.R.attr.colorForeground) == 0xff000000 ? 1 : 0;
- }
-
public static class SignalIcon extends Icon {
private final int mState;
@@ -68,7 +67,8 @@ public class CellTileView extends SignalTileView {
public Drawable getDrawable(Context context) {
//TODO: Not the optimal solution to create this drawable
SignalDrawable d = new SignalDrawable(context);
- d.setDarkIntensity(isDark(context));
+ d.setColors(QSTileImpl.getColorForState(context, Tile.STATE_UNAVAILABLE),
+ QSTileImpl.getColorForState(context, Tile.STATE_ACTIVE));
d.setLevel(getState());
return d;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java
index b8535a3f5a40..c35614893098 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java
@@ -33,11 +33,12 @@ import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
-import android.util.Log;
import android.util.FloatProperty;
public class SlashDrawable extends Drawable {
+ public static final float CORNER_RADIUS = 1f;
+
private final Path mPath = new Path();
private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -141,8 +142,8 @@ public class SlashDrawable extends Drawable {
Matrix m = new Matrix();
final int width = getBounds().width();
final int height = getBounds().height();
- final float radiusX = scale(1f, width);
- final float radiusY = scale(1f, height);
+ final float radiusX = scale(CORNER_RADIUS, width);
+ final float radiusY = scale(CORNER_RADIUS, height);
updateRect(
scale(LEFT, width),
scale(TOP, height),
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 652288d57fe3..e65bab6b4032 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -78,6 +78,7 @@ public class KeyguardClockPositionAlgorithm {
private AccelerateInterpolator mAccelerateInterpolator = new AccelerateInterpolator();
private int mClockBottom;
private float mDarkAmount;
+ private int mDozingStackPadding;
/**
* Refreshes the dimension values.
@@ -97,6 +98,7 @@ public class KeyguardClockPositionAlgorithm {
R.dimen.burn_in_prevention_offset_x);
mBurnInPreventionOffsetY = res.getDimensionPixelSize(
R.dimen.burn_in_prevention_offset_y);
+ mDozingStackPadding = res.getDimensionPixelSize(R.dimen.dozing_stack_padding);
}
public void setup(int maxKeyguardNotifications, int maxPanelHeight, float expandedHeight,
@@ -135,7 +137,7 @@ public class KeyguardClockPositionAlgorithm {
result.stackScrollerPadding = (int) interpolate(
result.stackScrollerPadding,
- mClockBottom + y,
+ mClockBottom + y + mDozingStackPadding,
mDarkAmount);
result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
index d537cda00b10..15ef742af02e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
@@ -36,6 +36,7 @@ import android.util.LayoutDirection;
import com.android.settingslib.R;
import com.android.settingslib.Utils;
+import com.android.systemui.qs.SlashDrawable;
public class SignalDrawable extends Drawable {
@@ -198,6 +199,11 @@ public class SignalDrawable extends Drawable {
return true;
}
+ public void setColors(int background, int foreground) {
+ mPaint.setColor(background);
+ mForegroundPaint.setColor(foreground);
+ }
+
public void setDarkIntensity(float darkIntensity) {
if (darkIntensity == mOldDarkIntensity) {
return;
@@ -333,10 +339,9 @@ public class SignalDrawable extends Drawable {
mForegroundPath.reset();
mFullPath.op(mCutPath, Path.Op.DIFFERENCE);
} else if (mState == STATE_AIRPLANE) {
- // Airplane mode is slashed, full-signal
- mForegroundPath.set(mFullPath);
- mFullPath.reset();
- mSlash.draw((int) height, (int) width, canvas, mForegroundPaint);
+ // Airplane mode is slashed, fully drawn background
+ mForegroundPath.reset();
+ mSlash.draw((int) height, (int) width, canvas, mPaint);
} else if (mState != STATE_CARRIER_CHANGE) {
mForegroundPath.reset();
int sigWidth = Math.round(calcFit(mLevel / (mNumLevels - 1)) * (width - 2 * padding));
@@ -473,6 +478,7 @@ public class SignalDrawable extends Drawable {
void draw(int height, int width, @NonNull Canvas canvas, Paint paint) {
Matrix m = new Matrix();
+ final float radius = scale(SlashDrawable.CORNER_RADIUS, width);
updateRect(
scale(LEFT, width),
scale(TOP, height),
@@ -481,7 +487,7 @@ public class SignalDrawable extends Drawable {
mPath.reset();
// Draw the slash vertically
- mPath.addRect(mSlashRect, Direction.CW);
+ mPath.addRoundRect(mSlashRect, radius, radius, Direction.CW);
m.setRotate(ROTATION, width / 2, height / 2);
mPath.transform(m);
canvas.drawPath(mPath, paint);
@@ -491,7 +497,7 @@ public class SignalDrawable extends Drawable {
mPath.transform(m);
m.setTranslate(mSlashRect.width(), 0);
mPath.transform(m);
- mPath.addRect(mSlashRect, Direction.CW);
+ mPath.addRoundRect(mSlashRect, radius, radius, Direction.CW);
m.setRotate(ROTATION, width / 2, height / 2);
mPath.transform(m);
canvas.clipOutPath(mPath);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
index 40e3806ee3fb..ede8411f3c9f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
@@ -38,6 +38,13 @@ public interface ExtensionController {
* (like configuration) may have changed.
*/
T reload();
+
+ /**
+ * Null out the cached item for the purpose of memory saving, should only be done
+ * when any other references are already gotten.
+ * @param isDestroyed
+ */
+ void clearItem(boolean isDestroyed);
}
interface ExtensionBuilder<T> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
index b79137ea68ff..cc10775a8385 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
@@ -26,6 +26,7 @@ import com.android.systemui.plugins.PluginManager;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
+import com.android.systemui.util.leak.LeakDetector;
import java.util.ArrayList;
import java.util.Collections;
@@ -146,7 +147,18 @@ public class ExtensionControllerImpl implements ExtensionController {
return get();
}
+ @Override
+ public void clearItem(boolean isDestroyed) {
+ if (isDestroyed && mItem != null) {
+ Dependency.get(LeakDetector.class).trackGarbage(mItem);
+ }
+ mItem = null;
+ }
+
private void notifyChanged() {
+ if (mItem != null) {
+ Dependency.get(LeakDetector.class).trackGarbage(mItem);
+ }
mItem = null;
for (int i = 0; i < mProducers.size(); i++) {
final T item = mProducers.get(i).get();
@@ -169,7 +181,7 @@ public class ExtensionControllerImpl implements ExtensionController {
}
public void addTunerFactory(TunerFactory<T> factory, String[] keys) {
- mProducers.add(new TunerItem(factory, factory.keys()));
+ mProducers.add(new TunerItem(factory, keys));
}
public void addUiMode(int uiMode, Supplier<T> mode) {
diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
index ba9e60a9c927..021f9c4f438b 100644
--- a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
@@ -21,6 +21,7 @@ import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemProperties;
+import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import com.android.systemui.Dependency;
@@ -84,12 +85,15 @@ public class GarbageMonitor {
// TODO(b/35345376): Turn this back on for debuggable builds after known leak fixed.
private static final boolean ENABLED = Build.IS_DEBUGGABLE
&& SystemProperties.getBoolean("debug.enable_leak_reporting", false);
+ private static final String FORCE_ENABLE = "sysui_force_garbage_monitor";
private GarbageMonitor mGarbageMonitor;
@Override
public void start() {
- if (!ENABLED) {
+ boolean forceEnable = Settings.Secure.getInt(mContext.getContentResolver(),
+ FORCE_ENABLE, 0) != 0;
+ if (!ENABLED && !forceEnable) {
return;
}
mGarbageMonitor = Dependency.get(GarbageMonitor.class);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 2527c6becc5e..22fb7104267c 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -178,7 +178,13 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
@Override
public void destroy() {
+ mAccessibility.destroy();
mController.removeCallback(mControllerCallbackH);
+ if (mZenFooter != null) {
+ mZenFooter.cleanup();
+ }
+ Dependency.get(TunerService.class).removeTunable(this);
+ mHandler.removeCallbacksAndMessages(null);
}
private void initDialog() {
@@ -1240,16 +1246,14 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
}
});
mDialogView.setAccessibilityDelegate(this);
- mAccessibilityMgr.addAccessibilityStateChangeListener(
- new AccessibilityStateChangeListener() {
- @Override
- public void onAccessibilityStateChanged(boolean enabled) {
- updateFeedbackEnabled();
- }
- });
+ mAccessibilityMgr.addAccessibilityStateChangeListener(mListener);
updateFeedbackEnabled();
}
+ public void destroy() {
+ mAccessibilityMgr.removeAccessibilityStateChangeListener(mListener);
+ }
+
@Override
public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
AccessibilityEvent event) {
@@ -1272,6 +1276,9 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
}
return false;
}
+
+ private final AccessibilityStateChangeListener mListener =
+ enabled -> updateFeedbackEnabled();
}
private static class VolumeRow {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
index 690186e91f55..d0f0bfd88883 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
@@ -48,7 +48,8 @@ public class SysuiColorExtractorTests extends SysuiTestCase {
@Test
public void getColors_usesGreyIfWallpaperNotVisible() {
- SysuiColorExtractor extractor = new SysuiColorExtractor(getContext(), new Tonal(), false);
+ SysuiColorExtractor extractor = new SysuiColorExtractor(getContext(),
+ new Tonal(getContext()), false);
simulateEvent(extractor);
extractor.setWallpaperVisible(false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
index 514dc8b94de5..fe3221af418c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
@@ -38,11 +38,13 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.utils.hardware.FakeSensorManager;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
@SmallTest
+@Ignore
public class DozeScreenBrightnessTest extends SysuiTestCase {
DozeServiceFake mServiceFake;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
index daf75476b3ea..586a424cb816 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
@@ -100,6 +100,11 @@ public class FakeExtensionController implements ExtensionController {
}
@Override
+ public void clearItem(boolean isDestroyed) {
+
+ }
+
+ @Override
public Context getContext() {
return null;
}
diff --git a/proto/src/ipconnectivity.proto b/proto/src/ipconnectivity.proto
index 76c54185a774..885896f24283 100644
--- a/proto/src/ipconnectivity.proto
+++ b/proto/src/ipconnectivity.proto
@@ -23,7 +23,7 @@ message NetworkId {
// It is not intended to map one to one to the TRANSPORT_* constants defined in
// android.net.NetworkCapabilities. Instead it is intended to be used as
// a dimension field for metrics events and aggregated metrics.
-// Next tag: 7
+// Next tag: 10
enum LinkLayer {
// An unknown link layer technology.
UNKNOWN = 0;
@@ -32,6 +32,9 @@ enum LinkLayer {
CELLULAR = 2;
ETHERNET = 3;
WIFI = 4;
+ WIFI_P2P = 7;
+ WIFI_NAN = 8; // Also known as WiFi Aware
+ LOWPAN = 9;
// Indicates that the link layer dimension is not relevant for the metrics or
// event considered.
@@ -47,16 +50,18 @@ message Pair {
optional int32 value = 2;
};
-// Logs changes in the system default network. Changes can be 1) acquiring a
-// default network with no previous default, 2) a switch of the system default
-// network to a new default network, 3) a loss of the system default network.
-// This message is associated to android.net.metrics.DefaultNetworkEvent.
+// An event record when the system default network disconnects or the system
+// switches to a new default network.
+// Next tag: 10.
message DefaultNetworkEvent {
- // A value of 0 means this is a loss of the system default network.
- optional NetworkId network_id = 1;
- // A value of 0 means there was no previous default network.
- optional NetworkId previous_network_id = 2;
+ // Reason why this network stopped being the default.
+ enum LostReason {
+ UNKNOWN = 0;
+ OUTSCORED = 1;
+ INVALIDATION = 2;
+ DISCONNECT = 3;
+ };
// Whether the network supports IPv4, IPv6, or both.
enum IPSupport {
@@ -66,17 +71,52 @@ message DefaultNetworkEvent {
DUAL = 3;
};
+ // Duration in milliseconds when this network was the default.
+ // Since version 4
+ optional int64 default_network_duration_ms = 5;
+
+ // Duration in milliseconds without a default network before this network
+ // became the default.
+ // Since version 4
+ optional int64 no_default_network_duration_ms = 6;
+
+ // Network score of this network when it became the default network.
+ // Since version 4
+ optional int64 initial_score = 7;
+
+ // Network score of this network when it stopped being the default network.
+ // Since version 4
+ optional int64 final_score = 8;
+
+ // Best available information about IP support of this default network.
+ // Since version 4
+ optional IPSupport ip_support = 9;
+
+
+ // Deprecated fields
+
+ // A value of 0 means this is a loss of the system default network.
+ // Deprecated since version 3. Replaced by top level network_id.
+ optional NetworkId network_id = 1 [deprecated = true];
+
+ // A value of 0 means there was no previous default network.
+ // Deprecated since version 3. Replaced by previous_default_network_id.
+ optional NetworkId previous_network_id = 2 [deprecated = true];
+
// Best available information about IP support of the previous network when
// disconnecting or switching to a new default network.
- optional IPSupport previous_network_ip_support = 3;
+ // Deprecated since version 3. Replaced by ip_support field.
+ optional IPSupport previous_network_ip_support = 3 [deprecated = true];
// The transport types of the new default network, represented by
// TRANSPORT_* constants as defined in NetworkCapabilities.
- repeated int32 transport_types = 4;
+ // Deprecated since version 3. Replaced by top-level transports field.
+ repeated int32 transport_types = 4 [deprecated = true];
};
// Logs IpReachabilityMonitor probe events and NUD_FAILED events.
// This message is associated to android.net.metrics.IpReachabilityEvent.
+// Next tag: 3.
message IpReachabilityEvent {
// The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
// Deprecated since version 2, to be replaced by link_layer field.
@@ -91,6 +131,7 @@ message IpReachabilityEvent {
// Logs NetworkMonitor and ConnectivityService events related to the state of
// a network: connection, evaluation, validation, lingering, and disconnection.
// This message is associated to android.net.metrics.NetworkEvent.
+// Next tag: 4.
message NetworkEvent {
// The id of the network on which this event happened.
// Deprecated since version 3.
@@ -108,6 +149,7 @@ message NetworkEvent {
// Logs individual captive portal probing events that are performed when
// evaluating or reevaluating networks for Internet connectivity.
// This message is associated to android.net.metrics.ValidationProbeEvent.
+// Next tag: 5.
message ValidationProbeEvent {
// The id of the network for which the probe was sent.
// Deprecated since version 3.
@@ -124,26 +166,64 @@ message ValidationProbeEvent {
optional int32 probe_result = 4;
}
-// Logs DNS lookup latencies. Repeated fields must have the same length.
+// Logs DNS lookup latencies.
// This message is associated to android.net.metrics.DnsEvent.
-// Deprecated since version 2.
+// Next tag: 11
message DNSLookupBatch {
+
+ // The time it took for successful DNS lookups to complete.
+ // The number of repeated values can be less than getaddrinfo_query_count
+ // + gethostbyname_query_count in case of event rate-limiting.
+ repeated int32 latencies_ms = 4;
+
+ // The total number of getaddrinfo queries.
+ // Since version 4.
+ optional int64 getaddrinfo_query_count = 5;
+
+ // The total number of gethostbyname queries.
+ // Since version 4.
+ optional int64 gethostbyname_query_count = 6;
+
+ // The total number of getaddrinfo errors.
+ // Since version 4.
+ optional int64 getaddrinfo_error_count = 7;
+
+ // The total number of gethostbyname errors.
+ // Since version 4.
+ optional int64 gethostbyname_error_count = 8;
+
+ // Counts of all errors returned by getaddrinfo.
+ // The Pair key field is the getaddrinfo error value.
+ // The value field is the count for that return value.
+ // Since version 4
+ repeated Pair getaddrinfo_errors = 9;
+
+ // Counts of all errors returned by gethostbyname.
+ // The Pair key field is the gethostbyname errno value.
+ // the Pair value field is the count for that errno code.
+ // Since version 4
+ repeated Pair gethostbyname_errors = 10;
+
+
+ // Deprecated fields
+
// The id of the network on which the DNS lookups took place.
- optional NetworkId network_id = 1;
+ // Deprecated since version 3.
+ optional NetworkId network_id = 1 [deprecated = true];
// The types of the DNS lookups, as defined in android.net.metrics.DnsEvent.
- repeated int32 event_types = 2;
+ // Deprecated since version 3.
+ repeated int32 event_types = 2 [deprecated = true];
// The return values of the DNS resolver for each DNS lookups.
- repeated int32 return_codes = 3;
-
- // The time it took for each DNS lookups to complete.
- repeated int32 latencies_ms = 4;
+ // Deprecated since version 3.
+ repeated int32 return_codes = 3 [deprecated = true];
};
// Represents a collections of DNS lookup latencies and counters for a
// particular combination of DNS query type and return code.
// Since version 2.
+// Next tag: 7.
message DNSLatencies {
// The type of the DNS lookups, as defined in android.net.metrics.DnsEvent.
// Acts as a key for a set of DNS query results.
@@ -203,6 +283,7 @@ message ConnectStatistics {
// state transition or a response packet parsing error.
// This message is associated to android.net.metrics.DhcpClientEvent and
// android.net.metrics.DhcpErrorEvent.
+// Next tag: 5
message DHCPEvent {
// The interface name (wlan, rmnet, lo, ...) on which the event happened.
// Deprecated since version 2, to be replaced by link_layer field.
@@ -255,7 +336,7 @@ message ApfProgramEvent {
// Represents Router Advertisement listening statistics for an interface with
// Android Packet Filter enabled.
// Since version 1.
-// Next tag: 12
+// Next tag: 15
message ApfStatistics {
// The time interval in milliseconds these stastistics cover.
optional int64 duration_ms = 1;
@@ -288,12 +369,28 @@ message ApfStatistics {
// The total number of APF program updates triggered when disabling the
// multicast filter. Since version 3.
+ // Since version 4.
optional int32 program_updates_allowing_multicast = 11;
+
+ // The total number of packets processed by the APF interpreter.
+ // Since version 4.
+ optional int32 total_packet_processed = 12;
+
+ // The total number of packets dropped by the APF interpreter.
+ // Since version 4.
+ optional int32 total_packet_dropped = 13;
+
+ // List of hardware counters collected by the APF interpreter.
+ // The Pair key is the counter id, defined in android.net.metrics.ApfStats.
+ // The Pair value is the counter value.
+ // Since version 4.
+ repeated Pair hardware_counters = 14;
}
// Represents the reception of a Router Advertisement packet for an interface
// with Android Packet Filter enabled.
// Since version 1.
+// Next tag: 7.
message RaEvent {
// All lifetime values are expressed in seconds. The default value for an
// option lifetime that was not present in the RA option list is -1.
@@ -322,6 +419,7 @@ message RaEvent {
// Represents an IP provisioning event in IpManager and how long the
// provisioning action took.
// This message is associated to android.net.metrics.IpManagerEvent.
+// Next tag: 4.
message IpProvisioningEvent {
// The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
// Deprecated since version 2, to be replaced by link_layer field.
@@ -335,8 +433,48 @@ message IpProvisioningEvent {
optional int32 latency_ms = 3;
}
+// Represents statistics from a single android Network.
+// Since version 4. Replace NetworkEvent.
+// Next tag: 9.
+message NetworkStats {
+
+ // Duration of this Network lifecycle in milliseconds.
+ optional int64 duration_ms = 1;
+
+ // Information about IP support of this network.
+ optional DefaultNetworkEvent.IPSupport ip_support = 2;
+
+ // True if the network was validated at least once.
+ optional bool ever_validated = 3;
+
+ // True if a captive portal was found at least once on this network.
+ optional bool portal_found = 4;
+
+ // Total number of times no connectivity was reported for this network.
+ optional int32 no_connectivity_reports = 5;
+
+ // Total number of validation attempts.
+ optional int32 validation_attempts = 6;
+
+ // Results from all validation attempts.
+ // The Pair key is the result:
+ // 0 -> unvalidated
+ // 1 -> validated
+ // 2 -> captive portal
+ // The Pair value is the duration of the validation attempts in milliseconds.
+ repeated Pair validation_events = 7;
+
+ // Time series of validation states in time order.
+ // The Pair key is the state:
+ // 0 -> unvalidated
+ // 1 -> validated
+ // 2 -> captive portal,
+ // The Pair value is the duration of that state in milliseconds.
+ repeated Pair validation_states = 8;
+}
+
// Represents one of the IP connectivity event defined in this file.
-// Next tag: 19
+// Next tag: 20
message IpConnectivityEvent {
// Time in ms when the event was recorded.
optional int64 time_ms = 1;
@@ -370,14 +508,13 @@ message IpConnectivityEvent {
oneof event {
// An event about the system default network.
- // The link_layer field is not relevant for this event and set to NONE.
DefaultNetworkEvent default_network_event = 2;
// An IP reachability probe event.
IpReachabilityEvent ip_reachability_event = 3;
// A network lifecycle event.
- NetworkEvent network_event = 4;
+ NetworkEvent network_event = 4 [deprecated = true];
// A batch of DNS lookups.
// Deprecated in the nyc-mr2 release since version 2,and replaced by
@@ -407,10 +544,14 @@ message IpConnectivityEvent {
// An RA packet reception event.
RaEvent ra_event = 11;
+
+ // Network statistics.
+ NetworkStats network_stats = 19;
};
};
// The information about IP connectivity events.
+// Next tag: 4.
message IpConnectivityLog {
// An array of IP connectivity events.
repeated IpConnectivityEvent events = 1;
@@ -424,5 +565,6 @@ message IpConnectivityLog {
// nyc-mr1: not populated, implicitly 1.
// nyc-mr2: 2.
// oc: 3.
+ // oc-dr1: 4. (sailfish, marlin, walleye, taimen)
optional int32 version = 3;
};
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 829217868f84..53190869513b 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -138,6 +138,18 @@ message MetricsEvent {
REASON_TIMEOUT = 19;
}
+ // Subtypes of camera events for ACTION_CAMERA_EVENT
+ enum CameraEvent {
+ // A back-facing camera was used
+ CAMERA_BACK_USED = 0;
+
+ // A front-facing camera was used
+ CAMERA_FRONT_USED = 1;
+
+ // An external camera was used
+ CAMERA_EXTERNAL_USED = 2;
+ }
+
// Known visual elements: views or controls.
enum View {
// Unknown view
@@ -4196,6 +4208,12 @@ message MetricsEvent {
// OS: O DR
DIALOG_BLUETOOTH_PAIRED_DEVICE_FORGET = 1031;
+ // An event from the camera service
+ // CATEGORY: OTHER
+ // SUBTYPE: CameraEvent
+ // OS: O DR
+ ACTION_CAMERA_EVENT = 1032;
+
// ---- End O-DR1 Constants, all O-DR1 constants go above this line ----
// ACTION: Settings > Network & Internet > Mobile network > Mobile data
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 8b15d506dab7..67ee1858f583 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -163,7 +163,8 @@ public final class AutoFillUI {
@Nullable String filterText, @NonNull String packageName,
@NonNull AutoFillUiCallback callback) {
if (sDebug) {
- Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + filterText);
+ final int size = filterText == null ? 0 : filterText.length();
+ Slog.d(TAG, "showFillUi(): id=" + focusedId + ", filter=" + size + " chars");
}
final LogMaker log = (new LogMaker(MetricsProto.MetricsEvent.AUTOFILL_FILL_UI))
.setPackageName(packageName)
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index 51a239f62be5..24f3b339b761 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -204,7 +204,10 @@ final class FillUi {
return;
}
if (count <= 0) {
- if (sDebug) Slog.d(TAG, "No dataset matches filter: " + mFilterText);
+ if (sDebug) {
+ final int size = mFilterText == null ? 0 : mFilterText.length();
+ Slog.d(TAG, "No dataset matches filter with " + size + " chars");
+ }
mCallback.requestHideFillUi();
} else {
if (updateContentSize()) {
diff --git a/services/backup/java/com/android/server/backup/BackupPasswordManager.java b/services/backup/java/com/android/server/backup/BackupPasswordManager.java
new file mode 100644
index 000000000000..ee7651b0a087
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/BackupPasswordManager.java
@@ -0,0 +1,307 @@
+/*
+ * 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
+ */
+
+package com.android.server.backup;
+
+import android.content.Context;
+import android.util.Slog;
+
+import com.android.server.backup.utils.DataStreamFileCodec;
+import com.android.server.backup.utils.DataStreamCodec;
+import com.android.server.backup.utils.PasswordUtils;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.security.SecureRandom;
+
+/**
+ * Manages persisting and verifying backup passwords.
+ *
+ * <p>Does not persist the password itself, but persists a PBKDF2 hash with a randomly chosen (also
+ * persisted) salt. Validation is performed by running the challenge text through the same
+ * PBKDF2 cycle with the persisted salt, and checking the hashes match.
+ *
+ * @see PasswordUtils for the hashing algorithm.
+ */
+public final class BackupPasswordManager {
+ private static final String TAG = "BackupPasswordManager";
+ private static final boolean DEBUG = false;
+
+ private static final int BACKUP_PW_FILE_VERSION = 2;
+ private static final int DEFAULT_PW_FILE_VERSION = 1;
+
+ private static final String PASSWORD_VERSION_FILE_NAME = "pwversion";
+ private static final String PASSWORD_HASH_FILE_NAME = "pwhash";
+
+ // See https://android-developers.googleblog.com/2013/12/changes-to-secretkeyfactory-api-in.html
+ public static final String PBKDF_CURRENT = "PBKDF2WithHmacSHA1";
+ public static final String PBKDF_FALLBACK = "PBKDF2WithHmacSHA1And8bit";
+
+ private final SecureRandom mRng;
+ private final Context mContext;
+ private final File mBaseStateDir;
+
+ private String mPasswordHash;
+ private int mPasswordVersion;
+ private byte[] mPasswordSalt;
+
+ /**
+ * Creates an instance enforcing permissions using the {@code context} and persisting password
+ * data within the {@code baseStateDir}.
+ *
+ * @param context The context, for enforcing permissions around setting the password.
+ * @param baseStateDir A directory within which to persist password data.
+ * @param secureRandom Random number generator with which to generate password salts.
+ */
+ BackupPasswordManager(Context context, File baseStateDir, SecureRandom secureRandom) {
+ mContext = context;
+ mRng = secureRandom;
+ mBaseStateDir = baseStateDir;
+ loadStateFromFilesystem();
+ }
+
+ /**
+ * Returns {@code true} if a password for backup is set.
+ *
+ * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP}
+ * permission.
+ */
+ boolean hasBackupPassword() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+ "hasBackupPassword");
+ return mPasswordHash != null && mPasswordHash.length() > 0;
+ }
+
+ /**
+ * Returns {@code true} if {@code password} matches the persisted password.
+ *
+ * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP}
+ * permission.
+ */
+ boolean backupPasswordMatches(String password) {
+ if (hasBackupPassword() && !passwordMatchesSaved(password)) {
+ if (DEBUG) Slog.w(TAG, "Backup password mismatch; aborting");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Sets the new password, given a correct current password.
+ *
+ * @throws SecurityException If caller does not have {@link android.Manifest.permission#BACKUP}
+ * permission.
+ * @return {@code true} if has permission to set the password, {@code currentPassword}
+ * matches the currently persisted password, and is able to persist {@code newPassword}.
+ */
+ boolean setBackupPassword(String currentPassword, String newPassword) {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
+ "setBackupPassword");
+
+ if (!passwordMatchesSaved(currentPassword)) {
+ return false;
+ }
+
+ // Snap up to latest password file version.
+ try {
+ getPasswordVersionFileCodec().serialize(BACKUP_PW_FILE_VERSION);
+ mPasswordVersion = BACKUP_PW_FILE_VERSION;
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to write backup pw version; password not changed");
+ return false;
+ }
+
+ if (newPassword == null || newPassword.isEmpty()) {
+ return clearPassword();
+ }
+
+ try {
+ byte[] salt = randomSalt();
+ String newPwHash = PasswordUtils.buildPasswordHash(
+ PBKDF_CURRENT, newPassword, salt, PasswordUtils.PBKDF2_HASH_ROUNDS);
+
+ getPasswordHashFileCodec().serialize(new BackupPasswordHash(newPwHash, salt));
+ mPasswordHash = newPwHash;
+ mPasswordSalt = salt;
+ return true;
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to set backup password");
+ }
+ return false;
+ }
+
+ /**
+ * Returns {@code true} if should try salting using the older PBKDF algorithm.
+ *
+ * <p>This is {@code true} for v1 files.
+ */
+ private boolean usePbkdf2Fallback() {
+ return mPasswordVersion < BACKUP_PW_FILE_VERSION;
+ }
+
+ /**
+ * Deletes the current backup password.
+ *
+ * @return {@code true} if successful.
+ */
+ private boolean clearPassword() {
+ File passwordHashFile = getPasswordHashFile();
+ if (passwordHashFile.exists() && !passwordHashFile.delete()) {
+ Slog.e(TAG, "Unable to clear backup password");
+ return false;
+ }
+
+ mPasswordHash = null;
+ mPasswordSalt = null;
+ return true;
+ }
+
+ /**
+ * Sets the password hash, salt, and version in the object from what has been persisted to the
+ * filesystem.
+ */
+ private void loadStateFromFilesystem() {
+ try {
+ mPasswordVersion = getPasswordVersionFileCodec().deserialize();
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to read backup pw version");
+ mPasswordVersion = DEFAULT_PW_FILE_VERSION;
+ }
+
+ try {
+ BackupPasswordHash hash = getPasswordHashFileCodec().deserialize();
+ mPasswordHash = hash.hash;
+ mPasswordSalt = hash.salt;
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to read saved backup pw hash");
+ }
+ }
+
+ /**
+ * Whether the candidate password matches the current password. If the persisted password is an
+ * older version, attempts hashing using the older algorithm.
+ *
+ * @param candidatePassword The password to try.
+ * @return {@code true} if the passwords match.
+ */
+ private boolean passwordMatchesSaved(String candidatePassword) {
+ return passwordMatchesSaved(PBKDF_CURRENT, candidatePassword)
+ || (usePbkdf2Fallback() && passwordMatchesSaved(PBKDF_FALLBACK, candidatePassword));
+ }
+
+ /**
+ * Returns {@code true} if the candidate password is correct.
+ *
+ * @param algorithm The algorithm used to hash passwords.
+ * @param candidatePassword The candidate password to compare to the current password.
+ * @return {@code true} if the candidate password matched the saved password.
+ */
+ private boolean passwordMatchesSaved(String algorithm, String candidatePassword) {
+ if (mPasswordHash == null) {
+ return candidatePassword == null || candidatePassword.equals("");
+ } else if (candidatePassword == null || candidatePassword.length() == 0) {
+ // The current password is not zero-length, but the candidate password is.
+ return false;
+ } else {
+ String candidatePasswordHash = PasswordUtils.buildPasswordHash(
+ algorithm, candidatePassword, mPasswordSalt, PasswordUtils.PBKDF2_HASH_ROUNDS);
+ return mPasswordHash.equalsIgnoreCase(candidatePasswordHash);
+ }
+ }
+
+ private byte[] randomSalt() {
+ int bitsPerByte = 8;
+ byte[] array = new byte[PasswordUtils.PBKDF2_SALT_SIZE / bitsPerByte];
+ mRng.nextBytes(array);
+ return array;
+ }
+
+ private DataStreamFileCodec<Integer> getPasswordVersionFileCodec() {
+ return new DataStreamFileCodec<>(
+ new File(mBaseStateDir, PASSWORD_VERSION_FILE_NAME),
+ new PasswordVersionFileCodec());
+ }
+
+ private DataStreamFileCodec<BackupPasswordHash> getPasswordHashFileCodec() {
+ return new DataStreamFileCodec<>(getPasswordHashFile(), new PasswordHashFileCodec());
+ }
+
+ private File getPasswordHashFile() {
+ return new File(mBaseStateDir, PASSWORD_HASH_FILE_NAME);
+ }
+
+ /**
+ * Container class for a PBKDF hash and the salt used to create the hash.
+ */
+ private static final class BackupPasswordHash {
+ public String hash;
+ public byte[] salt;
+
+ BackupPasswordHash(String hash, byte[] salt) {
+ this.hash = hash;
+ this.salt = salt;
+ }
+ }
+
+ /**
+ * The password version file contains a single 32-bit integer.
+ */
+ private static final class PasswordVersionFileCodec implements
+ DataStreamCodec<Integer> {
+ @Override
+ public void serialize(Integer integer, DataOutputStream dataOutputStream)
+ throws IOException {
+ dataOutputStream.write(integer);
+ }
+
+ @Override
+ public Integer deserialize(DataInputStream dataInputStream) throws IOException {
+ return dataInputStream.readInt();
+ }
+ }
+
+ /**
+ * The passwords hash file contains
+ *
+ * <ul>
+ * <li>A 32-bit integer representing the number of bytes in the salt;
+ * <li>The salt bytes;
+ * <li>A UTF-8 string of the hash.
+ * </ul>
+ */
+ private static final class PasswordHashFileCodec implements
+ DataStreamCodec<BackupPasswordHash> {
+ @Override
+ public void serialize(BackupPasswordHash backupPasswordHash,
+ DataOutputStream dataOutputStream) throws IOException {
+ dataOutputStream.writeInt(backupPasswordHash.salt.length);
+ dataOutputStream.write(backupPasswordHash.salt);
+ dataOutputStream.writeUTF(backupPasswordHash.hash);
+ }
+
+ @Override
+ public BackupPasswordHash deserialize(
+ DataInputStream dataInputStream) throws IOException {
+ int saltLen = dataInputStream.readInt();
+ byte[] salt = new byte[saltLen];
+ dataInputStream.readFully(salt);
+ String hash = dataInputStream.readUTF();
+ return new BackupPasswordHash(hash, salt);
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/DataChangedJournal.java b/services/backup/java/com/android/server/backup/DataChangedJournal.java
new file mode 100644
index 000000000000..9360c85aed33
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/DataChangedJournal.java
@@ -0,0 +1,142 @@
+/*
+ * 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
+ */
+
+package com.android.server.backup;
+
+import android.annotation.Nullable;
+
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+
+/**
+ * A journal of packages that have indicated that their data has changed (and therefore should be
+ * backed up in the next scheduled K/V backup pass).
+ *
+ * <p>This information is persisted to the filesystem so that it is not lost in the event of a
+ * reboot.
+ */
+public final class DataChangedJournal {
+ private static final String FILE_NAME_PREFIX = "journal";
+
+ /**
+ * Journals tend to be on the order of a few kilobytes, hence setting the buffer size to 8kb.
+ */
+ private static final int BUFFER_SIZE_BYTES = 8 * 1024;
+
+ private final File mFile;
+
+ /**
+ * Constructs an instance that reads from and writes to the given file.
+ */
+ DataChangedJournal(File file) {
+ mFile = file;
+ }
+
+ /**
+ * Adds the given package to the journal.
+ *
+ * @param packageName The name of the package whose data has changed.
+ * @throws IOException if there is an IO error writing to the journal file.
+ */
+ public void addPackage(String packageName) throws IOException {
+ try (RandomAccessFile out = new RandomAccessFile(mFile, "rws")) {
+ out.seek(out.length());
+ out.writeUTF(packageName);
+ }
+ }
+
+ /**
+ * Invokes {@link Consumer#accept(String)} with every package name in the journal file.
+ *
+ * @param consumer The callback.
+ * @throws IOException If there is an IO error reading from the file.
+ */
+ public void forEach(Consumer consumer) throws IOException {
+ try (
+ BufferedInputStream bufferedInputStream = new BufferedInputStream(
+ new FileInputStream(mFile), BUFFER_SIZE_BYTES);
+ DataInputStream dataInputStream = new DataInputStream(bufferedInputStream)
+ ) {
+ while (dataInputStream.available() > 0) {
+ String packageName = dataInputStream.readUTF();
+ consumer.accept(packageName);
+ }
+ }
+ }
+
+ /**
+ * Deletes the journal from the filesystem.
+ *
+ * @return {@code true} if successfully deleted journal.
+ */
+ public boolean delete() {
+ return mFile.delete();
+ }
+
+ @Override
+ public boolean equals(@Nullable Object object) {
+ if (object instanceof DataChangedJournal) {
+ DataChangedJournal that = (DataChangedJournal) object;
+ try {
+ return this.mFile.getCanonicalPath().equals(that.mFile.getCanonicalPath());
+ } catch (IOException exception) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return mFile.toString();
+ }
+
+ /**
+ * Consumer for iterating over package names in the journal.
+ */
+ @FunctionalInterface
+ public interface Consumer {
+ void accept(String packageName);
+ }
+
+ /**
+ * Creates a new journal with a random file name in the given journal directory.
+ *
+ * @param journalDirectory The directory where journals are kept.
+ * @return The journal.
+ * @throws IOException if there is an IO error creating the file.
+ */
+ static DataChangedJournal newJournal(File journalDirectory) throws IOException {
+ return new DataChangedJournal(
+ File.createTempFile(FILE_NAME_PREFIX, null, journalDirectory));
+ }
+
+ /**
+ * Returns a list of journals in the given journal directory.
+ */
+ static ArrayList<DataChangedJournal> listJournals(File journalDirectory) {
+ ArrayList<DataChangedJournal> journals = new ArrayList<>();
+ for (File file : journalDirectory.listFiles()) {
+ journals.add(new DataChangedJournal(file));
+ }
+ return journals;
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
index 7e28f610e565..c760806aa717 100644
--- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
@@ -32,6 +32,7 @@ import static com.android.server.backup.internal.BackupHandler.MSG_RUN_CLEAR;
import static com.android.server.backup.internal.BackupHandler.MSG_RUN_RESTORE;
import static com.android.server.backup.internal.BackupHandler.MSG_SCHEDULE_BACKUP_PACKAGE;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.AppGlobals;
@@ -118,12 +119,14 @@ import com.android.server.backup.utils.AppBackupUtils;
import com.android.server.backup.utils.BackupManagerMonitorUtils;
import com.android.server.backup.utils.BackupObserverUtils;
import com.android.server.backup.utils.PasswordUtils;
+import com.android.server.backup.utils.SparseArrayUtils;
import com.android.server.power.BatterySaverPolicy.ServiceType;
import libcore.io.IoUtils;
+import com.google.android.collect.Sets;
+
import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -135,7 +138,6 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.security.SecureRandom;
@@ -169,10 +171,6 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
// with U+FF00 or higher for system use).
public static final String KEY_WIDGET_STATE = "\uffed\uffedwidget";
- // Historical and current algorithm names
- public static final String PBKDF_CURRENT = "PBKDF2WithHmacSHA1";
- public static final String PBKDF_FALLBACK = "PBKDF2WithHmacSHA1And8bit";
-
// Name and current contents version of the full-backup manifest file
//
// Manifest version history:
@@ -190,7 +188,6 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
// 5 : added support for key-value packages
public static final int BACKUP_FILE_VERSION = 5;
public static final String BACKUP_FILE_HEADER_MAGIC = "ANDROID BACKUP\n";
- private static final int BACKUP_PW_FILE_VERSION = 2;
public static final String BACKUP_METADATA_FILENAME = "_meta";
public static final int BACKUP_METADATA_VERSION = 1;
public static final int BACKUP_WIDGET_METADATA_TOKEN = 0x01FFED01;
@@ -283,6 +280,8 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
private final Object mClearDataLock = new Object();
private volatile boolean mClearingData;
+ private final BackupPasswordManager mBackupPasswordManager;
+
@GuardedBy("mPendingRestores")
private boolean mIsRestoreInProgress;
@GuardedBy("mPendingRestores")
@@ -482,11 +481,11 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
mDataDir = dataDir;
}
- public File getJournal() {
+ public DataChangedJournal getJournal() {
return mJournal;
}
- public void setJournal(File journal) {
+ public void setJournal(@Nullable DataChangedJournal journal) {
mJournal = journal;
}
@@ -630,20 +629,9 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
private File mBaseStateDir;
private File mDataDir;
private File mJournalDir;
- private File mJournal;
-
- // Backup password, if any, and the file where it's saved. What is stored is not the
- // password text itself; it's the result of a PBKDF2 hash with a randomly chosen (but
- // persisted) salt. Validation is performed by running the challenge text through the
- // same PBKDF2 cycle with the persisted salt; if the resulting derived key string matches
- // the saved hash string, then the challenge text matches the originally supplied
- // password text.
+ @Nullable private DataChangedJournal mJournal;
+
private final SecureRandom mRng = new SecureRandom();
- private String mPasswordHash;
- private File mPasswordHashFile;
- private int mPasswordVersion;
- private File mPasswordVersionFile;
- private byte[] mPasswordSalt;
// Keep a log of all the apps we've ever backed up, and what the
// dataset tokens are for both the current backup dataset and
@@ -745,52 +733,7 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
// This dir on /cache is managed directly in init.rc
mDataDir = new File(Environment.getDownloadCacheDirectory(), "backup_stage");
- mPasswordVersion = 1; // unless we hear otherwise
- mPasswordVersionFile = new File(mBaseStateDir, "pwversion");
- if (mPasswordVersionFile.exists()) {
- FileInputStream fin = null;
- DataInputStream in = null;
- try {
- fin = new FileInputStream(mPasswordVersionFile);
- in = new DataInputStream(fin);
- mPasswordVersion = in.readInt();
- } catch (IOException e) {
- Slog.e(TAG, "Unable to read backup pw version");
- } finally {
- try {
- if (in != null) in.close();
- if (fin != null) fin.close();
- } catch (IOException e) {
- Slog.w(TAG, "Error closing pw version files");
- }
- }
- }
-
- mPasswordHashFile = new File(mBaseStateDir, "pwhash");
- if (mPasswordHashFile.exists()) {
- FileInputStream fin = null;
- DataInputStream in = null;
- try {
- fin = new FileInputStream(mPasswordHashFile);
- in = new DataInputStream(new BufferedInputStream(fin));
- // integer length of the salt array, followed by the salt,
- // then the hex pw hash string
- int saltLen = in.readInt();
- byte[] salt = new byte[saltLen];
- in.readFully(salt);
- mPasswordHash = in.readUTF();
- mPasswordSalt = salt;
- } catch (IOException e) {
- Slog.e(TAG, "Unable to read saved backup pw hash");
- } finally {
- try {
- if (in != null) in.close();
- if (fin != null) fin.close();
- } catch (IOException e) {
- Slog.w(TAG, "Unable to close streams");
- }
- }
- }
+ mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng);
// Alarm receivers for scheduled backups & initialization operations
mRunBackupReceiver = new RunBackupReceiver(this);
@@ -1105,35 +1048,17 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
}
private void parseLeftoverJournals() {
- for (File f : mJournalDir.listFiles()) {
- if (mJournal == null || f.compareTo(mJournal) != 0) {
- // This isn't the current journal, so it must be a leftover. Read
- // out the package names mentioned there and schedule them for
- // backup.
- DataInputStream in = null;
+ ArrayList<DataChangedJournal> journals = DataChangedJournal.listJournals(mJournalDir);
+ for (DataChangedJournal journal : journals) {
+ if (!journal.equals(mJournal)) {
try {
- Slog.i(TAG, "Found stale backup journal, scheduling");
- // Journals will tend to be on the order of a few kilobytes(around 4k), hence,
- // setting the buffer size to 8192.
- InputStream bufferedInputStream = new BufferedInputStream(
- new FileInputStream(f), 8192);
- in = new DataInputStream(bufferedInputStream);
- while (true) {
- String packageName = in.readUTF();
+ journal.forEach(packageName -> {
+ Slog.i(TAG, "Found stale backup journal, scheduling");
if (MORE_DEBUG) Slog.i(TAG, " " + packageName);
dataChangedImpl(packageName);
- }
- } catch (EOFException e) {
- // no more data; we're done
- } catch (Exception e) {
- Slog.e(TAG, "Can't read " + f, e);
- } finally {
- // close/delete the file
- try {
- if (in != null) in.close();
- } catch (IOException e) {
- }
- f.delete();
+ });
+ } catch (IOException e) {
+ Slog.e(TAG, "Can't read " + journal, e);
}
}
}
@@ -1146,128 +1071,18 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
return array;
}
- private boolean passwordMatchesSaved(String algorithm, String candidatePw, int rounds) {
- if (mPasswordHash == null) {
- // no current password case -- require that 'currentPw' be null or empty
- if (candidatePw == null || "".equals(candidatePw)) {
- return true;
- } // else the non-empty candidate does not match the empty stored pw
- } else {
- // hash the stated current pw and compare to the stored one
- if (candidatePw != null && candidatePw.length() > 0) {
- String currentPwHash = PasswordUtils.buildPasswordHash(algorithm, candidatePw,
- mPasswordSalt,
- rounds);
- if (mPasswordHash.equalsIgnoreCase(currentPwHash)) {
- // candidate hash matches the stored hash -- the password matches
- return true;
- }
- } // else the stored pw is nonempty but the candidate is empty; no match
- }
- return false;
- }
-
@Override
public boolean setBackupPassword(String currentPw, String newPw) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
- "setBackupPassword");
-
- // When processing v1 passwords we may need to try two different PBKDF2 checksum regimes
- final boolean pbkdf2Fallback = (mPasswordVersion < BACKUP_PW_FILE_VERSION);
-
- // If the supplied pw doesn't hash to the the saved one, fail. The password
- // might be caught in the legacy crypto mismatch; verify that too.
- if (!passwordMatchesSaved(PBKDF_CURRENT, currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS)
- && !(pbkdf2Fallback && passwordMatchesSaved(PBKDF_FALLBACK,
- currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS))) {
- return false;
- }
-
- // Snap up to current on the pw file version
- mPasswordVersion = BACKUP_PW_FILE_VERSION;
- FileOutputStream pwFout = null;
- DataOutputStream pwOut = null;
- try {
- pwFout = new FileOutputStream(mPasswordVersionFile);
- pwOut = new DataOutputStream(pwFout);
- pwOut.writeInt(mPasswordVersion);
- } catch (IOException e) {
- Slog.e(TAG, "Unable to write backup pw version; password not changed");
- return false;
- } finally {
- try {
- if (pwOut != null) pwOut.close();
- if (pwFout != null) pwFout.close();
- } catch (IOException e) {
- Slog.w(TAG, "Unable to close pw version record");
- }
- }
-
- // Clearing the password is okay
- if (newPw == null || newPw.isEmpty()) {
- if (mPasswordHashFile.exists()) {
- if (!mPasswordHashFile.delete()) {
- // Unable to delete the old pw file, so fail
- Slog.e(TAG, "Unable to clear backup password");
- return false;
- }
- }
- mPasswordHash = null;
- mPasswordSalt = null;
- return true;
- }
-
- try {
- // Okay, build the hash of the new backup password
- byte[] salt = randomBytes(PasswordUtils.PBKDF2_SALT_SIZE);
- String newPwHash = PasswordUtils.buildPasswordHash(PBKDF_CURRENT, newPw, salt,
- PasswordUtils.PBKDF2_HASH_ROUNDS);
-
- OutputStream pwf = null, buffer = null;
- DataOutputStream out = null;
- try {
- pwf = new FileOutputStream(mPasswordHashFile);
- buffer = new BufferedOutputStream(pwf);
- out = new DataOutputStream(buffer);
- // integer length of the salt array, followed by the salt,
- // then the hex pw hash string
- out.writeInt(salt.length);
- out.write(salt);
- out.writeUTF(newPwHash);
- out.flush();
- mPasswordHash = newPwHash;
- mPasswordSalt = salt;
- return true;
- } finally {
- if (out != null) out.close();
- if (buffer != null) buffer.close();
- if (pwf != null) pwf.close();
- }
- } catch (IOException e) {
- Slog.e(TAG, "Unable to set backup password");
- }
- return false;
+ return mBackupPasswordManager.setBackupPassword(currentPw, newPw);
}
@Override
public boolean hasBackupPassword() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
- "hasBackupPassword");
-
- return mPasswordHash != null && mPasswordHash.length() > 0;
+ return mBackupPasswordManager.hasBackupPassword();
}
public boolean backupPasswordMatches(String currentPw) {
- if (hasBackupPassword()) {
- final boolean pbkdf2Fallback = (mPasswordVersion < BACKUP_PW_FILE_VERSION);
- if (!passwordMatchesSaved(PBKDF_CURRENT, currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS)
- && !(pbkdf2Fallback && passwordMatchesSaved(PBKDF_FALLBACK,
- currentPw, PasswordUtils.PBKDF2_HASH_ROUNDS))) {
- if (DEBUG) Slog.w(TAG, "Backup password mismatch; aborting");
- return false;
- }
- }
- return true;
+ return mBackupPasswordManager.backupPasswordMatches(currentPw);
}
// Maintain persistent state around whether need to do an initialize operation.
@@ -2489,38 +2304,22 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
}
// a caller with full permission can ask to back up any participating app
- HashSet<String> targets = new HashSet<>();
if (PACKAGE_MANAGER_SENTINEL.equals(packageName)) {
- targets.add(PACKAGE_MANAGER_SENTINEL);
+ return Sets.newHashSet(PACKAGE_MANAGER_SENTINEL);
} else {
synchronized (mBackupParticipants) {
- int N = mBackupParticipants.size();
- for (int i = 0; i < N; i++) {
- HashSet<String> s = mBackupParticipants.valueAt(i);
- if (s != null) {
- targets.addAll(s);
- }
- }
+ return SparseArrayUtils.union(mBackupParticipants);
}
}
- return targets;
}
private void writeToJournalLocked(String str) {
- RandomAccessFile out = null;
try {
- if (mJournal == null) mJournal = File.createTempFile("journal", null, mJournalDir);
- out = new RandomAccessFile(mJournal, "rws");
- out.seek(out.length());
- out.writeUTF(str);
+ if (mJournal == null) mJournal = DataChangedJournal.newJournal(mJournalDir);
+ mJournal.addPackage(str);
} catch (IOException e) {
Slog.e(TAG, "Can't write " + str + " to backup journal", e);
mJournal = null;
- } finally {
- try {
- if (out != null) out.close();
- } catch (IOException e) {
- }
}
}
@@ -2595,14 +2394,7 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter
// a caller with full permission can ask to back up any participating app
// !!! TODO: allow data-clear of ANY app?
if (MORE_DEBUG) Slog.v(TAG, "Privileged caller, allowing clear of other apps");
- apps = new HashSet<>();
- int N = mBackupParticipants.size();
- for (int i = 0; i < N; i++) {
- HashSet<String> s = mBackupParticipants.valueAt(i);
- if (s != null) {
- apps.addAll(s);
- }
- }
+ apps = SparseArrayUtils.union(mBackupParticipants);
}
// Is the given app an available participant?
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
index 007d9309c188..804e92c88eb7 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java
@@ -16,11 +16,11 @@
package com.android.server.backup.fullbackup;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.RefactoredBackupManagerService.DEBUG;
import static com.android.server.backup.RefactoredBackupManagerService.MORE_DEBUG;
-import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_CURRENT;
import static com.android.server.backup.RefactoredBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.RefactoredBackupManagerService.TAG;
diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
index edd389403f02..8f823004d993 100644
--- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java
+++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
@@ -36,6 +36,7 @@ import android.util.Slog;
import com.android.internal.backup.IBackupTransport;
import com.android.server.EventLogTags;
import com.android.server.backup.BackupRestoreTask;
+import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.RefactoredBackupManagerService;
import com.android.server.backup.fullbackup.PerformAdbBackupTask;
import com.android.server.backup.fullbackup.PerformFullTransportBackupTask;
@@ -107,7 +108,7 @@ public class BackupHandler extends Handler {
// snapshot the pending-backup set and work on that
ArrayList<BackupRequest> queue = new ArrayList<>();
- File oldJournal = backupManagerService.getJournal();
+ DataChangedJournal oldJournal = backupManagerService.getJournal();
synchronized (backupManagerService.getQueueLock()) {
// Do we have any work to do? Construct the work queue
// then release the synchronization lock to actually run
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index a996e2d96492..5d4fcf4c16d9 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -28,6 +28,7 @@ import static com.android.server.backup.RefactoredBackupManagerService.TIMEOUT_B
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_OPERATION_TIMEOUT;
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
+import android.annotation.Nullable;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
import android.app.backup.BackupDataInput;
@@ -57,6 +58,7 @@ import com.android.internal.backup.IBackupTransport;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.EventLogTags;
import com.android.server.backup.BackupRestoreTask;
+import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.KeyValueBackupJob;
import com.android.server.backup.PackageManagerBackupAgent;
import com.android.server.backup.RefactoredBackupManagerService;
@@ -114,7 +116,7 @@ public class PerformBackupTask implements BackupRestoreTask {
ArrayList<BackupRequest> mQueue;
ArrayList<BackupRequest> mOriginalQueue;
File mStateDir;
- File mJournal;
+ @Nullable DataChangedJournal mJournal;
BackupState mCurrentState;
List<String> mPendingFullBackups;
IBackupObserver mObserver;
@@ -142,9 +144,9 @@ public class PerformBackupTask implements BackupRestoreTask {
public PerformBackupTask(RefactoredBackupManagerService backupManagerService,
IBackupTransport transport, String dirName,
- ArrayList<BackupRequest> queue, File journal, IBackupObserver observer,
- IBackupManagerMonitor monitor, List<String> pendingFullBackups,
- boolean userInitiated, boolean nonIncremental) {
+ ArrayList<BackupRequest> queue, @Nullable DataChangedJournal journal,
+ IBackupObserver observer, IBackupManagerMonitor monitor,
+ List<String> pendingFullBackups, boolean userInitiated, boolean nonIncremental) {
this.backupManagerService = backupManagerService;
mTransport = transport;
mOriginalQueue = queue;
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index b1d6afcbd63c..62ae065be1ac 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -16,6 +16,8 @@
package com.android.server.backup.restore;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
+import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_FILE_VERSION;
import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_MANIFEST_FILENAME;
@@ -23,8 +25,6 @@ import static com.android.server.backup.RefactoredBackupManagerService.BACKUP_ME
import static com.android.server.backup.RefactoredBackupManagerService.DEBUG;
import static com.android.server.backup.RefactoredBackupManagerService.MORE_DEBUG;
import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_RESTORE_WAIT;
-import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_CURRENT;
-import static com.android.server.backup.RefactoredBackupManagerService.PBKDF_FALLBACK;
import static com.android.server.backup.RefactoredBackupManagerService.SETTINGS_PACKAGE;
import static com.android.server.backup.RefactoredBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
import static com.android.server.backup.RefactoredBackupManagerService.TAG;
diff --git a/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java b/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java
new file mode 100644
index 000000000000..b1e226d5999c
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/utils/DataStreamCodec.java
@@ -0,0 +1,40 @@
+/*
+ * 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
+ */
+
+package com.android.server.backup.utils;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * Implements how to serialize a {@code T} to a {@link DataOutputStream} and how to deserialize a
+ * {@code T} from a {@link DataInputStream}.
+ *
+ * @param <T> Type of object to be serialized / deserialized.
+ */
+public interface DataStreamCodec<T> {
+ /**
+ * Serializes {@code t} to {@code dataOutputStream}.
+ */
+ void serialize(T t, DataOutputStream dataOutputStream) throws IOException;
+
+ /**
+ * Deserializes {@code t} from {@code dataInputStream}.
+ */
+ T deserialize(DataInputStream dataInputStream) throws IOException;
+}
+
diff --git a/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java b/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java
new file mode 100644
index 000000000000..7753b0370279
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/utils/DataStreamFileCodec.java
@@ -0,0 +1,78 @@
+/*
+ * 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
+ */
+
+package com.android.server.backup.utils;
+
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Provides an interface for serializing an object to a file and deserializing it back again.
+ *
+ * <p>Serialization logic is implemented as a {@link DataStreamCodec}.
+ *
+ * @param <T> The type of object to serialize / deserialize.
+ */
+public final class DataStreamFileCodec<T> {
+ private final File mFile;
+ private final DataStreamCodec<T> mCodec;
+
+ /**
+ * Constructs an instance to serialize to or deserialize from the given file, with the given
+ * serialization / deserialization strategy.
+ */
+ public DataStreamFileCodec(File file, DataStreamCodec<T> codec) {
+ mFile = file;
+ mCodec = codec;
+ }
+
+ /**
+ * Deserializes a {@code T} from the file, automatically closing input streams.
+ *
+ * @return The deserialized object.
+ * @throws IOException if an IO error occurred.
+ */
+ public T deserialize() throws IOException {
+ try (
+ FileInputStream fileInputStream = new FileInputStream(mFile);
+ DataInputStream dataInputStream = new DataInputStream(fileInputStream)
+ ) {
+ return mCodec.deserialize(dataInputStream);
+ }
+ }
+
+ /**
+ * Serializes {@code t} to the file, automatically flushing and closing output streams.
+ *
+ * @param t The object to serialize.
+ * @throws IOException if an IO error occurs.
+ */
+ public void serialize(T t) throws IOException {
+ try (
+ FileOutputStream fileOutputStream = new FileOutputStream(mFile);
+ BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+ DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream)
+ ) {
+ mCodec.serialize(t, dataOutputStream);
+ dataOutputStream.flush();
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/utils/PasswordUtils.java b/services/backup/java/com/android/server/backup/utils/PasswordUtils.java
index 12fc927315c2..9c5e28393a53 100644
--- a/services/backup/java/com/android/server/backup/utils/PasswordUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/PasswordUtils.java
@@ -123,8 +123,7 @@ public class PasswordUtils {
int rounds) {
try {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
- KeySpec
- ks = new PBEKeySpec(pwArray, salt, rounds, PBKDF2_KEY_SIZE);
+ KeySpec ks = new PBEKeySpec(pwArray, salt, rounds, PBKDF2_KEY_SIZE);
return keyFactory.generateSecret(ks);
} catch (InvalidKeySpecException e) {
Slog.e(TAG, "Invalid key spec for PBKDF2!");
diff --git a/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java b/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java
new file mode 100644
index 000000000000..954d714f6d60
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/utils/SparseArrayUtils.java
@@ -0,0 +1,49 @@
+/*
+ * 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
+ */
+
+package com.android.server.backup.utils;
+
+import android.util.SparseArray;
+
+import java.util.HashSet;
+
+/**
+ * Helper functions for manipulating instances of {@link SparseArray}.
+ */
+public final class SparseArrayUtils {
+ // Statics only
+ private SparseArrayUtils() {}
+
+ /**
+ * Given a {@link SparseArray<HashSet>}, returns a new {@link HashSet} containing every element
+ * from every set in the array.
+ *
+ * @param sets The array of sets from which to take the union.
+ * @param <V> The type of element contained in the set.
+ * @return The complete set.
+ */
+ public static<V> HashSet<V> union(SparseArray<HashSet<V>> sets) {
+ HashSet<V> unionSet = new HashSet<>();
+ int n = sets.size();
+ for (int i = 0; i < n; i++) {
+ HashSet<V> ithSet = sets.valueAt(i);
+ if (ithSet != null) {
+ unionSet.addAll(ithSet);
+ }
+ }
+ return unionSet;
+ }
+}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index f47b0d3c6e73..f2f01cfa19b0 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -57,6 +57,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.provider.SettingsStringUtil.ComponentNameSet;
import android.text.BidiFormatter;
+import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.ExceptionUtils;
import android.util.Log;
@@ -83,6 +84,7 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Function;
@@ -247,9 +249,9 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
throws RemoteException {
checkCallerIsSystemOr(callingPackage, userId);
checkUsesFeature(callingPackage, getCallingUserId());
- return CollectionUtils.map(
+ return new ArrayList<>(CollectionUtils.map(
readAllAssociations(userId, callingPackage),
- a -> a.deviceAddress);
+ a -> a.deviceAddress));
}
//TODO also revoke notification access
@@ -495,20 +497,20 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
new Association(userId, deviceAddress, priviledgedPackage)));
}
- private void updateAssociations(Function<List<Association>, List<Association>> update) {
+ private void updateAssociations(Function<Set<Association>, Set<Association>> update) {
updateAssociations(update, getCallingUserId());
}
- private void updateAssociations(Function<List<Association>, List<Association>> update,
+ private void updateAssociations(Function<Set<Association>, Set<Association>> update,
int userId) {
final AtomicFile file = getStorageFileForUser(userId);
synchronized (file) {
- List<Association> associations = readAllAssociations(userId);
- final List<Association> old = CollectionUtils.copyOf(associations);
+ Set<Association> associations = readAllAssociations(userId);
+ final Set<Association> old = CollectionUtils.copyOf(associations);
associations = update.apply(associations);
if (size(old) == size(associations)) return;
- List<Association> finalAssociations = associations;
+ Set<Association> finalAssociations = associations;
file.write((out) -> {
XmlSerializer xml = Xml.newSerializer();
try {
@@ -517,13 +519,12 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
xml.startDocument(null, true);
xml.startTag(null, XML_TAG_ASSOCIATIONS);
- for (int i = 0; i < size(finalAssociations); i++) {
- Association association = finalAssociations.get(i);
+ CollectionUtils.forEach(finalAssociations, association -> {
xml.startTag(null, XML_TAG_ASSOCIATION)
- .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage)
- .attribute(null, XML_ATTR_DEVICE, association.deviceAddress)
- .endTag(null, XML_TAG_ASSOCIATION);
- }
+ .attribute(null, XML_ATTR_PACKAGE, association.companionAppPackage)
+ .attribute(null, XML_ATTR_DEVICE, association.deviceAddress)
+ .endTag(null, XML_TAG_ASSOCIATION);
+ });
xml.endTag(null, XML_TAG_ASSOCIATIONS);
xml.endDocument();
@@ -545,17 +546,17 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
}
@Nullable
- private ArrayList<Association> readAllAssociations(int userId) {
+ private Set<Association> readAllAssociations(int userId) {
return readAllAssociations(userId, null);
}
@Nullable
- private ArrayList<Association> readAllAssociations(int userId, @Nullable String packageFilter) {
+ private Set<Association> readAllAssociations(int userId, @Nullable String packageFilter) {
final AtomicFile file = getStorageFileForUser(userId);
if (!file.getBaseFile().exists()) return null;
- ArrayList<Association> result = null;
+ ArraySet<Association> result = null;
final XmlPullParser parser = Xml.newPullParser();
synchronized (file) {
try (FileInputStream in = file.openRead()) {
@@ -627,12 +628,10 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
public int onCommand(String cmd) {
switch (cmd) {
case "list": {
- ArrayList<Association> associations = readAllAssociations(getNextArgInt());
- for (int i = 0; i < size(associations); i++) {
- Association a = associations.get(i);
- getOutPrintWriter()
- .println(a.companionAppPackage + " " + a.deviceAddress);
- }
+ CollectionUtils.forEach(
+ readAllAssociations(getNextArgInt()),
+ a -> getOutPrintWriter()
+ .println(a.companionAppPackage + " " + a.deviceAddress));
} break;
case "associate": {
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 8ea334dbfb17..7959e392d500 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -18,6 +18,7 @@ package com.android.server;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.DUMP;
+import static android.Manifest.permission.NETWORK_STACK;
import static android.Manifest.permission.SHUTDOWN;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_DOZABLE;
import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE;
@@ -55,6 +56,7 @@ import android.content.Context;
import android.net.ConnectivityManager;
import android.net.INetd;
import android.net.INetworkManagementEventObserver;
+import android.net.ITetheringStatsProvider;
import android.net.InterfaceConfiguration;
import android.net.IpPrefix;
import android.net.LinkAddress;
@@ -225,6 +227,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
private final NetworkStatsFactory mStatsFactory = new NetworkStatsFactory();
+ @GuardedBy("mTetheringStatsProviders")
+ private final HashMap<ITetheringStatsProvider, String>
+ mTetheringStatsProviders = Maps.newHashMap();
+
/**
* If both locks need to be held, then they should be obtained in the order:
* first {@link #mQuotaLock} and then {@link #mRulesLock}.
@@ -331,6 +337,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
Watchdog.getInstance().addMonitor(this);
LocalServices.addService(NetworkManagementInternal.class, new LocalService());
+
+ synchronized (mTetheringStatsProviders) {
+ mTetheringStatsProviders.put(new NetdTetheringStatsProvider(), "netd");
+ }
}
@VisibleForTesting
@@ -520,6 +530,23 @@ public class NetworkManagementService extends INetworkManagementService.Stub
}
}
+ @Override
+ public void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name) {
+ mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG);
+ Preconditions.checkNotNull(provider);
+ synchronized(mTetheringStatsProviders) {
+ mTetheringStatsProviders.put(provider, name);
+ }
+ }
+
+ @Override
+ public void unregisterTetheringStatsProvider(ITetheringStatsProvider provider) {
+ mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG);
+ synchronized(mTetheringStatsProviders) {
+ mTetheringStatsProviders.remove(provider);
+ }
+ }
+
// Sync the state of the given chain with the native daemon.
private void syncFirewallChainLocked(int chain, String name) {
SparseIntArray rules;
@@ -1789,14 +1816,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub
}
}
- @Override
- public NetworkStats getNetworkStatsTethering() {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1);
- try {
- final NativeDaemonEvent[] events = mConnector.executeForList(
- "bandwidth", "gettetherstats");
+ private class NetdTetheringStatsProvider extends ITetheringStatsProvider.Stub {
+ @Override
+ public NetworkStats getTetherStats() {
+ final NativeDaemonEvent[] events;
+ try {
+ events = mConnector.executeForList("bandwidth", "gettetherstats");
+ } catch (NativeDaemonConnectorException e) {
+ throw e.rethrowAsParcelableException();
+ }
+ final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1);
for (NativeDaemonEvent event : events) {
if (event.getCode() != TetheringStatsListResult) continue;
@@ -1822,8 +1851,24 @@ public class NetworkManagementService extends INetworkManagementService.Stub
throw new IllegalStateException("problem parsing tethering stats: " + event);
}
}
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ return stats;
+ }
+ }
+
+ @Override
+ public NetworkStats getNetworkStatsTethering() {
+ mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
+
+ final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1);
+ synchronized (mTetheringStatsProviders) {
+ for (ITetheringStatsProvider provider: mTetheringStatsProviders.keySet()) {
+ try {
+ stats.combineAllValues(provider.getTetherStats());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Problem reading tethering stats from " +
+ mTetheringStatsProviders.get(provider) + ": " + e);
+ }
+ }
}
return stats;
}
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 72ff6068cd68..581914db4bfa 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -18,6 +18,7 @@ package com.android.server;
import android.annotation.NonNull;
import android.content.Context;
+import android.os.SystemClock;
import android.os.Trace;
import android.util.Slog;
@@ -118,14 +119,14 @@ public class SystemServiceManager {
// Register it.
mServices.add(service);
// Start it.
- long time = System.currentTimeMillis();
+ long time = SystemClock.elapsedRealtime();
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
- warnIfTooLong(System.currentTimeMillis() - time, service, "onStart");
+ warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
/**
@@ -146,7 +147,7 @@ public class SystemServiceManager {
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
- long time = System.currentTimeMillis();
+ long time = SystemClock.elapsedRealtime();
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, service.getClass().getName());
try {
service.onBootPhase(mCurrentPhase);
@@ -156,7 +157,7 @@ public class SystemServiceManager {
+ ": onBootPhase threw an exception during phase "
+ mCurrentPhase, ex);
}
- warnIfTooLong(System.currentTimeMillis() - time, service, "onBootPhase");
+ warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onBootPhase");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
} finally {
@@ -178,14 +179,14 @@ public class SystemServiceManager {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onStartUser "
+ service.getClass().getName());
- long time = System.currentTimeMillis();
+ long time = SystemClock.elapsedRealtime();
try {
service.onStartUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting start of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
- warnIfTooLong(System.currentTimeMillis() - time, service, "onStartUser ");
+ warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStartUser ");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
@@ -197,14 +198,14 @@ public class SystemServiceManager {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onUnlockUser "
+ service.getClass().getName());
- long time = System.currentTimeMillis();
+ long time = SystemClock.elapsedRealtime();
try {
service.onUnlockUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting unlock of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
- warnIfTooLong(System.currentTimeMillis() - time, service, "onUnlockUser ");
+ warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onUnlockUser ");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
@@ -216,14 +217,14 @@ public class SystemServiceManager {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onSwitchUser "
+ service.getClass().getName());
- long time = System.currentTimeMillis();
+ long time = SystemClock.elapsedRealtime();
try {
service.onSwitchUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting switch of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
- warnIfTooLong(System.currentTimeMillis() - time, service, "onSwitchUser");
+ warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onSwitchUser");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
@@ -235,14 +236,14 @@ public class SystemServiceManager {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onStopUser "
+ service.getClass().getName());
- long time = System.currentTimeMillis();
+ long time = SystemClock.elapsedRealtime();
try {
service.onStopUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting stop of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
- warnIfTooLong(System.currentTimeMillis() - time, service, "onStopUser");
+ warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStopUser");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
@@ -254,14 +255,14 @@ public class SystemServiceManager {
final SystemService service = mServices.get(i);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "onCleanupUser "
+ service.getClass().getName());
- long time = System.currentTimeMillis();
+ long time = SystemClock.elapsedRealtime();
try {
service.onCleanupUser(userHandle);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting cleanup of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
}
- warnIfTooLong(System.currentTimeMillis() - time, service, "onCleanupUser");
+ warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onCleanupUser");
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java
index 6d9d874d0899..80d39f585c12 100644
--- a/services/core/java/com/android/server/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/TextServicesManagerService.java
@@ -857,7 +857,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
Slog.e(TAG, "Remove the spell checker bind unexpectedly.");
synchronized (mLock) {
final int size = mListeners.getRegisteredCallbackCount();
- for (int i = 0; i < size; ++i) {
+ for (int i = size - 1; i >= 0; --i) {
mListeners.unregister(mListeners.getRegisteredCallbackItem(i));
}
mPendingSessionRequests.clear();
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index b18fa322bd2b..aceedf1ab805 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -85,8 +85,9 @@ public class Watchdog extends Thread {
"android.hardware.bluetooth@1.0::IBluetoothHci",
"android.hardware.camera.provider@2.4::ICameraProvider",
"android.hardware.graphics.composer@2.1::IComposer",
- "android.hardware.vr@1.0::IVr",
- "android.hardware.media.omx@1.0::IOmx"
+ "android.hardware.media.omx@1.0::IOmx",
+ "android.hardware.sensors@1.0::ISensors",
+ "android.hardware.vr@1.0::IVr"
);
static Watchdog sWatchdog;
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index a54fe727f57e..c6f2fc082bac 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -5180,6 +5180,28 @@ public class AccountManagerService
fout.println();
mAuthenticatorCache.dump(fd, fout, args, userAccounts.userId);
+
+ boolean isUserUnlocked;
+ synchronized (mUsers) {
+ isUserUnlocked = isLocalUnlockedUser(userAccounts.userId);
+ }
+ // Following logs are printed only when user is unlocked.
+ if (!isUserUnlocked) {
+ return;
+ }
+ fout.println();
+ synchronized (userAccounts.dbLock) {
+ Map<Account, Map<String, Integer>> allVisibilityValues =
+ userAccounts.accountsDb.findAllVisibilityValues();
+ fout.println("Account visibility:");
+ for (Account account : allVisibilityValues.keySet()) {
+ fout.println(" " + account.name);
+ Map<String, Integer> visibilities = allVisibilityValues.get(account);
+ for (Entry<String, Integer> entry : visibilities.entrySet()) {
+ fout.println(" " + entry.getKey() + ", " + entry.getValue());
+ }
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 03adcc417898..ff387a7ae9a2 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -17368,23 +17368,41 @@ public class ActivityManagerService extends IActivityManager.Stub
ArrayList<MemItem> catMems = new ArrayList<MemItem>();
catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1));
- final MemItem dalvikItem =
- new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, -2);
- if (dalvikSubitemPss.length > 0) {
- dalvikItem.subitems = new ArrayList<MemItem>();
- for (int j=0; j<dalvikSubitemPss.length; j++) {
- final String name = Debug.MemoryInfo.getOtherLabel(
- Debug.MemoryInfo.NUM_OTHER_STATS + j);
- dalvikItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
- dalvikSubitemSwapPss[j], j));
- }
- }
- catMems.add(dalvikItem);
+ final int dalvikId = -2;
+ catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId));
catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3));
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
String label = Debug.MemoryInfo.getOtherLabel(j);
catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j));
}
+ if (dalvikSubitemPss.length > 0) {
+ // Add dalvik subitems.
+ for (MemItem memItem : catMems) {
+ int memItemStart = 0, memItemEnd = 0;
+ if (memItem.id == dalvikId) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_END;
+ } else if (memItem.id == Debug.MemoryInfo.OTHER_DALVIK_OTHER) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_END;
+ } else if (memItem.id == Debug.MemoryInfo.OTHER_DEX) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_END;
+ } else if (memItem.id == Debug.MemoryInfo.OTHER_ART) {
+ memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_ART_START;
+ memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_ART_END;
+ } else {
+ continue; // No subitems, continue.
+ }
+ memItem.subitems = new ArrayList<MemItem>();
+ for (int j=memItemStart; j<=memItemEnd; j++) {
+ final String name = Debug.MemoryInfo.getOtherLabel(
+ Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
+ dalvikSubitemSwapPss[j], j));
+ }
+ }
+ }
ArrayList<MemItem> oomMems = new ArrayList<MemItem>();
for (int j=0; j<oomPss.length; j++) {
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 82b25665160f..3133a51a5fb5 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -21,6 +21,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.ICameraService;
import android.hardware.ICameraServiceProxy;
+import android.metrics.LogMaker;
import android.nfc.INfcAdapter;
import android.os.Binder;
import android.os.Handler;
@@ -28,15 +29,23 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
+import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserManager;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
import java.util.Set;
/**
@@ -65,6 +74,9 @@ public class CameraServiceProxy extends SystemService
private static final int RETRY_DELAY_TIME = 20; //ms
+ // Maximum entries to keep in usage history before dumping out
+ private static final int MAX_USAGE_HISTORY = 100;
+
private final Context mContext;
private final ServiceThread mHandlerThread;
private final Handler mHandler;
@@ -76,14 +88,52 @@ public class CameraServiceProxy extends SystemService
private ICameraService mCameraServiceRaw;
- private final ArraySet<String> mActiveCameraIds = new ArraySet<>();
-
+ private final ArrayMap<String, CameraUsageEvent> mActiveCameraUsage = new ArrayMap<>();
+ private final List<CameraUsageEvent> mCameraUsageHistory = new ArrayList<>();
+ private final MetricsLogger mLogger = new MetricsLogger();
private static final String NFC_NOTIFICATION_PROP = "ro.camera.notify_nfc";
private static final String NFC_SERVICE_BINDER_NAME = "nfc";
private static final IBinder nfcInterfaceToken = new Binder();
private final boolean mNotifyNfc;
- private int mActiveCameraCount = 0;
+
+ /**
+ * Structure to track camera usage
+ */
+ private static class CameraUsageEvent {
+ public final int mCameraFacing;
+ public final String mClientName;
+
+ private boolean mCompleted;
+ private long mDurationOrStartTimeMs; // Either start time, or duration once completed
+
+ public CameraUsageEvent(int facing, String clientName) {
+ mCameraFacing = facing;
+ mClientName = clientName;
+ mDurationOrStartTimeMs = SystemClock.elapsedRealtime();
+ mCompleted = false;
+ }
+
+ public void markCompleted() {
+ if (mCompleted) {
+ return;
+ }
+ mCompleted = true;
+ mDurationOrStartTimeMs = SystemClock.elapsedRealtime() - mDurationOrStartTimeMs;
+ if (CameraServiceProxy.DEBUG) {
+ Slog.v(TAG, "A camera facing " + cameraFacingToString(mCameraFacing) +
+ " was in use by " + mClientName + " for " +
+ mDurationOrStartTimeMs + " ms");
+ }
+ }
+
+ /**
+ * Return duration of camera usage event, or 0 if the event is not done
+ */
+ public long getDuration() {
+ return mCompleted ? mDurationOrStartTimeMs : 0;
+ }
+ }
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
@@ -120,10 +170,11 @@ public class CameraServiceProxy extends SystemService
public void notifyCameraState(String cameraId, int newCameraState, int facing,
String clientName) {
String state = cameraStateToString(newCameraState);
- if (DEBUG) Slog.v(TAG, "Camera " + cameraId + " facing " + facing + " state now " +
+ String facingStr = cameraFacingToString(facing);
+ if (DEBUG) Slog.v(TAG, "Camera " + cameraId + " facing " + facingStr + " state now " +
state + " for client " + clientName);
- updateActivityCount(cameraId, newCameraState);
+ updateActivityCount(cameraId, newCameraState, facing, clientName);
}
};
@@ -169,6 +220,9 @@ public class CameraServiceProxy extends SystemService
mContext.registerReceiver(mIntentReceiver, filter);
publishBinderService(CAMERA_SERVICE_PROXY_BINDER_NAME, mCameraServiceProxy);
+ publishLocalService(CameraServiceProxy.class, this);
+
+ CameraStatsJobService.schedule(mContext);
}
@Override
@@ -198,8 +252,8 @@ public class CameraServiceProxy extends SystemService
mCameraServiceRaw = null;
// All cameras reset to idle on camera service death
- boolean wasEmpty = mActiveCameraIds.isEmpty();
- mActiveCameraIds.clear();
+ boolean wasEmpty = mActiveCameraUsage.isEmpty();
+ mActiveCameraUsage.clear();
if ( mNotifyNfc && !wasEmpty ) {
notifyNfcService(/*enablePolling*/ true);
@@ -207,6 +261,46 @@ public class CameraServiceProxy extends SystemService
}
}
+ /**
+ * Dump camera usage events to log.
+ * Package-private
+ */
+ void dumpUsageEvents() {
+ synchronized(mLock) {
+ // Randomize order of events so that it's not meaningful
+ Collections.shuffle(mCameraUsageHistory);
+ for (CameraUsageEvent e : mCameraUsageHistory) {
+ if (DEBUG) {
+ Slog.v(TAG, "Camera: " + e.mClientName + " used a camera facing " +
+ cameraFacingToString(e.mCameraFacing) + " for " +
+ e.getDuration() + " ms");
+ }
+ int subtype = 0;
+ switch(e.mCameraFacing) {
+ case ICameraServiceProxy.CAMERA_FACING_BACK:
+ subtype = MetricsEvent.CAMERA_BACK_USED;
+ break;
+ case ICameraServiceProxy.CAMERA_FACING_FRONT:
+ subtype = MetricsEvent.CAMERA_FRONT_USED;
+ break;
+ case ICameraServiceProxy.CAMERA_FACING_EXTERNAL:
+ subtype = MetricsEvent.CAMERA_EXTERNAL_USED;
+ break;
+ default:
+ continue;
+ }
+ LogMaker l = new LogMaker(MetricsEvent.ACTION_CAMERA_EVENT)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(subtype)
+ .setLatency(e.getDuration())
+ .setPackageName(e.mClientName);
+ mLogger.write(l);
+ }
+ mCameraUsageHistory.clear();
+ }
+ CameraStatsJobService.schedule(mContext);
+ }
+
private void switchUserLocked(int userHandle) {
Set<Integer> currentUserHandles = getEnabledUserHandles(userHandle);
mLastUser = userHandle;
@@ -274,21 +368,35 @@ public class CameraServiceProxy extends SystemService
return true;
}
- private void updateActivityCount(String cameraId, int newCameraState) {
+ private void updateActivityCount(String cameraId, int newCameraState, int facing, String clientName) {
synchronized(mLock) {
- boolean wasEmpty = mActiveCameraIds.isEmpty();
+ // Update active camera list and notify NFC if necessary
+ boolean wasEmpty = mActiveCameraUsage.isEmpty();
switch (newCameraState) {
case ICameraServiceProxy.CAMERA_STATE_OPEN:
break;
case ICameraServiceProxy.CAMERA_STATE_ACTIVE:
- mActiveCameraIds.add(cameraId);
+ CameraUsageEvent newEvent = new CameraUsageEvent(facing, clientName);
+ CameraUsageEvent oldEvent = mActiveCameraUsage.put(cameraId, newEvent);
+ if (oldEvent != null) {
+ Slog.w(TAG, "Camera " + cameraId + " was already marked as active");
+ oldEvent.markCompleted();
+ mCameraUsageHistory.add(oldEvent);
+ }
break;
case ICameraServiceProxy.CAMERA_STATE_IDLE:
case ICameraServiceProxy.CAMERA_STATE_CLOSED:
- mActiveCameraIds.remove(cameraId);
+ CameraUsageEvent doneEvent = mActiveCameraUsage.remove(cameraId);
+ if (doneEvent != null) {
+ doneEvent.markCompleted();
+ mCameraUsageHistory.add(doneEvent);
+ if (mCameraUsageHistory.size() > MAX_USAGE_HISTORY) {
+ dumpUsageEvents();
+ }
+ }
break;
}
- boolean isEmpty = mActiveCameraIds.isEmpty();
+ boolean isEmpty = mActiveCameraUsage.isEmpty();
if ( mNotifyNfc && (wasEmpty != isEmpty) ) {
notifyNfcService(isEmpty);
}
@@ -332,4 +440,15 @@ public class CameraServiceProxy extends SystemService
}
return "CAMERA_STATE_UNKNOWN";
}
+
+ private static String cameraFacingToString(int cameraFacing) {
+ switch (cameraFacing) {
+ case ICameraServiceProxy.CAMERA_FACING_BACK: return "CAMERA_FACING_BACK";
+ case ICameraServiceProxy.CAMERA_FACING_FRONT: return "CAMERA_FACING_FRONT";
+ case ICameraServiceProxy.CAMERA_FACING_EXTERNAL: return "CAMERA_FACING_EXTERNAL";
+ default: break;
+ }
+ return "CAMERA_FACING_UNKNOWN";
+ }
+
}
diff --git a/services/core/java/com/android/server/camera/CameraStatsJobService.java b/services/core/java/com/android/server/camera/CameraStatsJobService.java
new file mode 100644
index 000000000000..b8a6846ced76
--- /dev/null
+++ b/services/core/java/com/android/server/camera/CameraStatsJobService.java
@@ -0,0 +1,77 @@
+/*
+ * 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/LICENSE2.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.camera;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.util.Slog;
+
+import java.util.concurrent.TimeUnit;
+
+import com.android.server.LocalServices;
+
+/**
+ * A JobService to periodically collect camera usage stats.
+ */
+public class CameraStatsJobService extends JobService {
+ private static final String TAG = "CameraStatsJobService";
+
+ // Must be unique within UID (system service)
+ private static final int CAMERA_REPORTING_JOB_ID = 0xCA3E7A;
+
+ private static ComponentName sCameraStatsJobServiceName = new ComponentName(
+ "android",
+ CameraStatsJobService.class.getName());
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+ CameraServiceProxy serviceProxy = LocalServices.getService(CameraServiceProxy.class);
+ if (serviceProxy == null) {
+ Slog.w(TAG, "Can't collect camera usage stats - no camera service proxy found");
+ return false;
+ }
+
+ serviceProxy.dumpUsageEvents();
+ return false;
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters params) {
+ // All work is done in onStartJob, so nothing to stop here
+ return false;
+ }
+
+ public static void schedule(Context context) {
+
+ JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+ if (js == null) {
+ Slog.e(TAG, "Can't collect camera usage stats - no Job Scheduler");
+ return;
+ }
+ js.schedule(new JobInfo.Builder(CAMERA_REPORTING_JOB_ID, sCameraStatsJobServiceName)
+ .setMinimumLatency(TimeUnit.DAYS.toMillis(1))
+ .setRequiresDeviceIdle(true)
+ .build());
+
+ }
+
+}
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 1fb944fda7c9..b0be8f7b9635 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -214,7 +214,7 @@ public class Tethering extends BaseNetworkObserver {
final Handler smHandler = mTetherMasterSM.getHandler();
mOffloadController = new OffloadController(smHandler,
deps.getOffloadHardwareInterface(smHandler, mLog),
- mContext.getContentResolver(),
+ mContext.getContentResolver(), mNMService,
mLog);
mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
mContext, mTetherMasterSM, mLog, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
@@ -1759,6 +1759,11 @@ public class Tethering extends BaseNetworkObserver {
pw.decreaseIndent();
}
+ pw.println("Hardware offload:");
+ pw.increaseIndent();
+ mOffloadController.dump(pw);
+ pw.decreaseIndent();
+
pw.println("Log:");
pw.increaseIndent();
if (argsContain(args, SHORT_ARG)) {
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
index b47386705a36..1a5ff778010c 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
@@ -16,24 +16,38 @@
package com.android.server.connectivity.tethering;
+import static android.net.NetworkStats.SET_DEFAULT;
+import static android.net.NetworkStats.TAG_NONE;
+import static android.net.TrafficStats.UID_TETHERING;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
import android.content.ContentResolver;
+import android.net.ITetheringStatsProvider;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
+import android.net.NetworkStats;
import android.net.RouteInfo;
import android.net.util.SharedLog;
import android.os.Handler;
+import android.os.INetworkManagementService;
+import android.os.RemoteException;
+import android.os.SystemClock;
import android.provider.Settings;
+import android.text.TextUtils;
+
+import com.android.internal.util.IndentingPrintWriter;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
/**
* A class to encapsulate the business logic of programming the tethering
@@ -44,6 +58,8 @@ import java.util.Set;
public class OffloadController {
private static final String TAG = OffloadController.class.getSimpleName();
+ private static final int STATS_FETCH_TIMEOUT_MS = 1000;
+
private final Handler mHandler;
private final OffloadHardwareInterface mHwInterface;
private final ContentResolver mContentResolver;
@@ -59,14 +75,25 @@ public class OffloadController {
// prefixes representing only the locally-assigned IP addresses.
private Set<String> mLastLocalPrefixStrs;
+ // Maps upstream interface names to offloaded traffic statistics.
+ private HashMap<String, OffloadHardwareInterface.ForwardedStats>
+ mForwardedStats = new HashMap<>();
+
public OffloadController(Handler h, OffloadHardwareInterface hwi,
- ContentResolver contentResolver, SharedLog log) {
+ ContentResolver contentResolver, INetworkManagementService nms, SharedLog log) {
mHandler = h;
mHwInterface = hwi;
mContentResolver = contentResolver;
mLog = log.forSubComponent(TAG);
mExemptPrefixes = new HashSet<>();
mLastLocalPrefixStrs = new HashSet<>();
+
+ try {
+ nms.registerTetheringStatsProvider(
+ new OffloadTetheringStatsProvider(), getClass().getSimpleName());
+ } catch (RemoteException e) {
+ mLog.e("Cannot register offload stats provider: " + e);
+ }
}
public void start() {
@@ -138,6 +165,7 @@ public class OffloadController {
public void stop() {
final boolean wasStarted = started();
+ updateStatsForCurrentUpstream();
mUpstreamLinkProperties = null;
mHwInterface.stopOffloadControl();
mControlInitialized = false;
@@ -145,16 +173,76 @@ public class OffloadController {
if (wasStarted) mLog.log("tethering offload stopped");
}
+ private class OffloadTetheringStatsProvider extends ITetheringStatsProvider.Stub {
+ @Override
+ public NetworkStats getTetherStats() {
+ NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0);
+ CountDownLatch latch = new CountDownLatch(1);
+
+ mHandler.post(() -> {
+ try {
+ NetworkStats.Entry entry = new NetworkStats.Entry();
+ entry.set = SET_DEFAULT;
+ entry.tag = TAG_NONE;
+ entry.uid = UID_TETHERING;
+
+ updateStatsForCurrentUpstream();
+
+ for (String iface : mForwardedStats.keySet()) {
+ entry.iface = iface;
+ entry.rxBytes = mForwardedStats.get(iface).rxBytes;
+ entry.txBytes = mForwardedStats.get(iface).txBytes;
+ stats.addValues(entry);
+ }
+ } finally {
+ latch.countDown();
+ }
+ });
+
+ try {
+ latch.await(STATS_FETCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ mLog.e("Tethering stats fetch timed out after " + STATS_FETCH_TIMEOUT_MS + "ms");
+ }
+
+ return stats;
+ }
+ }
+
+ private void maybeUpdateStats(String iface) {
+ if (TextUtils.isEmpty(iface)) {
+ return;
+ }
+
+ if (!mForwardedStats.containsKey(iface)) {
+ mForwardedStats.put(iface, new OffloadHardwareInterface.ForwardedStats());
+ }
+ mForwardedStats.get(iface).add(mHwInterface.getForwardedStats(iface));
+ }
+
+ private void updateStatsForCurrentUpstream() {
+ if (mUpstreamLinkProperties != null) {
+ maybeUpdateStats(mUpstreamLinkProperties.getInterfaceName());
+ }
+ }
+
public void setUpstreamLinkProperties(LinkProperties lp) {
if (!started() || Objects.equals(mUpstreamLinkProperties, lp)) return;
+ String prevUpstream = (mUpstreamLinkProperties != null) ?
+ mUpstreamLinkProperties.getInterfaceName() : null;
+
mUpstreamLinkProperties = (lp != null) ? new LinkProperties(lp) : null;
+
// TODO: examine return code and decide what to do if programming
// upstream parameters fails (probably just wait for a subsequent
// onOffloadEvent() callback to tell us offload is available again and
// then reapply all state).
computeAndPushLocalPrefixes();
pushUpstreamParameters();
+
+ // Update stats after we've told the hardware to change routing so we don't miss packets.
+ maybeUpdateStats(prevUpstream);
}
public void setLocalPrefixes(Set<IpPrefix> localPrefixes) {
@@ -262,4 +350,16 @@ public class OffloadController {
for (IpPrefix pfx : prefixSet) localPrefixStrs.add(pfx.toString());
return localPrefixStrs;
}
+
+ public void dump(IndentingPrintWriter pw) {
+ if (isOffloadDisabled()) {
+ pw.println("Offload disabled");
+ return;
+ }
+ pw.println("Offload HALs " + (started() ? "started" : "not started"));
+ LinkProperties lp = mUpstreamLinkProperties;
+ String upstream = (lp != null) ? lp.getInterfaceName() : null;
+ pw.println("Current upstream: " + upstream);
+ pw.println("Exempt prefixes: " + mLastLocalPrefixStrs);
+ }
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index e82724db27f7..d4abc08ffc0d 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -16,6 +16,7 @@
package com.android.server.display;
+import android.app.ActivityManager;
import com.android.internal.app.IBatteryStats;
import com.android.server.LocalServices;
import com.android.server.am.BatteryStatsService;
@@ -161,6 +162,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// True if should use light sensor to automatically determine doze screen brightness.
private final boolean mAllowAutoBrightnessWhileDozingConfig;
+ // Whether or not the color fade on screen on / off is enabled.
+ private final boolean mColorFadeEnabled;
+
// True if we should fade the screen while turning it off, false if we should play
// a stylish color fade animation instead.
private boolean mColorFadeFadesConfig;
@@ -407,6 +411,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mScreenBrightnessRangeMinimum = screenBrightnessRangeMinimum;
+
+ mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic();
mColorFadeFadesConfig = resources.getBoolean(
com.android.internal.R.bool.config_animateScreenLights);
@@ -497,17 +503,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Initialize the power state object for the default display.
// In the future, we might manage multiple displays independently.
mPowerState = new DisplayPowerState(mBlanker,
- new ColorFade(Display.DEFAULT_DISPLAY));
+ mColorFadeEnabled ? new ColorFade(Display.DEFAULT_DISPLAY) : null);
- mColorFadeOnAnimator = ObjectAnimator.ofFloat(
- mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f);
- mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS);
- mColorFadeOnAnimator.addListener(mAnimatorListener);
+ if (mColorFadeEnabled) {
+ mColorFadeOnAnimator = ObjectAnimator.ofFloat(
+ mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 0.0f, 1.0f);
+ mColorFadeOnAnimator.setDuration(COLOR_FADE_ON_ANIMATION_DURATION_MILLIS);
+ mColorFadeOnAnimator.addListener(mAnimatorListener);
- mColorFadeOffAnimator = ObjectAnimator.ofFloat(
- mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f);
- mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS);
- mColorFadeOffAnimator.addListener(mAnimatorListener);
+ mColorFadeOffAnimator = ObjectAnimator.ofFloat(
+ mPowerState, DisplayPowerState.COLOR_FADE_LEVEL, 1.0f, 0.0f);
+ mColorFadeOffAnimator.setDuration(COLOR_FADE_OFF_ANIMATION_DURATION_MILLIS);
+ mColorFadeOffAnimator.addListener(mAnimatorListener);
+ }
mScreenBrightnessRampAnimator = new RampAnimator<DisplayPowerState>(
mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS);
@@ -784,9 +792,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Note that we do not wait for the brightness ramp animation to complete before
// reporting the display is ready because we only need to ensure the screen is in the
// right power state even as it continues to converge on the desired brightness.
- final boolean ready = mPendingScreenOnUnblocker == null
- && !mColorFadeOnAnimator.isStarted()
- && !mColorFadeOffAnimator.isStarted()
+ final boolean ready = mPendingScreenOnUnblocker == null &&
+ (!mColorFadeEnabled ||
+ (!mColorFadeOnAnimator.isStarted() && !mColorFadeOffAnimator.isStarted()))
&& mPowerState.waitUntilClean(mCleanListener);
final boolean finished = ready
&& !mScreenBrightnessRampAnimator.isAnimating();
@@ -959,8 +967,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
private void animateScreenStateChange(int target, boolean performScreenOffTransition) {
// If there is already an animation in progress, don't interfere with it.
- if (mColorFadeOnAnimator.isStarted()
- || mColorFadeOffAnimator.isStarted()) {
+ if (mColorFadeEnabled &&
+ (mColorFadeOnAnimator.isStarted() || mColorFadeOffAnimator.isStarted())) {
if (target != Display.STATE_ON) {
return;
}
@@ -984,7 +992,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (!setScreenState(Display.STATE_ON)) {
return; // screen on blocked
}
- if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) {
+ if (USE_COLOR_FADE_ON_ANIMATION && mColorFadeEnabled && mPowerRequest.isBrightOrDim()) {
// Perform screen on animation.
if (mPowerState.getColorFadeLevel() == 1.0f) {
mPowerState.dismissColorFade();
@@ -1060,6 +1068,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
} else {
// Want screen off.
mPendingScreenOff = true;
+ if (!mColorFadeEnabled) {
+ mPowerState.setColorFadeLevel(0.0f);
+ }
+
if (mPowerState.getColorFadeLevel() == 0.0f) {
// Turn the screen off.
// A black surface is already hiding the contents of the screen.
diff --git a/services/core/java/com/android/server/display/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java
index e2fd0acd3887..d0c15801a232 100644
--- a/services/core/java/com/android/server/display/DisplayPowerState.java
+++ b/services/core/java/com/android/server/display/DisplayPowerState.java
@@ -174,7 +174,7 @@ final class DisplayPowerState {
* @return True if the electron beam was prepared.
*/
public boolean prepareColorFade(Context context, int mode) {
- if (!mColorFade.prepare(context, mode)) {
+ if (mColorFade == null || !mColorFade.prepare(context, mode)) {
mColorFadePrepared = false;
mColorFadeReady = true;
return false;
@@ -190,7 +190,7 @@ final class DisplayPowerState {
* Dismisses the color fade surface.
*/
public void dismissColorFade() {
- mColorFade.dismiss();
+ if (mColorFade != null) mColorFade.dismiss();
mColorFadePrepared = false;
mColorFadeReady = true;
}
@@ -199,7 +199,7 @@ final class DisplayPowerState {
* Dismisses the color fade resources.
*/
public void dismissColorFadeResources() {
- mColorFade.dismissResources();
+ if (mColorFade != null) mColorFade.dismissResources();
}
/**
@@ -269,7 +269,7 @@ final class DisplayPowerState {
pw.println(" mColorFadeDrawPending=" + mColorFadeDrawPending);
mPhotonicModulator.dump(pw);
- mColorFade.dump(pw);
+ if (mColorFade != null) mColorFade.dump(pw);
}
private void scheduleScreenUpdate() {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 98a247975959..c0f9e0d90edb 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -5746,6 +5746,9 @@ public class NotificationManagerService extends SystemService {
@Override
public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
final PrintWriter pw = getOutPrintWriter();
try {
switch (cmd) {
diff --git a/services/core/java/com/android/server/notification/ZenModeFiltering.java b/services/core/java/com/android/server/notification/ZenModeFiltering.java
index cbaad460b888..a7a2743dfc7f 100644
--- a/services/core/java/com/android/server/notification/ZenModeFiltering.java
+++ b/services/core/java/com/android/server/notification/ZenModeFiltering.java
@@ -104,9 +104,6 @@ public class ZenModeFiltering {
}
public boolean shouldIntercept(int zen, ZenModeConfig config, NotificationRecord record) {
- if (isSystem(record)) {
- return false;
- }
switch (zen) {
case Global.ZEN_MODE_NO_INTERRUPTIONS:
// #notevenalarms
@@ -177,10 +174,6 @@ public class ZenModeFiltering {
return false;
}
- private static boolean isSystem(NotificationRecord record) {
- return record.isCategory(Notification.CATEGORY_SYSTEM);
- }
-
private static boolean isAlarm(NotificationRecord record) {
return record.isCategory(Notification.CATEGORY_ALARM)
|| record.isAudioStream(AudioManager.STREAM_ALARM)
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 700d3c2ef805..c3a40bf1443e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2699,7 +2699,16 @@ public class PackageManagerService extends IPackageManager.Stub
// Remove any shared userIDs that have no associated packages
mSettings.pruneSharedUsersLPw();
-
+ final long systemScanTime = SystemClock.uptimeMillis() - startTime;
+ final int systemPackagesCount = mPackages.size();
+ Slog.i(TAG, "Finished scanning system apps. Time: " + systemScanTime
+ + " ms, packageCount: " + systemPackagesCount
+ + " ms, timePerPackage: "
+ + (systemPackagesCount == 0 ? 0 : systemScanTime / systemPackagesCount));
+ if (mIsUpgrade && systemPackagesCount > 0) {
+ MetricsLogger.histogram(null, "ota_package_manager_system_app_avg_scan_time",
+ ((int) systemScanTime) / systemPackagesCount);
+ }
if (!mOnlyCore) {
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
SystemClock.uptimeMillis());
@@ -2780,6 +2789,16 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
}
+ final long dataScanTime = SystemClock.uptimeMillis() - systemScanTime - startTime;
+ final int dataPackagesCount = mPackages.size() - systemPackagesCount;
+ Slog.i(TAG, "Finished scanning non-system apps. Time: " + dataScanTime
+ + " ms, packageCount: " + dataPackagesCount
+ + " ms, timePerPackage: "
+ + (dataPackagesCount == 0 ? 0 : dataScanTime / dataPackagesCount));
+ if (mIsUpgrade && dataPackagesCount > 0) {
+ MetricsLogger.histogram(null, "ota_package_manager_data_app_avg_scan_time",
+ ((int) dataScanTime) / dataPackagesCount);
+ }
}
mExpectingBetter.clear();
@@ -3009,6 +3028,10 @@ public class PackageManagerService extends IPackageManager.Stub
userPackages.put(userId, getInstalledPackages(/*flags*/ 0, userId).getList());
}
mDexManager.load(userPackages);
+ if (mIsUpgrade) {
+ MetricsLogger.histogram(null, "ota_package_manager_init_time",
+ (int) (SystemClock.uptimeMillis() - startTime));
+ }
} // synchronized (mPackages)
} // synchronized (mInstallLock)
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp
index cb8416b36be5..45e9cc785bf8 100644
--- a/services/core/jni/com_android_server_VibratorService.cpp
+++ b/services/core/jni/com_android_server_VibratorService.cpp
@@ -73,11 +73,13 @@ Return<R> halCall(Return<R> (I::* fn)(Args0...), Args1&&... args1) {
ret = (sHal == nullptr) ? NullptrStatus<R>()
: (*sHal.*fn)(std::forward<Args1>(args1)...);
- if (!ret.isOk()) {
- ALOGE("Failed to issue command to vibrator HAL. Retrying.");
- // Restoring connection to the HAL.
- sHal = I::tryGetService();
+ if (ret.isOk()) {
+ break;
}
+
+ ALOGE("Failed to issue command to vibrator HAL. Retrying.");
+ // Restoring connection to the HAL.
+ sHal = I::tryGetService();
}
return ret;
}
diff --git a/services/core/jni/com_android_server_am_BatteryStatsService.cpp b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
index 37ae78254ce2..2dfd8b9fa163 100644
--- a/services/core/jni/com_android_server_am_BatteryStatsService.cpp
+++ b/services/core/jni/com_android_server_am_BatteryStatsService.cpp
@@ -59,7 +59,7 @@ namespace android
static bool wakeup_init = false;
static sem_t wakeup_sem;
-extern sp<IPower> gPowerHal;
+extern sp<android::hardware::power::V1_0::IPower> gPowerHalV1_0;
extern std::mutex gPowerHalMutex;
extern bool getPowerHal();
@@ -203,7 +203,7 @@ static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject o
return -1;
}
- Return<void> ret = gPowerHal->getPlatformLowPowerStats(
+ Return<void> ret = gPowerHalV1_0->getPlatformLowPowerStats(
[&offset, &remaining, &total_added](hidl_vec<PowerStatePlatformSleepState> states,
Status status) {
if (status != Status::SUCCESS)
@@ -257,7 +257,7 @@ static jint getPlatformLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject o
if (!ret.isOk()) {
ALOGE("getPlatformLowPowerStats() failed: power HAL service not available");
- gPowerHal = nullptr;
+ gPowerHalV1_0 = nullptr;
return -1;
}
}
@@ -288,7 +288,7 @@ static jint getSubsystemLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject
}
//Trying to cast to 1.1, this will succeed only for devices supporting 1.1
- gPowerHal_1_1 = android::hardware::power::V1_1::IPower::castFrom(gPowerHal);
+ gPowerHal_1_1 = android::hardware::power::V1_1::IPower::castFrom(gPowerHalV1_0);
if (gPowerHal_1_1 == nullptr) {
//This device does not support IPower@1.1, exiting gracefully
return 0;
@@ -351,7 +351,7 @@ static jint getSubsystemLowPowerStats(JNIEnv* env, jobject /* clazz */, jobject
if (!ret.isOk()) {
ALOGE("getSubsystemLowPowerStats() failed: power HAL service not available");
- gPowerHal = nullptr;
+ gPowerHalV1_0 = nullptr;
return -1;
}
}
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index 29924dd60dcf..070b8082e22b 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -18,7 +18,7 @@
//#define LOG_NDEBUG 0
-#include <android/hardware/power/1.0/IPower.h>
+#include <android/hardware/power/1.1/IPower.h>
#include "JNIHelp.h"
#include "jni.h"
@@ -41,7 +41,7 @@
using android::hardware::Return;
using android::hardware::Void;
-using android::hardware::power::V1_0::IPower;
+using android::hardware::power::V1_1::IPower;
using android::hardware::power::V1_0::PowerHint;
using android::hardware::power::V1_0::Feature;
using android::String8;
@@ -57,7 +57,8 @@ static struct {
// ----------------------------------------------------------------------------
static jobject gPowerManagerServiceObj;
-sp<IPower> gPowerHal = nullptr;
+sp<android::hardware::power::V1_0::IPower> gPowerHalV1_0 = nullptr;
+sp<android::hardware::power::V1_1::IPower> gPowerHalV1_1 = nullptr;
bool gPowerHalExists = true;
std::mutex gPowerHalMutex;
static nsecs_t gLastEventTime[USER_ACTIVITY_EVENT_LAST + 1];
@@ -80,16 +81,17 @@ static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa
// Check validity of current handle to the power HAL service, and call getService() if necessary.
// The caller must be holding gPowerHalMutex.
bool getPowerHal() {
- if (gPowerHalExists && gPowerHal == nullptr) {
- gPowerHal = IPower::getService();
- if (gPowerHal != nullptr) {
+ if (gPowerHalExists && gPowerHalV1_0 == nullptr) {
+ gPowerHalV1_0 = android::hardware::power::V1_0::IPower::getService();
+ if (gPowerHalV1_0 != nullptr) {
+ gPowerHalV1_1 = android::hardware::power::V1_1::IPower::castFrom(gPowerHalV1_0);
ALOGI("Loaded power HAL service");
} else {
ALOGI("Couldn't load power HAL service");
gPowerHalExists = false;
}
}
- return gPowerHal != nullptr;
+ return gPowerHalV1_0 != nullptr;
}
// Check if a call to a power HAL function failed; if so, log the failure and invalidate the
@@ -97,7 +99,7 @@ bool getPowerHal() {
static void processReturn(const Return<void> &ret, const char* functionName) {
if (!ret.isOk()) {
ALOGE("%s() failed: power HAL service not available.", functionName);
- gPowerHal = nullptr;
+ gPowerHalV1_0 = nullptr;
}
}
@@ -105,7 +107,12 @@ void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t
// Tell the power HAL when user activity occurs.
gPowerHalMutex.lock();
if (getPowerHal()) {
- Return<void> ret = gPowerHal->powerHint(PowerHint::INTERACTION, 0);
+ Return<void> ret;
+ if (gPowerHalV1_1 != nullptr) {
+ ret = gPowerHalV1_1->powerHintAsync(PowerHint::INTERACTION, 0);
+ } else {
+ ret = gPowerHalV1_0->powerHint(PowerHint::INTERACTION, 0);
+ }
processReturn(ret, "powerHint");
}
gPowerHalMutex.unlock();
@@ -159,7 +166,7 @@ static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean
std::lock_guard<std::mutex> lock(gPowerHalMutex);
if (getPowerHal()) {
android::base::Timer t;
- Return<void> ret = gPowerHal->setInteractive(enable);
+ Return<void> ret = gPowerHalV1_0->setInteractive(enable);
processReturn(ret, "setInteractive");
if (t.duration() > 20ms) {
ALOGD("Excessive delay in setInteractive(%s) while turning screen %s",
@@ -187,7 +194,12 @@ static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean
static void nativeSendPowerHint(JNIEnv *env, jclass clazz, jint hintId, jint data) {
std::lock_guard<std::mutex> lock(gPowerHalMutex);
if (getPowerHal()) {
- Return<void> ret = gPowerHal->powerHint((PowerHint)hintId, data);
+ Return<void> ret;
+ if (gPowerHalV1_1 != nullptr) {
+ ret = gPowerHalV1_1->powerHintAsync((PowerHint)hintId, data);
+ } else {
+ ret = gPowerHalV1_0->powerHint((PowerHint)hintId, data);
+ }
processReturn(ret, "powerHint");
}
}
@@ -195,7 +207,7 @@ static void nativeSendPowerHint(JNIEnv *env, jclass clazz, jint hintId, jint dat
static void nativeSetFeature(JNIEnv *env, jclass clazz, jint featureId, jint data) {
std::lock_guard<std::mutex> lock(gPowerHalMutex);
if (getPowerHal()) {
- Return<void> ret = gPowerHal->setFeature((Feature)featureId, static_cast<bool>(data));
+ Return<void> ret = gPowerHalV1_0->setFeature((Feature)featureId, static_cast<bool>(data));
processReturn(ret, "setFeature");
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index c2a5b6cff814..d10cc029f5ee 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -763,13 +763,6 @@ public final class SystemServer {
mContentResolver = context.getContentResolver();
- if (!disableCameraService) {
- Slog.i(TAG, "Camera Service Proxy");
- traceBeginAndSlog("StartCameraServiceProxy");
- mSystemServiceManager.startService(CameraServiceProxy.class);
- traceEnd();
- }
-
// The AccountManager must come before the ContentService
traceBeginAndSlog("StartAccountManagerService");
mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);
@@ -1516,6 +1509,12 @@ public final class SystemServer {
}
}
+ if (!disableCameraService) {
+ traceBeginAndSlog("StartCameraServiceProxy");
+ mSystemServiceManager.startService(CameraServiceProxy.class);
+ traceEnd();
+ }
+
// Before things start rolling, be sure we have decided whether
// we are in safe mode.
final boolean safeMode = wm.detectSafeMode();
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
index 3007cb1755e2..f457f6a550c1 100644
--- a/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
+++ b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
@@ -25,8 +25,14 @@ import android.os.Parcel;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.internal.util.FastXmlSerializer;
+
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -50,4 +56,15 @@ public class NotificationChannelTest extends NotificationTestCase {
channel.setBlockableSystem(true);
assertEquals(true, channel.isBlockableSystem());
}
+
+ @Test
+ public void testEmptyVibration_noException() throws Exception {
+ NotificationChannel channel = new NotificationChannel("a", "ab", IMPORTANCE_DEFAULT);
+ channel.setVibrationPattern(new long[0]);
+
+ XmlSerializer serializer = new FastXmlSerializer();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
+ channel.writeXml(serializer);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java
new file mode 100644
index 000000000000..04c02510cb3d
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/BackupPasswordManagerTest.java
@@ -0,0 +1,232 @@
+/*
+ * 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
+ */
+
+package com.android.server.backup;
+
+import static com.android.server.testutis.TestUtils.assertExpectException;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyString;
+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 com.android.server.backup.utils.PasswordUtils;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.security.SecureRandom;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class BackupPasswordManagerTest {
+ private static final String PASSWORD_VERSION_FILE_NAME = "pwversion";
+ private static final String PASSWORD_HASH_FILE_NAME = "pwhash";
+ private static final String V1_HASH_ALGORITHM = "PBKDF2WithHmacSHA1And8bit";
+
+ @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+
+ @Mock private Context mContext;
+
+ private File mStateFolder;
+ private BackupPasswordManager mPasswordManager;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mStateFolder = mTemporaryFolder.newFolder();
+ mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom());
+ }
+
+ @Test
+ public void hasBackupPassword_isFalseIfFileDoesNotExist() {
+ assertThat(mPasswordManager.hasBackupPassword()).isFalse();
+ }
+
+ @Test
+ public void hasBackupPassword_isTrueIfFileExists() throws Exception {
+ mPasswordManager.setBackupPassword(null, "password1234");
+ assertThat(mPasswordManager.hasBackupPassword()).isTrue();
+ }
+
+ @Test
+ public void hasBackupPassword_throwsSecurityExceptionIfLacksPermission() {
+ setDoesNotHavePermission();
+
+ assertExpectException(
+ SecurityException.class,
+ /* expectedExceptionMessageRegex */ null,
+ () -> mPasswordManager.hasBackupPassword());
+ }
+
+ @Test
+ public void backupPasswordMatches_isTrueIfNoPassword() {
+ assertThat(mPasswordManager.backupPasswordMatches("anything")).isTrue();
+ }
+
+ @Test
+ public void backupPasswordMatches_isTrueForSamePassword() {
+ String password = "password1234";
+ mPasswordManager.setBackupPassword(null, password);
+ assertThat(mPasswordManager.backupPasswordMatches(password)).isTrue();
+ }
+
+ @Test
+ public void backupPasswordMatches_isFalseForDifferentPassword() {
+ mPasswordManager.setBackupPassword(null, "shiba");
+ assertThat(mPasswordManager.backupPasswordMatches("corgi")).isFalse();
+ }
+
+ @Test
+ public void backupPasswordMatches_worksForV1HashIfVersionIsV1() throws Exception {
+ String password = "corgi\uFFFF";
+ writePasswordVersionToFile(1);
+ writeV1HashToFile(password, saltFixture());
+
+ // Reconstruct so it reloads from filesystem
+ mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom());
+
+ assertThat(mPasswordManager.backupPasswordMatches(password)).isTrue();
+ }
+
+ @Test
+ public void backupPasswordMatches_failsForV1HashIfVersionIsV2() throws Exception {
+ // The algorithms produce identical hashes except if the password contains higher-order
+ // unicode. See
+ // https://android-developers.googleblog.com/2013/12/changes-to-secretkeyfactory-api-in.html
+ String password = "corgi\uFFFF";
+ writePasswordVersionToFile(2);
+ writeV1HashToFile(password, saltFixture());
+
+ // Reconstruct so it reloads from filesystem
+ mPasswordManager = new BackupPasswordManager(mContext, mStateFolder, new SecureRandom());
+
+ assertThat(mPasswordManager.backupPasswordMatches(password)).isFalse();
+ }
+
+ @Test
+ public void backupPasswordMatches_throwsSecurityExceptionIfLacksPermission() {
+ setDoesNotHavePermission();
+
+ assertExpectException(
+ SecurityException.class,
+ /* expectedExceptionMessageRegex */ null,
+ () -> mPasswordManager.backupPasswordMatches("password123"));
+ }
+
+ @Test
+ public void setBackupPassword_persistsPasswordToFile() {
+ String password = "shiba";
+
+ mPasswordManager.setBackupPassword(null, password);
+
+ BackupPasswordManager newManager = new BackupPasswordManager(
+ mContext, mStateFolder, new SecureRandom());
+ assertThat(newManager.backupPasswordMatches(password)).isTrue();
+ }
+
+ @Test
+ public void setBackupPassword_failsIfCurrentPasswordIsWrong() {
+ String secondPassword = "second password";
+ mPasswordManager.setBackupPassword(null, "first password");
+
+ boolean result = mPasswordManager.setBackupPassword(
+ "incorrect pass", secondPassword);
+
+ BackupPasswordManager newManager = new BackupPasswordManager(
+ mContext, mStateFolder, new SecureRandom());
+ assertThat(result).isFalse();
+ assertThat(newManager.backupPasswordMatches(secondPassword)).isFalse();
+ }
+
+ @Test
+ public void setBackupPassword_throwsSecurityExceptionIfLacksPermission() {
+ setDoesNotHavePermission();
+
+ assertExpectException(
+ SecurityException.class,
+ /* expectedExceptionMessageRegex */ null,
+ () -> mPasswordManager.setBackupPassword(
+ "password123", "password111"));
+ }
+
+ private byte[] saltFixture() {
+ byte[] bytes = new byte[64];
+ for (int i = 0; i < 64; i++) {
+ bytes[i] = (byte) i;
+ }
+ return bytes;
+ }
+
+ private void setDoesNotHavePermission() {
+ doThrow(new SecurityException()).when(mContext)
+ .enforceCallingOrSelfPermission(anyString(), anyString());
+ }
+
+ private void writeV1HashToFile(String password, byte[] salt) throws Exception {
+ String hash = PasswordUtils.buildPasswordHash(
+ V1_HASH_ALGORITHM, password, salt, PasswordUtils.PBKDF2_HASH_ROUNDS);
+ writeHashAndSaltToFile(hash, salt);
+ }
+
+ private void writeHashAndSaltToFile(String hash, byte[] salt) throws Exception {
+ FileOutputStream fos = null;
+ DataOutputStream dos = null;
+
+ try {
+ File passwordHash = new File(mStateFolder, PASSWORD_HASH_FILE_NAME);
+ fos = new FileOutputStream(passwordHash);
+ dos = new DataOutputStream(fos);
+ dos.writeInt(salt.length);
+ dos.write(salt);
+ dos.writeUTF(hash);
+ dos.flush();
+ } finally {
+ if (dos != null) dos.close();
+ if (fos != null) fos.close();
+ }
+ }
+
+ private void writePasswordVersionToFile(int version) throws Exception {
+ FileOutputStream fos = null;
+ DataOutputStream dos = null;
+
+ try {
+ File passwordVersion = new File(mStateFolder, PASSWORD_VERSION_FILE_NAME);
+ fos = new FileOutputStream(passwordVersion);
+ dos = new DataOutputStream(fos);
+ dos.writeInt(version);
+ dos.flush();
+ } finally {
+ if (dos != null) dos.close();
+ if (fos != null) fos.close();
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java
new file mode 100644
index 000000000000..c27fd079bb89
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/DataChangedJournalTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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
+ */
+
+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 org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class DataChangedJournalTest {
+ private static final String GMAIL = "com.google.gmail";
+ private static final String DOCS = "com.google.docs";
+ private static final String GOOGLE_PLUS = "com.google.plus";
+
+ @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+
+ @Mock private DataChangedJournal.Consumer mConsumer;
+
+ private File mFile;
+ private DataChangedJournal mJournal;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mFile = mTemporaryFolder.newFile();
+ mJournal = new DataChangedJournal(mFile);
+ }
+
+ @Test
+ public void addPackage_addsPackagesToEndOfFile() throws Exception {
+ mJournal.addPackage(GMAIL);
+ mJournal.addPackage(DOCS);
+ mJournal.addPackage(GOOGLE_PLUS);
+
+ FileInputStream fos = new FileInputStream(mFile);
+ DataInputStream dos = new DataInputStream(fos);
+ assertThat(dos.readUTF()).isEqualTo(GMAIL);
+ assertThat(dos.readUTF()).isEqualTo(DOCS);
+ assertThat(dos.readUTF()).isEqualTo(GOOGLE_PLUS);
+ assertThat(dos.available()).isEqualTo(0);
+ }
+
+ @Test
+ public void delete_deletesTheFile() throws Exception {
+ mJournal.addPackage(GMAIL);
+
+ mJournal.delete();
+
+ assertThat(mFile.exists()).isFalse();
+ }
+
+ @Test
+ public void equals_isTrueForTheSameFile() throws Exception {
+ assertThat(mJournal.equals(new DataChangedJournal(mFile))).isTrue();
+ }
+
+ @Test
+ public void equals_isFalseForDifferentFiles() throws Exception {
+ assertThat(mJournal.equals(new DataChangedJournal(mTemporaryFolder.newFile()))).isFalse();
+ }
+
+ @Test
+ public void forEach_iteratesThroughPackagesInFileInOrder() throws Exception {
+ mJournal.addPackage(GMAIL);
+ mJournal.addPackage(DOCS);
+
+ mJournal.forEach(mConsumer);
+
+ InOrder inOrder = Mockito.inOrder(mConsumer);
+ inOrder.verify(mConsumer).accept(GMAIL);
+ inOrder.verify(mConsumer).accept(DOCS);
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ @Test
+ public void listJournals_returnsJournalsForEveryFileInDirectory() throws Exception {
+ File folder = mTemporaryFolder.newFolder();
+ DataChangedJournal.newJournal(folder);
+ DataChangedJournal.newJournal(folder);
+
+ ArrayList<DataChangedJournal> journals = DataChangedJournal.listJournals(folder);
+
+ assertThat(journals).hasSize(2);
+ }
+
+ @Test
+ public void newJournal_createsANewTemporaryFile() throws Exception {
+ File folder = mTemporaryFolder.newFolder();
+
+ DataChangedJournal.newJournal(folder);
+
+ assertThat(folder.listFiles()).hasLength(1);
+ }
+
+ @Test
+ public void toString_isSameAsFileToString() throws Exception {
+ assertThat(mJournal.toString()).isEqualTo(mFile.toString());
+ }
+}
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
new file mode 100644
index 000000000000..bfb95c1a3eda
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/DataStreamFileCodecTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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
+ */
+
+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 org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public final class DataStreamFileCodecTest {
+ @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+
+ @Test
+ public void serialize_writesToTheFile() throws Exception {
+ File unicornFile = mTemporaryFolder.newFile();
+
+ DataStreamFileCodec<MythicalCreature> mythicalCreatureCodec = new DataStreamFileCodec<>(
+ unicornFile, new MythicalCreatureDataStreamCodec());
+ MythicalCreature unicorn = new MythicalCreature(
+ 10000, "Unicorn");
+ mythicalCreatureCodec.serialize(unicorn);
+
+ DataStreamFileCodec<MythicalCreature> newCodecWithSameFile = new DataStreamFileCodec<>(
+ unicornFile, new MythicalCreatureDataStreamCodec());
+ MythicalCreature deserializedUnicorn = newCodecWithSameFile.deserialize();
+
+ assertThat(deserializedUnicorn.averageLifespanInYears)
+ .isEqualTo(unicorn.averageLifespanInYears);
+ assertThat(deserializedUnicorn.name).isEqualTo(unicorn.name);
+ }
+
+ private static class MythicalCreature {
+ int averageLifespanInYears;
+ String name;
+
+ MythicalCreature(int averageLifespanInYears, String name) {
+ this.averageLifespanInYears = averageLifespanInYears;
+ this.name = name;
+ }
+ }
+
+ private static class MythicalCreatureDataStreamCodec implements
+ DataStreamCodec<MythicalCreature> {
+ @Override
+ public void serialize(MythicalCreature mythicalCreature,
+ DataOutputStream dataOutputStream) throws IOException {
+ dataOutputStream.writeInt(mythicalCreature.averageLifespanInYears);
+ dataOutputStream.writeUTF(mythicalCreature.name);
+ }
+
+ @Override
+ public MythicalCreature deserialize(DataInputStream dataInputStream)
+ throws IOException {
+ int years = dataInputStream.readInt();
+ String name = dataInputStream.readUTF();
+ return new MythicalCreature(years, name);
+ }
+ }
+}
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
new file mode 100644
index 000000000000..db55120dc023
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/SparseArrayUtilsTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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
+ */
+
+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 com.google.android.collect.Sets;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.HashSet;
+
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class SparseArrayUtilsTest {
+ @Test
+ public void union_mergesSets() {
+ SparseArray<HashSet<String>> sparseArray = new SparseArray<>();
+ sparseArray.append(12, Sets.newHashSet("a", "b", "c"));
+ sparseArray.append(45, Sets.newHashSet("d", "e"));
+ sparseArray.append(46, Sets.newHashSet());
+ sparseArray.append(66, Sets.newHashSet("a", "e", "f"));
+
+ assertThat(SparseArrayUtils.union(sparseArray)).isEqualTo(
+ Sets.newHashSet("a", "b", "c", "d", "e", "f"));
+ }
+
+ @Test
+ public void union_returnsEmptySetForEmptyList() {
+ SparseArray<HashSet<String>> sparseArray = new SparseArray<>();
+
+ assertThat(SparseArrayUtils.union(sparseArray)).isEqualTo(Sets.newHashSet());
+ }
+}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 9c712f4c4ca2..50fab5dd784e 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1495,6 +1495,17 @@ public class CarrierConfigManager {
public static final String IMSI_KEY_EXPIRATION_DAYS_TIME_INT =
"imsi_key_expiration_days_time_int";
+ /**
+ * Key identifying if the CDMA Caller ID presentation and suppression MMI codes
+ * should be converted to 3GPP CLIR codes when a multimode (CDMA+UMTS+LTE) device is roaming
+ * on a 3GPP network. Specifically *67<number> will be converted to #31#<number> and
+ * *82<number> will be converted to *31#<number> before dialing a call when this key is
+ * set TRUE and device is roaming on a 3GPP network.
+ * @hide
+ */
+ public static final String KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL =
+ "convert_cdma_caller_id_mmi_codes_while_roaming_on_3gpp_bool";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -1745,10 +1756,10 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_DISABLE_VOICE_BARRING_NOTIFICATION_BOOL, false);
sDefaults.putInt(IMSI_KEY_EXPIRATION_DAYS_TIME_INT, IMSI_ENCRYPTION_DAYS_TIME_DISABLED);
sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null);
+ sDefaults.putBoolean(KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL,
+ false);
sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null);
sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null);
- sDefaults.putInt(IMSI_KEY_EXPIRATION_DAYS_TIME_INT, IMSI_ENCRYPTION_DAYS_TIME_DISABLED);
- sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null);
}
/**
diff --git a/telephony/java/android/telephony/MbmsDownloadManager.java b/telephony/java/android/telephony/MbmsDownloadManager.java
index 5fa6a952d709..4eeabb078a64 100644
--- a/telephony/java/android/telephony/MbmsDownloadManager.java
+++ b/telephony/java/android/telephony/MbmsDownloadManager.java
@@ -288,13 +288,11 @@ public class MbmsDownloadManager {
*
* This may throw an {@link MbmsException} containing one of the following errors:
* {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
*
* Asynchronous error codes via the {@link MbmsDownloadManagerCallback#error(int, String)}
* callback can include any of the errors except:
- * {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE}
- * {@link MbmsException#ERROR_END_OF_SESSION}
+ * {@link MbmsException.StreamingErrors#ERROR_UNABLE_TO_START_SERVICE}
*
* @param classList A list of service classes which the app wishes to receive
* {@link IMbmsDownloadManagerCallback#fileServicesUpdated(List)} callbacks
@@ -315,7 +313,7 @@ public class MbmsDownloadManager {
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService.set(null);
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
@@ -334,7 +332,7 @@ public class MbmsDownloadManager {
* Before calling this method, the app must cancel all of its pending
* {@link DownloadRequest}s via {@link #cancelDownload(DownloadRequest)}. If this is not done,
* an {@link MbmsException} will be thrown with code
- * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}
+ * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}
*
* The {@link File} supplied as a root temp file directory must already exist. If not, an
* {@link IllegalArgumentException} will be thrown.
@@ -366,7 +364,7 @@ public class MbmsDownloadManager {
}
} catch (RemoteException e) {
mService.set(null);
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
SharedPreferences prefs = mContext.getSharedPreferences(
@@ -417,29 +415,36 @@ public class MbmsDownloadManager {
downloadService.download(request, callback);
} catch (RemoteException e) {
mService.set(null);
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
/**
- * Returns a list DownloadRequests that originated from this application (UID).
- *
- * May throw a RemoteException.
- *
- * Asynchronous errors through the listener include any of the errors except
- * <li>ERROR_UNABLED_TO_START_SERVICE</li>
- * <li>ERROR_MSDC_INVALID_SERVICE_ID</li>
- * <li>ERROR_MSDC_END_OF_SESSION</li>
+ * Returns a list of pending {@link DownloadRequest}s that originated from this application.
+ * A pending request is one that was issued via
+ * {@link #download(DownloadRequest, IDownloadCallback)} but not cancelled through
+ * {@link #cancelDownload(DownloadRequest)}.
+ * @return A list, possibly empty, of {@link DownloadRequest}s
*/
- public List<DownloadRequest> listPendingDownloads() {
- return null;
+ public @NonNull List<DownloadRequest> listPendingDownloads() throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+
+ try {
+ return downloadService.listPendingDownloads(mSubscriptionId);
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
}
/**
* Attempts to cancel the specified {@link DownloadRequest}.
*
* If the middleware is not aware of the specified download request, an MbmsException will be
- * thrown with error code {@link MbmsException#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
+ * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
*
* If this method returns without throwing an exception, you may assume that cancellation
* was successful.
@@ -458,7 +463,7 @@ public class MbmsDownloadManager {
}
} catch (RemoteException e) {
mService.set(null);
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
deleteDownloadRequestToken(downloadRequest);
}
@@ -486,27 +491,43 @@ public class MbmsDownloadManager {
return downloadService.getDownloadStatus(downloadRequest, fileInfo);
} catch (RemoteException e) {
mService.set(null);
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
/**
- * Resets middleware knowledge regarding this download request.
+ * Resets the middleware's knowledge of previously-downloaded files in this download request.
*
- * This state consists of knowledge of what files have already been downloaded.
- * Normally the middleware won't download files who's hash matches previously downloaded
- * content, even if that content has since been deleted. If this function is called
- * repeated content will be downloaded again when available. This does not interrupt
- * in-progress downloads.
+ * Normally, the middleware keeps track of the hashes of downloaded files and won't re-download
+ * files whose server-reported hash matches one of the already-downloaded files. This means
+ * that if the file is accidentally deleted by the user or by the app, the middleware will
+ * not try to download it again.
+ * This method will reset the middleware's cache of hashes for the provided
+ * {@link DownloadRequest}, so that previously downloaded content will be downloaded again
+ * when available.
+ * This will not interrupt in-progress downloads.
*
- * May throw an IllegalArgumentException or RemoteException.
+ * If the middleware is not aware of the specified download request, an MbmsException will be
+ * thrown with error code {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
*
- * <li>SUCCESS</li>
- * <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li>
- * <li>ERROR_MSDC_UNKNOWN_REQUEST</li>
+ * May throw a {@link MbmsException} with error code
+ * @param downloadRequest The request to re-download files for.
*/
- public int resetDownloadKnowledge(DownloadRequest downloadRequest) {
- return 0;
+ public void resetDownloadKnowledge(DownloadRequest downloadRequest) throws MbmsException {
+ IMbmsDownloadService downloadService = mService.get();
+ if (downloadService == null) {
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND);
+ }
+
+ try {
+ int result = downloadService.resetDownloadKnowledge(downloadRequest);
+ if (result != MbmsException.SUCCESS) {
+ throw new MbmsException(result);
+ }
+ } catch (RemoteException e) {
+ mService.set(null);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ }
}
public void dispose() {
diff --git a/telephony/java/android/telephony/MbmsStreamingManager.java b/telephony/java/android/telephony/MbmsStreamingManager.java
index 8cc447e4db7a..5b3503a1b163 100644
--- a/telephony/java/android/telephony/MbmsStreamingManager.java
+++ b/telephony/java/android/telephony/MbmsStreamingManager.java
@@ -35,7 +35,10 @@ import java.util.concurrent.atomic.AtomicReference;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-/** @hide */
+/**
+ * This class provides functionality for streaming media over MBMS.
+ * @hide
+ */
public class MbmsStreamingManager {
private static final String LOG_TAG = "MbmsStreamingManager";
public static final String MBMS_STREAMING_SERVICE_ACTION =
@@ -88,6 +91,8 @@ public class MbmsStreamingManager {
/**
* Terminates this instance, ending calls to the registered listener. Also terminates
* any streaming services spawned from this instance.
+ *
+ * May throw an {@link IllegalStateException}
*/
public void dispose() {
IMbmsStreamingService streamingService = mService.get();
@@ -111,15 +116,15 @@ public class MbmsStreamingManager {
*
* Multiple calls replace the list of serviceClasses of interest.
*
- * This may throw an {@link MbmsException} containing one of the following errors:
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * This may throw an {@link MbmsException} containing any error in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors},
+ * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}.
*
- * Asynchronous error codes via the {@link MbmsStreamingManagerCallback#error(int, String)}
- * callback can include any of the errors except:
- * {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE}
- * {@link MbmsException#ERROR_END_OF_SESSION}
+ * May also throw an unchecked {@link IllegalArgumentException} or an
+ * {@link IllegalStateException}
+ *
+ * @param classList A list of streaming service classes that the app would like updates on.
*/
public void getStreamingServices(List<String> classList) throws MbmsException {
IMbmsStreamingService streamingService = mService.get();
@@ -134,7 +139,7 @@ public class MbmsStreamingManager {
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService.set(null);
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
@@ -145,14 +150,21 @@ public class MbmsStreamingManager {
* reported via
* {@link android.telephony.mbms.StreamingServiceCallback#streamStateUpdated(int, int)}
*
- * May throw an {@link MbmsException} containing any of the following error codes:
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * May throw an
+ * {@link MbmsException} containing any of the error codes in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors},
+ * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}, or
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}.
*
* May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
- * Asynchronous errors through the listener include any of the errors
+ * Asynchronous errors through the listener include any of the errors in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors} or
+ * {@link android.telephony.mbms.MbmsException.StreamingErrors}.
+ *
+ * @param serviceInfo The information about the service to stream.
+ * @param listener A listener that'll be called when something about the stream changes.
+ * @return An instance of {@link StreamingService} through which the stream can be controlled.
*/
public StreamingService startStreaming(StreamingServiceInfo serviceInfo,
StreamingServiceCallback listener) throws MbmsException {
@@ -170,7 +182,7 @@ public class MbmsStreamingManager {
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService.set(null);
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
return new StreamingService(mSubscriptionId, streamingService, serviceInfo, listener);
diff --git a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
index 8116a7f0b7c4..007aee7cf3f2 100755
--- a/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IMbmsStreamingManagerCallback.aidl
@@ -30,7 +30,5 @@ oneway interface IMbmsStreamingManagerCallback
void streamingServicesUpdated(in List<StreamingServiceInfo> services);
- void activeStreamingServicesUpdated(in List<StreamingServiceInfo> services);
-
void middlewareReady();
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
index 5b22199bea1c..ba25f663ffb4 100644
--- a/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadManagerCallback.java
@@ -55,7 +55,7 @@ public class MbmsDownloadManagerCallback extends IMbmsDownloadManagerCallback.St
* Before this method is called, calling any method on an instance of
* {@link android.telephony.MbmsDownloadManager} will result in an {@link MbmsException}
* being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * or {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY}
+ * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
*/
@Override
public void middlewareReady() {
diff --git a/telephony/java/android/telephony/mbms/MbmsException.java b/telephony/java/android/telephony/mbms/MbmsException.java
index e190623f5529..8888119f90e6 100644
--- a/telephony/java/android/telephony/mbms/MbmsException.java
+++ b/telephony/java/android/telephony/mbms/MbmsException.java
@@ -18,27 +18,112 @@ package android.telephony.mbms;
/** @hide */
public class MbmsException extends Exception {
+ /** Indicates that the operation was successful. */
public static final int SUCCESS = 0;
- public static final int ERROR_NO_SERVICE_INSTALLED = 1;
- public static final int ERROR_MULTIPLE_SERVICES_INSTALLED = 2;
- public static final int ERROR_BIND_TIMEOUT_OR_FAILURE = 3;
- public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 4;
- public static final int ERROR_ALREADY_INITIALIZED = 5;
- public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 6;
- public static final int ERROR_MIDDLEWARE_NOT_BOUND = 7;
- public static final int ERROR_UNABLE_TO_START_SERVICE = 8;
- public static final int ERROR_STREAM_ALREADY_STARTED = 9;
- public static final int ERROR_END_OF_SESSION = 10;
- public static final int ERROR_SERVICE_LOST = 11;
- public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 12;
- public static final int ERROR_IN_E911 = 13;
- public static final int ERROR_OUT_OF_MEMORY = 14;
- public static final int ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE = 15;
- public static final int ERROR_UNABLE_TO_READ_SIM = 16;
- public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 17;
- public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 18;
- public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 19;
- public static final int ERROR_UNABLE_TO_INITIALIZE = 20;
+
+ // Following errors are generated in the manager and should not be returned from the
+ // middleware
+ /**
+ * Indicates that either no MBMS middleware app is installed on the device or multiple
+ * middleware apps are installed on the device.
+ */
+ public static final int ERROR_NO_UNIQUE_MIDDLEWARE = 1;
+
+ /**
+ * Indicates that the app attempted to perform an operation on an instance of
+ * {@link android.telephony.MbmsDownloadManager} or
+ * {@link android.telephony.MbmsStreamingManager} without being bound to the middleware.
+ */
+ public static final int ERROR_MIDDLEWARE_NOT_BOUND = 2;
+
+ /** Indicates that the middleware has died and the requested operation was not completed.*/
+ public static final int ERROR_MIDDLEWARE_LOST = 3;
+
+ /**
+ * Indicates errors that may be generated during initialization by the
+ * middleware. They are applicable to both streaming and file-download use-cases.
+ */
+ public static class InitializationErrors {
+ /**
+ * Indicates that the app tried to create more than one instance each of
+ * {@link android.telephony.MbmsStreamingManager} or
+ * {@link android.telephony.MbmsDownloadManager}.
+ */
+ public static final int ERROR_DUPLICATE_INITIALIZE = 101;
+ /** Indicates that the app is not authorized to access media via MBMS.*/
+ public static final int ERROR_APP_PERMISSIONS_NOT_GRANTED = 102;
+ /** Indicates that the middleware was unable to initialize for this app. */
+ public static final int ERROR_UNABLE_TO_INITIALIZE = 103;
+ }
+
+ /**
+ * Indicates the errors that may occur at any point and are applicable to both
+ * streaming and file-download.
+ */
+ public static class GeneralErrors {
+ /**
+ * Indicates that the app attempted to perform an operation before receiving notification
+ * that the middleware is ready via {@link MbmsStreamingManagerCallback#middlewareReady()}
+ * or {@link MbmsDownloadManagerCallback#middlewareReady()}.
+ */
+ public static final int ERROR_MIDDLEWARE_NOT_YET_READY = 201;
+ /**
+ * Indicates that the middleware ran out of memory and was unable to complete the requested
+ * operation.
+ */
+ public static final int ERROR_OUT_OF_MEMORY = 202;
+ /**
+ * Indicates that the requested operation failed due to the middleware being unavailable due
+ * to a transient condition. The app may retry the operation at a later time.
+ */
+ public static final int ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE = 203;
+ /**
+ * Indicates that the requested operation was not performed due to being in emergency
+ * callback mode.
+ */
+ public static final int ERROR_IN_E911 = 204;
+ /** Indicates that MBMS is not available due to the device being in roaming. */
+ public static final int ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE = 205;
+ /** Indicates that MBMS is not available due to a SIM read error. */
+ public static final int ERROR_UNABLE_TO_READ_SIM = 206;
+ /**
+ * Indicates that MBMS is not available due to the inserted SIM being from an unsupported
+ * carrier.
+ */
+ public static final int ERROR_CARRIER_CHANGE_NOT_ALLOWED = 207;
+ }
+
+ /**
+ * Indicates the errors that are applicable only to the streaming use-case
+ */
+ public static class StreamingErrors {
+ /** Indicates that the middleware cannot start a stream due to too many ongoing streams */
+ public static final int ERROR_CONCURRENT_SERVICE_LIMIT_REACHED = 301;
+
+ /** Indicates that the middleware was unable to start the streaming service */
+ public static final int ERROR_UNABLE_TO_START_SERVICE = 302;
+
+ /**
+ * Indicates that the app called
+ * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo, StreamingServiceCallback)}
+ * more than once for the same {@link StreamingServiceInfo}.
+ */
+ public static final int ERROR_DUPLICATE_START_STREAM = 303;
+ }
+
+ /**
+ * Indicates the errors that are applicable only to the file-download use-case
+ */
+ public static class DownloadErrors {
+ /**
+ * Indicates that the app is not allowed to change the temp file root at this time due to
+ * outstanding download requests.
+ */
+ public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 401;
+
+ /** Indicates that the middleware has no record of the supplied {@link DownloadRequest}. */
+ public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402;
+ }
private final int mErrorCode;
diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
index 27d9878a1966..2e91be9acaf7 100644
--- a/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsStreamingManagerCallback.java
@@ -50,25 +50,12 @@ public class MbmsStreamingManagerCallback extends IMbmsStreamingManagerCallback.
}
/**
- * Called to indicate the active Streaming Services have changed.
- *
- * This will be caused whenever a new service starts streaming or whenever
- * MbmsStreamServiceManager.getActiveStreamingServices is called.
- *
- * @param services a list of StreamingServiceInfos. May be empty if
- * there are no active StreamingServices
- */
- public void activeStreamingServicesUpdated(List<StreamingServiceInfo> services) {
- // default implementation empty
- }
-
- /**
* Called to indicate that the middleware has been initialized and is ready.
*
* Before this method is called, calling any method on an instance of
* {@link android.telephony.MbmsStreamingManager} will result in an {@link MbmsException}
* being thrown with error code {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
- * or {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY}
+ * or {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
*/
@Override
public void middlewareReady() {
diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java
index 1e03fb9584b4..4b913f825231 100644
--- a/telephony/java/android/telephony/mbms/MbmsUtils.java
+++ b/telephony/java/android/telephony/mbms/MbmsUtils.java
@@ -22,14 +22,11 @@ import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.*;
import android.content.pm.ServiceInfo;
-import android.telephony.MbmsDownloadManager;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
/**
* @hide
@@ -78,7 +75,7 @@ public class MbmsUtils {
MbmsUtils.getMiddlewareServiceInfo(context, serviceAction);
if (mbmsServiceInfo == null) {
- throw new MbmsException(MbmsException.ERROR_NO_SERVICE_INSTALLED);
+ throw new MbmsException(MbmsException.ERROR_NO_UNIQUE_MIDDLEWARE);
}
bindIntent.setComponent(MbmsUtils.toComponentName(mbmsServiceInfo));
diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java
index 475c93aa0eb5..1a6418969a90 100644
--- a/telephony/java/android/telephony/mbms/StreamingService.java
+++ b/telephony/java/android/telephony/mbms/StreamingService.java
@@ -18,7 +18,6 @@ package android.telephony.mbms;
import android.annotation.IntDef;
import android.net.Uri;
-import android.os.DeadObjectException;
import android.os.RemoteException;
import android.telephony.mbms.vendor.IMbmsStreamingService;
import android.util.Log;
@@ -50,15 +49,42 @@ public class StreamingService {
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT,
- REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE})
+ REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE,
+ REASON_LEFT_MBMS_BROADCAST_AREA})
public @interface StreamingStateChangeReason {}
+
+ /**
+ * State changed due to a call to {@link #stopStreaming()} or
+ * {@link android.telephony.MbmsStreamingManager#startStreaming(StreamingServiceInfo, StreamingServiceCallback)}
+ */
public static final int REASON_BY_USER_REQUEST = 1;
+
+ /**
+ * State changed due to the streaming session ending at the carrier.
+ */
public static final int REASON_END_OF_SESSION = 2;
+
+ /**
+ * State changed due to a frequency conflict with another requested stream.
+ */
public static final int REASON_FREQUENCY_CONFLICT = 3;
+
+ /**
+ * State changed due to the middleware running out of memory
+ */
public static final int REASON_OUT_OF_MEMORY = 4;
+
+ /**
+ * State changed due to the device leaving the home carrier's LTE network.
+ */
public static final int REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE = 5;
/**
+ * State changed due to the device leaving the where this stream is being broadcast.
+ */
+ public static final int REASON_LEFT_MBMS_BROADCAST_AREA = 5;
+
+ /**
* The method of transmission currently used for a stream,
* reported via {@link StreamingServiceCallback#streamMethodUpdated}
*/
@@ -87,7 +113,9 @@ public class StreamingService {
* Retreive the Uri used to play this stream.
*
* This may throw a {@link MbmsException} with the error code
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ *
+ * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
* @return The {@link Uri} to pass to the streaming client.
*/
@@ -101,7 +129,7 @@ public class StreamingService {
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
@@ -115,7 +143,9 @@ public class StreamingService {
/**
* Stop streaming this service.
* This may throw a {@link MbmsException} with the error code
- * {@link MbmsException#ERROR_SERVICE_LOST}
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ *
+ * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*/
public void stopStreaming() throws MbmsException {
if (mService == null) {
@@ -127,10 +157,18 @@ public class StreamingService {
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
}
}
+ /**
+ * Disposes of this stream. Further operations on this object will fail with an
+ * {@link IllegalStateException}.
+ *
+ * This may throw a {@link MbmsException} with the error code
+ * {@link MbmsException#ERROR_MIDDLEWARE_LOST}
+ * May also throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
+ */
public void dispose() throws MbmsException {
if (mService == null) {
throw new IllegalStateException("No streaming service attached");
@@ -140,8 +178,9 @@ public class StreamingService {
mService.disposeStream(mSubscriptionId, mServiceInfo.getServiceId());
} catch (RemoteException e) {
Log.w(LOG_TAG, "Remote process died");
+ throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_LOST);
+ } finally {
mService = null;
- throw new MbmsException(MbmsException.ERROR_SERVICE_LOST);
}
}
}
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
index 06be8a011203..725d11c880b2 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl
@@ -24,7 +24,6 @@ import android.telephony.mbms.IMbmsDownloadManagerCallback;
import android.telephony.mbms.IDownloadCallback;
/**
- * The interface the opaque MbmsStreamingService will satisfy.
* @hide
*/
interface IMbmsDownloadService
@@ -43,12 +42,7 @@ interface IMbmsDownloadService
int getDownloadStatus(in DownloadRequest downloadRequest, in FileInfo fileInfo);
- /*
- * named this for 2 reasons:
- * 1 don't want 'State' here as it conflicts with 'Status' of the previous function
- * 2 want to perfect typing 'Knowledge'
- */
- void resetDownloadKnowledge(in DownloadRequest downloadRequest);
+ int resetDownloadKnowledge(in DownloadRequest downloadRequest);
void dispose(int subId);
}
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
index 1370b83857ec..04a53cbe0d00 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl
@@ -22,12 +22,11 @@ import android.telephony.mbms.IStreamingServiceCallback;
import android.telephony.mbms.StreamingServiceInfo;
/**
- * The interface the opaque MbmsStreamingService will satisfy.
* @hide
*/
interface IMbmsStreamingService
{
- int initialize(IMbmsStreamingManagerCallback listener, int subId);
+ void initialize(IMbmsStreamingManagerCallback listener, int subId);
int getStreamingServices(int subId, in List<String> serviceClasses);
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
index 305d38780ffc..8fbd4481cfc2 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java
@@ -16,6 +16,7 @@
package android.telephony.mbms.vendor;
+import android.annotation.NonNull;
import android.os.RemoteException;
import android.telephony.mbms.DownloadRequest;
import android.telephony.mbms.FileInfo;
@@ -35,7 +36,9 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
/**
* Initialize the download service for this app and subId, registering the listener.
*
- * May throw an {@link IllegalArgumentException} or a {@link SecurityException}
+ * Exceptions should not be thrown through this method -- this method is called from within a
+ * {@link android.content.ServiceConnection} defined by the framework, so apps have no way of
+ * catching them. Call {@link IMbmsDownloadManagerCallback#error(int, String)} instead.
*
* @param listener The callback to use to communicate with the app.
* @param subscriptionId The subscription ID to use.
@@ -59,9 +62,8 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
* @param serviceClasses The service classes that the app wishes to get info on. The strings
* may contain arbitrary data as negotiated between the app and the
* carrier.
- * @return One of {@link MbmsException#SUCCESS},
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY},
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
+ * @return One of {@link MbmsException#SUCCESS} or
+ * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY},
*/
@Override
public int getFileServices(int subscriptionId, List<String> serviceClasses)
@@ -76,14 +78,13 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
*
* If the calling app (as identified by the calling UID) currently has any pending download
* requests that have not been canceled, the middleware must return
- * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here.
+ * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here.
*
* @param subscriptionId The subscription id the download is operating under.
* @param rootDirectoryPath The path to the app's temp file root directory.
* @return {@link MbmsException#SUCCESS},
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY},
- * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT},
- * or {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
+ * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY} or
+ * {@link MbmsException.DownloadErrors#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}
*/
@Override
public int setTempFileRootDirectory(int subscriptionId,
@@ -109,8 +110,18 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
return 0;
}
+
+ /**
+ * Returns a list of pending {@link DownloadRequest}s that originated from the calling
+ * application, identified by its uid. A pending request is one that was issued via
+ * {@link #download(DownloadRequest, IDownloadCallback)} but not cancelled through
+ * {@link #cancelDownload(DownloadRequest)}.
+ * The middleware must return a non-null result synchronously or throw an exception
+ * inheriting from {@link RuntimeException}.
+ * @return A list, possibly empty, of {@link DownloadRequest}s
+ */
@Override
- public List<DownloadRequest> listPendingDownloads(int subscriptionId)
+ public @NonNull List<DownloadRequest> listPendingDownloads(int subscriptionId)
throws RemoteException {
return null;
}
@@ -124,23 +135,47 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {
* {@link DownloadRequest}.
* @param downloadRequest The request to cancel
* @return {@link MbmsException#SUCCESS},
- * {@link MbmsException#ERROR_UNKNOWN_DOWNLOAD_REQUEST},
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY}
+ * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST},
+ * {@link MbmsException.GeneralErrors#ERROR_MIDDLEWARE_NOT_YET_READY}
*/
@Override
public int cancelDownload(DownloadRequest downloadRequest) throws RemoteException {
return 0;
}
+ /**
+ * Gets information about the status of a file pending download.
+ *
+ * If the middleware has not yet been properly initialized or if it has no records of the
+ * file indicated by {@code fileInfo} being associated with {@code downloadRequest},
+ * {@link android.telephony.MbmsDownloadManager#STATUS_UNKNOWN} must be returned.
+ *
+ * @param downloadRequest The download request to query.
+ * @param fileInfo The particular file within the request to get information on.
+ * @return The status of the download.
+ */
@Override
public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo)
throws RemoteException {
return 0;
}
+ /**
+ * Resets the middleware's knowledge of previously-downloaded files in this download request.
+ *
+ * When this method is called, the middleware must attempt to re-download all the files
+ * specified by the {@link DownloadRequest}, even if the files have not changed on the server.
+ * In addition, current in-progress downloads must not be interrupted.
+ *
+ * If the middleware is not aware of the specified download request, return
+ * {@link MbmsException.DownloadErrors#ERROR_UNKNOWN_DOWNLOAD_REQUEST}.
+ *
+ * @param downloadRequest The request to re-download files for.
+ */
@Override
- public void resetDownloadKnowledge(DownloadRequest downloadRequest)
+ public int resetDownloadKnowledge(DownloadRequest downloadRequest)
throws RemoteException {
+ return 0;
}
/**
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
index c97e754d1dd5..f072c46171d6 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
@@ -33,16 +33,17 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub {
/**
* Initialize streaming service for this app and subId, registering the listener.
*
- * May throw an {@link IllegalArgumentException} or a {@link SecurityException}
+ * Exceptions should not be thrown through this method -- this method is called from within a
+ * {@link android.content.ServiceConnection} defined by the framework, so apps have no way of
+ * catching them. Call {@link IMbmsStreamingManagerCallback#error(int, String)} instead.
*
* @param listener The callback to use to communicate with the app.
* @param subscriptionId The subscription ID to use.
- * @return {@link MbmsException#SUCCESS} or {@link MbmsException#ERROR_ALREADY_INITIALIZED}
*/
@Override
- public int initialize(IMbmsStreamingManagerCallback listener, int subscriptionId)
+ public void initialize(IMbmsStreamingManagerCallback listener, int subscriptionId)
throws RemoteException {
- return 0;
+ return;
}
/**
@@ -59,9 +60,8 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub {
* @param serviceClasses The service classes that the app wishes to get info on. The strings
* may contain arbitrary data as negotiated between the app and the
* carrier.
- * @return One of {@link MbmsException#SUCCESS},
- * {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY},
- * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}
+ * @return {@link MbmsException#SUCCESS} or any of the errors in
+ * {@link android.telephony.mbms.MbmsException.GeneralErrors}
*/
@Override
public int getStreamingServices(int subscriptionId,
@@ -79,8 +79,7 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub {
* @param subscriptionId The subscription id to use.
* @param serviceId The ID of the streaming service that the app has requested.
* @param listener The listener object on which the app wishes to receive updates.
- * @return {@link MbmsException#SUCCESS}, {@link MbmsException#ERROR_STREAM_ALREADY_STARTED},
- * or {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE}.
+ * @return Any error in {@link android.telephony.mbms.MbmsException.GeneralErrors}
*/
@Override
public int startStreaming(int subscriptionId, String serviceId,
diff --git a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java
index d408b84109bc..6dc9ba7b621f 100644
--- a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java
+++ b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.assertTrue;
import android.app.WallpaperColors;
import android.graphics.Color;
+import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.Range;
@@ -42,7 +43,7 @@ public class TonalTest {
@Test
public void extractInto_usesFallback() {
GradientColors normal = new GradientColors();
- Tonal tonal = new Tonal();
+ Tonal tonal = new Tonal(InstrumentationRegistry.getContext());
tonal.extractInto(null, normal, new GradientColors(),
new GradientColors());
assertFalse("Should use fallback color if WallpaperColors is null.",
@@ -52,13 +53,14 @@ public class TonalTest {
@Test
public void extractInto_usesFallbackWhenTooLightOrDark() {
GradientColors normal = new GradientColors();
- Tonal tonal = new Tonal();
+ Tonal tonal = new Tonal(InstrumentationRegistry.getContext());
tonal.extractInto(new WallpaperColors(Color.valueOf(0xff000000), null, null, 0),
normal, new GradientColors(), new GradientColors());
assertTrue("Should use fallback color if WallpaperColors is too dark.",
normal.getMainColor() == Tonal.MAIN_COLOR_DARK);
- tonal.extractInto(new WallpaperColors(Color.valueOf(0xffffffff), null, null, 0),
+ tonal.extractInto(new WallpaperColors(Color.valueOf(0xffffffff), null, null,
+ WallpaperColors.HINT_SUPPORTS_DARK_TEXT),
normal, new GradientColors(), new GradientColors());
assertTrue("Should use fallback color if WallpaperColors is too light.",
normal.getMainColor() == Tonal.MAIN_COLOR_LIGHT);
@@ -89,18 +91,28 @@ public class TonalTest {
}
@Test
- public void colorRange_excludeBlacklistedColor() {
- // Creating a WallpaperColors object that contains *only* blacklisted colors
- float[] hsl = Tonal.BLACKLISTED_COLORS[0].getCenter();
+ public void configParser_dataSanity() {
+ Tonal.ConfigParser config = new Tonal.ConfigParser(InstrumentationRegistry.getContext());
+ // 1 to avoid regression where only first item would be parsed.
+ assertTrue("Tonal palettes are empty", config.getTonalPalettes().size() > 1);
+ assertTrue("Blacklisted colors are empty", config.getBlacklistedColors().size() > 1);
+ }
+
+ @Test
+ public void tonal_excludeBlacklistedColor() {
+ // Make sure that palette generation will fail.
+ Tonal tonal = new Tonal(InstrumentationRegistry.getContext());
+
+ // Creating a WallpaperColors object that contains *only* blacklisted colors.
+ float[] hsl = tonal.getBlacklistedColors().get(0).getCenter();
WallpaperColors colors = new WallpaperColors(Color.valueOf(ColorUtils.HSLToColor(hsl)),
null, null, 0);
// Make sure that palette generation will fail
- Tonal tonal = new Tonal();
GradientColors normal = new GradientColors();
tonal.extractInto(colors, normal, new GradientColors(),
new GradientColors());
- assertFalse("Cannot generate a tonal palette from blacklisted colors.",
- normal.getMainColor() == Tonal.MAIN_COLOR_LIGHT);
+ assertTrue("Cannot generate a tonal palette from blacklisted colors.",
+ normal.getMainColor() == Tonal.MAIN_COLOR_DARK);
}
}
diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java
index acf9e8f71718..a115146486a4 100644
--- a/tests/net/java/com/android/server/connectivity/TetheringTest.java
+++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java
@@ -178,6 +178,7 @@ public class TetheringTest {
mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager,
mLooper.getLooper(), mSystemProperties,
mTetheringDependencies);
+ verify(mNMService).registerTetheringStatsProvider(any(), anyString());
}
@After
diff --git a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java
index 0e4a36ccfc7e..dcb9723fa5e2 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java
@@ -16,26 +16,38 @@
package com.android.server.connectivity.tethering;
+import static android.net.NetworkStats.SET_DEFAULT;
+import static android.net.NetworkStats.TAG_NONE;
+import static android.net.TrafficStats.UID_TETHERING;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;
+import static com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.net.ITetheringStatsProvider;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
+import android.net.NetworkStats;
import android.net.RouteInfo;
import android.net.util.SharedLog;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.INetworkManagementService;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
@@ -66,11 +78,14 @@ public class OffloadControllerTest {
@Mock private OffloadHardwareInterface mHardware;
@Mock private ApplicationInfo mApplicationInfo;
@Mock private Context mContext;
+ @Mock private INetworkManagementService mNMService;
private final ArgumentCaptor<ArrayList> mStringArrayCaptor =
ArgumentCaptor.forClass(ArrayList.class);
+ private final ArgumentCaptor<ITetheringStatsProvider.Stub> mTetherStatsProviderCaptor =
+ ArgumentCaptor.forClass(ITetheringStatsProvider.Stub.class);
private MockContentResolver mContentResolver;
- @Before public void setUp() throws Exception {
+ @Before public void setUp() {
MockitoAnnotations.initMocks(this);
when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
when(mContext.getPackageName()).thenReturn("OffloadControllerTest");
@@ -88,14 +103,23 @@ public class OffloadControllerTest {
when(mHardware.initOffloadConfig()).thenReturn(true);
when(mHardware.initOffloadControl(any(OffloadHardwareInterface.ControlCallback.class)))
.thenReturn(true);
+ when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats());
}
private void enableOffload() {
Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
}
+ private OffloadController makeOffloadController() throws Exception {
+ OffloadController offload = new OffloadController(new Handler(Looper.getMainLooper()),
+ mHardware, mContentResolver, mNMService, new SharedLog("test"));
+ verify(mNMService).registerTetheringStatsProvider(
+ mTetherStatsProviderCaptor.capture(), anyString());
+ return offload;
+ }
+
@Test
- public void testNoSettingsValueDefaultDisabledDoesNotStart() {
+ public void testNoSettingsValueDefaultDisabledDoesNotStart() throws Exception {
setupFunctioningHardwareInterface();
when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(1);
try {
@@ -103,8 +127,7 @@ public class OffloadControllerTest {
fail();
} catch (SettingNotFoundException expected) {}
- final OffloadController offload =
- new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
+ final OffloadController offload = makeOffloadController();
offload.start();
final InOrder inOrder = inOrder(mHardware);
@@ -116,7 +139,7 @@ public class OffloadControllerTest {
}
@Test
- public void testNoSettingsValueDefaultEnabledDoesStart() {
+ public void testNoSettingsValueDefaultEnabledDoesStart() throws Exception {
setupFunctioningHardwareInterface();
when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(0);
try {
@@ -124,8 +147,7 @@ public class OffloadControllerTest {
fail();
} catch (SettingNotFoundException expected) {}
- final OffloadController offload =
- new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
+ final OffloadController offload = makeOffloadController();
offload.start();
final InOrder inOrder = inOrder(mHardware);
@@ -137,12 +159,11 @@ public class OffloadControllerTest {
}
@Test
- public void testSettingsAllowsStart() {
+ public void testSettingsAllowsStart() throws Exception {
setupFunctioningHardwareInterface();
Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0);
- final OffloadController offload =
- new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
+ final OffloadController offload = makeOffloadController();
offload.start();
final InOrder inOrder = inOrder(mHardware);
@@ -154,12 +175,11 @@ public class OffloadControllerTest {
}
@Test
- public void testSettingsDisablesStart() {
+ public void testSettingsDisablesStart() throws Exception {
setupFunctioningHardwareInterface();
Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1);
- final OffloadController offload =
- new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
+ final OffloadController offload = makeOffloadController();
offload.start();
final InOrder inOrder = inOrder(mHardware);
@@ -174,8 +194,7 @@ public class OffloadControllerTest {
setupFunctioningHardwareInterface();
enableOffload();
- final OffloadController offload =
- new OffloadController(null, mHardware, mContentResolver, new SharedLog("test"));
+ final OffloadController offload = makeOffloadController();
offload.start();
final InOrder inOrder = inOrder(mHardware);
@@ -240,6 +259,7 @@ public class OffloadControllerTest {
inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
eq(testIfName), eq(ipv4Addr), eq(null), eq(null));
+ inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
inOrder.verifyNoMoreInteractions();
final String ipv4Gateway = "192.0.2.1";
@@ -249,6 +269,7 @@ public class OffloadControllerTest {
inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null));
+ inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
inOrder.verifyNoMoreInteractions();
final String ipv6Gw1 = "fe80::cafe";
@@ -258,6 +279,7 @@ public class OffloadControllerTest {
inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
+ inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
ArrayList<String> v6gws = mStringArrayCaptor.getValue();
assertEquals(1, v6gws.size());
assertTrue(v6gws.contains(ipv6Gw1));
@@ -270,6 +292,7 @@ public class OffloadControllerTest {
inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
+ inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
v6gws = mStringArrayCaptor.getValue();
assertEquals(2, v6gws.size());
assertTrue(v6gws.contains(ipv6Gw1));
@@ -287,6 +310,7 @@ public class OffloadControllerTest {
inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture());
inOrder.verify(mHardware, times(1)).setUpstreamParameters(
eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture());
+ inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
v6gws = mStringArrayCaptor.getValue();
assertEquals(2, v6gws.size());
assertTrue(v6gws.contains(ipv6Gw1));
@@ -321,6 +345,7 @@ public class OffloadControllerTest {
assertEquals(2, v6gws.size());
assertTrue(v6gws.contains(ipv6Gw1));
assertTrue(v6gws.contains(ipv6Gw2));
+ inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName));
inOrder.verifyNoMoreInteractions();
// Completely identical LinkProperties updates are de-duped.
@@ -331,4 +356,65 @@ public class OffloadControllerTest {
anyObject(), anyObject(), anyObject(), anyObject());
inOrder.verifyNoMoreInteractions();
}
+
+ private void assertNetworkStats(String iface, ForwardedStats stats, NetworkStats.Entry entry) {
+ assertEquals(iface, entry.iface);
+ assertEquals(stats.rxBytes, entry.rxBytes);
+ assertEquals(stats.txBytes, entry.txBytes);
+ assertEquals(SET_DEFAULT, entry.set);
+ assertEquals(TAG_NONE, entry.tag);
+ assertEquals(UID_TETHERING, entry.uid);
+ }
+
+ @Test
+ public void testGetForwardedStats() throws Exception {
+ setupFunctioningHardwareInterface();
+ enableOffload();
+
+ final OffloadController offload = makeOffloadController();
+ offload.start();
+
+ final String ethernetIface = "eth1";
+ final String mobileIface = "rmnet_data0";
+
+ ForwardedStats ethernetStats = new ForwardedStats();
+ ethernetStats.rxBytes = 12345;
+ ethernetStats.txBytes = 54321;
+
+ ForwardedStats mobileStats = new ForwardedStats();
+ mobileStats.rxBytes = 999;
+ mobileStats.txBytes = 99999;
+
+ when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(ethernetStats);
+ when(mHardware.getForwardedStats(eq(mobileIface))).thenReturn(mobileStats);
+
+ final LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(ethernetIface);
+ offload.setUpstreamLinkProperties(lp);
+
+ lp.setInterfaceName(mobileIface);
+ offload.setUpstreamLinkProperties(lp);
+
+ lp.setInterfaceName(ethernetIface);
+ offload.setUpstreamLinkProperties(lp);
+
+ ethernetStats.rxBytes = 100000;
+ ethernetStats.txBytes = 100000;
+ offload.setUpstreamLinkProperties(null);
+
+ NetworkStats stats = mTetherStatsProviderCaptor.getValue().getTetherStats();
+ assertEquals(2, stats.size());
+
+ NetworkStats.Entry entry = null;
+ int ethernetPosition = ethernetIface.equals(stats.getValues(0, entry).iface) ? 0 : 1;
+ int mobilePosition = 1 - ethernetPosition;
+
+ entry = stats.getValues(mobilePosition, entry);
+ assertNetworkStats(mobileIface, mobileStats, entry);
+
+ ethernetStats.rxBytes = 12345 + 100000;
+ ethernetStats.txBytes = 54321 + 100000;
+ entry = stats.getValues(ethernetPosition, entry);
+ assertNetworkStats(ethernetIface, ethernetStats, entry);
+ }
}