release-request-fca2b5ac-03eb-4055-a549-b4fc2b292b64-for-git_oc-release-4049993 snap-temp-L04900000068539456

Change-Id: I9c94bb2a747e4b98290b3406832591e34376b3d8
diff --git a/api/removed.txt b/api/removed.txt
index 9baafeb..49b72e15 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -72,7 +72,6 @@
     method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
     method public deprecated java.lang.String getDeviceInitializerApp();
     method public deprecated android.content.ComponentName getDeviceInitializerComponent();
-    method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
   }
 
 }
diff --git a/api/system-removed.txt b/api/system-removed.txt
index b1a29e7..48f62b1 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -70,7 +70,6 @@
   public class DevicePolicyManager {
     method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
     method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
-    method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
   }
 
 }
diff --git a/api/test-current.txt b/api/test-current.txt
index d3cb4c9..cf119d1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -45743,6 +45743,7 @@
     method public boolean isAttachedToWindow();
     method public boolean isClickable();
     method public boolean isContextClickable();
+    method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
     method public boolean isDirty();
     method public boolean isDrawingCacheEnabled();
     method public boolean isDuplicateParentStateEnabled();
diff --git a/api/test-removed.txt b/api/test-removed.txt
index 9baafeb..49b72e15 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -72,7 +72,6 @@
     method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
     method public deprecated java.lang.String getDeviceInitializerApp();
     method public deprecated android.content.ComponentName getDeviceInitializerComponent();
-    method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
   }
 
 }
diff --git a/cmds/idmap/create.cpp b/cmds/idmap/create.cpp
index c13d318..524db14 100644
--- a/cmds/idmap/create.cpp
+++ b/cmds/idmap/create.cpp
@@ -221,3 +221,9 @@
     return create_and_write_idmap(target_apk_path, overlay_apk_path, fd, true) == 0 ?
         EXIT_SUCCESS : EXIT_FAILURE;
 }
+
+int idmap_verify_fd(const char *target_apk_path, const char *overlay_apk_path, int fd)
+{
+    return !is_idmap_stale_fd(target_apk_path, overlay_apk_path, fd) ?
+            EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/cmds/idmap/idmap.cpp b/cmds/idmap/idmap.cpp
index 3a237ff..8f86ed8 100644
--- a/cmds/idmap/idmap.cpp
+++ b/cmds/idmap/idmap.cpp
@@ -16,6 +16,7 @@
       idmap --scan target-package-name-to-look-for path-to-target-apk dir-to-hold-idmaps \\\
                    dir-to-scan [additional-dir-to-scan [additional-dir-to-scan [...]]]\n\
       idmap --inspect idmap \n\
+      idmap --verify target overlay fd \n\
 \n\
 DESCRIPTION \n\
       Idmap files play an integral part in the runtime resource overlay framework. An idmap \n\
@@ -57,6 +58,9 @@
       --inspect: decode the binary format of 'idmap' (path) and display the contents in a \n\
                  debug-friendly format. \n\
 \n\
+      --verify: verify if idmap corresponding to file descriptor 'fd' (integer) is made from \n\
+                target package 'target' (path to apk) and overlay package 'overlay'. \n\
+\n\
 EXAMPLES \n\
       Create an idmap file: \n\
 \n\
@@ -167,6 +171,29 @@
         return idmap_create_path(target_apk_path, overlay_apk_path, idmap_path);
     }
 
+    int maybe_verify_fd(const char *target_apk_path, const char *overlay_apk_path,
+            const char *idmap_str)
+    {
+        char *endptr;
+        int idmap_fd = strtol(idmap_str, &endptr, 10);
+        if (*endptr != '\0') {
+            fprintf(stderr, "error: failed to parse file descriptor argument %s\n", idmap_str);
+            return -1;
+        }
+
+        if (!verify_file_readable(target_apk_path)) {
+            ALOGD("error: failed to read apk %s: %s\n", target_apk_path, strerror(errno));
+            return -1;
+        }
+
+        if (!verify_file_readable(overlay_apk_path)) {
+            ALOGD("error: failed to read apk %s: %s\n", overlay_apk_path, strerror(errno));
+            return -1;
+        }
+
+        return idmap_verify_fd(target_apk_path, overlay_apk_path, idmap_fd);
+    }
+
     int maybe_scan(const char *target_package_name, const char *target_apk_path,
             const char *idmap_dir, const android::Vector<const char *> *overlay_dirs)
     {
@@ -235,6 +262,10 @@
         return maybe_create_path(argv[2], argv[3], argv[4]);
     }
 
+    if (argc == 5 && !strcmp(argv[1], "--verify")) {
+        return maybe_verify_fd(argv[2], argv[3], argv[4]);
+    }
+
     if (argc >= 6 && !strcmp(argv[1], "--scan")) {
         android::Vector<const char *> v;
         for (int i = 5; i < argc; i++) {
diff --git a/cmds/idmap/idmap.h b/cmds/idmap/idmap.h
index 8d4210b..5962108 100644
--- a/cmds/idmap/idmap.h
+++ b/cmds/idmap/idmap.h
@@ -25,6 +25,8 @@
 
 int idmap_create_fd(const char *target_apk_path, const char *overlay_apk_path, int fd);
 
+int idmap_verify_fd(const char *target_apk_path, const char *overlay_apk_path, int fd);
+
 // Regarding target_package_name: the idmap_scan implementation should
 // be able to extract this from the manifest in target_apk_path,
 // simplifying the external API.
diff --git a/compiled-classes-phone b/compiled-classes-phone
index 1a19b2c..cf4b28b 100644
--- a/compiled-classes-phone
+++ b/compiled-classes-phone
@@ -144,17 +144,19 @@
 android.animation.TypeEvaluator
 android.animation.ValueAnimator
 android.animation.ValueAnimator$AnimatorUpdateListener
-android.app.-$Lambda$36$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$39$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$57$vZ1qb742P9hE4drBY-TrOZB_qKo
-android.app.-$Lambda$7$u_rp3dnwvfyMTggc6hVftcuYJ3E
-android.app.-$Lambda$71$3eJ3p8XnIxdVOnT82Ns3R0V5ZQE
-android.app.-$Lambda$76$3eJ3p8XnIxdVOnT82Ns3R0V5ZQE
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU$1
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$1
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$2
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$3
+android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI$1
+android.app.-$Lambda$vZ1qb742P9hE4drBY-TrOZB_qKo
+android.app.-$Lambda$w9bG0NLfK6B6UpQKzQS6S1ayAh0
+android.app.-$Lambda$w9bG0NLfK6B6UpQKzQS6S1ayAh0$1
 android.app.ActionBar
 android.app.ActionBar$LayoutParams
-android.app.ActionBar$OnMenuVisibilityListener
-android.app.ActionBar$Tab
-android.app.ActionBar$TabListener
 android.app.Activity
 android.app.Activity$HostCallbacks
 android.app.ActivityManager
@@ -163,6 +165,7 @@
 android.app.ActivityManager$MemoryInfo
 android.app.ActivityManager$MemoryInfo$1
 android.app.ActivityManager$OnUidImportanceListener
+android.app.ActivityManager$ProcessErrorStateInfo
 android.app.ActivityManager$RecentTaskInfo
 android.app.ActivityManager$RecentTaskInfo$1
 android.app.ActivityManager$RunningAppProcessInfo
@@ -185,12 +188,13 @@
 android.app.ActivityManagerInternal
 android.app.ActivityManagerInternal$SleepToken
 android.app.ActivityOptions
+android.app.ActivityOptions$1
+android.app.ActivityOptions$1$1
 android.app.ActivityOptions$OnAnimationFinishedListener
 android.app.ActivityOptions$OnAnimationStartedListener
 android.app.ActivityThread
 android.app.ActivityThread$1
 android.app.ActivityThread$2
-android.app.ActivityThread$3
 android.app.ActivityThread$ActivityClientRecord
 android.app.ActivityThread$ActivityConfigChangeData
 android.app.ActivityThread$AppBindData
@@ -199,7 +203,6 @@
 android.app.ActivityThread$ContextCleanupInfo
 android.app.ActivityThread$CreateServiceData
 android.app.ActivityThread$DropBoxReporter
-android.app.ActivityThread$DumpComponentInfo
 android.app.ActivityThread$EventLoggingReporter
 android.app.ActivityThread$GcIdler
 android.app.ActivityThread$H
@@ -214,8 +217,12 @@
 android.app.ActivityThread$ResultData
 android.app.ActivityThread$ServiceArgsData
 android.app.ActivityThread$StopInfo
+android.app.ActivityTransitionCoordinator
+android.app.ActivityTransitionCoordinator$ContinueTransitionListener
+android.app.ActivityTransitionCoordinator$FixedEpicenterCallback
+android.app.ActivityTransitionCoordinator$GhostViewListeners
+android.app.ActivityTransitionCoordinator$SharedElementOriginalState
 android.app.ActivityTransitionState
-android.app.AlarmManager
 android.app.AlarmManager$AlarmClockInfo
 android.app.AlarmManager$ListenerWrapper
 android.app.AlarmManager$OnAlarmListener
@@ -233,8 +240,10 @@
 android.app.Application
 android.app.Application$ActivityLifecycleCallbacks
 android.app.ApplicationErrorReport
+android.app.ApplicationErrorReport$AnrInfo
 android.app.ApplicationErrorReport$CrashInfo
 android.app.ApplicationErrorReport$ParcelableCrashInfo
+android.app.ApplicationErrorReport$ParcelableCrashInfo$1
 android.app.ApplicationLoaders
 android.app.ApplicationPackageManager
 android.app.ApplicationPackageManager$MoveCallbackDelegate
@@ -248,20 +257,28 @@
 android.app.ContentProviderHolder$1
 android.app.ContextImpl
 android.app.ContextImpl$ApplicationContentResolver
-android.app.DatePickerDialog
 android.app.DatePickerDialog$OnDateSetListener
+android.app.DexLoadReporter
 android.app.Dialog
 android.app.Dialog$ListenersHandler
 android.app.DialogFragment
 android.app.DownloadManager
 android.app.DownloadManager$CursorTranslator
 android.app.DownloadManager$Query
-android.app.DownloadManager$Request
+android.app.EnterTransitionCoordinator
+android.app.EnterTransitionCoordinator$1
+android.app.EnterTransitionCoordinator$2
+android.app.EnterTransitionCoordinator$3
+android.app.EnterTransitionCoordinator$4
+android.app.EnterTransitionCoordinator$5
+android.app.EnterTransitionCoordinator$6
+android.app.ExitTransitionCoordinator
+android.app.ExitTransitionCoordinator$10
+android.app.ExitTransitionCoordinator$3
+android.app.ExitTransitionCoordinator$9
 android.app.Fragment
 android.app.Fragment$1
 android.app.Fragment$AnimationInfo
-android.app.Fragment$OnStartEnterTransitionListener
-android.app.Fragment$SavedState
 android.app.FragmentContainer
 android.app.FragmentController
 android.app.FragmentHostCallback
@@ -271,20 +288,14 @@
 android.app.FragmentManager$OnBackStackChangedListener
 android.app.FragmentManagerImpl
 android.app.FragmentManagerImpl$1
-android.app.FragmentManagerImpl$2
 android.app.FragmentManagerImpl$AnimateOnHWLayerIfNeededListener
 android.app.FragmentManagerImpl$OpGenerator
-android.app.FragmentManagerImpl$PopBackStackState
-android.app.FragmentManagerImpl$StartEnterTransitionListener
 android.app.FragmentManagerState
 android.app.FragmentManagerState$1
 android.app.FragmentState
 android.app.FragmentState$1
 android.app.FragmentTransaction
 android.app.FragmentTransition
-android.app.FragmentTransition$3
-android.app.FragmentTransition$4
-android.app.FragmentTransition$5
 android.app.FragmentTransition$FragmentContainerTransition
 android.app.IActivityContainer
 android.app.IActivityContainer$Stub
@@ -295,8 +306,10 @@
 android.app.IActivityManager$Stub$Proxy
 android.app.IAlarmCompleteListener
 android.app.IAlarmCompleteListener$Stub
+android.app.IAlarmCompleteListener$Stub$Proxy
 android.app.IAlarmListener
 android.app.IAlarmListener$Stub
+android.app.IAlarmListener$Stub$Proxy
 android.app.IAlarmManager
 android.app.IAlarmManager$Stub
 android.app.IAlarmManager$Stub$Proxy
@@ -306,6 +319,9 @@
 android.app.IApplicationThread
 android.app.IApplicationThread$Stub
 android.app.IApplicationThread$Stub$Proxy
+android.app.IInstantAppResolver
+android.app.IInstantAppResolver$Stub
+android.app.IInstantAppResolver$Stub$Proxy
 android.app.IInstrumentationWatcher
 android.app.IInstrumentationWatcher$Stub
 android.app.INotificationManager
@@ -334,6 +350,7 @@
 android.app.IUiModeManager$Stub$Proxy
 android.app.IUidObserver
 android.app.IUidObserver$Stub
+android.app.IUidObserver$Stub$Proxy
 android.app.IUserSwitchObserver
 android.app.IUserSwitchObserver$Stub
 android.app.IUserSwitchObserver$Stub$Proxy
@@ -343,6 +360,10 @@
 android.app.IWallpaperManagerCallback
 android.app.IWallpaperManagerCallback$Stub
 android.app.IWallpaperManagerCallback$Stub$Proxy
+android.app.InstantAppResolverService
+android.app.InstantAppResolverService$1
+android.app.InstantAppResolverService$InstantAppResolutionCallback
+android.app.InstantAppResolverService$ServiceHandler
 android.app.Instrumentation
 android.app.IntentReceiverLeaked
 android.app.IntentService
@@ -354,7 +375,6 @@
 android.app.ListFragment$1
 android.app.ListFragment$2
 android.app.LoadedApk
-android.app.LoadedApk$DexLoadReporter
 android.app.LoadedApk$ReceiverDispatcher
 android.app.LoadedApk$ReceiverDispatcher$Args
 android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
@@ -384,25 +404,29 @@
 android.app.Notification$InboxStyle
 android.app.Notification$MediaStyle
 android.app.Notification$MessagingStyle
-android.app.Notification$MessagingStyle$Message
 android.app.Notification$StandardTemplateParams
 android.app.Notification$Style
+android.app.Notification$TvExtender
 android.app.Notification$WearableExtender
 android.app.NotificationChannel
 android.app.NotificationChannel$1
+android.app.NotificationChannelGroup
+android.app.NotificationChannelGroup$1
 android.app.NotificationManager
 android.app.NotificationManager$Policy
 android.app.NotificationManager$Policy$1
 android.app.OnActivityPausedListener
+android.app.PackageInstallObserver
+android.app.PackageInstallObserver$1
 android.app.PendingIntent
 android.app.PendingIntent$1
 android.app.PendingIntent$CanceledException
 android.app.PendingIntent$FinishedDispatcher
 android.app.PendingIntent$OnFinished
 android.app.PendingIntent$OnMarshaledListener
-android.app.PictureInPictureArgs
-android.app.PictureInPictureArgs$1
-android.app.Presentation
+android.app.PictureInPictureParams
+android.app.PictureInPictureParams$1
+android.app.PictureInPictureParams$Builder
 android.app.ProfilerInfo
 android.app.ProgressDialog
 android.app.QueuedWork
@@ -410,24 +434,23 @@
 android.app.ReceiverRestrictedContext
 android.app.RemoteAction
 android.app.RemoteAction$1
-android.app.RemoteAction$2
-android.app.RemoteAction$OnActionListener
 android.app.RemoteInput
 android.app.RemoteInput$1
-android.app.RemoteInput$Builder
 android.app.ResourcesManager
 android.app.ResourcesManager$1
 android.app.ResourcesManager$ActivityResources
 android.app.ResultInfo
 android.app.ResultInfo$1
 android.app.RetailDemoModeServiceInternal
-android.app.SearchManager
 android.app.SearchableInfo
 android.app.SearchableInfo$1
 android.app.Service
 android.app.ServiceConnectionLeaked
+android.app.ServiceStartArgs
+android.app.ServiceStartArgs$1
 android.app.SharedElementCallback
 android.app.SharedElementCallback$1
+android.app.SharedElementCallback$OnSharedElementsReadyListener
 android.app.SharedPreferencesImpl
 android.app.SharedPreferencesImpl$1
 android.app.SharedPreferencesImpl$2
@@ -517,22 +540,27 @@
 android.app.SystemServiceRegistry$78
 android.app.SystemServiceRegistry$79
 android.app.SystemServiceRegistry$8
+android.app.SystemServiceRegistry$80
+android.app.SystemServiceRegistry$81
+android.app.SystemServiceRegistry$82
 android.app.SystemServiceRegistry$9
 android.app.SystemServiceRegistry$CachedServiceFetcher
 android.app.SystemServiceRegistry$ServiceFetcher
 android.app.SystemServiceRegistry$StaticApplicationContextServiceFetcher
 android.app.SystemServiceRegistry$StaticServiceFetcher
-android.app.TaskStackBuilder
 android.app.TaskStackListener
 android.app.TimePickerDialog$OnTimeSetListener
 android.app.UiModeManager
 android.app.UserSwitchObserver
-android.app.VoiceInteractor$PickOptionRequest$Option
+android.app.Vr2dDisplayProperties
+android.app.VrManager
 android.app.WaitResult
 android.app.WallpaperInfo
-android.app.WallpaperInfo$1
 android.app.WallpaperManager
 android.app.WallpaperManager$Globals
+android.app.admin.DeviceAdminInfo
+android.app.admin.DeviceAdminInfo$1
+android.app.admin.DeviceAdminInfo$PolicyInfo
 android.app.admin.DevicePolicyManager
 android.app.admin.DevicePolicyManagerInternal
 android.app.admin.DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener
@@ -549,9 +577,9 @@
 android.app.admin.SystemUpdatePolicy
 android.app.admin.SystemUpdatePolicy$1
 android.app.assist.AssistContent
-android.app.assist.AssistContent$1
 android.app.assist.AssistStructure
 android.app.assist.AssistStructure$1
+android.app.assist.AssistStructure$AutofillOverlay
 android.app.assist.AssistStructure$ParcelTransferReader
 android.app.assist.AssistStructure$ParcelTransferWriter
 android.app.assist.AssistStructure$SendChannel
@@ -577,13 +605,13 @@
 android.app.backup.IBackupManager
 android.app.backup.IBackupManager$Stub
 android.app.backup.IBackupManager$Stub$Proxy
+android.app.backup.IBackupManagerMonitor
 android.app.backup.IBackupObserver
 android.app.backup.IFullBackupRestoreObserver
 android.app.backup.IRestoreSession
 android.app.backup.ISelectBackupTransportCallback
 android.app.backup.RestoreDescription
 android.app.backup.RestoreSet
-android.app.backup.SharedPreferencesBackupHelper
 android.app.job.IJobCallback
 android.app.job.IJobCallback$Stub
 android.app.job.IJobCallback$Stub$Proxy
@@ -602,8 +630,11 @@
 android.app.job.JobParameters$1
 android.app.job.JobScheduler
 android.app.job.JobService
-android.app.job.JobService$JobHandler
-android.app.job.JobService$JobInterface
+android.app.job.JobService$1
+android.app.job.JobServiceEngine
+android.app.job.JobServiceEngine$JobHandler
+android.app.job.JobServiceEngine$JobInterface
+android.app.job.JobWorkItem
 android.app.trust.IStrongAuthTracker
 android.app.trust.IStrongAuthTracker$Stub
 android.app.trust.IStrongAuthTracker$Stub$Proxy
@@ -617,9 +648,15 @@
 android.app.trust.TrustManager$1
 android.app.trust.TrustManager$2
 android.app.trust.TrustManager$TrustListener
+android.app.usage.CacheQuotaHint
+android.app.usage.CacheQuotaHint$1
+android.app.usage.CacheQuotaHint$Builder
 android.app.usage.ConfigurationStats
 android.app.usage.ConfigurationStats$1
 android.app.usage.ExternalStorageStats
+android.app.usage.ICacheQuotaService
+android.app.usage.ICacheQuotaService$Stub
+android.app.usage.ICacheQuotaService$Stub$Proxy
 android.app.usage.IStorageStatsManager
 android.app.usage.IStorageStatsManager$Stub
 android.app.usage.IUsageStatsManager
@@ -642,26 +679,29 @@
 android.appwidget.AppWidgetHost$UpdateHandler
 android.appwidget.AppWidgetHostView
 android.appwidget.AppWidgetHostView$1
+android.appwidget.AppWidgetHostView$ParcelableSparseArray
+android.appwidget.AppWidgetHostView$ParcelableSparseArray$1
 android.appwidget.AppWidgetManager
 android.appwidget.AppWidgetProvider
 android.appwidget.AppWidgetProviderInfo
 android.appwidget.AppWidgetProviderInfo$1
+android.appwidget.PendingHostUpdate
+android.appwidget.PendingHostUpdate$1
 android.bluetooth.BluetoothA2dp
 android.bluetooth.BluetoothA2dp$1
 android.bluetooth.BluetoothA2dp$2
 android.bluetooth.BluetoothActivityEnergyInfo
-android.bluetooth.BluetoothActivityEnergyInfo$1
 android.bluetooth.BluetoothAdapter
 android.bluetooth.BluetoothAdapter$1
-android.bluetooth.BluetoothClass
-android.bluetooth.BluetoothClass$1
+android.bluetooth.BluetoothAdapter$BluetoothStateChangeCallback
 android.bluetooth.BluetoothCodecConfig
 android.bluetooth.BluetoothCodecConfig$1
 android.bluetooth.BluetoothCodecStatus
-android.bluetooth.BluetoothCodecStatus$1
 android.bluetooth.BluetoothDevice
 android.bluetooth.BluetoothDevice$1
 android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothGatt
+android.bluetooth.BluetoothGattCallback
 android.bluetooth.BluetoothGattCharacteristic
 android.bluetooth.BluetoothGattDescriptor
 android.bluetooth.BluetoothGattService
@@ -742,25 +782,21 @@
 android.bluetooth.IBluetoothStateChangeCallback$Stub
 android.bluetooth.IBluetoothStateChangeCallback$Stub$Proxy
 android.bluetooth.OobData
-android.bluetooth.SdpMasRecord
-android.bluetooth.SdpMnsRecord
-android.bluetooth.SdpOppOpsRecord
-android.bluetooth.SdpPseRecord
-android.bluetooth.SdpRecord
-android.bluetooth.SdpSapsRecord
 android.bluetooth.UidTraffic
 android.bluetooth.UidTraffic$1
 android.bluetooth.le.AdvertiseData
-android.bluetooth.le.AdvertiseSettings
+android.bluetooth.le.AdvertisingSetParameters
+android.bluetooth.le.BluetoothLeAdvertiser
 android.bluetooth.le.BluetoothLeScanner
 android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper
 android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1
-android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$2
 android.bluetooth.le.BluetoothLeUtils
-android.bluetooth.le.IAdvertiserCallback
+android.bluetooth.le.IAdvertisingSetCallback
+android.bluetooth.le.IPeriodicAdvertisingCallback
 android.bluetooth.le.IScannerCallback
 android.bluetooth.le.IScannerCallback$Stub
 android.bluetooth.le.IScannerCallback$Stub$Proxy
+android.bluetooth.le.PeriodicAdvertisingParameters
 android.bluetooth.le.ScanCallback
 android.bluetooth.le.ScanFilter
 android.bluetooth.le.ScanFilter$1
@@ -771,6 +807,11 @@
 android.bluetooth.le.ScanSettings
 android.bluetooth.le.ScanSettings$1
 android.bluetooth.le.ScanSettings$Builder
+android.companion.AssociationRequest
+android.companion.CompanionDeviceManager
+android.companion.ICompanionDeviceManager
+android.companion.ICompanionDeviceManager$Stub
+android.companion.IFindDeviceCallback
 android.content.AbstractThreadedSyncAdapter
 android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
 android.content.AbstractThreadedSyncAdapter$SyncThread
@@ -812,14 +853,12 @@
 android.content.ContentResolver
 android.content.ContentResolver$1
 android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$OpenResourceIdResult
 android.content.ContentResolver$ParcelFileDescriptorInner
 android.content.ContentUris
 android.content.ContentValues
 android.content.ContentValues$1
 android.content.Context
 android.content.ContextWrapper
-android.content.CursorEntityIterator
 android.content.CursorLoader
 android.content.DialogInterface
 android.content.DialogInterface$OnCancelListener
@@ -828,9 +867,6 @@
 android.content.DialogInterface$OnKeyListener
 android.content.DialogInterface$OnMultiChoiceClickListener
 android.content.DialogInterface$OnShowListener
-android.content.Entity
-android.content.Entity$NamedContentValues
-android.content.EntityIterator
 android.content.IClipboard
 android.content.IClipboard$Stub
 android.content.IClipboard$Stub$Proxy
@@ -846,7 +882,6 @@
 android.content.IIntentSender$Stub$Proxy
 android.content.IOnPrimaryClipChangedListener
 android.content.IOnPrimaryClipChangedListener$Stub
-android.content.IOnPrimaryClipChangedListener$Stub$Proxy
 android.content.IRestrictionsManager
 android.content.IRestrictionsManager$Stub
 android.content.IRestrictionsManager$Stub$Proxy
@@ -862,17 +897,19 @@
 android.content.Intent
 android.content.Intent$1
 android.content.Intent$FilterComparison
+android.content.Intent$ShortcutIconResource
+android.content.Intent$ShortcutIconResource$1
 android.content.IntentFilter
 android.content.IntentFilter$1
 android.content.IntentFilter$AuthorityEntry
 android.content.IntentFilter$MalformedMimeTypeException
 android.content.IntentSender
+android.content.IntentSender$1
 android.content.IntentSender$SendIntentException
 android.content.Loader
 android.content.Loader$ForceLoadContentObserver
 android.content.Loader$OnLoadCanceledListener
 android.content.Loader$OnLoadCompleteListener
-android.content.MutableContextWrapper
 android.content.OperationApplicationException
 android.content.PeriodicSync
 android.content.PeriodicSync$1
@@ -908,16 +945,21 @@
 android.content.UndoOperation
 android.content.UndoOwner
 android.content.UriMatcher
-android.content.UriPermission
+android.content.om.IOverlayManager
+android.content.om.IOverlayManager$Stub
+android.content.om.OverlayInfo
 android.content.pm.ActivityInfo
 android.content.pm.ActivityInfo$1
 android.content.pm.ActivityInfo$WindowLayout
 android.content.pm.ApplicationInfo
 android.content.pm.ApplicationInfo$1
+android.content.pm.AuxiliaryResolveInfo
+android.content.pm.BaseParceledListSlice
+android.content.pm.BaseParceledListSlice$1
+android.content.pm.ChangedPackages
 android.content.pm.ComponentInfo
 android.content.pm.ConfigurationInfo
 android.content.pm.ConfigurationInfo$1
-android.content.pm.EphemeralResponse
 android.content.pm.FallbackCategoryProvider
 android.content.pm.FeatureGroupInfo
 android.content.pm.FeatureGroupInfo$1
@@ -935,9 +977,13 @@
 android.content.pm.IOtaDexopt
 android.content.pm.IOtaDexopt$Stub
 android.content.pm.IPackageDataObserver
+android.content.pm.IPackageDataObserver$Stub
+android.content.pm.IPackageDataObserver$Stub$Proxy
 android.content.pm.IPackageDeleteObserver
 android.content.pm.IPackageDeleteObserver2
+android.content.pm.IPackageInstallObserver
 android.content.pm.IPackageInstallObserver2
+android.content.pm.IPackageInstallObserver2$Stub
 android.content.pm.IPackageInstaller
 android.content.pm.IPackageInstaller$Stub
 android.content.pm.IPackageInstaller$Stub$Proxy
@@ -945,6 +991,8 @@
 android.content.pm.IPackageInstallerCallback$Stub
 android.content.pm.IPackageInstallerCallback$Stub$Proxy
 android.content.pm.IPackageInstallerSession
+android.content.pm.IPackageInstallerSession$Stub
+android.content.pm.IPackageInstallerSession$Stub$Proxy
 android.content.pm.IPackageManager
 android.content.pm.IPackageManager$Stub
 android.content.pm.IPackageManager$Stub$Proxy
@@ -953,16 +1001,17 @@
 android.content.pm.IPackageMoveObserver$Stub$Proxy
 android.content.pm.IPackageStatsObserver
 android.content.pm.IPackageStatsObserver$Stub
-android.content.pm.IPackageStatsObserver$Stub$Proxy
 android.content.pm.IShortcutService
 android.content.pm.IShortcutService$Stub
 android.content.pm.IShortcutService$Stub$Proxy
+android.content.pm.InstantAppRequest
+android.content.pm.InstantAppResolveInfo$InstantAppDigest
+android.content.pm.InstantAppResolveInfo$InstantAppDigest$1
 android.content.pm.InstrumentationInfo
 android.content.pm.InstrumentationInfo$1
 android.content.pm.IntentFilterVerificationInfo
 android.content.pm.IntentFilterVerificationInfo$1
 android.content.pm.KeySet
-android.content.pm.LabeledIntent
 android.content.pm.LauncherActivityInfo
 android.content.pm.LauncherApps
 android.content.pm.LauncherApps$1
@@ -974,12 +1023,15 @@
 android.content.pm.PackageInfo
 android.content.pm.PackageInfo$1
 android.content.pm.PackageInfoLite
+android.content.pm.PackageInfoLite$1
 android.content.pm.PackageInstaller
 android.content.pm.PackageInstaller$Session
 android.content.pm.PackageInstaller$SessionCallback
 android.content.pm.PackageInstaller$SessionCallbackDelegate
 android.content.pm.PackageInstaller$SessionInfo
+android.content.pm.PackageInstaller$SessionInfo$1
 android.content.pm.PackageInstaller$SessionParams
+android.content.pm.PackageInstaller$SessionParams$1
 android.content.pm.PackageItemInfo
 android.content.pm.PackageManager
 android.content.pm.PackageManager$MoveCallback
@@ -994,6 +1046,8 @@
 android.content.pm.PackageParser$Activity$1
 android.content.pm.PackageParser$ActivityIntentInfo
 android.content.pm.PackageParser$ApkLite
+android.content.pm.PackageParser$Callback
+android.content.pm.PackageParser$CallbackImpl
 android.content.pm.PackageParser$Component
 android.content.pm.PackageParser$IntentInfo
 android.content.pm.PackageParser$NewPermissionInfo
@@ -1016,11 +1070,9 @@
 android.content.pm.PackageParser$SplitNameComparator
 android.content.pm.PackageParser$SplitPermissionInfo
 android.content.pm.PackageStats
-android.content.pm.PackageStats$1
 android.content.pm.PackageUserState
 android.content.pm.ParceledListSlice
 android.content.pm.ParceledListSlice$1
-android.content.pm.ParceledListSlice$2
 android.content.pm.PathPermission
 android.content.pm.PathPermission$1
 android.content.pm.PermissionGroupInfo
@@ -1038,6 +1090,7 @@
 android.content.pm.RegisteredServicesCacheListener
 android.content.pm.ResolveInfo
 android.content.pm.ResolveInfo$1
+android.content.pm.SELinuxUtil
 android.content.pm.ServiceInfo
 android.content.pm.ServiceInfo$1
 android.content.pm.SharedLibraryInfo
@@ -1050,6 +1103,8 @@
 android.content.pm.ShortcutServiceInternal$ShortcutChangeListener
 android.content.pm.Signature
 android.content.pm.Signature$1
+android.content.pm.StringParceledListSlice
+android.content.pm.StringParceledListSlice$1
 android.content.pm.UserInfo
 android.content.pm.UserInfo$1
 android.content.pm.VerifierDeviceIdentity
@@ -1057,15 +1112,9 @@
 android.content.pm.VersionedPackage
 android.content.pm.VersionedPackage$1
 android.content.pm.XmlSerializerAndParser
-android.content.pm.permission.IRuntimePermissionPresenter
-android.content.pm.permission.IRuntimePermissionPresenter$Stub
-android.content.pm.permission.IRuntimePermissionPresenter$Stub$Proxy
-android.content.pm.permission.RuntimePermissionPresentationInfo
-android.content.pm.permission.RuntimePermissionPresentationInfo$1
-android.content.pm.permission.RuntimePermissionPresenter
-android.content.pm.permission.RuntimePermissionPresenter$OnResultCallback
-android.content.pm.permission.RuntimePermissionPresenter$RemoteService
-android.content.pm.permission.RuntimePermissionPresenter$RemoteService$1
+android.content.pm.split.DefaultSplitAssetLoader
+android.content.pm.split.SplitAssetLoader
+android.content.pm.split.SplitDependencyLoader$IllegalDependencyException
 android.content.res.AssetFileDescriptor
 android.content.res.AssetFileDescriptor$1
 android.content.res.AssetFileDescriptor$AutoCloseInputStream
@@ -1074,6 +1123,7 @@
 android.content.res.ColorStateList
 android.content.res.ColorStateList$1
 android.content.res.ColorStateList$ColorStateListFactory
+android.content.res.CompatResources
 android.content.res.CompatibilityInfo
 android.content.res.CompatibilityInfo$1
 android.content.res.CompatibilityInfo$2
@@ -1139,9 +1189,9 @@
 android.database.MergeCursor$1
 android.database.Observable
 android.database.SQLException
+android.database.StaleDataException
 android.database.sqlite.DatabaseObjectNotClosedException
 android.database.sqlite.SQLiteAbortException
-android.database.sqlite.SQLiteAccessPermException
 android.database.sqlite.SQLiteCantOpenDatabaseException
 android.database.sqlite.SQLiteClosable
 android.database.sqlite.SQLiteConnection
@@ -1150,7 +1200,6 @@
 android.database.sqlite.SQLiteConnection$PreparedStatement
 android.database.sqlite.SQLiteConnection$PreparedStatementCache
 android.database.sqlite.SQLiteConnectionPool
-android.database.sqlite.SQLiteConnectionPool$1
 android.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus
 android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter
 android.database.sqlite.SQLiteConstraintException
@@ -1193,17 +1242,17 @@
 android.ddm.DdmHandleThread
 android.ddm.DdmHandleViewDebug
 android.ddm.DdmRegister
-android.drm.DrmErrorEvent
-android.drm.DrmEvent
-android.drm.DrmInfoEvent
-android.drm.DrmManagerClient
-android.drm.DrmManagerClient$EventHandler
-android.drm.DrmManagerClient$InfoHandler
 android.drm.DrmManagerClient$OnErrorListener
 android.drm.DrmManagerClient$OnEventListener
 android.drm.DrmManagerClient$OnInfoListener
 android.drm.DrmOutputStream
-android.drm.DrmSupportInfo
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$1
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$2
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$4
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$6
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$7
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$8
 android.graphics.BaseCanvas
 android.graphics.Bitmap
 android.graphics.Bitmap$1
@@ -1224,6 +1273,14 @@
 android.graphics.ColorFilter
 android.graphics.ColorMatrix
 android.graphics.ColorMatrixColorFilter
+android.graphics.ColorSpace
+android.graphics.ColorSpace$Adaptation
+android.graphics.ColorSpace$Lab
+android.graphics.ColorSpace$Model
+android.graphics.ColorSpace$Named
+android.graphics.ColorSpace$Rgb
+android.graphics.ColorSpace$Rgb$TransferParameters
+android.graphics.ColorSpace$Xyz
 android.graphics.ComposePathEffect
 android.graphics.ComposeShader
 android.graphics.CornerPathEffect
@@ -1297,13 +1354,15 @@
 android.graphics.TableMaskFilter
 android.graphics.TemporaryBuffer
 android.graphics.Typeface
+android.graphics.Typeface$Builder
 android.graphics.Xfermode
 android.graphics.YuvImage
+android.graphics.drawable.AdaptiveIconDrawable
+android.graphics.drawable.AdaptiveIconDrawable$ChildDrawable
+android.graphics.drawable.AdaptiveIconDrawable$LayerState
 android.graphics.drawable.Animatable
 android.graphics.drawable.Animatable2
-android.graphics.drawable.AnimatedRotateDrawable
-android.graphics.drawable.AnimatedRotateDrawable$1
-android.graphics.drawable.AnimatedRotateDrawable$AnimatedRotateState
+android.graphics.drawable.Animatable2$AnimationCallback
 android.graphics.drawable.AnimatedStateListDrawable
 android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState
 android.graphics.drawable.AnimatedStateListDrawable$AnimatedVectorDrawableTransition
@@ -1312,6 +1371,7 @@
 android.graphics.drawable.AnimatedStateListDrawable$Transition
 android.graphics.drawable.AnimatedVectorDrawable
 android.graphics.drawable.AnimatedVectorDrawable$1
+android.graphics.drawable.AnimatedVectorDrawable$2
 android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState
 android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator
 android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimator
@@ -1342,11 +1402,10 @@
 android.graphics.drawable.Icon$1
 android.graphics.drawable.InsetDrawable
 android.graphics.drawable.InsetDrawable$InsetState
+android.graphics.drawable.InsetDrawable$InsetValue
 android.graphics.drawable.LayerDrawable
 android.graphics.drawable.LayerDrawable$ChildDrawable
 android.graphics.drawable.LayerDrawable$LayerState
-android.graphics.drawable.LevelListDrawable
-android.graphics.drawable.LevelListDrawable$LevelListState
 android.graphics.drawable.NinePatchDrawable
 android.graphics.drawable.NinePatchDrawable$NinePatchState
 android.graphics.drawable.PaintDrawable
@@ -1407,23 +1466,14 @@
 android.graphics.drawable.shapes.RectShape
 android.graphics.drawable.shapes.RoundRectShape
 android.graphics.drawable.shapes.Shape
+android.graphics.fonts.FontVariationAxis
 android.graphics.pdf.PdfDocument
 android.graphics.pdf.PdfEditor
 android.graphics.pdf.PdfRenderer
 android.hardware.Camera
-android.hardware.Camera$AutoFocusCallback
-android.hardware.Camera$AutoFocusMoveCallback
 android.hardware.Camera$CameraInfo
 android.hardware.Camera$ErrorCallback
-android.hardware.Camera$EventHandler
 android.hardware.Camera$Face
-android.hardware.Camera$FaceDetectionListener
-android.hardware.Camera$OnZoomChangeListener
-android.hardware.Camera$Parameters
-android.hardware.Camera$PictureCallback
-android.hardware.Camera$PreviewCallback
-android.hardware.Camera$ShutterCallback
-android.hardware.Camera$Size
 android.hardware.CameraStatus
 android.hardware.CameraStatus$1
 android.hardware.ConsumerIrManager
@@ -1443,6 +1493,7 @@
 android.hardware.ISerialManager
 android.hardware.ISerialManager$Stub
 android.hardware.Sensor
+android.hardware.SensorAdditionalInfo
 android.hardware.SensorEvent
 android.hardware.SensorEventListener
 android.hardware.SensorManager
@@ -1474,7 +1525,6 @@
 android.hardware.camera2.CameraManager$CameraManagerGlobal$2
 android.hardware.camera2.CameraManager$CameraManagerGlobal$3
 android.hardware.camera2.CameraManager$CameraManagerGlobal$4
-android.hardware.camera2.CameraManager$CameraManagerGlobal$5
 android.hardware.camera2.CameraManager$TorchCallback
 android.hardware.camera2.CameraMetadata
 android.hardware.camera2.CaptureFailure
@@ -1515,7 +1565,6 @@
 android.hardware.camera2.impl.CameraDeviceImpl
 android.hardware.camera2.impl.CameraDeviceImpl$1
 android.hardware.camera2.impl.CameraDeviceImpl$10
-android.hardware.camera2.impl.CameraDeviceImpl$11
 android.hardware.camera2.impl.CameraDeviceImpl$2
 android.hardware.camera2.impl.CameraDeviceImpl$3
 android.hardware.camera2.impl.CameraDeviceImpl$4
@@ -1527,7 +1576,6 @@
 android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$2
 android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$3
 android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$4
-android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$6
 android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallback
 android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallbackHolder
 android.hardware.camera2.impl.CameraDeviceImpl$FrameNumberTracker
@@ -1762,18 +1810,44 @@
 android.hardware.radio.V1_0.Call
 android.hardware.radio.V1_0.CardStatus
 android.hardware.radio.V1_0.CdmaSignalStrength
+android.hardware.radio.V1_0.CellIdentity
+android.hardware.radio.V1_0.CellIdentityCdma
+android.hardware.radio.V1_0.CellIdentityGsm
+android.hardware.radio.V1_0.CellIdentityLte
+android.hardware.radio.V1_0.CellIdentityTdscdma
+android.hardware.radio.V1_0.CellIdentityWcdma
+android.hardware.radio.V1_0.CellInfo
+android.hardware.radio.V1_0.CellInfoCdma
+android.hardware.radio.V1_0.CellInfoGsm
+android.hardware.radio.V1_0.CellInfoLte
+android.hardware.radio.V1_0.CellInfoTdscdma
+android.hardware.radio.V1_0.CellInfoType
+android.hardware.radio.V1_0.CellInfoWcdma
+android.hardware.radio.V1_0.DataRegStateResult
 android.hardware.radio.V1_0.EvdoSignalStrength
 android.hardware.radio.V1_0.GsmSignalStrength
+android.hardware.radio.V1_0.HardwareConfig
 android.hardware.radio.V1_0.IRadio
 android.hardware.radio.V1_0.IRadio$Proxy
 android.hardware.radio.V1_0.IRadioIndication
 android.hardware.radio.V1_0.IRadioIndication$Stub
 android.hardware.radio.V1_0.IRadioResponse
 android.hardware.radio.V1_0.IRadioResponse$Stub
+android.hardware.radio.V1_0.LceStatusInfo
 android.hardware.radio.V1_0.LteSignalStrength
+android.hardware.radio.V1_0.RadioCapability
 android.hardware.radio.V1_0.RadioResponseInfo
+android.hardware.radio.V1_0.RegState
 android.hardware.radio.V1_0.SignalStrength
 android.hardware.radio.V1_0.TdScdmaSignalStrength
+android.hardware.radio.V1_0.VoiceRegStateResult
+android.hardware.radio.V1_0.WcdmaSignalStrength
+android.hardware.radio.deprecated.V1_0.IOemHook
+android.hardware.radio.deprecated.V1_0.IOemHook$Proxy
+android.hardware.radio.deprecated.V1_0.IOemHookIndication
+android.hardware.radio.deprecated.V1_0.IOemHookIndication$Stub
+android.hardware.radio.deprecated.V1_0.IOemHookResponse
+android.hardware.radio.deprecated.V1_0.IOemHookResponse$Stub
 android.hardware.soundtrigger.IRecognitionStatusCallback
 android.hardware.soundtrigger.IRecognitionStatusCallback$Stub
 android.hardware.soundtrigger.KeyphraseEnrollmentInfo
@@ -1815,22 +1889,23 @@
 android.hardware.usb.UsbPortStatus
 android.hardware.usb.UsbPortStatus$1
 android.hardware.usb.UsbRequest
+android.hidl.base.V1_0.DebugInfo
 android.hidl.base.V1_0.IBase
+android.hidl.manager.V1_0.IServiceManager
+android.hidl.manager.V1_0.IServiceManager$Proxy
+android.hidl.manager.V1_0.IServiceNotification
+android.hidl.manager.V1_0.IServiceNotification$Stub
 android.icu.impl.BMPSet
 android.icu.impl.CacheBase
 android.icu.impl.CacheValue
 android.icu.impl.CacheValue$NullValue
 android.icu.impl.CacheValue$SoftValue
 android.icu.impl.CacheValue$Strength
-android.icu.impl.CalendarAstronomer
-android.icu.impl.CalendarAstronomer$2
-android.icu.impl.CalendarAstronomer$CoordFunc
-android.icu.impl.CalendarAstronomer$Equatorial
-android.icu.impl.CalendarAstronomer$MoonAge
-android.icu.impl.CalendarAstronomer$SolarLongitude
 android.icu.impl.CalendarUtil
 android.icu.impl.CalendarUtil$CalendarPreferences
-android.icu.impl.CaseMap$StringContextIterator
+android.icu.impl.CaseMapImpl
+android.icu.impl.CaseMapImpl$GreekUpper
+android.icu.impl.CaseMapImpl$StringContextIterator
 android.icu.impl.CharTrie
 android.icu.impl.CharacterIteration
 android.icu.impl.ClassLoaderUtil
@@ -1909,7 +1984,6 @@
 android.icu.impl.JavaTimeZone
 android.icu.impl.LocaleDisplayNamesImpl
 android.icu.impl.LocaleDisplayNamesImpl$Cache
-android.icu.impl.LocaleDisplayNamesImpl$CapitalizationContextSink
 android.icu.impl.LocaleDisplayNamesImpl$CapitalizationContextUsage
 android.icu.impl.LocaleDisplayNamesImpl$DataTable
 android.icu.impl.LocaleDisplayNamesImpl$DataTables
@@ -2056,6 +2130,8 @@
 android.icu.text.BreakIteratorFactory
 android.icu.text.BreakIteratorFactory$BFService
 android.icu.text.BreakIteratorFactory$BFService$1RBBreakIteratorFactory
+android.icu.text.CaseMap
+android.icu.text.CaseMap$Upper
 android.icu.text.CollationKey
 android.icu.text.Collator
 android.icu.text.Collator$ServiceShim
@@ -2066,6 +2142,7 @@
 android.icu.text.CurrencyMetaInfo
 android.icu.text.CurrencyMetaInfo$CurrencyDigits
 android.icu.text.CurrencyMetaInfo$CurrencyFilter
+android.icu.text.CurrencyPluralInfo
 android.icu.text.DateFormat
 android.icu.text.DateFormat$BooleanAttribute
 android.icu.text.DateFormat$Field
@@ -2103,14 +2180,17 @@
 android.icu.text.DigitList
 android.icu.text.DisplayContext
 android.icu.text.DisplayContext$Type
+android.icu.text.Edits
 android.icu.text.IDNA
 android.icu.text.LanguageBreakEngine
-android.icu.text.ListFormatter
-android.icu.text.ListFormatter$Cache
-android.icu.text.ListFormatter$FormattedListBuilder
 android.icu.text.ListFormatter$Style
 android.icu.text.LocaleDisplayNames
 android.icu.text.LocaleDisplayNames$DialectHandling
+android.icu.text.MeasureFormat
+android.icu.text.MeasureFormat$FormatWidth
+android.icu.text.MeasureFormat$ImmutableNumberFormat
+android.icu.text.MeasureFormat$MeasureFormatData
+android.icu.text.MeasureFormat$UnitDataSink
 android.icu.text.Normalizer
 android.icu.text.Normalizer$FCDMode
 android.icu.text.Normalizer$Mode
@@ -2118,7 +2198,6 @@
 android.icu.text.Normalizer$NFCMode
 android.icu.text.Normalizer$NFCModeImpl
 android.icu.text.Normalizer$NFDMode
-android.icu.text.Normalizer$NFDModeImpl
 android.icu.text.Normalizer$NFKCMode
 android.icu.text.Normalizer$NFKDMode
 android.icu.text.Normalizer$NFKDModeImpl
@@ -2212,7 +2291,6 @@
 android.icu.util.CharsTrie
 android.icu.util.CharsTrie$Entry
 android.icu.util.CharsTrie$Iterator
-android.icu.util.ChineseCalendar
 android.icu.util.Currency
 android.icu.util.Currency$1
 android.icu.util.Currency$CurrencyUsage
@@ -2220,11 +2298,8 @@
 android.icu.util.CurrencyAmount
 android.icu.util.Freezable
 android.icu.util.GregorianCalendar
-android.icu.util.HebrewCalendar
 android.icu.util.ICUException
-android.icu.util.IndianCalendar
-android.icu.util.IslamicCalendar
-android.icu.util.IslamicCalendar$CalculationType
+android.icu.util.ICUUncheckedIOException
 android.icu.util.LocaleData
 android.icu.util.Measure
 android.icu.util.MeasureUnit
@@ -2263,9 +2338,10 @@
 android.inputmethodservice.InputMethodService$Insets
 android.inputmethodservice.InputMethodService$SettingsObserver
 android.inputmethodservice.SoftInputWindow
-android.inputmethodservice.SoftInputWindow$Callback
 android.location.Address
 android.location.Address$1
+android.location.BatchedLocationCallbackTransport
+android.location.BatchedLocationCallbackTransport$CallbackTransport
 android.location.Country
 android.location.Country$1
 android.location.CountryDetector
@@ -2273,6 +2349,7 @@
 android.location.CountryDetector$ListenerTransport$1
 android.location.CountryListener
 android.location.Criteria
+android.location.Criteria$1
 android.location.Geocoder
 android.location.GeocoderParams
 android.location.GeocoderParams$1
@@ -2288,6 +2365,8 @@
 android.location.GpsStatus$1
 android.location.GpsStatus$Listener
 android.location.GpsStatus$SatelliteIterator
+android.location.IBatchedLocationCallback
+android.location.IBatchedLocationCallback$Stub
 android.location.ICountryDetector
 android.location.ICountryDetector$Stub
 android.location.ICountryDetector$Stub$Proxy
@@ -2346,6 +2425,8 @@
 android.media.AudioDevicePortConfig
 android.media.AudioFocusInfo
 android.media.AudioFocusInfo$1
+android.media.AudioFocusRequest
+android.media.AudioFocusRequest$Builder
 android.media.AudioFormat
 android.media.AudioFormat$1
 android.media.AudioFormat$Builder
@@ -2356,6 +2437,7 @@
 android.media.AudioManager$1
 android.media.AudioManager$2
 android.media.AudioManager$3
+android.media.AudioManager$FocusRequestInfo
 android.media.AudioManager$NativeEventHandlerDelegate
 android.media.AudioManager$NativeEventHandlerDelegate$1
 android.media.AudioManager$OnAmPortUpdateListener
@@ -2377,8 +2459,6 @@
 android.media.AudioPortEventHandler
 android.media.AudioPortEventHandler$1
 android.media.AudioRecord
-android.media.AudioRecordingConfiguration
-android.media.AudioRecordingConfiguration$1
 android.media.AudioRoutesInfo
 android.media.AudioRoutesInfo$1
 android.media.AudioRouting
@@ -2392,8 +2472,6 @@
 android.media.BufferingParams$1
 android.media.CamcorderProfile
 android.media.CameraProfile
-android.media.Cea708CaptionRenderer
-android.media.ClosedCaptionRenderer
 android.media.DecoderCapabilities
 android.media.DeniedByServerException
 android.media.EncoderCapabilities
@@ -2422,10 +2500,6 @@
 android.media.IMediaRouterService
 android.media.IMediaRouterService$Stub
 android.media.IMediaRouterService$Stub$Proxy
-android.media.IMediaScannerListener
-android.media.IMediaScannerListener$Stub
-android.media.IMediaScannerService
-android.media.IMediaScannerService$Stub
 android.media.IPlaybackConfigDispatcher
 android.media.IPlaybackConfigDispatcher$Stub
 android.media.IPlayer
@@ -2477,15 +2551,17 @@
 android.media.MediaCodecInfo$VideoCapabilities
 android.media.MediaCodecList
 android.media.MediaCrypto
+android.media.MediaCryptoException
+android.media.MediaDescrambler
 android.media.MediaDescription
 android.media.MediaDescription$1
 android.media.MediaDescription$Builder
 android.media.MediaDrm
 android.media.MediaDrm$Certificate
-android.media.MediaDrm$CryptoSession
 android.media.MediaDrm$EventHandler
 android.media.MediaDrm$KeyRequest
 android.media.MediaDrm$MediaDrmStateException
+android.media.MediaDrm$OnEventListener
 android.media.MediaDrm$ProvisionRequest
 android.media.MediaDrmException
 android.media.MediaExtractor
@@ -2497,23 +2573,20 @@
 android.media.MediaMetadata
 android.media.MediaMetadata$1
 android.media.MediaMetadata$Builder
-android.media.MediaMetadataEditor
 android.media.MediaMetadataRetriever
 android.media.MediaMuxer
 android.media.MediaPlayer
 android.media.MediaPlayer$1
 android.media.MediaPlayer$2
-android.media.MediaPlayer$3
-android.media.MediaPlayer$3$1
+android.media.MediaPlayer$4
+android.media.MediaPlayer$4$1
 android.media.MediaPlayer$EventHandler
-android.media.MediaPlayer$OnBufferingUpdateListener
 android.media.MediaPlayer$OnCompletionListener
 android.media.MediaPlayer$OnErrorListener
 android.media.MediaPlayer$OnInfoListener
 android.media.MediaPlayer$OnPreparedListener
 android.media.MediaPlayer$OnSeekCompleteListener
 android.media.MediaPlayer$OnSubtitleDataListener
-android.media.MediaPlayer$OnVideoSizeChangedListener
 android.media.MediaPlayer$TimeProvider
 android.media.MediaPlayer$TimeProvider$EventHandler
 android.media.MediaPlayer$TrackInfo
@@ -2521,7 +2594,6 @@
 android.media.MediaRecorder
 android.media.MediaRecorder$EventHandler
 android.media.MediaRecorder$OnErrorListener
-android.media.MediaRecorder$OnInfoListener
 android.media.MediaRouter
 android.media.MediaRouter$Callback
 android.media.MediaRouter$CallbackInfo
@@ -2534,9 +2606,7 @@
 android.media.MediaRouter$Static$1
 android.media.MediaRouter$Static$Client
 android.media.MediaRouter$Static$Client$1
-android.media.MediaRouter$UserRouteInfo
 android.media.MediaRouter$VolumeCallback
-android.media.MediaRouter$VolumeCallbackInfo
 android.media.MediaRouter$VolumeChangeReceiver
 android.media.MediaRouter$WifiDisplayStatusChangedReceiver
 android.media.MediaRouterClientState
@@ -2544,38 +2614,25 @@
 android.media.MediaRouterClientState$RouteInfo
 android.media.MediaRouterClientState$RouteInfo$1
 android.media.MediaScanner
-android.media.MediaScanner$FileEntry
-android.media.MediaScanner$MediaBulkDeleter
-android.media.MediaScanner$MyMediaScannerClient
-android.media.MediaScannerClient
 android.media.MediaScannerConnection
-android.media.MediaScannerConnection$1
-android.media.MediaScannerConnection$ClientProxy
-android.media.MediaScannerConnection$MediaScannerConnectionClient
 android.media.MediaScannerConnection$OnScanCompletedListener
 android.media.MediaSync
 android.media.MediaTimeProvider
 android.media.MediaTimeProvider$OnMediaTimeListener
-android.media.Metadata
 android.media.MiniThumbFile
 android.media.NotProvisionedException
 android.media.PlaybackParams
 android.media.PlaybackParams$1
 android.media.PlayerBase
-android.media.PlayerBase$1
-android.media.PlayerBase$2
+android.media.PlayerBase$IAppOpsCallbackWrapper
+android.media.PlayerBase$IPlayerWrapper
 android.media.PlayerBase$PlayerIdCard
 android.media.PlayerBase$PlayerIdCard$1
+android.media.PlayerProxy
 android.media.Rating
 android.media.Rating$1
-android.media.RemoteControlClient
-android.media.RemoteControlClient$MetadataEditor
-android.media.RemoteControlClient$OnMetadataUpdateListener
 android.media.RemoteDisplay
 android.media.ResampleInputStream
-android.media.Ringtone
-android.media.Ringtone$MyOnCompletionListener
-android.media.RingtoneManager
 android.media.SoundPool
 android.media.SoundPool$Builder
 android.media.SoundPool$EventHandler
@@ -2585,32 +2642,32 @@
 android.media.SubtitleController$2
 android.media.SubtitleController$Anchor
 android.media.SubtitleController$Listener
-android.media.SubtitleController$Renderer
 android.media.SubtitleTrack
 android.media.SyncParams
 android.media.ThumbnailUtils
 android.media.ThumbnailUtils$SizedThumbnailBitmap
 android.media.ToneGenerator
-android.media.TtmlRenderer
+android.media.UnsupportedSchemeException
 android.media.Utils
 android.media.Utils$1
 android.media.Utils$2
+android.media.VolumeAutomation
 android.media.VolumePolicy
 android.media.VolumePolicy$1
-android.media.VolumeProvider
-android.media.WebVttRenderer
+android.media.VolumeShaper
+android.media.VolumeShaper$Configuration
+android.media.VolumeShaper$Configuration$1
+android.media.VolumeShaper$Configuration$Builder
+android.media.VolumeShaper$Operation
+android.media.VolumeShaper$Operation$1
+android.media.VolumeShaper$Operation$Builder
+android.media.VolumeShaper$State
+android.media.VolumeShaper$State$1
 android.media.audiofx.AudioEffect
 android.media.audiofx.AudioEffect$Descriptor
-android.media.audiofx.BassBoost
-android.media.audiofx.BassBoost$Settings
-android.media.audiofx.Equalizer
 android.media.audiofx.LoudnessEnhancer
-android.media.audiofx.NoiseSuppressor
-android.media.audiofx.PresetReverb
 android.media.audiofx.Virtualizer
-android.media.audiofx.Virtualizer$Settings
 android.media.audiofx.Visualizer
-android.media.audiofx.Visualizer$OnDataCaptureListener
 android.media.audiopolicy.AudioMix
 android.media.audiopolicy.AudioMixingRule
 android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
@@ -2618,9 +2675,10 @@
 android.media.audiopolicy.IAudioPolicyCallback
 android.media.audiopolicy.IAudioPolicyCallback$Stub
 android.media.browse.MediaBrowser
-android.media.browse.MediaBrowser$10
+android.media.browse.MediaBrowser$1
+android.media.browse.MediaBrowser$2
+android.media.browse.MediaBrowser$6
 android.media.browse.MediaBrowser$ConnectionCallback
-android.media.browse.MediaBrowser$MediaItem
 android.media.browse.MediaBrowser$MediaServiceConnection
 android.media.browse.MediaBrowser$MediaServiceConnection$1
 android.media.browse.MediaBrowser$ServiceCallbacks
@@ -2646,6 +2704,9 @@
 android.media.session.IActiveSessionsListener
 android.media.session.IActiveSessionsListener$Stub
 android.media.session.IActiveSessionsListener$Stub$Proxy
+android.media.session.ICallback
+android.media.session.ICallback$Stub
+android.media.session.ICallback$Stub$Proxy
 android.media.session.IOnMediaKeyListener
 android.media.session.IOnVolumeKeyLongPressListener
 android.media.session.ISession
@@ -2677,8 +2738,11 @@
 android.media.session.MediaSession$QueueItem$1
 android.media.session.MediaSession$Token
 android.media.session.MediaSession$Token$1
-android.media.session.MediaSessionLegacyHelper
 android.media.session.MediaSessionManager
+android.media.session.MediaSessionManager$Callback
+android.media.session.MediaSessionManager$CallbackImpl
+android.media.session.MediaSessionManager$CallbackImpl$3
+android.media.session.MediaSessionManager$CallbackImpl$4
 android.media.session.MediaSessionManager$OnActiveSessionsChangedListener
 android.media.session.MediaSessionManager$SessionsChangedWrapper
 android.media.session.MediaSessionManager$SessionsChangedWrapper$1
@@ -2711,11 +2775,9 @@
 android.net.ConnectivityManager$CallbackHandler
 android.net.ConnectivityManager$NetworkCallback
 android.net.ConnectivityManager$OnNetworkActiveListener
-android.net.ConnectivityManager$PacketKeepalive
 android.net.ConnectivityManager$PacketKeepaliveCallback
 android.net.ConnectivityMetricsEvent
 android.net.ConnectivityMetricsEvent$1
-android.net.ConnectivityMetricsEvent$Reference
 android.net.ConnectivityThread
 android.net.ConnectivityThread$Singleton
 android.net.Credentials
@@ -2731,14 +2793,14 @@
 android.net.IConnectivityManager
 android.net.IConnectivityManager$Stub
 android.net.IConnectivityManager$Stub$Proxy
-android.net.IConnectivityMetricsLogger
-android.net.IConnectivityMetricsLogger$Stub
 android.net.IEthernetManager
 android.net.IEthernetManager$Stub
 android.net.IEthernetServiceListener
 android.net.IEthernetServiceListener$Stub
 android.net.IIpConnectivityMetrics
 android.net.IIpConnectivityMetrics$Stub
+android.net.IIpSecService
+android.net.IIpSecService$Stub
 android.net.INetd
 android.net.INetd$Stub
 android.net.INetd$Stub$Proxy
@@ -2751,6 +2813,9 @@
 android.net.INetworkPolicyManager
 android.net.INetworkPolicyManager$Stub
 android.net.INetworkPolicyManager$Stub$Proxy
+android.net.INetworkRecommendationProvider
+android.net.INetworkRecommendationProvider$Stub
+android.net.INetworkRecommendationProvider$Stub$Proxy
 android.net.INetworkScoreCache
 android.net.INetworkScoreCache$Stub
 android.net.INetworkScoreCache$Stub$Proxy
@@ -2761,8 +2826,6 @@
 android.net.INetworkStatsService$Stub
 android.net.INetworkStatsService$Stub$Proxy
 android.net.INetworkStatsSession
-android.net.INetworkStatsSession$Stub
-android.net.INetworkStatsSession$Stub$Proxy
 android.net.InterfaceConfiguration
 android.net.InterfaceConfiguration$1
 android.net.IpConfiguration
@@ -2771,6 +2834,8 @@
 android.net.IpConfiguration$ProxySettings
 android.net.IpPrefix
 android.net.IpPrefix$1
+android.net.IpSecConfig
+android.net.IpSecManager
 android.net.LinkAddress
 android.net.LinkAddress$1
 android.net.LinkProperties
@@ -2784,12 +2849,13 @@
 android.net.LocalSocketImpl
 android.net.LocalSocketImpl$SocketInputStream
 android.net.LocalSocketImpl$SocketOutputStream
+android.net.MatchAllNetworkSpecifier
+android.net.MatchAllNetworkSpecifier$1
 android.net.Network
 android.net.Network$1
 android.net.Network$2
 android.net.Network$NetworkBoundSocketFactory
 android.net.NetworkAgent
-android.net.NetworkBadging
 android.net.NetworkCapabilities
 android.net.NetworkCapabilities$1
 android.net.NetworkConfig
@@ -2808,12 +2874,17 @@
 android.net.NetworkPolicy$1
 android.net.NetworkPolicyManager
 android.net.NetworkQuotaInfo
+android.net.NetworkRecommendationProvider
+android.net.NetworkRecommendationProvider$ServiceWrapper
+android.net.NetworkRecommendationProvider$ServiceWrapper$1
 android.net.NetworkRequest
 android.net.NetworkRequest$1
 android.net.NetworkRequest$Builder
 android.net.NetworkRequest$Type
 android.net.NetworkScoreManager
-android.net.NetworkScorerAppManager
+android.net.NetworkScorerAppData
+android.net.NetworkScorerAppData$1
+android.net.NetworkSpecifier
 android.net.NetworkState
 android.net.NetworkState$1
 android.net.NetworkStats
@@ -2824,7 +2895,6 @@
 android.net.NetworkStatsHistory$1
 android.net.NetworkStatsHistory$DataStreamUtils
 android.net.NetworkStatsHistory$Entry
-android.net.NetworkStatsHistory$ParcelUtils
 android.net.NetworkTemplate
 android.net.NetworkTemplate$1
 android.net.NetworkUtils
@@ -2832,8 +2902,6 @@
 android.net.Proxy
 android.net.ProxyInfo
 android.net.ProxyInfo$1
-android.net.RecommendationRequest
-android.net.RecommendationResult
 android.net.RouteInfo
 android.net.RouteInfo$1
 android.net.RssiCurve
@@ -2846,6 +2914,8 @@
 android.net.SntpClient
 android.net.StaticIpConfiguration
 android.net.StaticIpConfiguration$1
+android.net.StringNetworkSpecifier
+android.net.StringNetworkSpecifier$1
 android.net.TrafficStats
 android.net.UidRange
 android.net.Uri
@@ -2861,8 +2931,6 @@
 android.net.Uri$PathSegments
 android.net.Uri$PathSegmentsBuilder
 android.net.Uri$StringUri
-android.net.UrlQuerySanitizer
-android.net.VpnService
 android.net.WebAddress
 android.net.WifiKey
 android.net.WifiKey$1
@@ -2873,17 +2941,17 @@
 android.net.http.AndroidHttpClient$LoggingConfiguration
 android.net.http.HttpResponseCache
 android.net.http.SslCertificate
-android.net.http.SslError
 android.net.http.X509TrustManagerExtensions
 android.net.metrics.ApfProgramEvent
 android.net.metrics.ApfProgramEvent$1
+android.net.metrics.ApfStats
+android.net.metrics.ApfStats$1
 android.net.metrics.ConnectStats
 android.net.metrics.DefaultNetworkEvent
 android.net.metrics.DefaultNetworkEvent$1
 android.net.metrics.DhcpClientEvent
 android.net.metrics.DhcpClientEvent$1
 android.net.metrics.DnsEvent
-android.net.metrics.DnsEvent$1
 android.net.metrics.IpConnectivityLog
 android.net.metrics.IpManagerEvent
 android.net.metrics.IpManagerEvent$1
@@ -2903,7 +2971,6 @@
 android.net.sip.SipManager
 android.net.wifi.IRttManager
 android.net.wifi.IRttManager$Stub
-android.net.wifi.IRttManager$Stub$Proxy
 android.net.wifi.IWifiManager
 android.net.wifi.IWifiManager$Stub
 android.net.wifi.IWifiManager$Stub$Proxy
@@ -2911,12 +2978,10 @@
 android.net.wifi.IWifiScanner$Stub
 android.net.wifi.IWifiScanner$Stub$Proxy
 android.net.wifi.ParcelUtil
-android.net.wifi.RssiPacketCountInfo
 android.net.wifi.RttManager
 android.net.wifi.RttManager$RttCapabilities
 android.net.wifi.RttManager$RttListener
 android.net.wifi.RttManager$RttResult
-android.net.wifi.RttManager$ServiceHandler
 android.net.wifi.ScanResult
 android.net.wifi.ScanResult$1
 android.net.wifi.ScanResult$InformationElement
@@ -2925,15 +2990,10 @@
 android.net.wifi.SupplicantState$1
 android.net.wifi.WifiActivityEnergyInfo
 android.net.wifi.WifiActivityEnergyInfo$1
-android.net.wifi.WifiChannel
 android.net.wifi.WifiConfiguration
 android.net.wifi.WifiConfiguration$1
-android.net.wifi.WifiConfiguration$AuthAlgorithm
-android.net.wifi.WifiConfiguration$GroupCipher
 android.net.wifi.WifiConfiguration$KeyMgmt
 android.net.wifi.WifiConfiguration$NetworkSelectionStatus
-android.net.wifi.WifiConfiguration$PairwiseCipher
-android.net.wifi.WifiConfiguration$Protocol
 android.net.wifi.WifiConfiguration$Visibility
 android.net.wifi.WifiConnectionStatistics
 android.net.wifi.WifiConnectionStatistics$1
@@ -2949,6 +3009,7 @@
 android.net.wifi.WifiManager$WifiLock
 android.net.wifi.WifiNetworkScoreCache
 android.net.wifi.WifiNetworkScoreCache$CacheListener
+android.net.wifi.WifiNetworkScoreCache$CacheListener$1
 android.net.wifi.WifiScanner
 android.net.wifi.WifiScanner$ActionListener
 android.net.wifi.WifiScanner$ChannelSpec
@@ -2966,7 +3027,6 @@
 android.net.wifi.WifiScanner$ServiceHandler
 android.net.wifi.WifiSsid
 android.net.wifi.WifiSsid$1
-android.net.wifi.WifiWakeReasonAndCounts
 android.net.wifi.WpsInfo
 android.net.wifi.WpsInfo$1
 android.net.wifi.aware.WifiAwareManager
@@ -2988,12 +3048,9 @@
 android.net.wifi.p2p.WifiP2pInfo
 android.net.wifi.p2p.WifiP2pInfo$1
 android.net.wifi.p2p.WifiP2pManager
-android.net.wifi.p2p.WifiP2pManager$PeerListListener
-android.net.wifi.p2p.WifiP2pManager$PersistentGroupInfoListener
 android.net.wifi.p2p.WifiP2pWfdInfo
 android.net.wifi.p2p.WifiP2pWfdInfo$1
 android.nfc.BeamShareData
-android.nfc.ErrorCodes
 android.nfc.FormatException
 android.nfc.IAppCallback
 android.nfc.IAppCallback$Stub
@@ -3014,7 +3071,6 @@
 android.nfc.INfcUnlockHandler
 android.nfc.ITagRemovedCallback
 android.nfc.NdefMessage
-android.nfc.NdefRecord
 android.nfc.NfcActivityManager
 android.nfc.NfcActivityManager$NfcActivityState
 android.nfc.NfcActivityManager$NfcApplicationState
@@ -3035,13 +3091,6 @@
 android.nfc.cardemulation.CardEmulation
 android.nfc.cardemulation.HostApduService
 android.nfc.cardemulation.HostApduService$MsgHandler
-android.nfc.cardemulation.NfcFCardEmulation
-android.nfc.cardemulation.NfcFServiceInfo
-android.nfc.tech.BasicTagTechnology
-android.nfc.tech.MifareClassic
-android.nfc.tech.Ndef
-android.nfc.tech.NfcBarcode
-android.nfc.tech.TagTechnology
 android.opengl.EGL14
 android.opengl.EGLConfig
 android.opengl.EGLContext
@@ -3050,7 +3099,6 @@
 android.opengl.EGLObjectHandle
 android.opengl.EGLSurface
 android.opengl.ETC1
-android.opengl.ETC1Util
 android.opengl.GLES10
 android.opengl.GLES10Ext
 android.opengl.GLES11
@@ -3060,29 +3108,13 @@
 android.opengl.GLES31
 android.opengl.GLES31Ext
 android.opengl.GLES32
-android.opengl.GLSurfaceView
-android.opengl.GLSurfaceView$BaseConfigChooser
-android.opengl.GLSurfaceView$ComponentSizeChooser
-android.opengl.GLSurfaceView$DefaultContextFactory
-android.opengl.GLSurfaceView$DefaultWindowSurfaceFactory
-android.opengl.GLSurfaceView$EGLConfigChooser
-android.opengl.GLSurfaceView$EGLContextFactory
-android.opengl.GLSurfaceView$EGLWindowSurfaceFactory
-android.opengl.GLSurfaceView$EglHelper
-android.opengl.GLSurfaceView$GLThread
-android.opengl.GLSurfaceView$GLThreadManager
-android.opengl.GLSurfaceView$Renderer
-android.opengl.GLSurfaceView$SimpleEGLConfigChooser
-android.opengl.GLU
 android.opengl.GLUtils
 android.opengl.Matrix
 android.opengl.Visibility
-android.os.-$Lambda$0$-dncxFEc2F2bgG2fsIoC6FC6WNE
-android.os.-$Lambda$1$-dncxFEc2F2bgG2fsIoC6FC6WNE
-android.os.-$Lambda$5$6x30vPJhBKUfNY8tswxuZo3DCe0
-android.os.-$Lambda$67$OsaxDBgigpqjZN1F4C6nYRYm1YQ
+android.os.-$Lambda$-dncxFEc2F2bgG2fsIoC6FC6WNE
+android.os.-$Lambda$-dncxFEc2F2bgG2fsIoC6FC6WNE$1
+android.os.-$Lambda$6x30vPJhBKUfNY8tswxuZo3DCe0
 android.os.AsyncResult
-android.os.AsyncTask
 android.os.AsyncTask$1
 android.os.AsyncTask$2
 android.os.AsyncTask$3
@@ -3106,19 +3138,18 @@
 android.os.BatteryStats$DailyItem
 android.os.BatteryStats$HistoryEventTracker
 android.os.BatteryStats$HistoryItem
-android.os.BatteryStats$HistoryPrinter
 android.os.BatteryStats$HistoryStepDetails
 android.os.BatteryStats$HistoryTag
 android.os.BatteryStats$IntToString
 android.os.BatteryStats$LevelStepTracker
 android.os.BatteryStats$LongCounter
+android.os.BatteryStats$LongCounterArray
 android.os.BatteryStats$PackageChange
 android.os.BatteryStats$Timer
 android.os.BatteryStats$Uid
 android.os.BatteryStats$Uid$Pid
 android.os.BatteryStats$Uid$Pkg
 android.os.BatteryStats$Uid$Pkg$Serv
-android.os.BatteryStats$Uid$Proc
 android.os.BatteryStats$Uid$Sensor
 android.os.BatteryStats$Uid$Wakelock
 android.os.Binder
@@ -3133,7 +3164,6 @@
 android.os.CommonTimeConfig$OnServerDiedListener
 android.os.ConditionVariable
 android.os.CountDownTimer
-android.os.CountDownTimer$1
 android.os.CpuUsageInfo
 android.os.CpuUsageInfo$1
 android.os.DeadObjectException
@@ -3147,7 +3177,8 @@
 android.os.Environment
 android.os.Environment$UserEnvironment
 android.os.FactoryTest
-android.os.FileObserver
+android.os.FileBridge
+android.os.FileBridge$FileBridgeOutputStream
 android.os.FileObserver$ObserverThread
 android.os.FileUtils
 android.os.GraphicsEnvironment
@@ -3234,7 +3265,6 @@
 android.os.MessageQueue$OnFileDescriptorEventListener
 android.os.Messenger
 android.os.Messenger$1
-android.os.NullVibrator
 android.os.OperationCanceledException
 android.os.Parcel
 android.os.Parcel$1
@@ -3252,6 +3282,7 @@
 android.os.Parcelable
 android.os.Parcelable$ClassLoaderCreator
 android.os.Parcelable$Creator
+android.os.ParcelableException
 android.os.ParcelableParcel
 android.os.ParcelableParcel$1
 android.os.PatternMatcher
@@ -3266,15 +3297,18 @@
 android.os.PowerManager$WakeLock$1
 android.os.PowerManagerInternal
 android.os.PowerManagerInternal$LowPowerModeListener
+android.os.PowerSaveState
+android.os.PowerSaveState$1
+android.os.PowerSaveState$Builder
 android.os.Process
 android.os.Process$ProcessStartResult
 android.os.RecoverySystem
+android.os.RecoverySystem$ProgressListener
 android.os.Registrant
 android.os.RegistrantList
 android.os.RemoteCallback
 android.os.RemoteCallback$1
 android.os.RemoteCallback$2
-android.os.RemoteCallback$3
 android.os.RemoteCallback$OnResultListener
 android.os.RemoteCallbackList
 android.os.RemoteCallbackList$Callback
@@ -3284,14 +3318,13 @@
 android.os.ResultReceiver$MyResultReceiver
 android.os.ResultReceiver$MyRunnable
 android.os.SELinux
+android.os.Seccomp
 android.os.ServiceManager
 android.os.ServiceManager$ServiceNotFoundException
 android.os.ServiceManagerNative
 android.os.ServiceManagerProxy
 android.os.ServiceSpecificException
 android.os.ShellCallback
-android.os.ShellCallback$1
-android.os.ShellCommand
 android.os.StatFs
 android.os.StrictMode
 android.os.StrictMode$1
@@ -3310,6 +3343,7 @@
 android.os.StrictMode$InstanceTracker
 android.os.StrictMode$LogStackTrace
 android.os.StrictMode$Span
+android.os.StrictMode$StrictModeCustomViolation
 android.os.StrictMode$StrictModeDiskReadViolation
 android.os.StrictMode$StrictModeDiskWriteViolation
 android.os.StrictMode$StrictModeViolation
@@ -3340,18 +3374,27 @@
 android.os.UserHandle
 android.os.UserHandle$1
 android.os.UserManager
+android.os.UserManager$EnforcingUser
+android.os.UserManager$EnforcingUser$1
 android.os.UserManagerInternal
 android.os.UserManagerInternal$UserRestrictionsListener
+android.os.VibrationEffect
+android.os.VibrationEffect$1
+android.os.VibrationEffect$OneShot
+android.os.VibrationEffect$Prebaked
+android.os.VibrationEffect$Prebaked$1
+android.os.VibrationEffect$Waveform
+android.os.VibrationEffect$Waveform$1
 android.os.Vibrator
+android.os.VintfObject
+android.os.VintfRuntimeInfo
 android.os.WorkSource
 android.os.WorkSource$1
 android.os.ZygoteProcess
 android.os.ZygoteProcess$ZygoteState
 android.os.ZygoteStartFailedEx
-android.os.health.HealthStats
 android.os.health.HealthStatsParceler
 android.os.health.SystemHealthManager
-android.os.health.TimerStat
 android.os.storage.DiskInfo
 android.os.storage.DiskInfo$1
 android.os.storage.IObbActionListener
@@ -3376,50 +3419,23 @@
 android.os.storage.VolumeInfo$2
 android.os.storage.VolumeRecord
 android.os.storage.VolumeRecord$1
-android.permissionpresenterservice.RuntimePermissionPresenterService
-android.permissionpresenterservice.RuntimePermissionPresenterService$1
-android.permissionpresenterservice.RuntimePermissionPresenterService$MyHandler
-android.preference.CheckBoxPreference
-android.preference.DialogPreference
 android.preference.GenericInflater$Parent
-android.preference.ListPreference
 android.preference.Preference
 android.preference.Preference$BaseSavedState
 android.preference.Preference$BaseSavedState$1
-android.preference.Preference$OnPreferenceChangeInternalListener
 android.preference.Preference$OnPreferenceChangeListener
-android.preference.Preference$OnPreferenceClickListener
 android.preference.PreferenceActivity
 android.preference.PreferenceFragment
-android.preference.PreferenceFragment$1
-android.preference.PreferenceFragment$2
-android.preference.PreferenceFragment$3
 android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
-android.preference.PreferenceFrameLayout
 android.preference.PreferenceGroup
-android.preference.PreferenceGroupAdapter
-android.preference.PreferenceGroupAdapter$1
-android.preference.PreferenceGroupAdapter$PreferenceLayout
 android.preference.PreferenceManager
-android.preference.PreferenceManager$OnActivityDestroyListener
 android.preference.PreferenceManager$OnPreferenceTreeClickListener
 android.preference.PreferenceScreen
-android.preference.SeekBarVolumizer
-android.preference.SeekBarVolumizer$Callback
-android.preference.SeekBarVolumizer$H
-android.preference.SeekBarVolumizer$Observer
-android.preference.SeekBarVolumizer$Receiver
-android.preference.SwitchPreference
-android.preference.SwitchPreference$Listener
-android.preference.TwoStatePreference
 android.print.IPrintDocumentAdapter
 android.print.IPrintJobStateChangeListener
 android.print.IPrintManager
 android.print.IPrintManager$Stub
-android.print.IPrintManager$Stub$Proxy
 android.print.IPrintServicesChangeListener
-android.print.IPrintServicesChangeListener$Stub
-android.print.IPrintServicesChangeListener$Stub$Proxy
 android.print.IPrintSpooler
 android.print.IPrintSpooler$Stub
 android.print.IPrintSpooler$Stub$Proxy
@@ -3427,35 +3443,23 @@
 android.print.IPrintSpoolerCallbacks$Stub
 android.print.IPrintSpoolerClient
 android.print.IPrintSpoolerClient$Stub
-android.print.IPrintSpoolerClient$Stub$Proxy
 android.print.IPrinterDiscoveryObserver
 android.print.PageRange
 android.print.PrintAttributes
-android.print.PrintAttributes$Builder
-android.print.PrintAttributes$Margins
-android.print.PrintAttributes$MediaSize
-android.print.PrintAttributes$Resolution
 android.print.PrintDocumentAdapter
 android.print.PrintDocumentAdapter$LayoutResultCallback
 android.print.PrintDocumentAdapter$WriteResultCallback
-android.print.PrintDocumentInfo
-android.print.PrintDocumentInfo$Builder
 android.print.PrintJobId
 android.print.PrintJobInfo
 android.print.PrintManager
-android.print.PrintManager$1
-android.print.PrintManager$PrintServicesChangeListener
-android.print.PrintManager$PrintServicesChangeListenerWrapper
-android.print.PrintServicesLoader
-android.print.PrintServicesLoader$1
-android.print.PrintServicesLoader$MyHandler
 android.print.PrinterId
 android.printservice.IPrintServiceClient
 android.printservice.IPrintServiceClient$Stub
 android.printservice.PrintServiceInfo
 android.printservice.PrintServiceInfo$1
 android.printservice.recommendation.IRecommendationsChangeListener
-android.provider.-$Lambda$46$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$a7Jyr6j_Mb70hHJ2ssL1AAhKh4c
 android.provider.BaseColumns
 android.provider.BlockedNumberContract
 android.provider.BlockedNumberContract$BlockedNumbers
@@ -3467,42 +3471,30 @@
 android.provider.CalendarContract$CalendarCache
 android.provider.CalendarContract$CalendarCacheColumns
 android.provider.CalendarContract$CalendarColumns
-android.provider.CalendarContract$CalendarEntity
-android.provider.CalendarContract$CalendarEntity$EntityIteratorImpl
 android.provider.CalendarContract$CalendarSyncColumns
 android.provider.CalendarContract$Calendars
 android.provider.CalendarContract$Colors
 android.provider.CalendarContract$ColorsColumns
 android.provider.CalendarContract$Events
 android.provider.CalendarContract$EventsColumns
-android.provider.CalendarContract$EventsEntity
-android.provider.CalendarContract$EventsEntity$EntityIteratorImpl
 android.provider.CalendarContract$ExtendedProperties
 android.provider.CalendarContract$ExtendedPropertiesColumns
 android.provider.CalendarContract$Instances
 android.provider.CalendarContract$Reminders
 android.provider.CalendarContract$RemindersColumns
 android.provider.CalendarContract$SyncColumns
-android.provider.CalendarContract$SyncState
 android.provider.CallLog
 android.provider.CallLog$Calls
-android.provider.Contacts
-android.provider.Contacts$ContactMethods
-android.provider.Contacts$ContactMethodsColumns
-android.provider.Contacts$PeopleColumns
 android.provider.ContactsContract
-android.provider.ContactsContract$AggregationExceptions
 android.provider.ContactsContract$BaseSyncColumns
 android.provider.ContactsContract$CommonDataKinds$BaseTypes
 android.provider.ContactsContract$CommonDataKinds$Callable
 android.provider.ContactsContract$CommonDataKinds$CommonColumns
-android.provider.ContactsContract$CommonDataKinds$Contactables
 android.provider.ContactsContract$CommonDataKinds$Email
 android.provider.ContactsContract$CommonDataKinds$Event
 android.provider.ContactsContract$CommonDataKinds$Im
 android.provider.ContactsContract$CommonDataKinds$Phone
 android.provider.ContactsContract$CommonDataKinds$Relation
-android.provider.ContactsContract$CommonDataKinds$SipAddress
 android.provider.ContactsContract$CommonDataKinds$StructuredPostal
 android.provider.ContactsContract$ContactCounts
 android.provider.ContactsContract$ContactNameColumns
@@ -3525,50 +3517,37 @@
 android.provider.ContactsContract$MetadataSyncColumns
 android.provider.ContactsContract$PhoneLookup
 android.provider.ContactsContract$PhoneLookupColumns
-android.provider.ContactsContract$PinnedPositions
 android.provider.ContactsContract$Profile
 android.provider.ContactsContract$ProviderStatus
-android.provider.ContactsContract$QuickContact
 android.provider.ContactsContract$RawContacts
 android.provider.ContactsContract$RawContactsColumns
 android.provider.ContactsContract$RawContactsEntity
-android.provider.ContactsContract$Settings
-android.provider.ContactsContract$SettingsColumns
 android.provider.ContactsContract$StatusColumns
-android.provider.ContactsContract$StreamItems
-android.provider.ContactsContract$StreamItemsColumns
 android.provider.ContactsContract$SyncColumns
-android.provider.ContactsContract$SyncState
-android.provider.ContactsInternal
 android.provider.DocumentsContract
+android.provider.DocumentsContract$Path
 android.provider.DocumentsProvider
 android.provider.Downloads
 android.provider.Downloads$Impl
-android.provider.MediaStore
+android.provider.FontsContract
+android.provider.FontsContract$1
 android.provider.MediaStore$Audio
 android.provider.MediaStore$Audio$AlbumColumns
 android.provider.MediaStore$Audio$Albums
 android.provider.MediaStore$Audio$AudioColumns
-android.provider.MediaStore$Audio$Genres
-android.provider.MediaStore$Audio$Genres$Members
-android.provider.MediaStore$Audio$GenresColumns
 android.provider.MediaStore$Audio$Media
 android.provider.MediaStore$Audio$Playlists
-android.provider.MediaStore$Audio$Playlists$Members
 android.provider.MediaStore$Audio$PlaylistsColumns
 android.provider.MediaStore$Files
 android.provider.MediaStore$Images$ImageColumns
 android.provider.MediaStore$Images$Media
 android.provider.MediaStore$Images$Thumbnails
-android.provider.MediaStore$InternalThumbnails
 android.provider.MediaStore$MediaColumns
 android.provider.MediaStore$Video$Media
-android.provider.MediaStore$Video$Thumbnails
 android.provider.MediaStore$Video$VideoColumns
 android.provider.OpenableColumns
 android.provider.SearchIndexableData
 android.provider.SearchIndexableResource
-android.provider.SearchIndexablesContract
 android.provider.SearchIndexablesProvider
 android.provider.SearchRecentSuggestions
 android.provider.Settings
@@ -3594,17 +3573,12 @@
 android.provider.Settings$System$InclusiveIntegerRangeValidator
 android.provider.Settings$System$Validator
 android.provider.SyncStateContract$Columns
-android.provider.SyncStateContract$Helpers
 android.provider.Telephony$BaseMmsColumns
 android.provider.Telephony$Carriers
 android.provider.Telephony$Mms
-android.provider.Telephony$Mms$Inbox
-android.provider.Telephony$Mms$Sent
 android.provider.Telephony$MmsSms
+android.provider.Telephony$ServiceStateTable
 android.provider.Telephony$Sms
-android.provider.Telephony$Sms$Inbox
-android.provider.Telephony$Sms$Intents
-android.provider.Telephony$Sms$Sent
 android.provider.Telephony$TextBasedSmsColumns
 android.provider.Telephony$Threads
 android.provider.Telephony$ThreadsColumns
@@ -3612,21 +3586,9 @@
 android.provider.VoicemailContract$Status
 android.provider.VoicemailContract$Voicemails
 android.renderscript.Allocation
-android.renderscript.Allocation$MipmapControl
 android.renderscript.BaseObj
-android.renderscript.Element
-android.renderscript.Element$DataKind
-android.renderscript.Element$DataType
-android.renderscript.RenderScript
-android.renderscript.RenderScript$ContextType
-android.renderscript.RenderScript$MessageThread
+android.renderscript.Matrix4f
 android.renderscript.RenderScriptCacheDir
-android.renderscript.Script
-android.renderscript.ScriptIntrinsic
-android.renderscript.ScriptIntrinsicBlur
-android.renderscript.Type
-android.renderscript.Type$Builder
-android.renderscript.Type$CubemapFace
 android.security.GateKeeper
 android.security.IKeyChainService
 android.security.IKeyChainService$Stub
@@ -3683,35 +3645,38 @@
 android.security.net.config.RootTrustManager
 android.security.net.config.RootTrustManagerFactorySpi
 android.security.net.config.SystemCertificateSource
-android.security.net.config.SystemCertificateSource$NoPreloadHolder
 android.security.net.config.TrustedCertificateStoreAdapter
 android.security.net.config.UserCertificateSource
-android.security.net.config.UserCertificateSource$NoPreloadHolder
 android.security.net.config.XmlConfigSource
 android.security.net.config.XmlConfigSource$ParserException
-android.service.autofill.IAutoFillManagerService
-android.service.autofill.IAutoFillManagerService$Stub
-android.service.autofill.IAutoFillManagerService$Stub$Proxy
+android.service.autofill.-$Lambda$svbjmB3NFhHnuZrn67G14PFSJlY
+android.service.autofill.AutofillService
+android.service.autofill.AutofillService$1
+android.service.autofill.AutofillServiceInfo
+android.service.autofill.FillCallback
+android.service.autofill.FillContext
+android.service.autofill.FillContext$1
+android.service.autofill.FillEventHistory
+android.service.autofill.FillRequest
+android.service.autofill.FillRequest$1
+android.service.autofill.FillResponse
+android.service.autofill.IAutoFillService
+android.service.autofill.IAutoFillService$Stub
+android.service.autofill.IAutoFillService$Stub$Proxy
+android.service.autofill.IFillCallback
+android.service.autofill.IFillCallback$Stub
+android.service.autofill.IFillCallback$Stub$Proxy
+android.service.autofill.SaveCallback
+android.service.autofill.SaveRequest
 android.service.carrier.CarrierIdentifier
 android.service.carrier.CarrierIdentifier$1
 android.service.carrier.ICarrierService
 android.service.carrier.ICarrierService$Stub
 android.service.carrier.ICarrierService$Stub$Proxy
-android.service.chooser.ChooserTarget
-android.service.chooser.ChooserTargetService
 android.service.dreams.DreamManagerInternal
-android.service.dreams.DreamService
-android.service.dreams.DreamService$1
-android.service.dreams.DreamService$DreamServiceWrapper
-android.service.dreams.DreamService$DreamServiceWrapper$1
-android.service.dreams.DreamService$DreamServiceWrapper$2
-android.service.dreams.DreamService$DreamServiceWrapper$3
 android.service.dreams.IDreamManager
 android.service.dreams.IDreamManager$Stub
 android.service.dreams.IDreamManager$Stub$Proxy
-android.service.dreams.IDreamService
-android.service.dreams.IDreamService$Stub
-android.service.dreams.IDreamService$Stub$Proxy
 android.service.gatekeeper.IGateKeeperService
 android.service.gatekeeper.IGateKeeperService$Stub
 android.service.gatekeeper.IGateKeeperService$Stub$Proxy
@@ -3720,14 +3685,6 @@
 android.service.media.IMediaBrowserService$Stub$Proxy
 android.service.media.IMediaBrowserServiceCallbacks
 android.service.media.IMediaBrowserServiceCallbacks$Stub
-android.service.media.IMediaBrowserServiceCallbacks$Stub$Proxy
-android.service.media.MediaBrowserService
-android.service.media.MediaBrowserService$1
-android.service.media.MediaBrowserService$BrowserRoot
-android.service.media.MediaBrowserService$ConnectionRecord
-android.service.media.MediaBrowserService$Result
-android.service.media.MediaBrowserService$ServiceBinder
-android.service.media.MediaBrowserService$ServiceBinder$1
 android.service.notification.Adjustment
 android.service.notification.Condition
 android.service.notification.Condition$1
@@ -3738,7 +3695,6 @@
 android.service.notification.IConditionListener$Stub
 android.service.notification.IConditionProvider
 android.service.notification.IConditionProvider$Stub
-android.service.notification.IConditionProvider$Stub$Proxy
 android.service.notification.INotificationListener
 android.service.notification.INotificationListener$Stub
 android.service.notification.INotificationListener$Stub$Proxy
@@ -3762,21 +3718,18 @@
 android.service.notification.ZenModeConfig$ScheduleInfo
 android.service.notification.ZenModeConfig$ZenRule
 android.service.notification.ZenModeConfig$ZenRule$1
+android.service.oemlock.IOemLockService
+android.service.oemlock.IOemLockService$Stub
+android.service.oemlock.OemLockManager
 android.service.persistentdata.IPersistentDataBlockService
 android.service.persistentdata.IPersistentDataBlockService$Stub
 android.service.persistentdata.IPersistentDataBlockService$Stub$Proxy
 android.service.persistentdata.PersistentDataBlockManager
 android.service.quicksettings.IQSService
 android.service.quicksettings.IQSService$Stub
-android.service.quicksettings.IQSTileService
 android.service.quicksettings.Tile
-android.service.quicksettings.Tile$1
-android.service.quicksettings.TileService
 android.service.textservice.SpellCheckerService
 android.service.textservice.SpellCheckerService$InternalISpellCheckerSession
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceTextInfoParams
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceWordItem
 android.service.textservice.SpellCheckerService$Session
 android.service.textservice.SpellCheckerService$SpellCheckerServiceBinder
 android.service.voice.AlwaysOnHotwordDetector
@@ -3789,33 +3742,13 @@
 android.service.voice.IVoiceInteractionService$Stub
 android.service.voice.IVoiceInteractionService$Stub$Proxy
 android.service.voice.IVoiceInteractionSession
-android.service.voice.IVoiceInteractionSession$Stub
-android.service.voice.IVoiceInteractionSession$Stub$Proxy
-android.service.voice.IVoiceInteractionSessionService
-android.service.voice.IVoiceInteractionSessionService$Stub
-android.service.voice.IVoiceInteractionSessionService$Stub$Proxy
 android.service.voice.VoiceInteractionManagerInternal
 android.service.voice.VoiceInteractionService
 android.service.voice.VoiceInteractionService$1
 android.service.voice.VoiceInteractionService$MyHandler
 android.service.voice.VoiceInteractionServiceInfo
-android.service.voice.VoiceInteractionSession
-android.service.voice.VoiceInteractionSession$1
-android.service.voice.VoiceInteractionSession$2
-android.service.voice.VoiceInteractionSession$2$1
-android.service.voice.VoiceInteractionSession$3
-android.service.voice.VoiceInteractionSession$4
-android.service.voice.VoiceInteractionSession$AbortVoiceRequest
-android.service.voice.VoiceInteractionSession$CommandRequest
-android.service.voice.VoiceInteractionSession$CompleteVoiceRequest
-android.service.voice.VoiceInteractionSession$ConfirmationRequest
-android.service.voice.VoiceInteractionSession$Insets
-android.service.voice.VoiceInteractionSession$MyCallbacks
-android.service.voice.VoiceInteractionSession$PickOptionRequest
-android.service.voice.VoiceInteractionSession$Request
-android.service.voice.VoiceInteractionSessionService
-android.service.voice.VoiceInteractionSessionService$1
-android.service.voice.VoiceInteractionSessionService$2
+android.service.vr.IPersistentVrStateCallbacks
+android.service.vr.IPersistentVrStateCallbacks$Stub
 android.service.vr.IVrManager
 android.service.vr.IVrManager$Stub
 android.service.vr.IVrManager$Stub$Proxy
@@ -3840,10 +3773,13 @@
 android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper
 android.service.wallpaper.WallpaperService$IWallpaperServiceWrapper
 android.service.wallpaper.WallpaperService$WallpaperCommand
-android.speech.RecognitionService
 android.speech.SpeechRecognizer
+android.speech.tts.AbstractEventLogger
+android.speech.tts.AbstractSynthesisCallback
 android.speech.tts.AudioPlaybackHandler
 android.speech.tts.AudioPlaybackHandler$MessageLoop
+android.speech.tts.EventLogger
+android.speech.tts.FileSynthesisCallback
 android.speech.tts.ITextToSpeechCallback
 android.speech.tts.ITextToSpeechCallback$Stub
 android.speech.tts.ITextToSpeechCallback$Stub$Proxy
@@ -3855,6 +3791,7 @@
 android.speech.tts.TextToSpeech
 android.speech.tts.TextToSpeech$10
 android.speech.tts.TextToSpeech$16
+android.speech.tts.TextToSpeech$17
 android.speech.tts.TextToSpeech$7
 android.speech.tts.TextToSpeech$Action
 android.speech.tts.TextToSpeech$Connection
@@ -3865,13 +3802,19 @@
 android.speech.tts.TextToSpeechService
 android.speech.tts.TextToSpeechService$1
 android.speech.tts.TextToSpeechService$CallbackMap
+android.speech.tts.TextToSpeechService$SpeechItem
 android.speech.tts.TextToSpeechService$SynthHandler
+android.speech.tts.TextToSpeechService$SynthHandler$1
 android.speech.tts.TextToSpeechService$SynthHandler$2
 android.speech.tts.TextToSpeechService$SynthThread
+android.speech.tts.TextToSpeechService$SynthesisSpeechItem
+android.speech.tts.TextToSpeechService$SynthesisToFileOutputStreamSpeechItem
+android.speech.tts.TextToSpeechService$UtteranceProgressDispatcher
+android.speech.tts.TextToSpeechService$UtteranceSpeechItem
+android.speech.tts.TextToSpeechService$UtteranceSpeechItemWithParams
 android.speech.tts.TtsEngines
 android.speech.tts.TtsEngines$EngineInfoComparator
 android.speech.tts.UtteranceProgressListener
-android.speech.tts.Voice
 android.system.ErrnoException
 android.system.GaiException
 android.system.NetlinkSocketAddress
@@ -3882,6 +3825,7 @@
 android.system.StructFlock
 android.system.StructGroupReq
 android.system.StructGroupSourceReq
+android.system.StructIcmpHdr
 android.system.StructIfaddrs
 android.system.StructLinger
 android.system.StructPasswd
@@ -3892,19 +3836,9 @@
 android.system.StructUcred
 android.system.StructUtsname
 android.system.UnixSocketAddress
-android.telecom.-$Lambda$3$afyb_ODGzn3xMew6fjs8ANSIdVo
-android.telecom.AudioState
-android.telecom.AudioState$1
-android.telecom.Call
-android.telecom.Call$1
-android.telecom.Call$4
-android.telecom.Call$8
-android.telecom.Call$Callback
-android.telecom.Call$Details
-android.telecom.Call$Listener
+android.telecom.-$Lambda$afyb_ODGzn3xMew6fjs8ANSIdVo
 android.telecom.CallAudioState
 android.telecom.CallAudioState$1
-android.telecom.CallbackRecord
 android.telecom.Conference
 android.telecom.Conference$Listener
 android.telecom.Conferenceable
@@ -3915,6 +3849,7 @@
 android.telecom.Connection$Listener
 android.telecom.ConnectionRequest
 android.telecom.ConnectionRequest$1
+android.telecom.ConnectionRequest$Builder
 android.telecom.ConnectionService
 android.telecom.ConnectionService$1
 android.telecom.ConnectionService$2
@@ -3927,18 +3862,11 @@
 android.telecom.DefaultDialerManager
 android.telecom.DisconnectCause
 android.telecom.DisconnectCause$1
-android.telecom.GatewayInfo
-android.telecom.InCallAdapter
-android.telecom.InCallService
-android.telecom.InCallService$1
-android.telecom.InCallService$2
-android.telecom.InCallService$InCallServiceBinder
-android.telecom.InCallService$VideoCall
 android.telecom.Log
 android.telecom.Log$1
-android.telecom.Logging.-$Lambda$2$OwO3BlCgqcOx28O1BaOAPVPor24
-android.telecom.Logging.-$Lambda$35$OwO3BlCgqcOx28O1BaOAPVPor24
-android.telecom.Logging.-$Lambda$47$OwO3BlCgqcOx28O1BaOAPVPor24
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24$1
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24$2
 android.telecom.Logging.EventManager
 android.telecom.Logging.EventManager$Event
 android.telecom.Logging.EventManager$EventListener
@@ -3960,8 +3888,6 @@
 android.telecom.ParcelableConference
 android.telecom.ParcelableConnection
 android.telecom.ParcelableConnection$1
-android.telecom.Phone
-android.telecom.Phone$Listener
 android.telecom.PhoneAccount
 android.telecom.PhoneAccount$1
 android.telecom.PhoneAccount$Builder
@@ -3970,17 +3896,10 @@
 android.telecom.RemoteConnectionManager
 android.telecom.StatusHints
 android.telecom.TelecomAnalytics
-android.telecom.TelecomAnalytics$SessionTiming
-android.telecom.TelecomAnalytics$SessionTiming$1
 android.telecom.TelecomManager
-android.telecom.TimedEvent
 android.telecom.VideoProfile
 android.telecom.VideoProfile$1
 android.telephony.CarrierConfigManager
-android.telephony.CellBroadcastMessage
-android.telephony.CellIdentityCdma
-android.telephony.CellIdentityGsm
-android.telephony.CellIdentityLte
 android.telephony.CellIdentityWcdma
 android.telephony.CellIdentityWcdma$1
 android.telephony.CellInfo
@@ -3992,9 +3911,6 @@
 android.telephony.CellInfoWcdma$1
 android.telephony.CellLocation
 android.telephony.CellSignalStrength
-android.telephony.CellSignalStrengthCdma
-android.telephony.CellSignalStrengthGsm
-android.telephony.CellSignalStrengthLte
 android.telephony.CellSignalStrengthWcdma
 android.telephony.CellSignalStrengthWcdma$1
 android.telephony.ClientRequestStats
@@ -4002,7 +3918,6 @@
 android.telephony.DisconnectCause
 android.telephony.IccOpenLogicalChannelResponse
 android.telephony.ModemActivityInfo
-android.telephony.ModemActivityInfo$1
 android.telephony.PhoneNumberFormattingTextWatcher
 android.telephony.PhoneNumberUtils
 android.telephony.PhoneStateListener
@@ -4020,7 +3935,6 @@
 android.telephony.SignalStrength$1
 android.telephony.SmsManager
 android.telephony.SmsMessage
-android.telephony.SmsMessage$MessageClass
 android.telephony.SubscriptionInfo
 android.telephony.SubscriptionInfo$1
 android.telephony.SubscriptionManager
@@ -4034,10 +3948,14 @@
 android.telephony.VisualVoicemailSmsFilterSettings
 android.telephony.VoLteServiceState
 android.telephony.VoLteServiceState$1
-android.telephony.cdma.CdmaCellLocation
-android.telephony.cdma.CdmaSmsCbProgramData
 android.telephony.gsm.GsmCellLocation
-android.telephony.gsm.SmsMessage
+android.telephony.ims.ImsServiceProxy$INotifyStatusChanged
+android.telephony.ims.ImsServiceProxyCompat
+android.telephony.ims.feature.IMMTelFeature
+android.telephony.ims.stub.ImsConfigImplBase
+android.telephony.ims.stub.ImsEcbmImplBase
+android.telephony.ims.stub.ImsUtImplBase
+android.telephony.ims.stub.ImsUtListenerImplBase
 android.text.AndroidBidi
 android.text.AndroidCharacter
 android.text.Annotation
@@ -4052,27 +3970,19 @@
 android.text.Editable
 android.text.Editable$Factory
 android.text.FontConfig
-android.text.FontConfig$1
 android.text.FontConfig$Alias
-android.text.FontConfig$Alias$1
-android.text.FontConfig$Axis
-android.text.FontConfig$Axis$1
 android.text.FontConfig$Family
-android.text.FontConfig$Family$1
 android.text.FontConfig$Font
-android.text.FontConfig$Font$1
 android.text.GetChars
 android.text.GraphicsOperations
 android.text.Html
 android.text.Html$HtmlParser
-android.text.Html$ImageGetter
 android.text.Html$TagHandler
 android.text.HtmlToSpannedConverter
 android.text.HtmlToSpannedConverter$Bold
 android.text.HtmlToSpannedConverter$Href
 android.text.Hyphenator
-android.text.ITextClassificationService
-android.text.ITextClassificationService$Stub
+android.text.Hyphenator$HyphenationData
 android.text.InputFilter
 android.text.InputFilter$LengthFilter
 android.text.InputType
@@ -4153,10 +4063,8 @@
 android.text.method.TransformationMethod
 android.text.method.TransformationMethod2
 android.text.method.WordIterator
-android.text.style.AbsoluteSizeSpan
 android.text.style.AlignmentSpan
 android.text.style.BackgroundColorSpan
-android.text.style.BulletSpan
 android.text.style.CharacterStyle
 android.text.style.CharacterStyle$Passthrough
 android.text.style.ClickableSpan
@@ -4178,17 +4086,14 @@
 android.text.style.SpellCheckSpan
 android.text.style.StrikethroughSpan
 android.text.style.StyleSpan
-android.text.style.SubscriptSpan
 android.text.style.SuggestionSpan
-android.text.style.SuperscriptSpan
 android.text.style.TabStopSpan
 android.text.style.TextAppearanceSpan
 android.text.style.TtsSpan
 android.text.style.TtsSpan$Builder
-android.text.style.TtsSpan$DigitsBuilder
 android.text.style.TtsSpan$SemioticClassBuilder
 android.text.style.TtsSpan$TelephoneBuilder
-android.text.style.TtsSpan$TextBuilder
+android.text.style.TtsSpan$VerbatimBuilder
 android.text.style.TypefaceSpan
 android.text.style.URLSpan
 android.text.style.UnderlineSpan
@@ -4204,6 +4109,7 @@
 android.text.util.Linkify$TransformFilter
 android.text.util.Rfc822Token
 android.text.util.Rfc822Tokenizer
+android.transition.ArcMotion
 android.transition.AutoTransition
 android.transition.ChangeBounds
 android.transition.ChangeBounds$1
@@ -4212,9 +4118,7 @@
 android.transition.ChangeBounds$4
 android.transition.ChangeBounds$5
 android.transition.ChangeBounds$6
-android.transition.ChangeBounds$7
 android.transition.ChangeBounds$9
-android.transition.ChangeBounds$ViewBounds
 android.transition.ChangeClipBounds
 android.transition.ChangeImageTransform
 android.transition.ChangeImageTransform$1
@@ -4226,6 +4130,8 @@
 android.transition.ChangeTransform$GhostListener
 android.transition.ChangeTransform$PathAnimatorMatrix
 android.transition.ChangeTransform$Transforms
+android.transition.CircularPropagation
+android.transition.Explode
 android.transition.Fade
 android.transition.Fade$1
 android.transition.Fade$FadeAnimatorListener
@@ -4247,25 +4153,22 @@
 android.transition.Transition$2
 android.transition.Transition$3
 android.transition.Transition$AnimationInfo
+android.transition.Transition$ArrayListManager
 android.transition.Transition$EpicenterCallback
 android.transition.Transition$TransitionListener
-android.transition.Transition$TransitionListenerAdapter
 android.transition.TransitionInflater
+android.transition.TransitionListenerAdapter
 android.transition.TransitionManager
 android.transition.TransitionManager$MultiListener
 android.transition.TransitionManager$MultiListener$1
 android.transition.TransitionPropagation
 android.transition.TransitionSet
-android.transition.TransitionSet$1
 android.transition.TransitionSet$TransitionSetListener
 android.transition.TransitionUtils
 android.transition.TransitionValues
 android.transition.TransitionValuesMaps
-android.transition.TranslationAnimationCreator
-android.transition.TranslationAnimationCreator$TransitionPositionListener
 android.transition.Visibility
 android.transition.Visibility$1
-android.transition.Visibility$DisappearListener
 android.transition.Visibility$VisibilityInfo
 android.transition.VisibilityPropagation
 android.util.AndroidException
@@ -4281,6 +4184,7 @@
 android.util.Base64$Decoder
 android.util.Base64$Encoder
 android.util.BootTimingsTraceLog
+android.util.ByteStringUtils
 android.util.ContainerHelpers
 android.util.DebugUtils
 android.util.DisplayMetrics
@@ -4289,6 +4193,7 @@
 android.util.FastImmutableArraySet
 android.util.FastImmutableArraySet$FastIterator
 android.util.FloatProperty
+android.util.IconDrawableFactory
 android.util.IntArray
 android.util.IntProperty
 android.util.JsonReader
@@ -4296,19 +4201,21 @@
 android.util.JsonToken
 android.util.JsonWriter
 android.util.KeyValueListParser
+android.util.LauncherIcons
+android.util.LauncherIcons$ShadowDrawable
+android.util.LauncherIcons$ShadowDrawable$MyConstantState
 android.util.LocalLog
 android.util.LocalLog$ReadOnlyLocalLog
 android.util.Log
 android.util.Log$1
 android.util.Log$ImmediateLogWriter
-android.util.Log$NoPreloadHolder
+android.util.Log$TerribleFailure
 android.util.Log$TerribleFailureHandler
 android.util.LogPrinter
 android.util.LongArray
 android.util.LongSparseArray
 android.util.LongSparseLongArray
 android.util.LruCache
-android.util.MalformedJsonException
 android.util.MapCollections
 android.util.MapCollections$ArrayIterator
 android.util.MapCollections$EntrySet
@@ -4318,6 +4225,8 @@
 android.util.MathUtils
 android.util.MemoryIntArray
 android.util.MemoryIntArray$1
+android.util.MergedConfiguration
+android.util.MergedConfiguration$1
 android.util.MutableBoolean
 android.util.MutableInt
 android.util.MutableLong
@@ -4329,7 +4238,6 @@
 android.util.Pools$Pool
 android.util.Pools$SimplePool
 android.util.Pools$SynchronizedPool
-android.util.PrintWriterPrinter
 android.util.Printer
 android.util.Property
 android.util.Range
@@ -4354,20 +4262,28 @@
 android.util.TrustedTime
 android.util.TypedValue
 android.util.Xml
-android.util.Xml$Encoding
 android.util.Xml$XmlSerializerFactory
+android.util.XmlPullAttributes
 android.util.apk.ApkSignatureSchemeV2Verifier
-android.util.apk.ApkSignatureSchemeV2Verifier$ByteBufferDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$DataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$MemoryMappedFileDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$SignatureInfo
 android.util.apk.ApkSignatureSchemeV2Verifier$SignatureNotFoundException
-android.util.apk.ApkSignatureSchemeV2Verifier$VerbatimX509Certificate
-android.util.apk.ApkSignatureSchemeV2Verifier$WrappedX509Certificate
 android.util.apk.ZipUtils
 android.util.jar.StrictJarFile
-android.view.-$Lambda$48$iU_USrtPm1XIm5H9QYQvXfBGDE4
-android.view.-$Lambda$49$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.util.jar.StrictJarFile$EntryIterator
+android.util.jar.StrictJarFile$FDStream
+android.util.jar.StrictJarFile$JarFileInputStream
+android.util.jar.StrictJarFile$ZipInflaterInputStream
+android.util.jar.StrictJarManifest
+android.util.jar.StrictJarManifest$Chunk
+android.util.jar.StrictJarManifestReader
+android.util.jar.StrictJarVerifier
+android.util.jar.StrictJarVerifier$VerifierEntry
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$1
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$2
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$3
+android.view.-$Lambda$P6MTGFSudLpwrqb6oVD8FdorW1c
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4$1
 android.view.AbsSavedState
 android.view.AbsSavedState$1
 android.view.AbsSavedState$2
@@ -4386,7 +4302,6 @@
 android.view.Choreographer$FrameCallback
 android.view.Choreographer$FrameDisplayEventReceiver
 android.view.Choreographer$FrameHandler
-android.view.CollapsibleActionView
 android.view.ContextMenu
 android.view.ContextMenu$ContextMenuInfo
 android.view.ContextThemeWrapper
@@ -4400,12 +4315,13 @@
 android.view.DisplayInfo
 android.view.DisplayInfo$1
 android.view.DisplayListCanvas
-android.view.DragAndDropPermissions
 android.view.DragEvent
 android.view.FallbackEventHandler
 android.view.FocusFinder
 android.view.FocusFinder$1
-android.view.FocusFinder$SequentialFocusComparator
+android.view.FocusFinder$FocusSorter
+android.view.FocusFinder$UserSpecifiedFocusComparator
+android.view.FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter
 android.view.FrameInfo
 android.view.FrameMetrics
 android.view.FrameMetricsObserver
@@ -4432,6 +4348,9 @@
 android.view.IGraphicsStats
 android.view.IGraphicsStats$Stub
 android.view.IGraphicsStats$Stub$Proxy
+android.view.IGraphicsStatsCallback
+android.view.IGraphicsStatsCallback$Stub
+android.view.IGraphicsStatsCallback$Stub$Proxy
 android.view.IInputFilter
 android.view.IOnKeyguardExitResult
 android.view.IPinnedStackController
@@ -4477,11 +4396,14 @@
 android.view.KeyCharacterMap
 android.view.KeyCharacterMap$1
 android.view.KeyCharacterMap$FallbackAction
-android.view.KeyCharacterMap$KeyData
 android.view.KeyEvent
 android.view.KeyEvent$1
 android.view.KeyEvent$Callback
 android.view.KeyEvent$DispatcherState
+android.view.KeyboardShortcutGroup
+android.view.KeyboardShortcutGroup$1
+android.view.KeyboardShortcutInfo
+android.view.KeyboardShortcutInfo$1
 android.view.LayoutInflater
 android.view.LayoutInflater$Factory
 android.view.LayoutInflater$Factory2
@@ -4500,7 +4422,6 @@
 android.view.MotionEvent$PointerProperties
 android.view.NotificationHeaderView
 android.view.NotificationHeaderView$1
-android.view.NotificationHeaderView$2
 android.view.NotificationHeaderView$HeaderTouchListener
 android.view.OrientationEventListener
 android.view.OrientationEventListener$SensorEventListenerImpl
@@ -4512,19 +4433,16 @@
 android.view.RenderNode$NoImagePreloadHolder
 android.view.RenderNodeAnimator
 android.view.RenderNodeAnimator$1
-android.view.RenderNodeAnimator$DelayedAnimationHelper
 android.view.RenderNodeAnimatorSetHelper
 android.view.ScaleGestureDetector
 android.view.ScaleGestureDetector$1
 android.view.ScaleGestureDetector$OnScaleGestureListener
 android.view.ScaleGestureDetector$SimpleOnScaleGestureListener
 android.view.SearchEvent
-android.view.SoundEffectConstants
 android.view.SubMenu
 android.view.Surface
 android.view.Surface$1
 android.view.Surface$CompatibleCanvas
-android.view.Surface$HwuiContext
 android.view.Surface$OutOfResourcesException
 android.view.SurfaceControl
 android.view.SurfaceControl$PhysicalDisplayInfo
@@ -4537,13 +4455,13 @@
 android.view.SurfaceView$2
 android.view.SurfaceView$3
 android.view.SurfaceView$4
-android.view.SurfaceView$MyWindow
 android.view.TextureView
 android.view.TextureView$1
 android.view.TextureView$SurfaceTextureListener
 android.view.ThreadedRenderer
 android.view.ThreadedRenderer$DrawCallbacks
 android.view.ThreadedRenderer$ProcessInitializer
+android.view.ThreadedRenderer$ProcessInitializer$1
 android.view.TouchDelegate
 android.view.VelocityTracker
 android.view.VelocityTracker$Estimator
@@ -4563,13 +4481,11 @@
 android.view.View$AccessibilityDelegate
 android.view.View$AttachInfo
 android.view.View$AttachInfo$Callbacks
-android.view.View$AttachInfo$InvalidateInfo
 android.view.View$BaseSavedState
 android.view.View$BaseSavedState$1
 android.view.View$CheckForLongPress
 android.view.View$CheckForTap
 android.view.View$DeclaredOnClickListener
-android.view.View$DragShadowBuilder
 android.view.View$ForegroundInfo
 android.view.View$ListenerInfo
 android.view.View$MatchIdPredicate
@@ -4585,6 +4501,7 @@
 android.view.View$OnKeyListener
 android.view.View$OnLayoutChangeListener
 android.view.View$OnLongClickListener
+android.view.View$OnScrollChangeListener
 android.view.View$OnSystemUiVisibilityChangeListener
 android.view.View$OnTouchListener
 android.view.View$PerformClick
@@ -4593,6 +4510,7 @@
 android.view.View$TooltipInfo
 android.view.View$TransformationInfo
 android.view.View$UnsetPressedState
+android.view.View$VisibilityChangeForAutofillHandler
 android.view.ViewAnimationUtils
 android.view.ViewConfiguration
 android.view.ViewDebug$CapturedViewProperty
@@ -4603,6 +4521,7 @@
 android.view.ViewGroup$2
 android.view.ViewGroup$3
 android.view.ViewGroup$4
+android.view.ViewGroup$ChildListForAutoFill
 android.view.ViewGroup$LayoutParams
 android.view.ViewGroup$MarginLayoutParams
 android.view.ViewGroup$OnHierarchyChangeListener
@@ -4628,7 +4547,9 @@
 android.view.ViewRootImpl$2
 android.view.ViewRootImpl$4
 android.view.ViewRootImpl$AccessibilityInteractionConnectionManager
+android.view.ViewRootImpl$ActivityConfigCallback
 android.view.ViewRootImpl$AsyncInputStage
+android.view.ViewRootImpl$ConfigChangedCallback
 android.view.ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable
 android.view.ViewRootImpl$ConsumeBatchedInputRunnable
 android.view.ViewRootImpl$EarlyPostImeInputStage
@@ -4653,9 +4574,12 @@
 android.view.ViewRootImpl$ViewRootHandler
 android.view.ViewRootImpl$W
 android.view.ViewRootImpl$WindowInputEventReceiver
+android.view.ViewRootImpl$WindowStoppedCallback
 android.view.ViewStructure
+android.view.ViewStructure$HtmlInfo
 android.view.ViewStub
 android.view.ViewStub$OnInflateListener
+android.view.ViewStub$ViewReplaceRunnable
 android.view.ViewTreeObserver
 android.view.ViewTreeObserver$CopyOnWriteArray
 android.view.ViewTreeObserver$CopyOnWriteArray$Access
@@ -4701,24 +4625,23 @@
 android.view.WindowManagerPolicy$InputConsumer
 android.view.WindowManagerPolicy$OnKeyguardExitResult
 android.view.WindowManagerPolicy$PointerEventListener
+android.view.WindowManagerPolicy$ScreenOffListener
 android.view.WindowManagerPolicy$ScreenOnListener
 android.view.WindowManagerPolicy$StartingSurface
 android.view.WindowManagerPolicy$WindowManagerFuncs
 android.view.WindowManagerPolicy$WindowState
 android.view.accessibility.AccessibilityEvent
+android.view.accessibility.AccessibilityEvent$1
 android.view.accessibility.AccessibilityEventSource
 android.view.accessibility.AccessibilityManager
 android.view.accessibility.AccessibilityManager$1
 android.view.accessibility.AccessibilityManager$AccessibilityServicesStateChangeListener
 android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener
 android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener
-android.view.accessibility.AccessibilityManager$MyHandler
+android.view.accessibility.AccessibilityManager$MyCallback
 android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
 android.view.accessibility.AccessibilityNodeInfo
-android.view.accessibility.AccessibilityNodeInfo$1
 android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction
-android.view.accessibility.AccessibilityNodeInfo$CollectionInfo
-android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo
 android.view.accessibility.AccessibilityNodeProvider
 android.view.accessibility.AccessibilityRecord
 android.view.accessibility.CaptioningManager
@@ -4727,6 +4650,9 @@
 android.view.accessibility.CaptioningManager$CaptioningChangeListener
 android.view.accessibility.CaptioningManager$MyContentObserver
 android.view.accessibility.IAccessibilityInteractionConnection
+android.view.accessibility.IAccessibilityInteractionConnection$Stub
+android.view.accessibility.IAccessibilityInteractionConnection$Stub$Proxy
+android.view.accessibility.IAccessibilityInteractionConnectionCallback
 android.view.accessibility.IAccessibilityManager
 android.view.accessibility.IAccessibilityManager$Stub
 android.view.accessibility.IAccessibilityManager$Stub$Proxy
@@ -4758,15 +4684,24 @@
 android.view.animation.LinearInterpolator
 android.view.animation.OvershootInterpolator
 android.view.animation.PathInterpolator
-android.view.animation.RotateAnimation
 android.view.animation.ScaleAnimation
 android.view.animation.Transformation
 android.view.animation.TranslateAnimation
-android.view.autofill.AutoFillId
-android.view.autofill.AutoFillId$1
-android.view.autofill.AutoFillManager
-android.view.autofill.AutoFillType
-android.view.autofill.AutoFillType$1
+android.view.autofill.AutofillId
+android.view.autofill.AutofillId$1
+android.view.autofill.AutofillManager
+android.view.autofill.AutofillManager$AutofillClient
+android.view.autofill.AutofillManager$AutofillManagerClient
+android.view.autofill.AutofillValue
+android.view.autofill.AutofillValue$1
+android.view.autofill.Helper
+android.view.autofill.IAutoFillManager
+android.view.autofill.IAutoFillManager$Stub
+android.view.autofill.IAutoFillManager$Stub$Proxy
+android.view.autofill.IAutoFillManagerClient
+android.view.autofill.IAutoFillManagerClient$Stub
+android.view.autofill.IAutoFillManagerClient$Stub$Proxy
+android.view.autofill.IAutofillWindowPresenter
 android.view.inputmethod.BaseInputConnection
 android.view.inputmethod.CompletionInfo
 android.view.inputmethod.CompletionInfo$1
@@ -4806,9 +4741,9 @@
 android.view.inputmethod.InputMethodSubtype$InputMethodSubtypeBuilder
 android.view.inputmethod.InputMethodSubtypeArray
 android.view.textclassifier.TextClassificationManager
-android.view.textclassifier.TextLanguage
-android.view.textservice.SentenceSuggestionsInfo
-android.view.textservice.SentenceSuggestionsInfo$1
+android.view.textclassifier.TextClassifier
+android.view.textclassifier.TextClassifier$1
+android.view.textclassifier.TextClassifierImpl
 android.view.textservice.SpellCheckerInfo
 android.view.textservice.SpellCheckerInfo$1
 android.view.textservice.SpellCheckerSession
@@ -4820,9 +4755,7 @@
 android.view.textservice.SpellCheckerSubtype
 android.view.textservice.SpellCheckerSubtype$1
 android.view.textservice.SuggestionsInfo
-android.view.textservice.SuggestionsInfo$1
 android.view.textservice.TextInfo
-android.view.textservice.TextInfo$1
 android.view.textservice.TextServicesManager
 android.webkit.ConsoleMessage
 android.webkit.ConsoleMessage$MessageLevel
@@ -4830,18 +4763,14 @@
 android.webkit.CookieSyncManager
 android.webkit.DownloadListener
 android.webkit.GeolocationPermissions
-android.webkit.GeolocationPermissions$Callback
 android.webkit.IWebViewUpdateService
 android.webkit.IWebViewUpdateService$Stub
 android.webkit.IWebViewUpdateService$Stub$Proxy
 android.webkit.JavascriptInterface
-android.webkit.JsPromptResult
-android.webkit.JsResult
 android.webkit.MimeTypeMap
 android.webkit.ServiceWorkerClient
 android.webkit.ServiceWorkerController
 android.webkit.ServiceWorkerWebSettings
-android.webkit.SslErrorHandler
 android.webkit.TokenBindingService
 android.webkit.URLUtil
 android.webkit.UserPackage
@@ -4849,19 +4778,16 @@
 android.webkit.WebBackForwardList
 android.webkit.WebChromeClient
 android.webkit.WebChromeClient$CustomViewCallback
-android.webkit.WebHistoryItem
 android.webkit.WebIconDatabase
 android.webkit.WebMessage
 android.webkit.WebMessagePort
 android.webkit.WebResourceRequest
-android.webkit.WebResourceResponse
 android.webkit.WebSettings
 android.webkit.WebSettings$LayoutAlgorithm
 android.webkit.WebSettings$PluginState
 android.webkit.WebSettings$RenderPriority
 android.webkit.WebSettings$ZoomDensity
 android.webkit.WebStorage
-android.webkit.WebStorage$QuotaUpdater
 android.webkit.WebSyncManager
 android.webkit.WebView
 android.webkit.WebView$FindListener
@@ -4880,7 +4806,6 @@
 android.webkit.WebViewFactory$RelroFileCreator
 android.webkit.WebViewFactoryProvider
 android.webkit.WebViewFactoryProvider$Statics
-android.webkit.WebViewFragment
 android.webkit.WebViewProvider
 android.webkit.WebViewProvider$ScrollDelegate
 android.webkit.WebViewProvider$ViewDelegate
@@ -4889,23 +4814,22 @@
 android.webkit.WebViewProviderResponse
 android.webkit.WebViewProviderResponse$1
 android.webkit.WebViewZygote
-android.widget.-$Lambda$50$tfOQKOmkDz_xLYaBQX_cysn8vbE
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$1
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$2
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$3
+android.widget.-$Lambda$tfOQKOmkDz_xLYaBQX_cysn8vbE
 android.widget.AbsListView
 android.widget.AbsListView$3
-android.widget.AbsListView$4
-android.widget.AbsListView$AbsPositionScroller
 android.widget.AbsListView$AdapterDataSetObserver
 android.widget.AbsListView$CheckForTap
 android.widget.AbsListView$FlingRunnable
 android.widget.AbsListView$FlingRunnable$1
-android.widget.AbsListView$InputConnectionWrapper
 android.widget.AbsListView$LayoutParams
 android.widget.AbsListView$MultiChoiceModeListener
 android.widget.AbsListView$MultiChoiceModeWrapper
 android.widget.AbsListView$OnScrollListener
 android.widget.AbsListView$PerformClick
-android.widget.AbsListView$PositionScroller
-android.widget.AbsListView$PositionScroller$1
 android.widget.AbsListView$RecycleBin
 android.widget.AbsListView$RecyclerListener
 android.widget.AbsListView$SavedState
@@ -4915,20 +4839,14 @@
 android.widget.AbsSeekBar
 android.widget.AbsSpinner
 android.widget.AbsSpinner$RecycleBin
-android.widget.AbsSpinner$SavedState
-android.widget.AbsSpinner$SavedState$1
 android.widget.AbsoluteLayout
 android.widget.ActionMenuPresenter
 android.widget.ActionMenuPresenter$1
 android.widget.ActionMenuPresenter$2
 android.widget.ActionMenuPresenter$ActionMenuPopupCallback
-android.widget.ActionMenuPresenter$OpenOverflowRunnable
 android.widget.ActionMenuPresenter$OverflowMenuButton
 android.widget.ActionMenuPresenter$OverflowMenuButton$1
-android.widget.ActionMenuPresenter$OverflowPopup
 android.widget.ActionMenuPresenter$PopupPresenterCallback
-android.widget.ActionMenuPresenter$SavedState
-android.widget.ActionMenuPresenter$SavedState$1
 android.widget.ActionMenuView
 android.widget.ActionMenuView$ActionMenuChildView
 android.widget.ActionMenuView$ActionMenuPresenterCallback
@@ -4937,7 +4855,6 @@
 android.widget.ActionMenuView$OnMenuItemClickListener
 android.widget.Adapter
 android.widget.AdapterView
-android.widget.AdapterView$AdapterContextMenuInfo
 android.widget.AdapterView$AdapterDataSetObserver
 android.widget.AdapterView$OnItemClickListener
 android.widget.AdapterView$OnItemLongClickListener
@@ -4960,11 +4877,9 @@
 android.widget.Chronometer$1
 android.widget.CompoundButton
 android.widget.CompoundButton$OnCheckedChangeListener
-android.widget.CompoundButton$SavedState
-android.widget.CompoundButton$SavedState$1
 android.widget.CursorAdapter
 android.widget.CursorFilter$CursorFilterClient
-android.widget.DatePicker$OnDateChangedListener
+android.widget.DatePicker
 android.widget.DateTimeView
 android.widget.DateTimeView$ReceiverInfo
 android.widget.DateTimeView$ReceiverInfo$1
@@ -4988,7 +4903,6 @@
 android.widget.Editor$InsertionPointCursorController
 android.widget.Editor$PositionListener
 android.widget.Editor$ProcessTextIntentActionsHandler
-android.widget.Editor$SelectionHandleView
 android.widget.Editor$SelectionModifierCursorController
 android.widget.Editor$SpanController
 android.widget.Editor$SuggestionHelper
@@ -5010,11 +4924,8 @@
 android.widget.Filter$RequestArguments
 android.widget.Filter$RequestHandler
 android.widget.Filter$ResultsHandler
-android.widget.FilterQueryProvider
 android.widget.Filterable
 android.widget.ForwardingListener
-android.widget.ForwardingListener$DisallowIntercept
-android.widget.ForwardingListener$TriggerLongPress
 android.widget.FrameLayout
 android.widget.FrameLayout$LayoutParams
 android.widget.GridLayout
@@ -5045,6 +4956,7 @@
 android.widget.HorizontalScrollView$SavedState$1
 android.widget.ImageButton
 android.widget.ImageView
+android.widget.ImageView$ImageDrawableCallback
 android.widget.ImageView$ScaleType
 android.widget.LinearLayout
 android.widget.LinearLayout$LayoutParams
@@ -5061,18 +4973,7 @@
 android.widget.ListView$ArrowScrollFocusResult
 android.widget.ListView$FixedViewInfo
 android.widget.MediaController
-android.widget.MediaController$1
-android.widget.MediaController$2
-android.widget.MediaController$3
-android.widget.MediaController$4
-android.widget.MediaController$5
-android.widget.MediaController$6
-android.widget.MediaController$7
-android.widget.MediaController$8
 android.widget.MediaController$MediaPlayerControl
-android.widget.MenuItemHoverListener
-android.widget.MenuPopupWindow
-android.widget.MenuPopupWindow$MenuDropDownListView
 android.widget.MultiAutoCompleteTextView
 android.widget.MultiAutoCompleteTextView$Tokenizer
 android.widget.NumberPicker
@@ -5084,20 +4985,14 @@
 android.widget.PopupMenu$1
 android.widget.PopupMenu$2
 android.widget.PopupMenu$3
-android.widget.PopupMenu$OnDismissListener
 android.widget.PopupMenu$OnMenuItemClickListener
 android.widget.PopupWindow
 android.widget.PopupWindow$1
 android.widget.PopupWindow$2
-android.widget.PopupWindow$3
 android.widget.PopupWindow$OnDismissListener
 android.widget.PopupWindow$PopupBackgroundView
 android.widget.PopupWindow$PopupDecorView
 android.widget.PopupWindow$PopupDecorView$1
-android.widget.PopupWindow$PopupDecorView$2
-android.widget.PopupWindow$PopupDecorView$2$1
-android.widget.PopupWindow$PopupDecorView$3
-android.widget.PopupWindow$PopupDecorView$4
 android.widget.ProgressBar
 android.widget.ProgressBar$1
 android.widget.ProgressBar$ProgressTintInfo
@@ -5122,25 +5017,30 @@
 android.widget.RemoteViews$1
 android.widget.RemoteViews$2
 android.widget.RemoteViews$3
-android.widget.RemoteViews$4
 android.widget.RemoteViews$Action
 android.widget.RemoteViews$ActionException
+android.widget.RemoteViews$AsyncApplyTask
 android.widget.RemoteViews$BitmapCache
 android.widget.RemoteViews$BitmapReflectionAction
 android.widget.RemoteViews$LayoutParamAction
 android.widget.RemoteViews$MemoryUsageCounter
 android.widget.RemoteViews$MutablePair
 android.widget.RemoteViews$OnClickHandler
+android.widget.RemoteViews$OnViewAppliedListener
 android.widget.RemoteViews$ReflectionAction
 android.widget.RemoteViews$RemoteView
+android.widget.RemoteViews$RemoteViewsContextWrapper
+android.widget.RemoteViews$RunnableAction
 android.widget.RemoteViews$RuntimeAction
 android.widget.RemoteViews$SetDrawableParameters
 android.widget.RemoteViews$SetOnClickPendingIntent
 android.widget.RemoteViews$SetOnClickPendingIntent$1
 android.widget.RemoteViews$ViewGroupAction
+android.widget.RemoteViews$ViewGroupAction$1
+android.widget.RemoteViews$ViewGroupAction$2
+android.widget.RemoteViews$ViewPaddingAction
+android.widget.RemoteViews$ViewTree
 android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
-android.widget.RemoteViewsService
-android.widget.RemoteViewsService$RemoteViewsFactory
 android.widget.ResourceCursorAdapter
 android.widget.RtlSpacingHelper
 android.widget.ScrollBarDrawable
@@ -5149,37 +5049,23 @@
 android.widget.ScrollView$SavedState$1
 android.widget.Scroller
 android.widget.Scroller$ViscousFluidInterpolator
-android.widget.SearchView
-android.widget.SearchView$1
-android.widget.SearchView$10
-android.widget.SearchView$11
-android.widget.SearchView$2
-android.widget.SearchView$3
-android.widget.SearchView$4
-android.widget.SearchView$5
-android.widget.SearchView$6
-android.widget.SearchView$7
-android.widget.SearchView$8
-android.widget.SearchView$9
 android.widget.SearchView$OnCloseListener
-android.widget.SearchView$OnQueryTextListener
-android.widget.SearchView$SearchAutoComplete
-android.widget.SearchView$UpdatableTouchDelegate
 android.widget.SectionIndexer
 android.widget.SeekBar
 android.widget.SeekBar$OnSeekBarChangeListener
+android.widget.SelectionActionModeHelper
+android.widget.SelectionActionModeHelper$SelectionTracker
+android.widget.SelectionActionModeHelper$TextClassificationHelper
 android.widget.SimpleCursorAdapter
 android.widget.Space
 android.widget.SpellChecker
-android.widget.SpellChecker$1
 android.widget.SpellChecker$SpellParser
 android.widget.Spinner
 android.widget.Spinner$1
+android.widget.Spinner$DialogPopup
 android.widget.Spinner$DropDownAdapter
 android.widget.Spinner$DropdownPopup
 android.widget.Spinner$DropdownPopup$1
-android.widget.Spinner$SavedState
-android.widget.Spinner$SavedState$1
 android.widget.Spinner$SpinnerPopup
 android.widget.SpinnerAdapter
 android.widget.Switch
@@ -5198,11 +5084,6 @@
 android.widget.TabWidget$OnTabSelectionChanged
 android.widget.TabWidget$TabClickListener
 android.widget.TableLayout
-android.widget.TableLayout$LayoutParams
-android.widget.TableLayout$PassThroughHierarchyChangeListener
-android.widget.TableRow
-android.widget.TableRow$ChildrenTracker
-android.widget.TableRow$LayoutParams
 android.widget.TextClock
 android.widget.TextClock$1
 android.widget.TextClock$2
@@ -5215,6 +5096,10 @@
 android.widget.TextView$ChangeWatcher
 android.widget.TextView$CharWrapper
 android.widget.TextView$Drawables
+android.widget.TextView$Marquee
+android.widget.TextView$Marquee$1
+android.widget.TextView$Marquee$2
+android.widget.TextView$Marquee$3
 android.widget.TextView$OnEditorActionListener
 android.widget.TextView$SavedState
 android.widget.TextView$SavedState$1
@@ -5231,52 +5116,15 @@
 android.widget.Toolbar$ExpandedActionViewMenuPresenter
 android.widget.Toolbar$LayoutParams
 android.widget.Toolbar$OnMenuItemClickListener
-android.widget.Toolbar$SavedState
-android.widget.Toolbar$SavedState$1
 android.widget.VideoView
-android.widget.VideoView$1
-android.widget.VideoView$2
-android.widget.VideoView$3
-android.widget.VideoView$4
-android.widget.VideoView$5
-android.widget.VideoView$6
-android.widget.VideoView$7
 android.widget.ViewAnimator
 android.widget.ViewFlipper
 android.widget.ViewFlipper$1
 android.widget.ViewFlipper$2
 android.widget.ViewSwitcher
 android.widget.WrapperListAdapter
-android.widget.ZoomButtonsController
-com.android.dex.ClassData
-com.android.dex.ClassData$Method
-com.android.dex.ClassDef
-com.android.dex.Code
-com.android.dex.Dex
-com.android.dex.Dex$ClassDefIterable
-com.android.dex.Dex$FieldIdTable
-com.android.dex.Dex$MethodIdTable
-com.android.dex.Dex$ProtoIdTable
-com.android.dex.Dex$Section
-com.android.dex.Dex$StringTable
-com.android.dex.Dex$TypeIndexToDescriptorIndexTable
-com.android.dex.Dex$TypeIndexToDescriptorTable
-com.android.dex.DexException
-com.android.dex.DexFormat
-com.android.dex.FieldId
-com.android.dex.Leb128
-com.android.dex.MethodId
-com.android.dex.Mutf8
-com.android.dex.TableOfContents
-com.android.dex.TableOfContents$Section
-com.android.dex.TypeList
-com.android.dex.util.ByteInput
-com.android.dex.util.ByteOutput
-com.android.dex.util.ExceptionWithContext
-com.android.dex.util.FileUtils
 com.android.framework.protobuf.nano.CodedInputByteBufferNano
 com.android.framework.protobuf.nano.CodedOutputByteBufferNano
-com.android.framework.protobuf.nano.ExtendableMessageNano
 com.android.framework.protobuf.nano.InternalNano
 com.android.framework.protobuf.nano.InvalidProtocolBufferNanoException
 com.android.framework.protobuf.nano.MessageNano
@@ -5316,6 +5164,7 @@
 com.android.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder
 com.android.i18n.phonenumbers.prefixmapper.MappingFileProvider
 com.android.i18n.phonenumbers.prefixmapper.PrefixFileReader
+com.android.ims.-$Lambda$AvFHcs3Z6Dq6dkOugMW9Kc7Qzng$4
 com.android.ims.ImsCall$Listener
 com.android.ims.ImsCallForwardInfo
 com.android.ims.ImsCallProfile
@@ -5330,11 +5179,8 @@
 com.android.ims.ImsExternalCallStateListener
 com.android.ims.ImsManager
 com.android.ims.ImsManager$1
-com.android.ims.ImsManager$2
 com.android.ims.ImsManager$ImsRegistrationListenerProxy
 com.android.ims.ImsManager$ImsServiceDeathRecipient
-com.android.ims.ImsMultiEndpoint
-com.android.ims.ImsMultiEndpoint$ImsExternalCallStateListenerProxy
 com.android.ims.ImsReasonInfo
 com.android.ims.ImsReasonInfo$1
 com.android.ims.ImsSsInfo
@@ -5342,80 +5188,32 @@
 com.android.ims.internal.IImsCallSessionListener
 com.android.ims.internal.IImsConfig
 com.android.ims.internal.IImsConfig$Stub
-com.android.ims.internal.IImsConfig$Stub$Proxy
 com.android.ims.internal.IImsEcbm
 com.android.ims.internal.IImsEcbm$Stub
 com.android.ims.internal.IImsEcbmListener
 com.android.ims.internal.IImsEcbmListener$Stub
-com.android.ims.internal.IImsExternalCallStateListener
-com.android.ims.internal.IImsExternalCallStateListener$Stub
 com.android.ims.internal.IImsMultiEndpoint
-com.android.ims.internal.IImsMultiEndpoint$Stub
 com.android.ims.internal.IImsRegistrationListener
 com.android.ims.internal.IImsRegistrationListener$Stub
-com.android.ims.internal.IImsRegistrationListener$Stub$Proxy
 com.android.ims.internal.IImsService
 com.android.ims.internal.IImsService$Stub
-com.android.ims.internal.IImsService$Stub$Proxy
 com.android.ims.internal.IImsServiceController
 com.android.ims.internal.IImsServiceFeatureListener
 com.android.ims.internal.IImsUt
 com.android.ims.internal.IImsUt$Stub
 com.android.ims.internal.IImsUtListener
 com.android.ims.internal.IImsUtListener$Stub
-com.android.ims.internal.uce.common.CapInfo
-com.android.ims.internal.uce.common.CapInfo$1
-com.android.ims.internal.uce.common.StatusCode
-com.android.ims.internal.uce.common.StatusCode$1
-com.android.ims.internal.uce.common.UceLong
-com.android.ims.internal.uce.common.UceLong$1
-com.android.ims.internal.uce.options.IOptionsListener
-com.android.ims.internal.uce.options.IOptionsService
-com.android.ims.internal.uce.presence.IPresenceListener
-com.android.ims.internal.uce.presence.IPresenceListener$Stub
-com.android.ims.internal.uce.presence.IPresenceListener$Stub$Proxy
-com.android.ims.internal.uce.presence.IPresenceService
-com.android.ims.internal.uce.presence.IPresenceService$Stub
-com.android.ims.internal.uce.presence.IPresenceService$Stub$Proxy
-com.android.ims.internal.uce.presence.PresCapInfo
-com.android.ims.internal.uce.presence.PresCmdId
-com.android.ims.internal.uce.presence.PresCmdId$1
-com.android.ims.internal.uce.presence.PresCmdStatus
-com.android.ims.internal.uce.presence.PresCmdStatus$1
-com.android.ims.internal.uce.presence.PresPublishTriggerType
-com.android.ims.internal.uce.presence.PresPublishTriggerType$1
-com.android.ims.internal.uce.presence.PresResInfo
-com.android.ims.internal.uce.presence.PresResInfo$1
-com.android.ims.internal.uce.presence.PresResInstanceInfo
-com.android.ims.internal.uce.presence.PresResInstanceInfo$1
-com.android.ims.internal.uce.presence.PresRlmiInfo
-com.android.ims.internal.uce.presence.PresRlmiInfo$1
-com.android.ims.internal.uce.presence.PresServiceInfo
-com.android.ims.internal.uce.presence.PresSipResponse
-com.android.ims.internal.uce.presence.PresSipResponse$1
-com.android.ims.internal.uce.presence.PresSubscriptionState
-com.android.ims.internal.uce.presence.PresSubscriptionState$1
-com.android.ims.internal.uce.presence.PresTupleInfo
-com.android.ims.internal.uce.presence.PresTupleInfo$1
-com.android.ims.internal.uce.uceservice.IUceListener
-com.android.ims.internal.uce.uceservice.IUceListener$Stub
-com.android.ims.internal.uce.uceservice.IUceService
-com.android.ims.internal.uce.uceservice.IUceService$Stub
-com.android.ims.internal.uce.uceservice.IUceService$Stub$Proxy
-com.android.ims.internal.uce.uceservice.ImsUceManager
-com.android.ims.internal.uce.uceservice.ImsUceManager$UceServiceDeathRecipient
 com.android.internal.R$styleable
 com.android.internal.alsa.AlsaCardsParser
 com.android.internal.alsa.AlsaCardsParser$AlsaCardRecord
 com.android.internal.alsa.AlsaDevicesParser
 com.android.internal.alsa.LineTokenizer
-com.android.internal.app.AlertActivity
 com.android.internal.app.AlertController
 com.android.internal.app.AlertController$1
 com.android.internal.app.AlertController$AlertParams
-com.android.internal.app.AlertController$AlertParams$3
+com.android.internal.app.AlertController$AlertParams$1
+com.android.internal.app.AlertController$AlertParams$4
 com.android.internal.app.AlertController$ButtonHandler
-com.android.internal.app.AlertController$CheckedItemAdapter
 com.android.internal.app.AlertController$RecycleListView
 com.android.internal.app.AssistUtils
 com.android.internal.app.IAppOpsCallback
@@ -5425,7 +5223,6 @@
 com.android.internal.app.IAppOpsService$Stub
 com.android.internal.app.IAppOpsService$Stub$Proxy
 com.android.internal.app.IAssistScreenshotReceiver
-com.android.internal.app.IAssistScreenshotReceiver$Stub
 com.android.internal.app.IBatteryStats
 com.android.internal.app.IBatteryStats$Stub
 com.android.internal.app.IBatteryStats$Stub$Proxy
@@ -5442,15 +5239,9 @@
 com.android.internal.app.IVoiceInteractionSessionListener$Stub$Proxy
 com.android.internal.app.IVoiceInteractionSessionShowCallback
 com.android.internal.app.IVoiceInteractionSessionShowCallback$Stub
-com.android.internal.app.IVoiceInteractionSessionShowCallback$Stub$Proxy
 com.android.internal.app.IVoiceInteractor
 com.android.internal.app.IVoiceInteractor$Stub
-com.android.internal.app.IVoiceInteractor$Stub$Proxy
-com.android.internal.app.LocaleHelper
-com.android.internal.app.LocalePicker
-com.android.internal.app.LocalePickerWithRegion$LocaleSelectedListener
 com.android.internal.app.NightDisplayController
-com.android.internal.app.NightDisplayController$1
 com.android.internal.app.NightDisplayController$Callback
 com.android.internal.app.NightDisplayController$LocalTime
 com.android.internal.app.ProcessMap
@@ -5465,20 +5256,16 @@
 com.android.internal.app.WindowDecorActionBar$1
 com.android.internal.app.WindowDecorActionBar$2
 com.android.internal.app.WindowDecorActionBar$3
-com.android.internal.app.procstats.DumpUtils
+com.android.internal.app.WindowDecorActionBar$ActionModeImpl
 com.android.internal.app.procstats.DurationsTable
 com.android.internal.app.procstats.IProcessStats
 com.android.internal.app.procstats.IProcessStats$Stub
-com.android.internal.app.procstats.IProcessStats$Stub$Proxy
 com.android.internal.app.procstats.ProcessState
 com.android.internal.app.procstats.ProcessState$1
-com.android.internal.app.procstats.ProcessState$PssAggr
 com.android.internal.app.procstats.ProcessStats
 com.android.internal.app.procstats.ProcessStats$1
 com.android.internal.app.procstats.ProcessStats$PackageState
-com.android.internal.app.procstats.ProcessStats$ProcessDataCollection
 com.android.internal.app.procstats.ProcessStats$ProcessStateHolder
-com.android.internal.app.procstats.ProcessStats$TotalMemoryUseCollection
 com.android.internal.app.procstats.PssTable
 com.android.internal.app.procstats.ServiceState
 com.android.internal.app.procstats.SparseMappingTable
@@ -5495,8 +5282,12 @@
 com.android.internal.backup.IBackupTransport$Stub$Proxy
 com.android.internal.backup.LocalTransport
 com.android.internal.backup.LocalTransportService
+com.android.internal.content.FileSystemProvider
 com.android.internal.content.NativeLibraryHelper
+com.android.internal.content.NativeLibraryHelper$Handle
 com.android.internal.content.PackageHelper
+com.android.internal.content.PackageHelper$1
+com.android.internal.content.PackageHelper$TestableInterface
 com.android.internal.content.PackageMonitor
 com.android.internal.content.ReferrerIntent
 com.android.internal.content.ReferrerIntent$1
@@ -5539,25 +5330,25 @@
 com.android.internal.net.VpnConfig
 com.android.internal.net.VpnInfo
 com.android.internal.net.VpnProfile
+com.android.internal.notification.SystemNotificationChannels
 com.android.internal.os.AndroidPrintStream
 com.android.internal.os.AppFuseMount
 com.android.internal.os.AtomicFile
 com.android.internal.os.BackgroundThread
-com.android.internal.os.BatterySipper
-com.android.internal.os.BatterySipper$DrainType
 com.android.internal.os.BatteryStatsHelper
-com.android.internal.os.BatteryStatsHelper$1
 com.android.internal.os.BatteryStatsImpl
 com.android.internal.os.BatteryStatsImpl$1
-com.android.internal.os.BatteryStatsImpl$5
+com.android.internal.os.BatteryStatsImpl$6
 com.android.internal.os.BatteryStatsImpl$BatchTimer
 com.android.internal.os.BatteryStatsImpl$BatteryCallback
 com.android.internal.os.BatteryStatsImpl$Clocks
 com.android.internal.os.BatteryStatsImpl$ControllerActivityCounterImpl
 com.android.internal.os.BatteryStatsImpl$Counter
+com.android.internal.os.BatteryStatsImpl$DualTimer
 com.android.internal.os.BatteryStatsImpl$DurationTimer
 com.android.internal.os.BatteryStatsImpl$ExternalStatsSync
 com.android.internal.os.BatteryStatsImpl$LongSamplingCounter
+com.android.internal.os.BatteryStatsImpl$LongSamplingCounterArray
 com.android.internal.os.BatteryStatsImpl$MyHandler
 com.android.internal.os.BatteryStatsImpl$OverflowArrayMap
 com.android.internal.os.BatteryStatsImpl$PlatformIdleStateCallback
@@ -5573,43 +5364,32 @@
 com.android.internal.os.BatteryStatsImpl$Uid$3
 com.android.internal.os.BatteryStatsImpl$Uid$Pkg
 com.android.internal.os.BatteryStatsImpl$Uid$Pkg$Serv
-com.android.internal.os.BatteryStatsImpl$Uid$Proc
 com.android.internal.os.BatteryStatsImpl$Uid$Sensor
 com.android.internal.os.BatteryStatsImpl$Uid$Wakelock
 com.android.internal.os.BinderInternal
 com.android.internal.os.BinderInternal$GcWatcher
-com.android.internal.os.BluetoothPowerCalculator
-com.android.internal.os.CameraPowerCalculator
-com.android.internal.os.CpuPowerCalculator
-com.android.internal.os.FlashlightPowerCalculator
 com.android.internal.os.FuseAppLoop
 com.android.internal.os.FuseAppLoop$1
-com.android.internal.os.FuseAppLoop$UnmountedException
+com.android.internal.os.FuseUnavailableMountException
 com.android.internal.os.HandlerCaller
 com.android.internal.os.HandlerCaller$Callback
 com.android.internal.os.HandlerCaller$MyHandler
 com.android.internal.os.IDropBoxManagerService
 com.android.internal.os.IDropBoxManagerService$Stub
 com.android.internal.os.IDropBoxManagerService$Stub$Proxy
-com.android.internal.os.IParcelFileDescriptorFactory
 com.android.internal.os.IResultReceiver
 com.android.internal.os.IResultReceiver$Stub
 com.android.internal.os.IResultReceiver$Stub$Proxy
-com.android.internal.os.IShellCallback
-com.android.internal.os.IShellCallback$Stub
-com.android.internal.os.IShellCallback$Stub$Proxy
 com.android.internal.os.KernelCpuSpeedReader
 com.android.internal.os.KernelMemoryBandwidthStats
+com.android.internal.os.KernelUidCpuFreqTimeReader
 com.android.internal.os.KernelUidCpuTimeReader
 com.android.internal.os.KernelWakelockReader
 com.android.internal.os.KernelWakelockStats
 com.android.internal.os.KernelWakelockStats$Entry
 com.android.internal.os.LoggingPrintStream
 com.android.internal.os.LoggingPrintStream$1
-com.android.internal.os.MemoryPowerCalculator
-com.android.internal.os.MobileRadioPowerCalculator
 com.android.internal.os.PathClassLoaderFactory
-com.android.internal.os.PowerCalculator
 com.android.internal.os.PowerProfile
 com.android.internal.os.PowerProfile$CpuClusterKey
 com.android.internal.os.ProcessCpuTracker
@@ -5623,11 +5403,7 @@
 com.android.internal.os.RuntimeInit$KillApplicationHandler
 com.android.internal.os.RuntimeInit$LoggingHandler
 com.android.internal.os.SamplingProfilerIntegration
-com.android.internal.os.SensorPowerCalculator
 com.android.internal.os.SomeArgs
-com.android.internal.os.TransferPipe
-com.android.internal.os.WakelockPowerCalculator
-com.android.internal.os.WifiPowerCalculator
 com.android.internal.os.Zygote
 com.android.internal.os.Zygote$MethodAndArgsCaller
 com.android.internal.os.ZygoteConnection
@@ -5638,6 +5414,8 @@
 com.android.internal.policy.DecorContext
 com.android.internal.policy.DecorView
 com.android.internal.policy.DecorView$1
+com.android.internal.policy.DecorView$ActionModeCallback2Wrapper
+com.android.internal.policy.DecorView$ColorViewAttributes
 com.android.internal.policy.DecorView$ColorViewState
 com.android.internal.policy.DividerSnapAlgorithm
 com.android.internal.policy.DividerSnapAlgorithm$SnapTarget
@@ -5662,12 +5440,9 @@
 com.android.internal.policy.PhoneWindow$1
 com.android.internal.policy.PhoneWindow$ActionMenuPresenterCallback
 com.android.internal.policy.PhoneWindow$PanelFeatureState
-com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState
-com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState$1
 com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
 com.android.internal.policy.PhoneWindow$RotationWatcher
 com.android.internal.policy.PhoneWindow$RotationWatcher$1
-com.android.internal.policy.PipMotionHelper
 com.android.internal.policy.PipSnapAlgorithm
 com.android.internal.statusbar.IStatusBar
 com.android.internal.statusbar.IStatusBar$Stub
@@ -5687,7 +5462,6 @@
 com.android.internal.telecom.IConnectionServiceAdapter$Stub$Proxy
 com.android.internal.telecom.IInCallAdapter
 com.android.internal.telecom.IInCallAdapter$Stub
-com.android.internal.telecom.IInCallAdapter$Stub$Proxy
 com.android.internal.telecom.IInCallService
 com.android.internal.telecom.IInCallService$Stub
 com.android.internal.telecom.IInCallService$Stub$Proxy
@@ -5715,6 +5489,8 @@
 com.android.internal.telephony.CallerInfoAsyncQuery$CookieWrapper
 com.android.internal.telephony.CallerInfoAsyncQuery$OnQueryCompleteListener
 com.android.internal.telephony.CarrierActionAgent
+com.android.internal.telephony.CarrierActionAgent$1
+com.android.internal.telephony.CarrierActionAgent$SettingsObserver
 com.android.internal.telephony.CarrierAppUtils
 com.android.internal.telephony.CarrierServiceBindHelper
 com.android.internal.telephony.CarrierServiceBindHelper$1
@@ -5738,6 +5514,9 @@
 com.android.internal.telephony.DctConstants$State
 com.android.internal.telephony.DebugService
 com.android.internal.telephony.DefaultPhoneNotifier
+com.android.internal.telephony.DeviceStateMonitor
+com.android.internal.telephony.DeviceStateMonitor$1
+com.android.internal.telephony.DeviceStateMonitor$2
 com.android.internal.telephony.EncodeException
 com.android.internal.telephony.GsmAlphabet
 com.android.internal.telephony.GsmAlphabet$TextEncodingDetails
@@ -5749,7 +5528,6 @@
 com.android.internal.telephony.GsmCdmaPhone$1
 com.android.internal.telephony.GsmCdmaPhone$2
 com.android.internal.telephony.HardwareConfig
-com.android.internal.telephony.HbpcdUtils
 com.android.internal.telephony.ICarrierConfigLoader
 com.android.internal.telephony.ICarrierConfigLoader$Stub
 com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
@@ -5798,18 +5576,18 @@
 com.android.internal.telephony.InboundSmsHandler$StartupState
 com.android.internal.telephony.InboundSmsHandler$WaitingState
 com.android.internal.telephony.IntRangeManager
-com.android.internal.telephony.MccTable
-com.android.internal.telephony.MccTable$MccEntry
+com.android.internal.telephony.OemHookIndication
+com.android.internal.telephony.OemHookResponse
 com.android.internal.telephony.OperatorInfo
 com.android.internal.telephony.Phone
 com.android.internal.telephony.Phone$1
+com.android.internal.telephony.PhoneConstantConversions
 com.android.internal.telephony.PhoneConstants$DataState
 com.android.internal.telephony.PhoneConstants$State
 com.android.internal.telephony.PhoneFactory
 com.android.internal.telephony.PhoneInternalInterface
 com.android.internal.telephony.PhoneInternalInterface$DataActivityState
 com.android.internal.telephony.PhoneNotifier
-com.android.internal.telephony.PhoneStateIntentReceiver
 com.android.internal.telephony.PhoneSubInfoController
 com.android.internal.telephony.PhoneSwitcher
 com.android.internal.telephony.PhoneSwitcher$1
@@ -5819,10 +5597,6 @@
 com.android.internal.telephony.ProxyController
 com.android.internal.telephony.ProxyController$1
 com.android.internal.telephony.RIL
-com.android.internal.telephony.RIL$1
-com.android.internal.telephony.RIL$2
-com.android.internal.telephony.RIL$RILReceiver
-com.android.internal.telephony.RIL$RILSender
 com.android.internal.telephony.RIL$RadioProxyDeathRecipient
 com.android.internal.telephony.RIL$RilHandler
 com.android.internal.telephony.RILConstants
@@ -5843,6 +5617,8 @@
 com.android.internal.telephony.ServiceStateTracker$3
 com.android.internal.telephony.ServiceStateTracker$CellInfoResult
 com.android.internal.telephony.ServiceStateTracker$SstSubscriptionsChangedListener
+com.android.internal.telephony.SimActivationTracker
+com.android.internal.telephony.SimActivationTracker$1
 com.android.internal.telephony.SmsApplication
 com.android.internal.telephony.SmsApplication$SmsApplicationData
 com.android.internal.telephony.SmsApplication$SmsPackageMonitor
@@ -5879,21 +5655,8 @@
 com.android.internal.telephony.WapPushOverSms$1
 com.android.internal.telephony.WapPushOverSms$BindServiceThread
 com.android.internal.telephony.cat.AppInterface
-com.android.internal.telephony.cat.AppInterface$CommandType
-com.android.internal.telephony.cat.CatCmdMessage
-com.android.internal.telephony.cat.CatCmdMessage$BrowserSettings
-com.android.internal.telephony.cat.CatCmdMessage$CallSettings
-com.android.internal.telephony.cat.CatCmdMessage$SetupEventListSettings
 com.android.internal.telephony.cat.CatLog
-com.android.internal.telephony.cat.CatResponseMessage
 com.android.internal.telephony.cat.CatService
-com.android.internal.telephony.cat.Input
-com.android.internal.telephony.cat.Item
-com.android.internal.telephony.cat.LaunchBrowserMode
-com.android.internal.telephony.cat.Menu
-com.android.internal.telephony.cat.ResultCode
-com.android.internal.telephony.cat.TextMessage
-com.android.internal.telephony.cat.ToneSettings
 com.android.internal.telephony.cdma.CdmaInboundSmsHandler
 com.android.internal.telephony.cdma.CdmaSMSDispatcher
 com.android.internal.telephony.cdma.CdmaServiceCategoryProgramHandler
@@ -5901,7 +5664,6 @@
 com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager
 com.android.internal.telephony.cdma.EriInfo
 com.android.internal.telephony.cdma.EriManager
-com.android.internal.telephony.cdma.EriManager$EriDisplayInformation
 com.android.internal.telephony.cdma.EriManager$EriFile
 com.android.internal.telephony.dataconnection.ApnContext
 com.android.internal.telephony.dataconnection.DataConnection
@@ -5934,9 +5696,9 @@
 com.android.internal.telephony.gsm.GsmSMSDispatcher
 com.android.internal.telephony.gsm.SmsMessage
 com.android.internal.telephony.gsm.UsimDataDownloadHandler
-com.android.internal.telephony.ims.-$Lambda$2$6hDwuvYxqWrzW_Ex5wc53XnUOpg
-com.android.internal.telephony.ims.-$Lambda$3$6hDwuvYxqWrzW_Ex5wc53XnUOpg
-com.android.internal.telephony.ims.-$Lambda$4$6hDwuvYxqWrzW_Ex5wc53XnUOpg
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg$1
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg$2
 com.android.internal.telephony.ims.ImsResolver
 com.android.internal.telephony.ims.ImsResolver$1
 com.android.internal.telephony.ims.ImsResolver$2
@@ -5944,6 +5706,8 @@
 com.android.internal.telephony.ims.ImsResolver$ImsServiceControllerFactory
 com.android.internal.telephony.ims.ImsResolver$SubscriptionManagerProxy
 com.android.internal.telephony.ims.ImsServiceController$ImsServiceControllerCallbacks
+com.android.internal.telephony.imsphone.-$Lambda$tILLuSJl16qfDJK1ikBVGFm2D5w
+com.android.internal.telephony.imsphone.-$Lambda$tILLuSJl16qfDJK1ikBVGFm2D5w$1
 com.android.internal.telephony.imsphone.ImsExternalCallTracker
 com.android.internal.telephony.imsphone.ImsExternalCallTracker$1
 com.android.internal.telephony.imsphone.ImsExternalCallTracker$2
@@ -5963,6 +5727,7 @@
 com.android.internal.telephony.imsphone.ImsPhoneCallTracker$3
 com.android.internal.telephony.imsphone.ImsPhoneCallTracker$4
 com.android.internal.telephony.imsphone.ImsPhoneCallTracker$5
+com.android.internal.telephony.imsphone.ImsPhoneCallTracker$IRetryTimeout
 com.android.internal.telephony.imsphone.ImsPhoneCallTracker$PhoneStateListener
 com.android.internal.telephony.imsphone.ImsPhoneCommandInterface
 com.android.internal.telephony.imsphone.ImsPhoneFactory
@@ -5984,6 +5749,12 @@
 com.android.internal.telephony.nano.TelephonyProto$TelephonyServiceState
 com.android.internal.telephony.nano.TelephonyProto$TelephonyServiceState$TelephonyOperator
 com.android.internal.telephony.nano.TelephonyProto$TelephonySettings
+com.android.internal.telephony.protobuf.nano.CodedOutputByteBufferNano
+com.android.internal.telephony.protobuf.nano.ExtendableMessageNano
+com.android.internal.telephony.protobuf.nano.InternalNano
+com.android.internal.telephony.protobuf.nano.InvalidProtocolBufferNanoException
+com.android.internal.telephony.protobuf.nano.MessageNano
+com.android.internal.telephony.protobuf.nano.WireFormatNano
 com.android.internal.telephony.test.SimulatedRadioControl
 com.android.internal.telephony.uicc.IccCardApplicationStatus
 com.android.internal.telephony.uicc.IccCardApplicationStatus$AppType
@@ -5993,16 +5764,20 @@
 com.android.internal.telephony.uicc.IccCardStatus$PinState
 com.android.internal.telephony.uicc.IccConstants
 com.android.internal.telephony.uicc.IccRecords
-com.android.internal.telephony.uicc.IccRefreshResponse
 com.android.internal.telephony.uicc.IccUtils
 com.android.internal.telephony.uicc.UiccCard
 com.android.internal.telephony.uicc.UiccCard$1
 com.android.internal.telephony.uicc.UiccCardApplication
 com.android.internal.telephony.uicc.UiccController
 com.android.internal.telephony.uicc.UiccStateChangedLauncher
+com.android.internal.telephony.util.NotificationChannelController
+com.android.internal.telephony.util.NotificationChannelController$1
 com.android.internal.textservice.ISpellCheckerService
 com.android.internal.textservice.ISpellCheckerService$Stub
 com.android.internal.textservice.ISpellCheckerService$Stub$Proxy
+com.android.internal.textservice.ISpellCheckerServiceCallback
+com.android.internal.textservice.ISpellCheckerServiceCallback$Stub
+com.android.internal.textservice.ISpellCheckerServiceCallback$Stub$Proxy
 com.android.internal.textservice.ISpellCheckerSession
 com.android.internal.textservice.ISpellCheckerSession$Stub
 com.android.internal.textservice.ISpellCheckerSession$Stub$Proxy
@@ -6016,10 +5791,6 @@
 com.android.internal.textservice.ITextServicesSessionListener$Stub
 com.android.internal.textservice.ITextServicesSessionListener$Stub$Proxy
 com.android.internal.transition.EpicenterTranslateClipReveal
-com.android.internal.transition.EpicenterTranslateClipReveal$1
-com.android.internal.transition.EpicenterTranslateClipReveal$State
-com.android.internal.transition.EpicenterTranslateClipReveal$StateEvaluator
-com.android.internal.transition.EpicenterTranslateClipReveal$StateProperty
 com.android.internal.transition.TransitionConstants
 com.android.internal.util.ArrayUtils
 com.android.internal.util.AsyncChannel
@@ -6027,10 +5798,13 @@
 com.android.internal.util.AsyncChannel$DeathMonitor
 com.android.internal.util.AsyncChannel$SyncMessenger
 com.android.internal.util.AsyncChannel$SyncMessenger$SyncHandler
+com.android.internal.util.BitUtils
+com.android.internal.util.CollectionUtils
 com.android.internal.util.ConcurrentUtils
 com.android.internal.util.ConcurrentUtils$1
 com.android.internal.util.ConcurrentUtils$1$1
 com.android.internal.util.DumpUtils$Dump
+com.android.internal.util.ExponentiallyBucketedHistogram
 com.android.internal.util.FastMath
 com.android.internal.util.FastPrintWriter
 com.android.internal.util.FastPrintWriter$DummyWriter
@@ -6045,6 +5819,7 @@
 com.android.internal.util.IState
 com.android.internal.util.ImageUtils
 com.android.internal.util.IndentingPrintWriter
+com.android.internal.util.IntPair
 com.android.internal.util.JournaledFile
 com.android.internal.util.LineBreakBufferedWriter
 com.android.internal.util.LocalLog
@@ -6052,8 +5827,9 @@
 com.android.internal.util.MessageUtils
 com.android.internal.util.NotificationColorUtil
 com.android.internal.util.NotificationColorUtil$ColorUtilsFromCompat
+com.android.internal.util.NotificationMessagingUtil
+com.android.internal.util.NotificationMessagingUtil$1
 com.android.internal.util.Preconditions
-com.android.internal.util.Predicate
 com.android.internal.util.ProcFileReader
 com.android.internal.util.ProgressReporter
 com.android.internal.util.RingBufferIndices
@@ -6078,7 +5854,6 @@
 com.android.internal.view.BaseSurfaceHolder
 com.android.internal.view.IInputConnectionWrapper
 com.android.internal.view.IInputConnectionWrapper$MyHandler
-com.android.internal.view.IInputConnectionWrapper$SomeArgs
 com.android.internal.view.IInputContext
 com.android.internal.view.IInputContext$Stub
 com.android.internal.view.IInputContext$Stub$Proxy
@@ -6111,6 +5886,7 @@
 com.android.internal.view.RotationPolicy$RotationPolicyListener$1
 com.android.internal.view.SurfaceCallbackHelper
 com.android.internal.view.SurfaceCallbackHelper$1
+com.android.internal.view.SurfaceFlingerVsyncChoreographer
 com.android.internal.view.WindowManagerPolicyThread
 com.android.internal.view.animation.FallbackLUTInterpolator
 com.android.internal.view.animation.HasNativeInterpolator
@@ -6120,14 +5896,12 @@
 com.android.internal.view.menu.ActionMenuItemView
 com.android.internal.view.menu.ActionMenuItemView$PopupCallback
 com.android.internal.view.menu.BaseMenuPresenter
-com.android.internal.view.menu.ListMenuItemView
-com.android.internal.view.menu.MenuAdapter
+com.android.internal.view.menu.ContextMenuBuilder
 com.android.internal.view.menu.MenuBuilder
 com.android.internal.view.menu.MenuBuilder$Callback
 com.android.internal.view.menu.MenuBuilder$ItemInvoker
 com.android.internal.view.menu.MenuHelper
 com.android.internal.view.menu.MenuItemImpl
-com.android.internal.view.menu.MenuPopup
 com.android.internal.view.menu.MenuPopupHelper
 com.android.internal.view.menu.MenuPopupHelper$1
 com.android.internal.view.menu.MenuPresenter
@@ -6135,16 +5909,13 @@
 com.android.internal.view.menu.MenuView
 com.android.internal.view.menu.MenuView$ItemView
 com.android.internal.view.menu.ShowableListMenu
-com.android.internal.view.menu.StandardMenuPopup
-com.android.internal.view.menu.StandardMenuPopup$1
-com.android.internal.view.menu.StandardMenuPopup$2
-com.android.internal.view.menu.SubMenuBuilder
-com.android.internal.widget.-$Lambda$6$LaTFiUorkqfcqmu-zMQbCLeO77c
+com.android.internal.widget.-$Lambda$LaTFiUorkqfcqmu-zMQbCLeO77c
 com.android.internal.widget.AbsActionBarView
 com.android.internal.widget.AbsActionBarView$VisibilityAnimListener
 com.android.internal.widget.ActionBarContainer
 com.android.internal.widget.ActionBarContainer$ActionBarBackgroundDrawable
 com.android.internal.widget.ActionBarContextView
+com.android.internal.widget.ActionBarContextView$1
 com.android.internal.widget.ActionBarOverlayLayout
 com.android.internal.widget.ActionBarOverlayLayout$1
 com.android.internal.widget.ActionBarOverlayLayout$2
@@ -6174,10 +5945,10 @@
 com.android.internal.widget.MediaNotificationView
 com.android.internal.widget.NotificationActionListLayout
 com.android.internal.widget.NotificationExpandButton
-com.android.internal.widget.PreferenceImageView
 com.android.internal.widget.ScrollBarUtils
 com.android.internal.widget.ToolbarWidgetWrapper
 com.android.internal.widget.ToolbarWidgetWrapper$1
+com.android.internal.widget.ToolbarWidgetWrapper$2
 com.android.internal.widget.VerifyCredentialResponse
 com.android.okhttp.Address
 com.android.okhttp.AndroidInternal
@@ -6185,6 +5956,9 @@
 com.android.okhttp.Authenticator
 com.android.okhttp.Cache
 com.android.okhttp.Cache$1
+com.android.okhttp.Cache$CacheRequestImpl
+com.android.okhttp.Cache$CacheRequestImpl$1
+com.android.okhttp.Cache$Entry
 com.android.okhttp.CacheControl
 com.android.okhttp.CacheControl$Builder
 com.android.okhttp.CertificatePinner
@@ -6229,6 +6003,7 @@
 com.android.okhttp.internal.DiskLruCache$2
 com.android.okhttp.internal.DiskLruCache$3
 com.android.okhttp.internal.DiskLruCache$Editor
+com.android.okhttp.internal.DiskLruCache$Editor$1
 com.android.okhttp.internal.DiskLruCache$Entry
 com.android.okhttp.internal.FaultHidingSink
 com.android.okhttp.internal.Internal
@@ -6240,6 +6015,7 @@
 com.android.okhttp.internal.Util
 com.android.okhttp.internal.Util$1
 com.android.okhttp.internal.http.AuthenticatorAdapter
+com.android.okhttp.internal.http.CacheRequest
 com.android.okhttp.internal.http.CacheStrategy
 com.android.okhttp.internal.http.CacheStrategy$Factory
 com.android.okhttp.internal.http.HeaderParser
@@ -6252,6 +6028,7 @@
 com.android.okhttp.internal.http.Http1xStream$UnknownLengthSource
 com.android.okhttp.internal.http.HttpEngine
 com.android.okhttp.internal.http.HttpEngine$1
+com.android.okhttp.internal.http.HttpEngine$2
 com.android.okhttp.internal.http.HttpMethod
 com.android.okhttp.internal.http.HttpStream
 com.android.okhttp.internal.http.OkHeaders
@@ -6275,6 +6052,7 @@
 com.android.okhttp.okio.AsyncTimeout$1
 com.android.okhttp.okio.AsyncTimeout$2
 com.android.okhttp.okio.AsyncTimeout$Watchdog
+com.android.okhttp.okio.Base64
 com.android.okhttp.okio.Buffer
 com.android.okhttp.okio.BufferedSink
 com.android.okhttp.okio.BufferedSource
@@ -6298,49 +6076,85 @@
 com.android.okhttp.okio.Timeout
 com.android.okhttp.okio.Timeout$1
 com.android.okhttp.okio.Util
+com.android.org.bouncycastle.asn1.ASN1BitString
+com.android.org.bouncycastle.asn1.ASN1Choice
 com.android.org.bouncycastle.asn1.ASN1Encodable
+com.android.org.bouncycastle.asn1.ASN1EncodableVector
+com.android.org.bouncycastle.asn1.ASN1InputStream
+com.android.org.bouncycastle.asn1.ASN1Integer
+com.android.org.bouncycastle.asn1.ASN1Null
 com.android.org.bouncycastle.asn1.ASN1Object
 com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier
 com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier$OidHandle
+com.android.org.bouncycastle.asn1.ASN1OutputStream
 com.android.org.bouncycastle.asn1.ASN1Primitive
+com.android.org.bouncycastle.asn1.ASN1Sequence
+com.android.org.bouncycastle.asn1.ASN1Set
+com.android.org.bouncycastle.asn1.ASN1StreamParser
+com.android.org.bouncycastle.asn1.ASN1String
+com.android.org.bouncycastle.asn1.ASN1TaggedObject
+com.android.org.bouncycastle.asn1.ASN1TaggedObjectParser
+com.android.org.bouncycastle.asn1.ASN1UTCTime
+com.android.org.bouncycastle.asn1.BERTags
+com.android.org.bouncycastle.asn1.DERBitString
+com.android.org.bouncycastle.asn1.DERFactory
+com.android.org.bouncycastle.asn1.DERNull
+com.android.org.bouncycastle.asn1.DEROutputStream
+com.android.org.bouncycastle.asn1.DERPrintableString
+com.android.org.bouncycastle.asn1.DERSequence
+com.android.org.bouncycastle.asn1.DERSet
+com.android.org.bouncycastle.asn1.DERTaggedObject
+com.android.org.bouncycastle.asn1.DLSequence
+com.android.org.bouncycastle.asn1.DLSet
+com.android.org.bouncycastle.asn1.DefiniteLengthInputStream
+com.android.org.bouncycastle.asn1.InMemoryRepresentable
+com.android.org.bouncycastle.asn1.IndefiniteLengthInputStream
+com.android.org.bouncycastle.asn1.LimitedInputStream
 com.android.org.bouncycastle.asn1.OIDTokenizer
+com.android.org.bouncycastle.asn1.StreamUtil
 com.android.org.bouncycastle.asn1.bc.BCObjectIdentifiers
 com.android.org.bouncycastle.asn1.iana.IANAObjectIdentifiers
 com.android.org.bouncycastle.asn1.misc.MiscObjectIdentifiers
 com.android.org.bouncycastle.asn1.nist.NISTObjectIdentifiers
 com.android.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
 com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
+com.android.org.bouncycastle.asn1.x500.RDN
+com.android.org.bouncycastle.asn1.x500.X500Name
+com.android.org.bouncycastle.asn1.x500.X500NameStyle
+com.android.org.bouncycastle.asn1.x500.style.AbstractX500NameStyle
+com.android.org.bouncycastle.asn1.x500.style.BCStyle
+com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier
+com.android.org.bouncycastle.asn1.x509.Certificate
+com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
+com.android.org.bouncycastle.asn1.x509.TBSCertificate
+com.android.org.bouncycastle.asn1.x509.Time
 com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers
 com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers
 com.android.org.bouncycastle.crypto.AsymmetricBlockCipher
-com.android.org.bouncycastle.crypto.BlockCipher
-com.android.org.bouncycastle.crypto.BufferedBlockCipher
 com.android.org.bouncycastle.crypto.CipherKeyGenerator
 com.android.org.bouncycastle.crypto.CipherParameters
 com.android.org.bouncycastle.crypto.CryptoException
-com.android.org.bouncycastle.crypto.DataLengthException
 com.android.org.bouncycastle.crypto.Digest
 com.android.org.bouncycastle.crypto.ExtendedDigest
 com.android.org.bouncycastle.crypto.InvalidCipherTextException
 com.android.org.bouncycastle.crypto.KeyGenerationParameters
-com.android.org.bouncycastle.crypto.OutputLengthException
-com.android.org.bouncycastle.crypto.RuntimeCryptoException
+com.android.org.bouncycastle.crypto.Mac
+com.android.org.bouncycastle.crypto.PBEParametersGenerator
 com.android.org.bouncycastle.crypto.digests.AndroidDigestFactory
 com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryInterface
 com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL
+com.android.org.bouncycastle.crypto.digests.EncodableDigest
+com.android.org.bouncycastle.crypto.digests.GeneralDigest
 com.android.org.bouncycastle.crypto.digests.OpenSSLDigest
 com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1
+com.android.org.bouncycastle.crypto.digests.SHA1Digest
 com.android.org.bouncycastle.crypto.encodings.OAEPEncoding
-com.android.org.bouncycastle.crypto.engines.AESEngine
 com.android.org.bouncycastle.crypto.engines.RSABlindedEngine
 com.android.org.bouncycastle.crypto.engines.RSACoreEngine
-com.android.org.bouncycastle.crypto.paddings.BlockCipherPadding
-com.android.org.bouncycastle.crypto.paddings.PKCS7Padding
-com.android.org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
+com.android.org.bouncycastle.crypto.generators.PKCS12ParametersGenerator
+com.android.org.bouncycastle.crypto.io.MacInputStream
+com.android.org.bouncycastle.crypto.macs.HMac
 com.android.org.bouncycastle.crypto.params.KeyParameter
-com.android.org.bouncycastle.crypto.params.ParametersWithRandom
-com.android.org.bouncycastle.jcajce.PBKDFKey
-com.android.org.bouncycastle.jcajce.PKCS12Key
 com.android.org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings
 com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings
 com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings
@@ -6356,6 +6170,10 @@
 com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi
 com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseCipherSpi
 com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi
+com.android.org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.PEMUtil
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject
 com.android.org.bouncycastle.jcajce.provider.config.ConfigurableProvider
 com.android.org.bouncycastle.jcajce.provider.config.ProviderConfiguration
 com.android.org.bouncycastle.jcajce.provider.config.ProviderConfigurationPermission
@@ -6377,10 +6195,8 @@
 com.android.org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings
 com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi
 com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std
+com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$StoreEntry
 com.android.org.bouncycastle.jcajce.provider.symmetric.AES
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB$1
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen
 com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings
 com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4
 com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings
@@ -6401,36 +6217,34 @@
 com.android.org.bouncycastle.jcajce.provider.symmetric.SymmetricAlgorithmProvider
 com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish
 com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$GenericBlockCipher
 com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BlockCipherProvider
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.PBE
 com.android.org.bouncycastle.jcajce.provider.util.AlgorithmProvider
 com.android.org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider
 com.android.org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter
 com.android.org.bouncycastle.jcajce.provider.util.DigestFactory
-com.android.org.bouncycastle.jcajce.spec.AEADParameterSpec
 com.android.org.bouncycastle.jcajce.util.BCJcaJceHelper
 com.android.org.bouncycastle.jcajce.util.JcaJceHelper
 com.android.org.bouncycastle.jcajce.util.ProviderJcaJceHelper
 com.android.org.bouncycastle.jce.interfaces.BCKeyStore
+com.android.org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier
 com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
 com.android.org.bouncycastle.jce.provider.BouncyCastleProvider$1
 com.android.org.bouncycastle.jce.provider.BouncyCastleProviderConfiguration
+com.android.org.bouncycastle.jce.provider.CertStoreCollectionSpi
 com.android.org.bouncycastle.util.Arrays
 com.android.org.bouncycastle.util.Encodable
+com.android.org.bouncycastle.util.Integers
+com.android.org.bouncycastle.util.Iterable
+com.android.org.bouncycastle.util.Memoable
 com.android.org.bouncycastle.util.Pack
 com.android.org.bouncycastle.util.Strings
 com.android.org.bouncycastle.util.Strings$1
+com.android.org.bouncycastle.util.io.Streams
 com.android.org.conscrypt.AbstractOpenSSLSession
 com.android.org.conscrypt.AbstractSessionContext
 com.android.org.conscrypt.AbstractSessionContext$1
 com.android.org.conscrypt.AddressUtils
+com.android.org.conscrypt.ArrayUtils
 com.android.org.conscrypt.ByteArray
 com.android.org.conscrypt.CertBlacklist
 com.android.org.conscrypt.CertificatePriorityComparator
@@ -6464,6 +6278,7 @@
 com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES
 com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES$CBC
 com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES$CBC$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES_BASE
 com.android.org.conscrypt.OpenSSLCipher$Mode
 com.android.org.conscrypt.OpenSSLCipher$Padding
 com.android.org.conscrypt.OpenSSLContextImpl
@@ -6477,15 +6292,13 @@
 com.android.org.conscrypt.OpenSSLKeyHolder
 com.android.org.conscrypt.OpenSSLMac
 com.android.org.conscrypt.OpenSSLMac$HmacSHA1
+com.android.org.conscrypt.OpenSSLMac$HmacSHA256
 com.android.org.conscrypt.OpenSSLMessageDigestJDK
 com.android.org.conscrypt.OpenSSLMessageDigestJDK$MD5
 com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA1
 com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA256
 com.android.org.conscrypt.OpenSSLProvider
 com.android.org.conscrypt.OpenSSLRSAKeyFactory
-com.android.org.conscrypt.OpenSSLRSAKeyPairGenerator
-com.android.org.conscrypt.OpenSSLRSAPrivateCrtKey
-com.android.org.conscrypt.OpenSSLRSAPrivateKey
 com.android.org.conscrypt.OpenSSLRSAPublicKey
 com.android.org.conscrypt.OpenSSLRandom
 com.android.org.conscrypt.OpenSSLSessionImpl
@@ -6508,11 +6321,11 @@
 com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
 com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
 com.android.org.conscrypt.Platform
-com.android.org.conscrypt.Platform$NoPreloadHolder
 com.android.org.conscrypt.SSLClientSessionCache
 com.android.org.conscrypt.SSLParametersImpl
 com.android.org.conscrypt.SSLParametersImpl$AliasChooser
 com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks
+com.android.org.conscrypt.SSLUtils
 com.android.org.conscrypt.ServerSessionContext
 com.android.org.conscrypt.TrustManagerFactoryImpl
 com.android.org.conscrypt.TrustManagerImpl
@@ -6526,6 +6339,7 @@
 com.android.org.conscrypt.TrustedCertificateStore$4
 com.android.org.conscrypt.TrustedCertificateStore$5
 com.android.org.conscrypt.TrustedCertificateStore$CertSelector
+com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder
 com.android.org.conscrypt.ct.CTLogInfo
 com.android.org.conscrypt.ct.CTLogStore
 com.android.org.conscrypt.ct.CTLogStoreImpl
@@ -6535,11 +6349,10 @@
 com.android.org.conscrypt.ct.CTVerifier
 com.android.org.conscrypt.ct.KnownLogs
 com.android.org.conscrypt.ct.SerializationException
-com.android.org.conscrypt.util.ArrayUtils
-com.android.org.conscrypt.util.EmptyArray
 com.android.server.AppWidgetBackupBridge
 com.android.server.BootReceiver
 com.android.server.BootReceiver$1
+com.android.server.BootReceiver$2
 com.android.server.LocalServices
 com.android.server.NetworkManagementSocketTagger
 com.android.server.NetworkManagementSocketTagger$1
@@ -6565,6 +6378,8 @@
 com.android.server.wifi.nano.WifiMetricsProto$RssiPollCount
 com.android.server.wifi.nano.WifiMetricsProto$SoftApDurationBucket
 com.android.server.wifi.nano.WifiMetricsProto$SoftApReturnCodeCount
+com.android.server.wifi.nano.WifiMetricsProto$StaEvent
+com.android.server.wifi.nano.WifiMetricsProto$StaEvent$ConfigInfo
 com.android.server.wifi.nano.WifiMetricsProto$WifiLog
 com.android.server.wifi.nano.WifiMetricsProto$WifiLog$ScanReturnEntry
 com.android.server.wifi.nano.WifiMetricsProto$WifiLog$WifiSystemStateEntry
@@ -6580,11 +6395,9 @@
 com.google.android.gles_jni.EGLSurfaceImpl
 com.google.android.gles_jni.GLImpl
 com.google.android.mms.MmsException
-com.google.android.mms.pdu.GenericPdu
-com.google.android.mms.pdu.PduComposer
-com.google.android.mms.pdu.PduPersister
 dalvik.annotation.optimization.CriticalNative
 dalvik.annotation.optimization.FastNative
+dalvik.system.-$Lambda$xxvwQBVHC44UYbpcpA8j0sUqLOo
 dalvik.system.BaseDexClassLoader
 dalvik.system.BaseDexClassLoader$Reporter
 dalvik.system.BlockGuard
@@ -6608,7 +6421,6 @@
 dalvik.system.DexPathList$NativeLibraryElement
 dalvik.system.EmulatedStackFrame
 dalvik.system.EmulatedStackFrame$Range
-dalvik.system.InMemoryDexClassLoader$DexData
 dalvik.system.PathClassLoader
 dalvik.system.SocketTagger
 dalvik.system.SocketTagger$1
@@ -6623,9 +6435,7 @@
 java.io.BufferedWriter
 java.io.ByteArrayInputStream
 java.io.ByteArrayOutputStream
-java.io.CharArrayReader
 java.io.CharArrayWriter
-java.io.CharConversionException
 java.io.Closeable
 java.io.Console
 java.io.DataInput
@@ -6662,7 +6472,6 @@
 java.io.InterruptedIOException
 java.io.InvalidClassException
 java.io.InvalidObjectException
-java.io.NotSerializableException
 java.io.ObjectInput
 java.io.ObjectInputStream
 java.io.ObjectInputStream$BlockDataInputStream
@@ -6706,16 +6515,13 @@
 java.io.Serializable
 java.io.SerializablePermission
 java.io.StreamCorruptedException
-java.io.StringBufferInputStream
 java.io.StringReader
 java.io.StringWriter
-java.io.SyncFailedException
-java.io.UTFDataFormatException
 java.io.UnixFileSystem
 java.io.UnsupportedEncodingException
 java.io.Writer
-java.lang.-$Lambda$250$S9HjrJh0nDg7IyU6wZdPArnZWRQ
-java.lang.-$Lambda$251$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ$1
 java.lang.AbstractMethodError
 java.lang.AbstractStringBuilder
 java.lang.AndroidHardcodedSystemProperties
@@ -6799,14 +6605,7 @@
 java.lang.Package
 java.lang.Process
 java.lang.ProcessBuilder
-java.lang.ProcessBuilder$NullInputStream
-java.lang.ProcessBuilder$NullOutputStream
 java.lang.ProcessEnvironment
-java.lang.ProcessEnvironment$ExternalData
-java.lang.ProcessEnvironment$StringEnvironment
-java.lang.ProcessEnvironment$Value
-java.lang.ProcessEnvironment$Variable
-java.lang.ProcessImpl
 java.lang.Readable
 java.lang.ReflectiveOperationException
 java.lang.Runnable
@@ -6837,6 +6636,7 @@
 java.lang.ThreadDeath
 java.lang.ThreadGroup
 java.lang.ThreadLocal
+java.lang.ThreadLocal$SuppliedThreadLocal
 java.lang.ThreadLocal$ThreadLocalMap
 java.lang.ThreadLocal$ThreadLocalMap$Entry
 java.lang.Throwable
@@ -6846,13 +6646,6 @@
 java.lang.Throwable$WrappedPrintWriter
 java.lang.TypeNotPresentException
 java.lang.UNIXProcess
-java.lang.UNIXProcess$1
-java.lang.UNIXProcess$2
-java.lang.UNIXProcess$3
-java.lang.UNIXProcess$ProcessPipeInputStream
-java.lang.UNIXProcess$ProcessPipeOutputStream
-java.lang.UNIXProcess$ProcessReaperThreadFactory
-java.lang.UNIXProcess$ProcessReaperThreadFactory$1
 java.lang.UnsatisfiedLinkError
 java.lang.UnsupportedOperationException
 java.lang.VMClassLoader
@@ -6865,18 +6658,22 @@
 java.lang.annotation.Inherited
 java.lang.annotation.Retention
 java.lang.annotation.Target
+java.lang.invoke.CallSite
+java.lang.invoke.ConstantCallSite
 java.lang.invoke.MethodHandle
 java.lang.invoke.MethodHandleImpl
 java.lang.invoke.MethodHandleImpl$HandleInfo
 java.lang.invoke.MethodHandleInfo
 java.lang.invoke.MethodHandleStatics
 java.lang.invoke.MethodHandles
+java.lang.invoke.MethodHandles$Lookup
 java.lang.invoke.MethodType
 java.lang.invoke.MethodType$ConcurrentWeakInternSet
 java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
 java.lang.invoke.MethodTypeForm
 java.lang.invoke.Transformers$BindTo
 java.lang.invoke.Transformers$Collector
+java.lang.invoke.Transformers$Construct
 java.lang.invoke.Transformers$Spreader
 java.lang.invoke.Transformers$Transformer
 java.lang.invoke.Transformers$VarargsCollector
@@ -6926,7 +6723,6 @@
 java.math.BigDecimal
 java.math.BigInt
 java.math.BigInteger
-java.math.BitLevel
 java.math.Conversion
 java.math.Division
 java.math.MathContext
@@ -6938,12 +6734,9 @@
 java.net.AddressCache
 java.net.AddressCache$AddressCacheEntry
 java.net.AddressCache$AddressCacheKey
-java.net.Authenticator
-java.net.Authenticator$RequestorType
 java.net.ConnectException
 java.net.CookieHandler
 java.net.CookieManager
-java.net.CookieManager$CookiePathComparator
 java.net.CookiePolicy
 java.net.CookiePolicy$1
 java.net.CookiePolicy$2
@@ -6957,19 +6750,6 @@
 java.net.DefaultFileNameMap
 java.net.DefaultInterface
 java.net.FileNameMap
-java.net.HttpCookie
-java.net.HttpCookie$1
-java.net.HttpCookie$10
-java.net.HttpCookie$11
-java.net.HttpCookie$2
-java.net.HttpCookie$3
-java.net.HttpCookie$4
-java.net.HttpCookie$5
-java.net.HttpCookie$6
-java.net.HttpCookie$7
-java.net.HttpCookie$8
-java.net.HttpCookie$9
-java.net.HttpCookie$CookieAttributeAssignor
 java.net.HttpURLConnection
 java.net.IDN
 java.net.InMemoryCookieStore
@@ -6991,17 +6771,18 @@
 java.net.NetworkInterface$1checkedAddresses
 java.net.NoRouteToHostException
 java.net.Parts
-java.net.PasswordAuthentication
 java.net.PlainDatagramSocketImpl
 java.net.PlainSocketImpl
 java.net.PortUnreachableException
 java.net.ProtocolException
+java.net.ProtocolFamily
 java.net.Proxy
 java.net.Proxy$Type
 java.net.ProxySelector
 java.net.ResponseCache
 java.net.ServerSocket
 java.net.Socket
+java.net.Socket$1
 java.net.Socket$2
 java.net.Socket$3
 java.net.SocketAddress
@@ -7013,6 +6794,7 @@
 java.net.SocketTimeoutException
 java.net.SocksConsts
 java.net.SocksSocketImpl
+java.net.StandardProtocolFamily
 java.net.URI
 java.net.URI$Parser
 java.net.URISyntaxException
@@ -7043,7 +6825,6 @@
 java.nio.FloatBuffer
 java.nio.HeapByteBuffer
 java.nio.HeapCharBuffer
-java.nio.HeapIntBuffer
 java.nio.IntBuffer
 java.nio.InvalidMarkException
 java.nio.LongBuffer
@@ -7058,7 +6839,7 @@
 java.nio.channels.CancelledKeyException
 java.nio.channels.Channel
 java.nio.channels.Channels
-java.nio.channels.Channels$ReadableByteChannelImpl
+java.nio.channels.Channels$1
 java.nio.channels.ClosedByInterruptException
 java.nio.channels.ClosedChannelException
 java.nio.channels.DatagramChannel
@@ -7075,12 +6856,19 @@
 java.nio.channels.ScatteringByteChannel
 java.nio.channels.SeekableByteChannel
 java.nio.channels.SelectableChannel
+java.nio.channels.SelectionKey
+java.nio.channels.Selector
 java.nio.channels.ServerSocketChannel
 java.nio.channels.SocketChannel
 java.nio.channels.WritableByteChannel
 java.nio.channels.spi.AbstractInterruptibleChannel
 java.nio.channels.spi.AbstractInterruptibleChannel$1
 java.nio.channels.spi.AbstractSelectableChannel
+java.nio.channels.spi.AbstractSelectionKey
+java.nio.channels.spi.AbstractSelector
+java.nio.channels.spi.AbstractSelector$1
+java.nio.channels.spi.SelectorProvider
+java.nio.channels.spi.SelectorProvider$1
 java.nio.charset.CharacterCodingException
 java.nio.charset.Charset
 java.nio.charset.CharsetDecoder
@@ -7096,6 +6884,8 @@
 java.nio.charset.IllegalCharsetNameException
 java.nio.charset.StandardCharsets
 java.nio.charset.UnsupportedCharsetException
+java.nio.file.AccessMode
+java.nio.file.CopyOption
 java.nio.file.FileAlreadyExistsException
 java.nio.file.FileSystem
 java.nio.file.FileSystemException
@@ -7103,12 +6893,18 @@
 java.nio.file.FileSystems$DefaultFileSystemHolder
 java.nio.file.FileSystems$DefaultFileSystemHolder$1
 java.nio.file.Files
+java.nio.file.LinkOption
 java.nio.file.NoSuchFileException
 java.nio.file.OpenOption
 java.nio.file.Path
+java.nio.file.Paths
+java.nio.file.StandardOpenOption
 java.nio.file.Watchable
+java.nio.file.attribute.AttributeView
+java.nio.file.attribute.BasicFileAttributeView
 java.nio.file.attribute.BasicFileAttributes
 java.nio.file.attribute.FileAttribute
+java.nio.file.attribute.FileAttributeView
 java.nio.file.attribute.PosixFileAttributes
 java.nio.file.spi.FileSystemProvider
 java.security.AccessControlContext
@@ -7121,7 +6917,6 @@
 java.security.CodeSigner
 java.security.CryptoPrimitive
 java.security.DigestException
-java.security.DigestInputStream
 java.security.GeneralSecurityException
 java.security.Guard
 java.security.InvalidAlgorithmParameterException
@@ -7134,11 +6929,9 @@
 java.security.KeyManagementException
 java.security.KeyPair
 java.security.KeyPairGenerator
-java.security.KeyPairGenerator$Delegate
 java.security.KeyPairGeneratorSpi
 java.security.KeyStore
 java.security.KeyStore$1
-java.security.KeyStore$LoadStoreParameter
 java.security.KeyStoreException
 java.security.KeyStoreSpi
 java.security.MessageDigest
@@ -7172,6 +6965,7 @@
 java.security.UnrecoverableKeyException
 java.security.cert.CRL
 java.security.cert.CRLException
+java.security.cert.CRLReason
 java.security.cert.CertPath
 java.security.cert.CertPathBuilderException
 java.security.cert.CertPathChecker
@@ -7182,6 +6976,10 @@
 java.security.cert.CertPathValidatorResult
 java.security.cert.CertPathValidatorSpi
 java.security.cert.CertSelector
+java.security.cert.CertStore
+java.security.cert.CertStoreException
+java.security.cert.CertStoreParameters
+java.security.cert.CertStoreSpi
 java.security.cert.Certificate
 java.security.cert.CertificateEncodingException
 java.security.cert.CertificateException
@@ -7190,11 +6988,13 @@
 java.security.cert.CertificateFactorySpi
 java.security.cert.CertificateNotYetValidException
 java.security.cert.CertificateParsingException
+java.security.cert.CollectionCertStoreParameters
 java.security.cert.Extension
 java.security.cert.PKIXCertPathChecker
 java.security.cert.PKIXCertPathValidatorResult
 java.security.cert.PKIXParameters
 java.security.cert.PKIXRevocationChecker
+java.security.cert.PKIXRevocationChecker$Option
 java.security.cert.PolicyNode
 java.security.cert.PolicyQualifierInfo
 java.security.cert.TrustAnchor
@@ -7207,7 +7007,6 @@
 java.security.interfaces.ECPrivateKey
 java.security.interfaces.ECPublicKey
 java.security.interfaces.RSAKey
-java.security.interfaces.RSAPrivateCrtKey
 java.security.interfaces.RSAPrivateKey
 java.security.interfaces.RSAPublicKey
 java.security.spec.AlgorithmParameterSpec
@@ -7229,8 +7028,6 @@
 java.security.spec.RSAPrivateKeySpec
 java.security.spec.RSAPublicKeySpec
 java.security.spec.X509EncodedKeySpec
-java.sql.Date
-java.sql.Time
 java.sql.Timestamp
 java.text.AttributedCharacterIterator$Attribute
 java.text.Bidi
@@ -7263,16 +7060,16 @@
 java.text.SimpleDateFormat
 java.text.StringCharacterIterator
 java.time.DateTimeException
-java.util.-$Lambda$181$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$182$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$183$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$184$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$267$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$268$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$291$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$292$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$293$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$294$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$1
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$2
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$3
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$4
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$5
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$1
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$2
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$3
 java.util.AbstractCollection
 java.util.AbstractList
 java.util.AbstractList$Itr
@@ -7394,6 +7191,7 @@
 java.util.EnumSet$SerializationProxy
 java.util.Enumeration
 java.util.EventListener
+java.util.FormatFlagsConversionMismatchException
 java.util.Formattable
 java.util.Formatter
 java.util.Formatter$Conversion
@@ -7403,6 +7201,7 @@
 java.util.Formatter$FormatSpecifier
 java.util.Formatter$FormatSpecifierParser
 java.util.Formatter$FormatString
+java.util.FormatterClosedException
 java.util.GregorianCalendar
 java.util.HashMap
 java.util.HashMap$EntryIterator
@@ -7451,7 +7250,6 @@
 java.util.LinkedList$Node
 java.util.List
 java.util.ListIterator
-java.util.ListResourceBundle
 java.util.Locale
 java.util.Locale$Builder
 java.util.Locale$Cache
@@ -7459,6 +7257,7 @@
 java.util.Locale$FilteringMode
 java.util.Locale$LanguageRange
 java.util.Locale$LocaleKey
+java.util.Locale$NoImagePreloadHolder
 java.util.Map
 java.util.Map$Entry
 java.util.MissingFormatArgumentException
@@ -7469,6 +7268,7 @@
 java.util.Objects
 java.util.Observable
 java.util.Observer
+java.util.Optional
 java.util.PrimitiveIterator
 java.util.PrimitiveIterator$OfInt
 java.util.PriorityQueue
@@ -7493,6 +7293,10 @@
 java.util.ResourceBundle$LoaderReference
 java.util.Scanner
 java.util.Scanner$1
+java.util.ServiceConfigurationError
+java.util.ServiceLoader
+java.util.ServiceLoader$1
+java.util.ServiceLoader$LazyIterator
 java.util.Set
 java.util.SimpleTimeZone
 java.util.SortedMap
@@ -7508,6 +7312,7 @@
 java.util.Spliterators$EmptySpliterator$OfInt
 java.util.Spliterators$EmptySpliterator$OfLong
 java.util.Spliterators$EmptySpliterator$OfRef
+java.util.Spliterators$IntArraySpliterator
 java.util.Spliterators$IteratorSpliterator
 java.util.Stack
 java.util.StringJoiner
@@ -7546,14 +7351,13 @@
 java.util.Vector$Itr
 java.util.WeakHashMap
 java.util.WeakHashMap$Entry
-java.util.WeakHashMap$EntryIterator
 java.util.WeakHashMap$EntrySet
 java.util.WeakHashMap$HashIterator
 java.util.WeakHashMap$KeyIterator
 java.util.WeakHashMap$KeySet
 java.util.WeakHashMap$ValueIterator
 java.util.WeakHashMap$Values
-java.util.concurrent.-$Lambda$269$xR9BLpu6SifNikvFgr4lEiECBsk
+java.util.concurrent.-$Lambda$xR9BLpu6SifNikvFgr4lEiECBsk
 java.util.concurrent.AbstractExecutorService
 java.util.concurrent.ArrayBlockingQueue
 java.util.concurrent.BlockingDeque
@@ -7564,8 +7368,6 @@
 java.util.concurrent.CompletableFuture$AltResult
 java.util.concurrent.CompletableFuture$AsynchronousCompletionTask
 java.util.concurrent.CompletableFuture$Completion
-java.util.concurrent.CompletableFuture$Signaller
-java.util.concurrent.CompletionService
 java.util.concurrent.CompletionStage
 java.util.concurrent.ConcurrentHashMap
 java.util.concurrent.ConcurrentHashMap$BaseIterator
@@ -7585,6 +7387,7 @@
 java.util.concurrent.ConcurrentHashMap$ForwardingNode
 java.util.concurrent.ConcurrentHashMap$KeyIterator
 java.util.concurrent.ConcurrentHashMap$KeySetView
+java.util.concurrent.ConcurrentHashMap$KeySpliterator
 java.util.concurrent.ConcurrentHashMap$MapEntry
 java.util.concurrent.ConcurrentHashMap$MapReduceEntriesTask
 java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToDoubleTask
@@ -7617,6 +7420,8 @@
 java.util.concurrent.ConcurrentHashMap$TreeNode
 java.util.concurrent.ConcurrentHashMap$ValueIterator
 java.util.concurrent.ConcurrentHashMap$ValuesView
+java.util.concurrent.ConcurrentLinkedDeque
+java.util.concurrent.ConcurrentLinkedDeque$Node
 java.util.concurrent.ConcurrentLinkedQueue
 java.util.concurrent.ConcurrentLinkedQueue$Itr
 java.util.concurrent.ConcurrentLinkedQueue$Node
@@ -7626,12 +7431,9 @@
 java.util.concurrent.ConcurrentSkipListMap$HeadIndex
 java.util.concurrent.ConcurrentSkipListMap$Index
 java.util.concurrent.ConcurrentSkipListMap$Iter
-java.util.concurrent.ConcurrentSkipListMap$KeyIterator
-java.util.concurrent.ConcurrentSkipListMap$KeySet
 java.util.concurrent.ConcurrentSkipListMap$Node
 java.util.concurrent.ConcurrentSkipListMap$ValueIterator
 java.util.concurrent.ConcurrentSkipListMap$Values
-java.util.concurrent.ConcurrentSkipListSet
 java.util.concurrent.CopyOnWriteArrayList
 java.util.concurrent.CopyOnWriteArrayList$COWIterator
 java.util.concurrent.CopyOnWriteArraySet
@@ -7642,8 +7444,6 @@
 java.util.concurrent.Delayed
 java.util.concurrent.ExecutionException
 java.util.concurrent.Executor
-java.util.concurrent.ExecutorCompletionService
-java.util.concurrent.ExecutorCompletionService$QueueingFuture
 java.util.concurrent.ExecutorService
 java.util.concurrent.Executors
 java.util.concurrent.Executors$DefaultThreadFactory
@@ -7655,10 +7455,8 @@
 java.util.concurrent.ForkJoinPool$1
 java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory
 java.util.concurrent.ForkJoinPool$ForkJoinWorkerThreadFactory
-java.util.concurrent.ForkJoinPool$ManagedBlocker
 java.util.concurrent.ForkJoinTask
 java.util.concurrent.ForkJoinTask$ExceptionNode
-java.util.concurrent.ForkJoinWorkerThread
 java.util.concurrent.Future
 java.util.concurrent.FutureTask
 java.util.concurrent.FutureTask$WaitNode
@@ -7669,8 +7467,6 @@
 java.util.concurrent.LinkedBlockingQueue
 java.util.concurrent.LinkedBlockingQueue$Itr
 java.util.concurrent.LinkedBlockingQueue$Node
-java.util.concurrent.Phaser
-java.util.concurrent.Phaser$QNode
 java.util.concurrent.PriorityBlockingQueue
 java.util.concurrent.RejectedExecutionException
 java.util.concurrent.RejectedExecutionHandler
@@ -7685,6 +7481,7 @@
 java.util.concurrent.Semaphore$NonfairSync
 java.util.concurrent.Semaphore$Sync
 java.util.concurrent.SynchronousQueue
+java.util.concurrent.SynchronousQueue$TransferQueue
 java.util.concurrent.SynchronousQueue$TransferStack
 java.util.concurrent.SynchronousQueue$TransferStack$SNode
 java.util.concurrent.SynchronousQueue$Transferer
@@ -7712,8 +7509,7 @@
 java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl
 java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl$1
 java.util.concurrent.atomic.AtomicLong
-java.util.concurrent.atomic.AtomicLongFieldUpdater
-java.util.concurrent.atomic.AtomicLongFieldUpdater$CASUpdater
+java.util.concurrent.atomic.AtomicLongArray
 java.util.concurrent.atomic.AtomicReference
 java.util.concurrent.atomic.AtomicReferenceArray
 java.util.concurrent.atomic.AtomicReferenceFieldUpdater
@@ -7738,12 +7534,15 @@
 java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter
 java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
 java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
-java.util.function.-$Lambda$276$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk$1
 java.util.function.BiConsumer
 java.util.function.BiFunction
 java.util.function.BinaryOperator
 java.util.function.Consumer
 java.util.function.DoubleBinaryOperator
+java.util.function.DoubleUnaryOperator
 java.util.function.Function
 java.util.function.IntBinaryOperator
 java.util.function.IntConsumer
@@ -7752,6 +7551,7 @@
 java.util.function.IntToLongFunction
 java.util.function.IntUnaryOperator
 java.util.function.LongBinaryOperator
+java.util.function.LongConsumer
 java.util.function.LongUnaryOperator
 java.util.function.Predicate
 java.util.function.Supplier
@@ -7774,6 +7574,9 @@
 java.util.jar.Manifest
 java.util.jar.Manifest$FastInputStream
 java.util.logging.ErrorManager
+java.util.logging.FileHandler
+java.util.logging.FileHandler$InitializationErrorManager
+java.util.logging.FileHandler$MeteredStream
 java.util.logging.Filter
 java.util.logging.Formatter
 java.util.logging.Handler
@@ -7797,6 +7600,9 @@
 java.util.logging.Logger$LoggerBundle
 java.util.logging.LoggingPermission
 java.util.logging.LoggingProxyImpl
+java.util.logging.SimpleFormatter
+java.util.logging.StreamHandler
+java.util.logging.XMLFormatter
 java.util.prefs.AbstractPreferences
 java.util.prefs.FileSystemPreferences
 java.util.prefs.Preferences
@@ -7805,40 +7611,94 @@
 java.util.regex.Matcher$OffsetBasedMatchResult
 java.util.regex.Pattern
 java.util.regex.PatternSyntaxException
-java.util.stream.-$Lambda$155$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$41$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$67$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$89$qTstLJg88fs2C3g6LH-R51vCVP0
+java.util.stream.-$Lambda$DJvCeprCIGMk0JvfSkTmQUmEYKA$1
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$12
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$5
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$6
+java.util.stream.-$Lambda$RYrQKhHyGc-mMxiERR98xxRAWkA$5
+java.util.stream.-$Lambda$ioGbka_-VkWTFjRjTt8T4zzsxgk$3
+java.util.stream.-$Lambda$ioGbka_-VkWTFjRjTt8T4zzsxgk$7
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$21
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$22
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$26
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$4
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$5
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$51
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$54
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$67
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$83
 java.util.stream.AbstractPipeline
+java.util.stream.AbstractSpinedBuffer
 java.util.stream.BaseStream
 java.util.stream.Collector
 java.util.stream.Collector$Characteristics
 java.util.stream.Collectors
 java.util.stream.Collectors$CollectorImpl
+java.util.stream.DistinctOps
+java.util.stream.DistinctOps$1
+java.util.stream.DistinctOps$1$2
 java.util.stream.DoubleStream
+java.util.stream.FindOps
+java.util.stream.FindOps$FindOp
+java.util.stream.FindOps$FindSink
+java.util.stream.FindOps$FindSink$OfRef
 java.util.stream.ForEachOps
 java.util.stream.ForEachOps$ForEachOp
 java.util.stream.ForEachOps$ForEachOp$OfRef
+java.util.stream.IntPipeline
+java.util.stream.IntPipeline$4
+java.util.stream.IntPipeline$4$1
+java.util.stream.IntPipeline$Head
+java.util.stream.IntPipeline$StatelessOp
 java.util.stream.IntStream
+java.util.stream.LongPipeline
+java.util.stream.LongPipeline$StatelessOp
 java.util.stream.LongStream
+java.util.stream.Node
+java.util.stream.Node$Builder
+java.util.stream.Node$Builder$OfInt
+java.util.stream.Node$OfDouble
+java.util.stream.Node$OfInt
+java.util.stream.Node$OfLong
+java.util.stream.Node$OfPrimitive
+java.util.stream.Nodes
+java.util.stream.Nodes$EmptyNode
+java.util.stream.Nodes$EmptyNode$OfDouble
+java.util.stream.Nodes$EmptyNode$OfInt
+java.util.stream.Nodes$EmptyNode$OfLong
+java.util.stream.Nodes$EmptyNode$OfRef
+java.util.stream.Nodes$IntSpinedNodeBuilder
 java.util.stream.PipelineHelper
 java.util.stream.ReduceOps
 java.util.stream.ReduceOps$3
 java.util.stream.ReduceOps$3ReducingSink
+java.util.stream.ReduceOps$8
+java.util.stream.ReduceOps$8ReducingSink
 java.util.stream.ReduceOps$AccumulatingSink
 java.util.stream.ReduceOps$Box
 java.util.stream.ReduceOps$ReduceOp
 java.util.stream.ReferencePipeline
 java.util.stream.ReferencePipeline$2
 java.util.stream.ReferencePipeline$2$1
+java.util.stream.ReferencePipeline$3
+java.util.stream.ReferencePipeline$3$1
+java.util.stream.ReferencePipeline$4
+java.util.stream.ReferencePipeline$4$1
+java.util.stream.ReferencePipeline$5
+java.util.stream.ReferencePipeline$5$1
 java.util.stream.ReferencePipeline$Head
 java.util.stream.ReferencePipeline$StatefulOp
 java.util.stream.ReferencePipeline$StatelessOp
 java.util.stream.Sink
+java.util.stream.Sink$ChainedInt
 java.util.stream.Sink$ChainedReference
+java.util.stream.Sink$OfInt
+java.util.stream.Sink$OfLong
 java.util.stream.SliceOps
 java.util.stream.SliceOps$1
 java.util.stream.SliceOps$1$1
+java.util.stream.SpinedBuffer$OfInt
+java.util.stream.SpinedBuffer$OfPrimitive
 java.util.stream.Stream
 java.util.stream.StreamOpFlag
 java.util.stream.StreamOpFlag$MaskBuilder
@@ -7852,7 +7712,6 @@
 java.util.zip.Adler32
 java.util.zip.CRC32
 java.util.zip.CheckedInputStream
-java.util.zip.CheckedOutputStream
 java.util.zip.Checksum
 java.util.zip.DataFormatException
 java.util.zip.Deflater
@@ -7866,14 +7725,12 @@
 java.util.zip.ZipCoder
 java.util.zip.ZipConstants
 java.util.zip.ZipEntry
-java.util.zip.ZipError
 java.util.zip.ZipException
 java.util.zip.ZipFile
 java.util.zip.ZipFile$ZipEntryIterator
 java.util.zip.ZipFile$ZipFileInflaterInputStream
 java.util.zip.ZipFile$ZipFileInputStream
 java.util.zip.ZipInputStream
-java.util.zip.ZipOutputStream
 java.util.zip.ZipUtils
 javax.crypto.BadPaddingException
 javax.crypto.Cipher
@@ -7883,8 +7740,6 @@
 javax.crypto.Cipher$NeedToSet
 javax.crypto.Cipher$SpiAndProviderUpdater
 javax.crypto.Cipher$Transform
-javax.crypto.CipherInputStream
-javax.crypto.CipherOutputStream
 javax.crypto.CipherSpi
 javax.crypto.IllegalBlockSizeException
 javax.crypto.JarVerifier
@@ -7898,8 +7753,6 @@
 javax.crypto.NullCipher
 javax.crypto.SecretKey
 javax.crypto.ShortBufferException
-javax.crypto.interfaces.PBEKey
-javax.crypto.spec.GCMParameterSpec
 javax.crypto.spec.IvParameterSpec
 javax.crypto.spec.OAEPParameterSpec
 javax.crypto.spec.PBEParameterSpec
@@ -7925,7 +7778,6 @@
 javax.net.ssl.HandshakeCompletedListener
 javax.net.ssl.HostnameVerifier
 javax.net.ssl.HttpsURLConnection
-javax.net.ssl.HttpsURLConnection$NoPreloadHolder
 javax.net.ssl.KeyManager
 javax.net.ssl.KeyManagerFactory
 javax.net.ssl.KeyManagerFactory$1
@@ -7936,7 +7788,6 @@
 javax.net.ssl.SSLContextSpi
 javax.net.ssl.SSLEngine
 javax.net.ssl.SSLException
-javax.net.ssl.SSLHandshakeException
 javax.net.ssl.SSLParameters
 javax.net.ssl.SSLPeerUnverifiedException
 javax.net.ssl.SSLProtocolException
@@ -7962,19 +7813,11 @@
 javax.security.cert.CertificateException
 javax.security.cert.X509Certificate
 javax.sip.SipException
-javax.xml.parsers.DocumentBuilder
-javax.xml.parsers.DocumentBuilderFactory
 javax.xml.parsers.ParserConfigurationException
 javax.xml.parsers.SAXParser
 javax.xml.parsers.SAXParserFactory
-javax.xml.transform.Result
-javax.xml.transform.Source
-javax.xml.transform.Transformer
 javax.xml.transform.TransformerConfigurationException
 javax.xml.transform.TransformerException
-javax.xml.transform.TransformerFactory
-javax.xml.transform.dom.DOMSource
-javax.xml.transform.stream.StreamResult
 junit.framework.Assert
 libcore.icu.CollationKeyICU
 libcore.icu.DateIntervalFormat
@@ -8007,11 +7850,11 @@
 libcore.io.IoUtils
 libcore.io.IoUtils$FileReader
 libcore.io.Libcore
+libcore.io.Linux
 libcore.io.Memory
 libcore.io.MemoryMappedFile
 libcore.io.NioBufferIterator
 libcore.io.Os
-libcore.io.Posix
 libcore.io.Streams
 libcore.math.MathUtils
 libcore.net.MimeUtils
@@ -8020,15 +7863,12 @@
 libcore.net.UriCodec
 libcore.net.event.NetworkEventDispatcher
 libcore.net.event.NetworkEventListener
-libcore.net.http.HttpDate
-libcore.net.http.HttpDate$1
 libcore.reflect.AnnotatedElements
 libcore.reflect.AnnotationFactory
 libcore.reflect.AnnotationMember
 libcore.reflect.AnnotationMember$DefaultValues
 libcore.reflect.GenericArrayTypeImpl
 libcore.reflect.GenericSignatureParser
-libcore.reflect.InternalNames
 libcore.reflect.ListOfTypes
 libcore.reflect.ListOfVariables
 libcore.reflect.ParameterizedTypeImpl
@@ -8043,6 +7883,7 @@
 libcore.util.NativeAllocationRegistry$CleanerRunner
 libcore.util.NativeAllocationRegistry$CleanerThunk
 libcore.util.Objects
+libcore.util.TimeZoneDataFiles
 libcore.util.ZoneInfo
 libcore.util.ZoneInfo$CheckedArithmeticException
 libcore.util.ZoneInfo$OffsetInterval
@@ -8066,23 +7907,8 @@
 org.apache.harmony.xml.ExpatParser$CurrentAttributes
 org.apache.harmony.xml.ExpatParser$ExpatLocator
 org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.dom.AttrImpl
-org.apache.harmony.xml.dom.CharacterDataImpl
-org.apache.harmony.xml.dom.DOMImplementationImpl
-org.apache.harmony.xml.dom.DocumentImpl
-org.apache.harmony.xml.dom.ElementImpl
-org.apache.harmony.xml.dom.ElementImpl$ElementAttrNamedNodeMapImpl
-org.apache.harmony.xml.dom.InnerNodeImpl
-org.apache.harmony.xml.dom.LeafNodeImpl
-org.apache.harmony.xml.dom.NodeImpl
-org.apache.harmony.xml.dom.NodeImpl$1
-org.apache.harmony.xml.dom.NodeListImpl
-org.apache.harmony.xml.dom.TextImpl
-org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
-org.apache.harmony.xml.parsers.DocumentBuilderImpl
 org.apache.harmony.xml.parsers.SAXParserFactoryImpl
 org.apache.harmony.xml.parsers.SAXParserImpl
-org.apache.http.ConnectionClosedException
 org.apache.http.ConnectionReuseStrategy
 org.apache.http.FormattedHeader
 org.apache.http.Header
@@ -8106,9 +7932,7 @@
 org.apache.http.HttpResponseInterceptor
 org.apache.http.HttpServerConnection
 org.apache.http.HttpVersion
-org.apache.http.MethodNotSupportedException
 org.apache.http.NameValuePair
-org.apache.http.NoHttpResponseException
 org.apache.http.ParseException
 org.apache.http.ProtocolException
 org.apache.http.ProtocolVersion
@@ -8132,15 +7956,11 @@
 org.apache.http.client.UserTokenHandler
 org.apache.http.client.entity.UrlEncodedFormEntity
 org.apache.http.client.methods.AbortableHttpRequest
-org.apache.http.client.methods.HttpDelete
 org.apache.http.client.methods.HttpEntityEnclosingRequestBase
 org.apache.http.client.methods.HttpGet
-org.apache.http.client.methods.HttpHead
-org.apache.http.client.methods.HttpOptions
 org.apache.http.client.methods.HttpPost
 org.apache.http.client.methods.HttpPut
 org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.methods.HttpTrace
 org.apache.http.client.methods.HttpUriRequest
 org.apache.http.client.params.HttpClientParams
 org.apache.http.client.protocol.RequestAddCookies
@@ -8156,7 +7976,6 @@
 org.apache.http.conn.ClientConnectionRequest
 org.apache.http.conn.ConnectTimeoutException
 org.apache.http.conn.ConnectionKeepAliveStrategy
-org.apache.http.conn.ConnectionPoolTimeoutException
 org.apache.http.conn.ConnectionReleaseTrigger
 org.apache.http.conn.EofSensorInputStream
 org.apache.http.conn.EofSensorWatcher
@@ -8178,7 +7997,6 @@
 org.apache.http.conn.routing.RouteInfo$LayerType
 org.apache.http.conn.routing.RouteInfo$TunnelType
 org.apache.http.conn.routing.RouteTracker
-org.apache.http.conn.scheme.HostNameResolver
 org.apache.http.conn.scheme.LayeredSocketFactory
 org.apache.http.conn.scheme.PlainSocketFactory
 org.apache.http.conn.scheme.Scheme
@@ -8235,7 +8053,6 @@
 org.apache.http.impl.client.DefaultTargetAuthenticationHandler
 org.apache.http.impl.client.DefaultUserTokenHandler
 org.apache.http.impl.client.EntityEnclosingRequestWrapper
-org.apache.http.impl.client.RedirectLocations
 org.apache.http.impl.client.RequestWrapper
 org.apache.http.impl.client.RoutedRequest
 org.apache.http.impl.client.TunnelRefusedException
@@ -8260,7 +8077,6 @@
 org.apache.http.impl.conn.tsccm.RouteSpecificPool
 org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
 org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1
-org.apache.http.impl.conn.tsccm.WaitingThread
 org.apache.http.impl.conn.tsccm.WaitingThreadAborter
 org.apache.http.impl.cookie.AbstractCookieAttributeHandler
 org.apache.http.impl.cookie.AbstractCookieSpec
@@ -8369,7 +8185,6 @@
 org.apache.http.protocol.UriPatternMatcher
 org.apache.http.util.ByteArrayBuffer
 org.apache.http.util.CharArrayBuffer
-org.apache.http.util.EncodingUtils
 org.apache.http.util.EntityUtils
 org.apache.http.util.LangUtils
 org.ccil.cowan.tagsoup.AttributesImpl
@@ -8395,19 +8210,6 @@
 org.kxml2.io.KXmlParser
 org.kxml2.io.KXmlParser$ValueContext
 org.kxml2.io.KXmlSerializer
-org.w3c.dom.Attr
-org.w3c.dom.CharacterData
-org.w3c.dom.DOMImplementation
-org.w3c.dom.Document
-org.w3c.dom.DocumentFragment
-org.w3c.dom.DocumentType
-org.w3c.dom.Element
-org.w3c.dom.NamedNodeMap
-org.w3c.dom.Node
-org.w3c.dom.NodeList
-org.w3c.dom.ProcessingInstruction
-org.w3c.dom.Text
-org.w3c.dom.TypeInfo
 org.xml.sax.Attributes
 org.xml.sax.ContentHandler
 org.xml.sax.DTDHandler
@@ -8420,6 +8222,9 @@
 org.xml.sax.SAXNotSupportedException
 org.xml.sax.SAXParseException
 org.xml.sax.XMLReader
+org.xml.sax.ext.DeclHandler
+org.xml.sax.ext.DefaultHandler2
+org.xml.sax.ext.EntityResolver2
 org.xml.sax.ext.LexicalHandler
 org.xml.sax.helpers.AttributesImpl
 org.xml.sax.helpers.DefaultHandler
@@ -8428,7 +8233,9 @@
 org.xmlpull.v1.XmlPullParserFactory
 org.xmlpull.v1.XmlSerializer
 sun.invoke.util.BytecodeDescriptor
+sun.invoke.util.VerifyAccess
 sun.invoke.util.Wrapper
+sun.invoke.util.Wrapper$Format
 sun.misc.ASCIICaseInsensitiveComparator
 sun.misc.Cleaner
 sun.misc.CompoundEnumeration
@@ -8465,13 +8272,17 @@
 sun.net.www.ParseUtil
 sun.net.www.protocol.file.Handler
 sun.net.www.protocol.jar.Handler
+sun.nio.ch.AbstractPollArrayWrapper
+sun.nio.ch.AbstractPollSelectorImpl
+sun.nio.ch.AllocatedNativeObject
 sun.nio.ch.ChannelInputStream
 sun.nio.ch.DatagramChannelImpl
 sun.nio.ch.DatagramDispatcher
+sun.nio.ch.DefaultSelectorProvider
 sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
 sun.nio.ch.FileChannelImpl
 sun.nio.ch.FileChannelImpl$Unmapper
+sun.nio.ch.FileDescriptorHolderSocketImpl
 sun.nio.ch.FileDispatcher
 sun.nio.ch.FileDispatcherImpl
 sun.nio.ch.FileKey
@@ -8481,16 +8292,31 @@
 sun.nio.ch.IOUtil
 sun.nio.ch.Interruptible
 sun.nio.ch.NativeDispatcher
+sun.nio.ch.NativeObject
 sun.nio.ch.NativeThread
 sun.nio.ch.NativeThreadSet
 sun.nio.ch.Net
+sun.nio.ch.Net$1
+sun.nio.ch.Net$4
+sun.nio.ch.PollArrayWrapper
+sun.nio.ch.PollSelectorImpl
+sun.nio.ch.PollSelectorProvider
 sun.nio.ch.SelChImpl
+sun.nio.ch.SelectionKeyImpl
+sun.nio.ch.SelectorImpl
+sun.nio.ch.SelectorProviderImpl
 sun.nio.ch.ServerSocketChannelImpl
 sun.nio.ch.SharedFileLockTable
 sun.nio.ch.SharedFileLockTable$FileLockReference
+sun.nio.ch.SocketAdaptor
+sun.nio.ch.SocketAdaptor$1
+sun.nio.ch.SocketAdaptor$2
+sun.nio.ch.SocketAdaptor$SocketInputStream
 sun.nio.ch.SocketChannelImpl
+sun.nio.ch.SocketDispatcher
 sun.nio.ch.Util
 sun.nio.ch.Util$1
+sun.nio.ch.Util$2
 sun.nio.ch.Util$BufferCache
 sun.nio.cs.ArrayDecoder
 sun.nio.cs.ArrayEncoder
@@ -8500,9 +8326,11 @@
 sun.nio.cs.ThreadLocalCoders$1
 sun.nio.cs.ThreadLocalCoders$2
 sun.nio.cs.ThreadLocalCoders$Cache
+sun.nio.fs.AbstractBasicFileAttributeView
 sun.nio.fs.AbstractFileSystemProvider
 sun.nio.fs.AbstractPath
 sun.nio.fs.DefaultFileSystemProvider
+sun.nio.fs.DynamicFileAttributeView
 sun.nio.fs.LinuxFileSystem
 sun.nio.fs.LinuxFileSystemProvider
 sun.nio.fs.NativeBuffer
@@ -8512,7 +8340,10 @@
 sun.nio.fs.UnixChannelFactory$Flags
 sun.nio.fs.UnixConstants
 sun.nio.fs.UnixException
+sun.nio.fs.UnixFileAttributeViews
+sun.nio.fs.UnixFileAttributeViews$Basic
 sun.nio.fs.UnixFileAttributes
+sun.nio.fs.UnixFileAttributes$UnixAsBasicFileAttributes
 sun.nio.fs.UnixFileModeAttribute
 sun.nio.fs.UnixFileStoreAttributes
 sun.nio.fs.UnixFileSystem
@@ -8523,6 +8354,7 @@
 sun.nio.fs.Util
 sun.reflect.misc.ReflectUtil
 sun.security.action.GetBooleanAction
+sun.security.action.GetIntegerAction
 sun.security.action.GetPropertyAction
 sun.security.jca.GetInstance
 sun.security.jca.GetInstance$Instance
@@ -8548,23 +8380,34 @@
 sun.security.provider.certpath.AdaptableX509CertSelector
 sun.security.provider.certpath.AlgorithmChecker
 sun.security.provider.certpath.BasicChecker
+sun.security.provider.certpath.CertId
 sun.security.provider.certpath.CertPathHelper
 sun.security.provider.certpath.ConstraintsChecker
 sun.security.provider.certpath.KeyChecker
+sun.security.provider.certpath.OCSP$RevocationStatus
+sun.security.provider.certpath.OCSP$RevocationStatus$CertStatus
+sun.security.provider.certpath.OCSPResponse
+sun.security.provider.certpath.OCSPResponse$ResponseStatus
+sun.security.provider.certpath.OCSPResponse$SingleResponse
 sun.security.provider.certpath.PKIX
 sun.security.provider.certpath.PKIX$ValidatorParams
 sun.security.provider.certpath.PKIXCertPathValidator
 sun.security.provider.certpath.PKIXMasterCertPathValidator
 sun.security.provider.certpath.PolicyChecker
 sun.security.provider.certpath.PolicyNodeImpl
-sun.security.util.-$Lambda$179$Kli5xKA4dAwmFO1sy_hpNWmbfH4
+sun.security.provider.certpath.RevocationChecker
+sun.security.provider.certpath.RevocationChecker$1
+sun.security.provider.certpath.RevocationChecker$Mode
+sun.security.provider.certpath.RevocationChecker$RevocationProperties
 sun.security.util.AbstractAlgorithmConstraints
+sun.security.util.AbstractAlgorithmConstraints$1
 sun.security.util.AlgorithmDecomposer
 sun.security.util.BitArray
 sun.security.util.ByteArrayLexOrder
 sun.security.util.ByteArrayTagOrder
 sun.security.util.Cache
 sun.security.util.Cache$EqualByteArray
+sun.security.util.CertConstraintParameters
 sun.security.util.Debug
 sun.security.util.DerEncoder
 sun.security.util.DerIndefLenConverter
@@ -8573,9 +8416,10 @@
 sun.security.util.DerOutputStream
 sun.security.util.DerValue
 sun.security.util.DisabledAlgorithmConstraints
+sun.security.util.DisabledAlgorithmConstraints$Constraint
+sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator
+sun.security.util.DisabledAlgorithmConstraints$Constraints
 sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraints
 sun.security.util.KeyUtil
 sun.security.util.Length
 sun.security.util.ManifestDigester
@@ -8657,6 +8501,7 @@
 sun.util.locale.BaseLocale
 sun.util.locale.BaseLocale$Cache
 sun.util.locale.BaseLocale$Key
+sun.util.locale.Extension
 sun.util.locale.InternalLocaleBuilder
 sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar
 sun.util.locale.LanguageTag
@@ -8667,9 +8512,11 @@
 sun.util.locale.LocaleUtils
 sun.util.locale.ParseStatus
 sun.util.locale.StringTokenIterator
+sun.util.locale.UnicodeLocaleExtension
 sun.util.logging.LoggingProxy
 sun.util.logging.LoggingSupport
 sun.util.logging.LoggingSupport$1
+sun.util.logging.LoggingSupport$2
 sun.util.logging.PlatformLogger
 sun.util.logging.PlatformLogger$1
 sun.util.logging.PlatformLogger$JavaLoggerProxy
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index b7f1068..a44bd03 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -25,6 +25,7 @@
 import android.annotation.StyleRes;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.res.ResourceId;
 import android.database.Cursor;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -204,7 +205,7 @@
         mAlert = AlertController.create(getContext(), this, getWindow());
     }
 
-    static int resolveDialogTheme(Context context, int themeResId) {
+    static @StyleRes int resolveDialogTheme(Context context, @StyleRes int themeResId) {
         if (themeResId == THEME_TRADITIONAL) {
             return R.style.Theme_Dialog_Alert;
         } else if (themeResId == THEME_HOLO_DARK) {
@@ -215,7 +216,7 @@
             return R.style.Theme_DeviceDefault_Dialog_Alert;
         } else if (themeResId == THEME_DEVICE_DEFAULT_LIGHT) {
             return R.style.Theme_DeviceDefault_Light_Dialog_Alert;
-        } else if (Integer.compareUnsigned(themeResId, 0x01000000) >= 0) {
+        } else if (ResourceId.isValid(themeResId)) {
             // start of real resource IDs.
             return themeResId;
         } else {
@@ -450,7 +451,7 @@
          * @param context the parent context
          */
         public Builder(Context context) {
-            this(context, resolveDialogTheme(context, 0));
+            this(context, resolveDialogTheme(context, ResourceId.ID_NULL));
         }
 
         /**
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 943c572..b162cb1 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -34,6 +34,7 @@
 import android.content.DialogInterface;
 import android.content.res.Configuration;
 import android.content.pm.ApplicationInfo;
+import android.content.res.ResourceId;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
@@ -169,7 +170,7 @@
 
     Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
         if (createContextThemeWrapper) {
-            if (themeResId == 0) {
+            if (themeResId == ResourceId.ID_NULL) {
                 final TypedValue outValue = new TypedValue();
                 context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true);
                 themeResId = outValue.resourceId;
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index bc7fcf5..143d147 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -71,6 +71,7 @@
     private static final String ATT_SHOW_BADGE = "show_badge";
     private static final String ATT_USER_LOCKED = "locked";
     private static final String ATT_GROUP = "group";
+    private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
     private static final String DELIMITER = ",";
 
     /**
@@ -140,6 +141,7 @@
     private boolean mDeleted = DEFAULT_DELETED;
     private String mGroup;
     private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
+    private boolean mBlockableSystem = false;
 
     /**
      * Creates a notification channel.
@@ -199,6 +201,7 @@
         }
         mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
         mLightColor = in.readInt();
+        mBlockableSystem = in.readBoolean();
     }
 
     @Override
@@ -249,6 +252,7 @@
             dest.writeInt(0);
         }
         dest.writeInt(mLightColor);
+        dest.writeBoolean(mBlockableSystem);
     }
 
     /**
@@ -272,6 +276,12 @@
         mDeleted = deleted;
     }
 
+    /**
+     * @hide
+     */
+    public void setBlockableSystem(boolean blockableSystem) {
+        mBlockableSystem = blockableSystem;
+    }
     // Modifiable by apps post channel creation
 
     /**
@@ -421,7 +431,6 @@
         this.mLockscreenVisibility = lockscreenVisibility;
     }
 
-
     /**
      * Returns the id of this channel.
      */
@@ -549,6 +558,13 @@
     /**
      * @hide
      */
+    public boolean isBlockableSystem() {
+        return mBlockableSystem;
+    }
+
+    /**
+     * @hide
+     */
     @SystemApi
     public void populateFromXml(XmlPullParser parser) {
         // Name, id, and importance are set in the constructor.
@@ -559,12 +575,13 @@
         setSound(safeUri(parser, ATT_SOUND), safeAudioAttributes(parser));
         enableLights(safeBool(parser, ATT_LIGHTS, false));
         setLightColor(safeInt(parser, ATT_LIGHT_COLOR, DEFAULT_LIGHT_COLOR));
-        enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
         setVibrationPattern(safeLongArray(parser, ATT_VIBRATION, null));
+        enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
         setShowBadge(safeBool(parser, ATT_SHOW_BADGE, false));
         setDeleted(safeBool(parser, ATT_DELETED, false));
         setGroup(parser.getAttributeValue(null, ATT_GROUP));
         lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
+        setBlockableSystem(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
     }
 
     /**
@@ -625,6 +642,9 @@
         if (getGroup() != null) {
             out.attribute(null, ATT_GROUP, getGroup());
         }
+        if (isBlockableSystem()) {
+            out.attribute(null, ATT_BLOCKABLE_SYSTEM, Boolean.toString(isBlockableSystem()));
+        }
 
         out.endTag(null, TAG_CHANNEL);
     }
@@ -665,6 +685,7 @@
         record.put(ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
         record.put(ATT_DELETED, Boolean.toString(isDeleted()));
         record.put(ATT_GROUP, getGroup());
+        record.put(ATT_BLOCKABLE_SYSTEM, isBlockableSystem());
         return record;
     }
 
@@ -764,6 +785,7 @@
         if (mVibrationEnabled != that.mVibrationEnabled) return false;
         if (mShowBadge != that.mShowBadge) return false;
         if (isDeleted() != that.isDeleted()) return false;
+        if (isBlockableSystem() != that.isBlockableSystem()) return false;
         if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) return false;
         if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) {
             return false;
@@ -802,6 +824,7 @@
         result = 31 * result + (isDeleted() ? 1 : 0);
         result = 31 * result + (getGroup() != null ? getGroup().hashCode() : 0);
         result = 31 * result + (getAudioAttributes() != null ? getAudioAttributes().hashCode() : 0);
+        result = 31 * result + (isBlockableSystem() ? 1 : 0);
         return result;
     }
 
@@ -824,6 +847,7 @@
                 ", mDeleted=" + mDeleted +
                 ", mGroup='" + mGroup + '\'' +
                 ", mAudioAttributes=" + mAudioAttributes +
+                ", mBlockableSystem=" + mBlockableSystem +
                 '}';
     }
 }
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index de80c36..9ae5d1c 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -7609,22 +7609,6 @@
     }
 
     /**
-     * STOPSHIP (b/37622682) Remove it before release.
-     * @removed
-     */
-    public void setAffiliationIds(@NonNull ComponentName admin, @NonNull List<String> ids) {
-        throwIfParentInstance("setAffiliationIds");
-        if (ids == null) {
-            throw new IllegalArgumentException("ids must not be null");
-        }
-        try {
-            mService.setAffiliationIds(admin, ids);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
      * Returns the set of affiliation ids previously set via {@link #setAffiliationIds}, or an
      * empty set if none have been set.
      */
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index c613d97..c99a1e4 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -1682,11 +1682,6 @@
         }
 
         @Override
-        public void setAutofillId(@NonNull ViewStructure parent, int virtualId) {
-            setAutofillId(parent.getAutofillId(), virtualId);
-        }
-
-        @Override
         public ViewStructure newChild(int index) {
             ViewNode node = new ViewNode();
             mNode.mChildren[index] = node;
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index 52fa8a6..fd1b0e0 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
+import android.content.res.ResourceId;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
@@ -368,7 +369,7 @@
         try {
             Resources resources = context.getPackageManager().getResourcesForApplication(
                     providerInfo.applicationInfo);
-            if (resourceId != 0) {
+            if (ResourceId.isValid(resourceId)) {
                 if (density < 0) {
                     density = 0;
                 }
diff --git a/core/java/android/bluetooth/le/ScanRecord.java b/core/java/android/bluetooth/le/ScanRecord.java
index f802e8d..914e8fd 100644
--- a/core/java/android/bluetooth/le/ScanRecord.java
+++ b/core/java/android/bluetooth/le/ScanRecord.java
@@ -47,7 +47,9 @@
     private static final int DATA_TYPE_LOCAL_NAME_SHORT = 0x08;
     private static final int DATA_TYPE_LOCAL_NAME_COMPLETE = 0x09;
     private static final int DATA_TYPE_TX_POWER_LEVEL = 0x0A;
-    private static final int DATA_TYPE_SERVICE_DATA = 0x16;
+    private static final int DATA_TYPE_SERVICE_DATA_16_BIT = 0x16;
+    private static final int DATA_TYPE_SERVICE_DATA_32_BIT = 0x20;
+    private static final int DATA_TYPE_SERVICE_DATA_128_BIT = 0x21;
     private static final int DATA_TYPE_MANUFACTURER_SPECIFIC_DATA = 0xFF;
 
     // Flags of the advertising data.
@@ -224,10 +226,16 @@
                     case DATA_TYPE_TX_POWER_LEVEL:
                         txPowerLevel = scanRecord[currentPos];
                         break;
-                    case DATA_TYPE_SERVICE_DATA:
-                        // The first two bytes of the service data are service data UUID in little
-                        // endian. The rest bytes are service data.
+                    case DATA_TYPE_SERVICE_DATA_16_BIT:
+                    case DATA_TYPE_SERVICE_DATA_32_BIT:
+                    case DATA_TYPE_SERVICE_DATA_128_BIT:
                         int serviceUuidLength = BluetoothUuid.UUID_BYTES_16_BIT;
+                        if (fieldType == DATA_TYPE_SERVICE_DATA_32_BIT) {
+                         serviceUuidLength = BluetoothUuid.UUID_BYTES_32_BIT;
+                        } else if (fieldType == DATA_TYPE_SERVICE_DATA_128_BIT) {
+                         serviceUuidLength = BluetoothUuid.UUID_BYTES_128_BIT;
+                        }
+
                         byte[] serviceDataUuidBytes = extractBytes(scanRecord, currentPos,
                                 serviceUuidLength);
                         ParcelUuid serviceDataUuid = BluetoothUuid.parseUuidFrom(
diff --git a/core/java/android/content/res/ResourceId.java b/core/java/android/content/res/ResourceId.java
new file mode 100644
index 0000000..adb9cf1
--- /dev/null
+++ b/core/java/android/content/res/ResourceId.java
@@ -0,0 +1,44 @@
+/*
+ * 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.content.res;
+
+import android.annotation.AnyRes;
+
+/**
+ * Provides a set of utility methods for dealing with Resource IDs.
+ * @hide
+ */
+public final class ResourceId {
+
+    /**
+     * The {@code null} resource ID.
+     */
+    public static final @AnyRes int ID_NULL = 0;
+
+    /**
+     * Checks whether the integer {@code id} is a valid resource ID, as generated by AAPT.
+     * <p>Note that a negative integer is not necessarily an invalid resource ID, and custom
+     * validations that compare the {@code id} against {@code 0} are incorrect.</p>
+     * @param id The integer to validate.
+     * @return {@code true} if the integer is a valid resource ID.
+     */
+    public static boolean isValid(@AnyRes int id) {
+        // With the introduction of packages with IDs > 0x7f, resource IDs can be negative when
+        // represented as a signed Java int. Some legacy code assumes -1 is an invalid resource ID,
+        // despite the existing documentation.
+        return id != -1 && (id & 0xff000000) != 0 && (id & 0x00ff0000) != 0;
+    }
+}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index e525ab3f..60226d5 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -151,7 +151,7 @@
     /** @hide */
     public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo,
             int dark, int deviceDefault) {
-        if (curTheme != 0) {
+        if (curTheme != ResourceId.ID_NULL) {
             return curTheme;
         }
         if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index b3adf82..23591c7 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -36,6 +36,7 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.DrawableContainer;
 import android.icu.text.PluralRules;
 import android.os.Build;
 import android.os.LocaleList;
@@ -590,6 +591,7 @@
             }
 
             Drawable dr;
+            boolean needsNewDrawableAfterCache = false;
             if (cs != null) {
                 dr = cs.newDrawable(wrapper);
             } else if (isColorDrawable) {
@@ -597,6 +599,12 @@
             } else {
                 dr = loadDrawableForCookie(wrapper, value, id, density, null);
             }
+            // DrawableContainer' constant state has drawables instances. In order to leave the
+            // constant state intact in the cache, we need to create a new DrawableContainer after
+            // added to cache.
+            if (dr instanceof DrawableContainer)  {
+                needsNewDrawableAfterCache = true;
+            }
 
             // Determine if the drawable has unresolved theme attributes. If it
             // does, we'll need to apply a theme and store it in a theme-specific
@@ -615,6 +623,12 @@
                 dr.setChangingConfigurations(value.changingConfigurations);
                 if (useCache) {
                     cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr);
+                    if (needsNewDrawableAfterCache) {
+                        Drawable.ConstantState state = dr.getConstantState();
+                        if (state != null) {
+                            dr = state.newDrawable(wrapper);
+                        }
+                    }
                 }
             }
 
diff --git a/core/java/android/hardware/camera2/impl/CallbackProxies.java b/core/java/android/hardware/camera2/impl/CallbackProxies.java
index e6e448e..c9eecf1 100644
--- a/core/java/android/hardware/camera2/impl/CallbackProxies.java
+++ b/core/java/android/hardware/camera2/impl/CallbackProxies.java
@@ -88,7 +88,7 @@
     }
 
     @SuppressWarnings("deprecation")
-    public static class DeviceCaptureCallbackProxy extends CameraDeviceImpl.CaptureCallback {
+    public static class DeviceCaptureCallbackProxy implements CameraDeviceImpl.CaptureCallback {
         private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;
 
         public DeviceCaptureCallbackProxy(
@@ -138,6 +138,13 @@
                 int sequenceId) {
             mProxy.invoke("onCaptureSequenceAborted", camera, sequenceId);
         }
+
+        @Override
+        public void onCaptureBufferLost(CameraDevice camera,
+                CaptureRequest request, Surface target, long frameNumber) {
+            mProxy.invoke("onCaptureBufferLost", camera, request, target, frameNumber);
+        }
+
     }
 
     public static class SessionStateCallbackProxy
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
index 16ffee0..b3938cb 100644
--- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
@@ -452,6 +452,37 @@
     private CameraDeviceImpl.CaptureCallback createCaptureCallbackProxy(
             Handler handler, CaptureCallback callback) {
         CameraDeviceImpl.CaptureCallback localCallback = new CameraDeviceImpl.CaptureCallback() {
+
+            @Override
+            public void onCaptureStarted(CameraDevice camera,
+                    CaptureRequest request, long timestamp, long frameNumber) {
+                // Do nothing
+            }
+
+            @Override
+            public void onCapturePartial(CameraDevice camera,
+                    CaptureRequest request, android.hardware.camera2.CaptureResult result) {
+                // Do nothing
+            }
+
+            @Override
+            public void onCaptureProgressed(CameraDevice camera,
+                    CaptureRequest request, android.hardware.camera2.CaptureResult partialResult) {
+                // Do nothing
+            }
+
+            @Override
+            public void onCaptureCompleted(CameraDevice camera,
+                    CaptureRequest request, android.hardware.camera2.TotalCaptureResult result) {
+                // Do nothing
+            }
+
+            @Override
+            public void onCaptureFailed(CameraDevice camera,
+                    CaptureRequest request, android.hardware.camera2.CaptureFailure failure) {
+                // Do nothing
+            }
+
             @Override
             public void onCaptureSequenceCompleted(CameraDevice camera,
                     int sequenceId, long frameNumber) {
@@ -463,6 +494,13 @@
                     int sequenceId) {
                 finishPendingSequence(sequenceId);
             }
+
+            @Override
+            public void onCaptureBufferLost(CameraDevice camera,
+                    CaptureRequest request, Surface target, long frameNumber) {
+                // Do nothing
+            }
+
         };
 
         /*
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index ab87f15..0d5c5e3 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -1112,8 +1112,11 @@
      * <p>A callback for tracking the progress of a {@link CaptureRequest}
      * submitted to the camera device.</p>
      *
+     * An interface instead of an abstract class because this is internal and
+     * we want to make sure we always implement all its callbacks until we reach
+     * the public layer.
      */
-    public static abstract class CaptureCallback {
+    public interface CaptureCallback {
 
         /**
          * This constant is used to indicate that no images were captured for
@@ -1130,9 +1133,7 @@
          * @see android.media.MediaActionSound
          */
         public void onCaptureStarted(CameraDevice camera,
-                CaptureRequest request, long timestamp, long frameNumber) {
-            // default empty implementation
-        }
+                CaptureRequest request, long timestamp, long frameNumber);
 
         /**
          * This method is called when some results from an image capture are
@@ -1141,9 +1142,7 @@
          * @hide
          */
         public void onCapturePartial(CameraDevice camera,
-                CaptureRequest request, CaptureResult result) {
-            // default empty implementation
-        }
+                CaptureRequest request, CaptureResult result);
 
         /**
          * This method is called when an image capture makes partial forward progress; some
@@ -1151,18 +1150,14 @@
          *
          */
         public void onCaptureProgressed(CameraDevice camera,
-                CaptureRequest request, CaptureResult partialResult) {
-            // default empty implementation
-        }
+                CaptureRequest request, CaptureResult partialResult);
 
         /**
          * This method is called when an image capture has fully completed and all the
          * result metadata is available.
          */
         public void onCaptureCompleted(CameraDevice camera,
-                CaptureRequest request, TotalCaptureResult result) {
-            // default empty implementation
-        }
+                CaptureRequest request, TotalCaptureResult result);
 
         /**
          * This method is called instead of {@link #onCaptureCompleted} when the
@@ -1170,9 +1165,7 @@
          * request.
          */
         public void onCaptureFailed(CameraDevice camera,
-                CaptureRequest request, CaptureFailure failure) {
-            // default empty implementation
-        }
+                CaptureRequest request, CaptureFailure failure);
 
         /**
          * This method is called independently of the others in CaptureCallback,
@@ -1180,9 +1173,7 @@
          * or {@link CaptureFailure} for it have been returned via this callback.
          */
         public void onCaptureSequenceCompleted(CameraDevice camera,
-                int sequenceId, long frameNumber) {
-            // default empty implementation
-        }
+                int sequenceId, long frameNumber);
 
         /**
          * This method is called independently of the others in CaptureCallback,
@@ -1190,14 +1181,16 @@
          * or {@link CaptureFailure} for it have been returned via this callback.
          */
         public void onCaptureSequenceAborted(CameraDevice camera,
-                int sequenceId) {
-            // default empty implementation
-        }
+                int sequenceId);
 
+        /**
+         * This method is called independently of the others in CaptureCallback, if an output buffer
+         * is dropped for a particular capture request.
+         *
+         * Loss of metadata is communicated via onCaptureFailed, independently of any buffer loss.
+         */
         public void onCaptureBufferLost(CameraDevice camera,
-                CaptureRequest request, Surface target, long frameNumber) {
-            // default empty implementation
-        }
+                CaptureRequest request, Surface target, long frameNumber);
     }
 
     /**
diff --git a/core/java/android/nfc/NdefRecord.java b/core/java/android/nfc/NdefRecord.java
index 2c9ce3f..093a9b4 100644
--- a/core/java/android/nfc/NdefRecord.java
+++ b/core/java/android/nfc/NdefRecord.java
@@ -938,7 +938,7 @@
      */
     void writeToByteBuffer(ByteBuffer buffer, boolean mb, boolean me) {
         boolean sr = mPayload.length < 256;
-        boolean il = mId.length > 0;
+        boolean il = mTnf == TNF_EMPTY ? true : mId.length > 0;
 
         byte flags = (byte)((mb ? FLAG_MB : 0) | (me ? FLAG_ME : 0) |
                 (sr ? FLAG_SR : 0) | (il ? FLAG_IL : 0) | mTnf);
@@ -966,7 +966,7 @@
         int length = 3 + mType.length + mId.length + mPayload.length;
 
         boolean sr = mPayload.length < 256;
-        boolean il = mId.length > 0;
+        boolean il = mTnf == TNF_EMPTY ? true : mId.length > 0;
 
         if (!sr) length += 3;
         if (il) length += 1;
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
index fea64ec..141d33b 100644
--- a/core/java/android/os/AsyncTask.java
+++ b/core/java/android/os/AsyncTask.java
@@ -17,14 +17,14 @@
 package android.os;
 
 import android.annotation.MainThread;
+import android.annotation.Nullable;
 import android.annotation.WorkerThread;
-
 import java.util.ArrayDeque;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CancellationException;
-import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
 import java.util.concurrent.FutureTask;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadFactory;
@@ -232,6 +232,8 @@
     private final AtomicBoolean mCancelled = new AtomicBoolean();
     private final AtomicBoolean mTaskInvoked = new AtomicBoolean();
 
+    private final Handler mHandler;
+
     private static class SerialExecutor implements Executor {
         final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
         Runnable mActive;
@@ -277,15 +279,19 @@
         FINISHED,
     }
 
-    private static Handler getHandler() {
+    private static Handler getMainHandler() {
         synchronized (AsyncTask.class) {
             if (sHandler == null) {
-                sHandler = new InternalHandler();
+                sHandler = new InternalHandler(Looper.getMainLooper());
             }
             return sHandler;
         }
     }
 
+    private Handler getHandler() {
+        return mHandler;
+    }
+
     /** @hide */
     public static void setDefaultExecutor(Executor exec) {
         sDefaultExecutor = exec;
@@ -295,6 +301,28 @@
      * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
      */
     public AsyncTask() {
+        this((Looper) null);
+    }
+
+    /**
+     * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+     *
+     * @hide
+     */
+    public AsyncTask(@Nullable Handler handler) {
+        this(handler != null ? handler.getLooper() : null);
+    }
+
+    /**
+     * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+     *
+     * @hide
+     */
+    public AsyncTask(@Nullable Looper callbackLooper) {
+        mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()
+            ? getMainHandler()
+            : new Handler(callbackLooper);
+
         mWorker = new WorkerRunnable<Params, Result>() {
             public Result call() throws Exception {
                 mTaskInvoked.set(true);
@@ -670,8 +698,8 @@
     }
 
     private static class InternalHandler extends Handler {
-        public InternalHandler() {
-            super(Looper.getMainLooper());
+        public InternalHandler(Looper looper) {
+            super(looper);
         }
 
         @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 447f280..d2598c7 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -22,9 +22,12 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.os.UserManager;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.Display;
+import android.view.WindowManager;
 
 import libcore.io.Streams;
 
@@ -570,7 +573,16 @@
 
             // Having set up the BCB (bootloader control block), go ahead and reboot
             PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-            pm.reboot(PowerManager.REBOOT_RECOVERY_UPDATE);
+            String reason = PowerManager.REBOOT_RECOVERY_UPDATE;
+
+            // On TV, reboot quiescently if the screen is off
+            if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
+                WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+                if (wm.getDefaultDisplay().getState() != Display.STATE_ON) {
+                    reason += ",quiescent";
+                }
+            }
+            pm.reboot(reason);
 
             throw new IOException("Reboot failed (no permissions?)");
         }
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index f503b3a..0611f17 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -342,6 +342,18 @@
     private static volatile int sVmPolicyMask = 0;
     private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;
 
+    /** {@hide} */
+    public interface ViolationListener {
+        public void onViolation(String message);
+    }
+
+    private static volatile ViolationListener sListener;
+
+    /** {@hide} */
+    public static void setViolationListener(ViolationListener listener) {
+        sListener = listener;
+    }
+
     /**
      * The number of threads trying to do an async dropbox write.
      * Just to limit ourselves out of paranoia.
@@ -1581,6 +1593,9 @@
             long timeSinceLastViolationMillis = lastViolationTime == 0 ?
                     Long.MAX_VALUE : (now - lastViolationTime);
 
+            if ((info.policy & PENALTY_LOG) != 0 && sListener != null) {
+                sListener.onViolation(info.crashInfo.stackTrace);
+            }
             if ((info.policy & PENALTY_LOG) != 0 &&
                 timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
                 if (info.durationMillis != -1) {
@@ -2024,6 +2039,9 @@
             }
         }
 
+        if (penaltyLog && sListener != null) {
+            sListener.onViolation(originStack.toString());
+        }
         if (penaltyLog && timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
             Log.e(TAG, message, originStack);
         }
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index f987e4e..ad46d07 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -923,8 +923,11 @@
                             + " include tag: <include layout=\"@layout/layoutID\" />");
                 }
 
-                // Attempt to resolve the "?attr/name" string to an identifier.
-                layout = context.getResources().getIdentifier(value.substring(1), null, null);
+                // Attempt to resolve the "?attr/name" string to an attribute
+                // within the default (e.g. application) package.
+                layout = context.getResources().getIdentifier(
+                        value.substring(1), "attr", context.getPackageName());
+
             }
 
             // The layout might be referencing a theme attribute.
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index c66bf874..25a58e6 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -872,6 +872,15 @@
         }
     }
 
+    /**
+     * Creates a {@link android.graphics.Bitmap.Config#HARDWARE} bitmap from the given
+     * RenderNode. Note that the RenderNode should be created as a root node (so x/y of 0,0), and
+     * not the RenderNode from a View.
+     **/
+    public static Bitmap createHardwareBitmap(RenderNode node, int width, int height) {
+        return nCreateHardwareBitmap(node.getNativeDisplayList(), width, height);
+    }
+
     @Override
     protected void finalize() throws Throwable {
         try {
@@ -1015,4 +1024,6 @@
 
     private static native int nCopySurfaceInto(Surface surface,
             int srcLeft, int srcTop, int srcRight, int srcBottom, Bitmap bitmap);
+
+    private static native Bitmap nCreateHardwareBitmap(long renderNode, int width, int height);
 }
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 5b51c16..a69b813 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -593,12 +593,12 @@
  * a single tag using the {@link android.R.styleable#View_tag android:tag}
  * attribute or multiple tags using the {@code <tag>} child element:
  * <pre>
- *     &ltView ...
+ *     &lt;View ...
  *           android:tag="@string/mytag_value" /&gt;
- *     &ltView ...&gt;
- *         &lttag android:id="@+id/mytag"
+ *     &lt;View ...&gt;
+ *         &lt;tag android:id="@+id/mytag"
  *              android:value="@string/mytag_value" /&gt;
- *     &lt/View>
+ *     &lt;/View>
  * </pre>
  * </p>
  * <p>
@@ -628,11 +628,11 @@
  * {@link android.R.styleable#Theme_colorAccent android:colorAccent} defined on
  * the inflation context's theme (e.g. the Activity theme) will be preserved.
  * <pre>
- *     &ltLinearLayout
+ *     &lt;LinearLayout
  *             ...
  *             android:theme="@android:theme/ThemeOverlay.Material.Dark"&gt;
- *         &ltView ...&gt;
- *     &lt/LinearLayout&gt;
+ *         &lt;View ...&gt;
+ *     &lt;/LinearLayout&gt;
  * </pre>
  * </p>
  *
@@ -964,115 +964,155 @@
     private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};
 
     /**
-     * This view contains an email address.
+     * Hint indicating that this view can be autofilled with an email address.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_EMAIL_ADDRESS}"
-     * to <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_EMAIL_ADDRESS}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_EMAIL_ADDRESS = "emailAddress";
 
     /**
-     * The view contains a real name.
+     * Hint indicating that this view can be autofilled with a user's real name.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_NAME}" to
-     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_NAME}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_NAME = "name";
 
     /**
-     * The view contains a user name.
+     * Hint indicating that this view can be autofilled with a username.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_USERNAME}" to
-     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_USERNAME}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_USERNAME = "username";
 
     /**
-     * The view contains a password.
+     * Hint indicating that this view can be autofilled with a password.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_PASSWORD}" to
-     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_PASSWORD}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_PASSWORD = "password";
 
     /**
-     * The view contains a phone number.
+     * Hint indicating that this view can be autofilled with a phone number.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_PHONE}" to
-     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_PHONE}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_PHONE = "phone";
 
     /**
-     * The view contains a postal address.
+     * Hint indicating that this view can be autofilled with a postal address.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_POSTAL_ADDRESS}"
-     * to <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_POSTAL_ADDRESS}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress";
 
     /**
-     * The view contains a postal code.
+     * Hint indicating that this view can be autofilled with a postal code.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_POSTAL_CODE}" to
-     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_POSTAL_CODE}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
 
     /**
-     * The view contains a credit card number.
+     * Hint indicating that this view can be autofilled with a credit card number.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value
-     * #AUTOFILL_HINT_CREDIT_CARD_NUMBER}" to <a href="#attr_android:autofillHint"> {@code
-     * android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_NUMBER}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_CREDIT_CARD_NUMBER = "creditCardNumber";
 
     /**
-     * The view contains a credit card security code.
+     * Hint indicating that this view can be autofilled with a credit card security code.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value
-     * #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE}" to <a href="#attr_android:autofillHint"> {@code
-     * android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = "creditCardSecurityCode";
 
     /**
-     * The view contains a credit card expiration date.
+     * Hint indicating that this view can be autofilled with a credit card expiration date.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value
-     * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE}" to <a href="#attr_android:autofillHint"> {@code
-     * android:autofillHint}.
+     * <p>It should be used when the credit card expiration date is represented by just one view;
+     * if it is represented by more than one (for example, one view for the month and another view
+     * for the year), then each of these views should use the hint specific for the unit
+     * ({@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY},
+     * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH},
+     * or {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}).
+     *
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE =
             "creditCardExpirationDate";
 
     /**
-     * The view contains the month a credit card expires.
+     * Hint indicating that this view can be autofilled with a credit card expiration month.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value
-     * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH}" to <a href="#attr_android:autofillHint"> {@code
-     * android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH =
             "creditCardExpirationMonth";
 
     /**
-     * The view contains the year a credit card expires.
+     * Hint indicating that this view can be autofilled with a credit card expiration year.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value
-     * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}" to <a href="#attr_android:autofillHint"> {@code
-     * android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR =
             "creditCardExpirationYear";
 
     /**
-     * The view contains the day a credit card expires.
+     * Hint indicating that this view can be autofilled with a credit card expiration day.
      *
-     * Use with {@link #setAutofillHints(String[])}, or set "{@value
-     * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY}" to <a href="#attr_android:autofillHint"> {@code
-     * android:autofillHint}.
+     * <p>Can be used with either {@link #setAutofillHints(String[])} or
+     * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+     * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY}</code>).
+     *
+     * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
      */
     public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
 
@@ -1189,7 +1229,8 @@
     public @interface AutofillFlags {}
 
     /**
-     * Flag requesting you to add views not-important for autofill to the assist data.
+     * Flag requesting you to add views that are marked as not important for autofill
+     * (see {@link #setImportantForAutofill(int)}) to a {@link ViewStructure}.
      */
     public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1;
 
@@ -7486,7 +7527,7 @@
      * <li>Call {@link AutofillManager#commit()} when the autofill context
      * of the view structure changed and you want the current autofill interaction if such
      * to be commited.
-     * <li>Call {@link AutofillManager#cancel()} ()} when the autofill context
+     * <li>Call {@link AutofillManager#cancel()} when the autofill context
      * of the view structure changed and you want the current autofill interaction if such
      * to be cancelled.
      * <li> The {@code left} and {@code top} values set in
@@ -7516,15 +7557,22 @@
      * <li>Passing the actual value to the equivalent setter in the view.
      * </ol>
      *
-     * <p>For example, a text-field view would call:
+     * <p>For example, a text-field view could implement the method this way:
+     *
      * <pre class="prettyprint">
-     * CharSequence text = value.getTextValue();
-     * if (text != null) {
-     *     setText(text);
+     * &#64;Override
+     * public void autofill(AutofillValue value) {
+     *   if (!value.isText() || !this.isEditable()) {
+     *      return;
+     *   }
+     *   CharSequence text = value.getTextValue();
+     *   if (text != null) {
+     *     this.setText(text);
+     *   }
      * }
      * </pre>
      *
-     * <p>If the value is updated asyncronously the next call to
+     * <p>If the value is updated asynchronously the next call to
      * {@link AutofillManager#notifyValueChanged(View)} must happen <u>after</u> the value was
      * changed to the autofilled value. If not, the view will not be considered autofilled.
      *
@@ -7575,9 +7623,13 @@
     }
 
     /**
-     * Describes the content of a view so that a autofill service can fill in the appropriate data.
+     * Gets the hints that help an {@link android.service.autofill.AutofillService} determine how
+     * to autofill the view with the user's data.
      *
-     * @return The hints set via the attribute or {@code null} if no hint it set.
+     * <p>See {@link #setAutofillHints(String...)} for more info about these hints.
+     *
+     * @return The hints set via the attribute or {@link #setAutofillHints(String...)}, or
+     * {@code null} if no hints were set.
      *
      * @attr ref android.R.styleable#View_autofillHints
      */
@@ -9242,8 +9294,26 @@
     }
 
     /**
-     * Sets the hints that helps the autofill service to select the appropriate data to fill the
-     * view.
+     * Sets the hints that help an {@link android.service.autofill.AutofillService} determine how
+     * to autofill the view with the user's data.
+     *
+     * <p>Typically, there is only one way to autofill a view, but there could be more than one.
+     * For example, if the application accepts either an username or email address to identify
+     * an user.
+     *
+     * <p>These hints are not validated by the Android System, but passed "as is" to the service.
+     * Hence, they can have any value, but it's recommended to use the {@code AUTOFILL_HINT_}
+     * constants such as:
+     * {@link #AUTOFILL_HINT_USERNAME}, {@link #AUTOFILL_HINT_PASSWORD},
+     * {@link #AUTOFILL_HINT_EMAIL_ADDRESS},
+     * {@link #AUTOFILL_HINT_NAME},
+     * {@link #AUTOFILL_HINT_PHONE},
+     * {@link #AUTOFILL_HINT_POSTAL_ADDRESS}, {@link #AUTOFILL_HINT_POSTAL_CODE},
+     * {@link #AUTOFILL_HINT_CREDIT_CARD_NUMBER}, {@link #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE},
+     * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE},
+     * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY},
+     * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH} or
+     * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}.
      *
      * @param autofillHints The autofill hints to set. If the array is emtpy, {@code null} is set.
      * @attr ref android.R.styleable#View_autofillHints
@@ -19801,18 +19871,23 @@
      * Check whether we need to draw a default focus highlight when this view gets focused,
      * which requires:
      * <ul>
-     *     <li>In the background, {@link android.R.attr#state_focused} is not defined.</li>
+     *     <li>In both background and foreground, {@link android.R.attr#state_focused}
+     *         is not defined.</li>
      *     <li>This view is not in touch mode.</li>
      *     <li>This view doesn't opt out for a default focus highlight, via
      *         {@link #setDefaultFocusHighlightEnabled(boolean)}.</li>
      *     <li>This view is attached to window.</li>
      * </ul>
      * @return {@code true} if a default focus highlight is needed.
+     * @hide
      */
-    private boolean isDefaultFocusHighlightNeeded(Drawable background) {
-        final boolean hasFocusStateSpecified = background == null || !background.isStateful()
-                || !background.hasFocusStateSpecified();
-        return !isInTouchMode() && getDefaultFocusHighlightEnabled() && hasFocusStateSpecified
+    @TestApi
+    public boolean isDefaultFocusHighlightNeeded(Drawable background, Drawable foreground) {
+        final boolean lackFocusState = (background == null || !background.isStateful()
+                || !background.hasFocusStateSpecified())
+                && (foreground == null || !foreground.isStateful()
+                || !foreground.hasFocusStateSpecified());
+        return !isInTouchMode() && getDefaultFocusHighlightEnabled() && lackFocusState
                 && isAttachedToWindow() && sUseDefaultFocusHighlight;
     }
 
@@ -19824,7 +19899,8 @@
      */
     private void switchDefaultFocusHighlight() {
         if (isFocused()) {
-            final boolean needed = isDefaultFocusHighlightNeeded(mBackground);
+            final boolean needed = isDefaultFocusHighlightNeeded(mBackground,
+                    mForegroundInfo == null ? null : mForegroundInfo.mDrawable);
             final boolean active = mDefaultFocusHighlight != null;
             if (needed && !active) {
                 setDefaultFocusHighlight(getDefaultFocusHighlightDrawable());
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 50593f2..09464eec4 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -57,6 +57,7 @@
 import android.view.animation.AnimationUtils;
 import android.view.animation.LayoutAnimationController;
 import android.view.animation.Transformation;
+
 import com.android.internal.R;
 
 import java.util.ArrayList;
@@ -7715,14 +7716,15 @@
                         mMarginFlags |= RIGHT_MARGIN_UNDEFINED_MASK;
                         rightMargin = DEFAULT_MARGIN_RESOLVED;
                     }
-                    startMargin = a.getDimensionPixelSize(
-                            R.styleable.ViewGroup_MarginLayout_layout_marginStart,
-                            DEFAULT_MARGIN_RELATIVE);
-                    endMargin = a.getDimensionPixelSize(
-                            R.styleable.ViewGroup_MarginLayout_layout_marginEnd,
-                            DEFAULT_MARGIN_RELATIVE);
                 }
 
+                startMargin = a.getDimensionPixelSize(
+                        R.styleable.ViewGroup_MarginLayout_layout_marginStart,
+                        DEFAULT_MARGIN_RELATIVE);
+                endMargin = a.getDimensionPixelSize(
+                        R.styleable.ViewGroup_MarginLayout_layout_marginEnd,
+                        DEFAULT_MARGIN_RELATIVE);
+
                 if (verticalMargin >= 0) {
                     topMargin = verticalMargin;
                     bottomMargin = verticalMargin;
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index 6bdc9ff..ddfe697 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -304,13 +304,6 @@
     public abstract void setAutofillId(@NonNull AutofillId parentId, int virtualId);
 
     /**
-     * @deprecated - use {@link #setAutofillId(AutofillId, int)} instead
-     * @hide
-     */
-    @Deprecated
-    public abstract void setAutofillId(@NonNull ViewStructure parent, int virtualId);
-
-    /**
      * Sets the {@link View#getAutofillType()} that can be used to autofill this node.
      */
     public abstract void setAutofillType(@View.AutofillType int type);
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index d8b316e..a2aff93 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -388,9 +388,10 @@
     /**
      * Explicitly requests a new autofill context.
      *
-     * <p>Normally, the autofill context is automatically started when autofillable views are
-     * focused, but this method should be used in the cases where it must be explicitly requested,
-     * like a view that provides a contextual menu allowing users to autofill the activity.
+     * <p>Normally, the autofill context is automatically started if necessary when
+     * {@link #notifyViewEntered(View)} is called, but this method should be used in the
+     * cases where it must be explicitly started. For example, when the view offers an AUTOFILL
+     * option on its contextual overflow menu, and the user selects it.
      *
      * @param view view requesting the new autofill context.
      */
@@ -401,16 +402,29 @@
     /**
      * Explicitly requests a new autofill context for virtual views.
      *
-     * <p>Normally, the autofill context is automatically started when autofillable views are
-     * focused, but this method should be used in the cases where it must be explicitly requested,
-     * like a virtual view that provides a contextual menu allowing users to autofill the activity.
+     * <p>Normally, the autofill context is automatically started if necessary when
+     * {@link #notifyViewEntered(View, int, Rect)} is called, but this method should be used in the
+     * cases where it must be explicitly started. For example, when the virtual view offers an
+     * AUTOFILL option on its contextual overflow menu, and the user selects it.
      *
-     * @param view the {@link View} whose descendant is the virtual view.
-     * @param childId id identifying the virtual child inside the view.
-     * @param bounds child boundaries, relative to the top window.
+     * <p>The virtual view boundaries must be absolute screen coordinates. For example, if the
+     * parent view uses {@code bounds} to draw the virtual view inside its Canvas,
+     * the absolute bounds could be calculated by:
+     *
+     * <pre class="prettyprint">
+     *   int offset[] = new int[2];
+     *   getLocationOnScreen(offset);
+     *   Rect absBounds = new Rect(bounds.left + offset[0],
+     *       bounds.top + offset[1],
+     *       bounds.right + offset[0], bounds.bottom + offset[1]);
+     * </pre>
+     *
+     * @param view the virtual view parent.
+     * @param virtualId id identifying the virtual child inside the parent view.
+     * @param absBounds absolute boundaries of the virtual view in the screen.
      */
-    public void requestAutofill(@NonNull View view, int childId, @NonNull Rect bounds) {
-        notifyViewEntered(view, childId, bounds, FLAG_MANUAL_REQUEST);
+    public void requestAutofill(@NonNull View view, int virtualId, @NonNull Rect absBounds) {
+        notifyViewEntered(view, virtualId, absBounds, FLAG_MANUAL_REQUEST);
     }
 
     /**
@@ -502,15 +516,27 @@
     /**
      * Called when a virtual view that supports autofill is entered.
      *
-     * @param view the {@link View} whose descendant is the virtual view.
-     * @param childId id identifying the virtual child inside the view.
-     * @param bounds child boundaries, relative to the top window.
+     * <p>The virtual view boundaries must be absolute screen coordinates. For example, if the
+     * parent, non-virtual view uses {@code bounds} to draw the virtual view inside its Canvas,
+     * the absolute bounds could be calculated by:
+     *
+     * <pre class="prettyprint">
+     *   int offset[] = new int[2];
+     *   getLocationOnScreen(offset);
+     *   Rect absBounds = new Rect(bounds.left + offset[0],
+     *       bounds.top + offset[1],
+     *       bounds.right + offset[0], bounds.bottom + offset[1]);
+     * </pre>
+     *
+     * @param view the virtual view parent.
+     * @param virtualId id identifying the virtual child inside the parent view.
+     * @param absBounds absolute boundaries of the virtual view in the screen.
      */
-    public void notifyViewEntered(@NonNull View view, int childId, @NonNull Rect bounds) {
-        notifyViewEntered(view, childId, bounds, 0);
+    public void notifyViewEntered(@NonNull View view, int virtualId, @NonNull Rect absBounds) {
+        notifyViewEntered(view, virtualId, absBounds, 0);
     }
 
-    private void notifyViewEntered(View view, int childId, Rect bounds, int flags) {
+    private void notifyViewEntered(View view, int virtualId, Rect bounds, int flags) {
         if (!hasAutofillFeature()) {
             return;
         }
@@ -523,7 +549,7 @@
                     callback = mCallback;
                 }
             } else {
-                final AutofillId id = getAutofillId(view, childId);
+                final AutofillId id = getAutofillId(view, virtualId);
 
                 if (mSessionId == NO_SESSION) {
                     // Starts new session.
@@ -536,7 +562,7 @@
         }
 
         if (callback != null) {
-            callback.onAutofillEvent(view, childId,
+            callback.onAutofillEvent(view, virtualId,
                     AutofillCallback.EVENT_INPUT_UNAVAILABLE);
         }
     }
@@ -544,10 +570,10 @@
     /**
      * Called when a virtual view that supports autofill is exited.
      *
-     * @param view the {@link View} whose descendant is the virtual view.
-     * @param childId id identifying the virtual child inside the view.
+     * @param view the virtual view parent.
+     * @param virtualId id identifying the virtual child inside the parent view.
      */
-    public void notifyViewExited(@NonNull View view, int childId) {
+    public void notifyViewExited(@NonNull View view, int virtualId) {
         if (!hasAutofillFeature()) {
             return;
         }
@@ -555,7 +581,7 @@
             ensureServiceClientAddedIfNeededLocked();
 
             if (mEnabled && mSessionId != NO_SESSION) {
-                final AutofillId id = getAutofillId(view, childId);
+                final AutofillId id = getAutofillId(view, virtualId);
 
                 // Update focus on existing session.
                 updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0);
@@ -615,13 +641,13 @@
     }
 
     /**
-     * Called to indicate the value of an autofillable virtual {@link View} changed.
+     * Called to indicate the value of an autofillable virtual view has changed.
      *
-     * @param view the {@link View} whose descendant is the virtual view.
-     * @param childId id identifying the virtual child inside the parent view.
+     * @param view the virtual view parent.
+     * @param virtualId id identifying the virtual child inside the parent view.
      * @param value new value of the child.
      */
-    public void notifyValueChanged(View view, int childId, AutofillValue value) {
+    public void notifyValueChanged(View view, int virtualId, AutofillValue value) {
         if (!hasAutofillFeature()) {
             return;
         }
@@ -630,7 +656,7 @@
                 return;
             }
 
-            final AutofillId id = getAutofillId(view, childId);
+            final AutofillId id = getAutofillId(view, virtualId);
             updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0);
         }
     }
@@ -765,8 +791,8 @@
         return new AutofillId(view.getAccessibilityViewId());
     }
 
-    private static AutofillId getAutofillId(View parent, int childId) {
-        return new AutofillId(parent.getAccessibilityViewId(), childId);
+    private static AutofillId getAutofillId(View parent, int virtualId) {
+        return new AutofillId(parent.getAccessibilityViewId(), virtualId);
     }
 
     private void startSessionLocked(@NonNull AutofillId id, @NonNull Rect bounds,
@@ -1470,11 +1496,12 @@
          * Called after a change in the autofill state associated with a virtual view.
          *
          * @param view parent view associated with the change.
-         * @param childId id identifying the virtual child inside the parent view.
+         * @param virtualId id identifying the virtual child inside the parent view.
          *
          * @param event currently either {@link #EVENT_INPUT_SHOWN} or {@link #EVENT_INPUT_HIDDEN}.
          */
-        public void onAutofillEvent(@NonNull View view, int childId, @AutofillEventType int event) {
+        public void onAutofillEvent(@NonNull View view, int virtualId,
+                @AutofillEventType int event) {
         }
     }
 
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index ecb25fe..dda5df6 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2654,19 +2654,23 @@
      *       {@link ViewStructure#setAutofillHints(String[])}.
      *   <li>The {@code type} attribute of {@code INPUT} tags maps to
      *       {@link ViewStructure#setInputType(int)}.
-     *   <li>The {@code value} attribute maps to {@link ViewStructure#setText(CharSequence)}.
+     *   <li>The {@code value} attribute of {@code INPUT} tags maps to
+     *       {@link ViewStructure#setText(CharSequence)}.
+     *   <li>If the view is editalbe, the {@link ViewStructure#setAutofillType(int)} and
+     *   {@link ViewStructure#setAutofillValue(AutofillValue)} must be set.
      *   <li>The {@code placeholder} attribute maps to {@link ViewStructure#setHint(CharSequence)}.
-     *   <li>{@link ViewStructure#setDataIsSensitive(boolean)} whould only be called with
-     *       {@code true} for form fields whose {@code value} attribute was not pre-loaded.
      *   <li>Other HTML attributes can be represented through
      *   {@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)}.
      * </ol>
      *
+     * <p>It should also call {@code structure.setDataIsSensitive(false)} for fields whose value
+     * were not dynamically changed (for example, through Javascript).
+     *
      * <p>Example1: an HTML form with 2 fields for username and password.
      *
      * <pre class="prettyprint">
-     *    <input type="text" name="username" id="user" value="mr.sparkle" autocomplete="username" placeholder="Email or username">
-     *    <input type="password" name="password" id="pass" autocomplete="current-password" placeholder="Password">
+     *    &lt;input type="text" name="username" id="user" value="Type your username" autocomplete="username" placeholder="Email or username"&gt;
+     *    &lt;input type="password" name="password" id="pass" autocomplete="current-password" placeholder="Password"&gt;
      * </pre>
      *
      * <p>Would map to:
@@ -2674,38 +2678,40 @@
      * <pre class="prettyprint">
      *     int index = structure.addChildCount(2);
      *     ViewStructure username = structure.newChild(index);
-     *     username.setAutofillId(structure, 1); // id 1 - first child
+     *     username.setAutofillId(structure.getAutofillId(), 1); // id 1 - first child
      *     username.setClassName("input");
      *     username.setInputType("android.widget.EditText");
      *     username.setAutofillHints("username");
-     *     username.setHtmlInfo(child.newHtmlInfoBuilder("input")
+     *     username.setHtmlInfo(username.newHtmlInfoBuilder("input")
+     *         .addAttribute("type", "text")
      *         .addAttribute("name", "username")
      *         .addAttribute("id", "user")
      *         .build());
      *     username.setHint("Email or username");
      *     username.setAutofillType(View.AUTOFILL_TYPE_TEXT);
-     *     username.setAutofillValue(AutofillValue.forText("mr.sparkle"));
-     *     username.setText("mr.sparkle");
-     *     username.setDataIsSensitive(true); // Contains real username, which is sensitive
+     *     username.setAutofillValue(AutofillValue.forText("Type your username"));
+     *     username.setText("Type your username");
+     *     // Value of the field is not sensitive because it was not dynamically changed:
+     *     username.setDataIsSensitive(false);
      *
      *     ViewStructure password = structure.newChild(index + 1);
      *     username.setAutofillId(structure, 2); // id 2 - second child
      *     password.setInputType("android.widget.EditText");
      *     password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
      *     password.setAutofillHints("current-password");
-     *     password.setHtmlInfo(child.newHtmlInfoBuilder("input")
+     *     password.setHtmlInfo(password.newHtmlInfoBuilder("input")
+     *         .addAttribute("type", "password")
      *         .addAttribute("name", "password")
      *         .addAttribute("id", "pass")
      *         .build());
      *     password.setHint("Password");
      *     password.setAutofillType(View.AUTOFILL_TYPE_TEXT);
-     *     password.setDataIsSensitive(false); // Value is not set
      * </pre>
      *
      * <p>Example2: an IFRAME tag.
      *
      * <pre class="prettyprint">
-     *    <iframe src="https://example.com/login"/>
+     *    &lt;iframe src="https://example.com/login"/&gt;
      * </pre>
      *
      * <p>Would map to:
@@ -2713,8 +2719,9 @@
      * <pre class="prettyprint">
      *     int index = structure.addChildCount(1);
      *     ViewStructure iframe = structure.newChildFor(index);
-     *     iframe.setHtmlInfo(child.newHtmlInfoBuilder("iframe")
-     *         .addAttribute("url", "https://example.com/login")
+     *     iframe.setAutofillId(structure.getAutofillId(), 1);
+     *     iframe.setHtmlInfo(iframe.newHtmlInfoBuilder("iframe")
+     *         .addAttribute("src", "https://example.com/login")
      *         .build());
      * </pre>
      */
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index 9a39a17..121a8c5 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -24,6 +24,8 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.database.DataSetObserver;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -403,6 +405,7 @@
             }
             popupWindow.getListView().setContentDescription(mContext.getString(
                     R.string.activitychooserview_choose_application));
+            popupWindow.getListView().setSelector(new ColorDrawable(Color.TRANSPARENT));
         }
     }
 
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 57818e2..1dc5b44 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -19,6 +19,7 @@
 import android.annotation.DrawableRes;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.ColorStateList;
@@ -1640,4 +1641,13 @@
         super.encodeProperties(stream);
         stream.addProperty("layout:baseline", getBaseline());
     }
+
+    /** @hide */
+    @Override
+    @TestApi
+    public boolean isDefaultFocusHighlightNeeded(Drawable background, Drawable foreground) {
+        final boolean lackFocusState = mDrawable == null || !mDrawable.isStateful()
+                || !mDrawable.hasFocusStateSpecified();
+        return super.isDefaultFocusHighlightNeeded(background, foreground) && lackFocusState;
+    }
 }
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 6657c3a..142412a 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -74,8 +74,9 @@
             startActionMode(null);
         } else {
             resetTextClassificationHelper(true /* resetSelectionTag */);
+            final TextView tv = mEditor.getTextView();
             mTextClassificationAsyncTask = new TextClassificationAsyncTask(
-                    mEditor.getTextView(),
+                    tv,
                     TIMEOUT_DURATION,
                     adjustSelection
                             ? mTextClassificationHelper::suggestSelection
@@ -340,6 +341,7 @@
                 @NonNull TextView textView, int timeOut,
                 @NonNull Supplier<SelectionResult> selectionResultSupplier,
                 @NonNull Consumer<SelectionResult> selectionResultCallback) {
+            super(textView != null ? textView.getHandler() : null);
             mTextView = Preconditions.checkNotNull(textView);
             mTimeOutDuration = timeOut;
             mSelectionResultSupplier = Preconditions.checkNotNull(selectionResultSupplier);
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 2f1f890..de56092 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8257,6 +8257,7 @@
      * Automatically computes and sets the text size.
      */
     private void autoSizeText() {
+        if (getMeasuredWidth() <= 0 || getMeasuredHeight() <= 0) return;
         final int maxWidth = getWidth() - getTotalPaddingLeft() - getTotalPaddingRight();
         final int maxHeight = getHeight() - getExtendedPaddingBottom() - getExtendedPaddingTop();
 
diff --git a/core/java/com/android/internal/app/ResolverListController.java b/core/java/com/android/internal/app/ResolverListController.java
index ee5f6fd..5ab17e44 100644
--- a/core/java/com/android/internal/app/ResolverListController.java
+++ b/core/java/com/android/internal/app/ResolverListController.java
@@ -99,6 +99,14 @@
                             | (shouldGetResolvedFilter ? PackageManager.GET_RESOLVED_FILTER : 0)
                             | (shouldGetActivityMetadata ? PackageManager.GET_META_DATA : 0)
                             | PackageManager.MATCH_INSTANT);
+            // Remove any activities that are not exported.
+            int totalSize = infos.size();
+            for (int j = totalSize - 1; j >= 0 ; j--) {
+                ResolveInfo info = infos.get(j);
+                if (info.activityInfo != null && !info.activityInfo.exported) {
+                    infos.remove(j);
+                }
+            }
             if (infos != null) {
                 if (resolvedComponents == null) {
                     resolvedComponents = new ArrayList<>();
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 17ef77c..31064ac 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -10049,7 +10049,7 @@
         // Read the CPU data for each UID. This will internally generate a snapshot so next time
         // we read, we get a delta. If we are to distribute the cpu time, then do so. Otherwise
         // we just ignore the data.
-        final long startTimeMs = mClocks.elapsedRealtime();
+        final long startTimeMs = mClocks.uptimeMillis();
         mKernelUidCpuTimeReader.readDelta(!mOnBatteryInternal ? null :
                 new KernelUidCpuTimeReader.Callback() {
                     @Override
@@ -10121,7 +10121,7 @@
             readKernelUidCpuFreqTimesLocked();
         }
 
-        final long elapse = (mClocks.elapsedRealtime() - startTimeMs);
+        final long elapse = (mClocks.uptimeMillis() - startTimeMs);
         if (DEBUG_ENERGY_CPU || (elapse >= 100)) {
             Slog.d(TAG, "Reading cpu stats took " + elapse + " ms");
         }
diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
index 65cd4fa2..5d7fa6a 100644
--- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
+++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
@@ -76,6 +76,7 @@
     private final Rect mLastBaseContentInsets = new Rect();
     private final Rect mContentInsets = new Rect();
     private final Rect mBaseInnerInsets = new Rect();
+    private final Rect mLastBaseInnerInsets = new Rect();
     private final Rect mInnerInsets = new Rect();
     private final Rect mLastInnerInsets = new Rect();
 
@@ -323,6 +324,10 @@
 
         mBaseInnerInsets.set(systemInsets);
         computeFitSystemWindows(mBaseInnerInsets, mBaseContentInsets);
+        if (!mLastBaseInnerInsets.equals(mBaseInnerInsets)) {
+            changed = true;
+            mLastBaseContentInsets.set(mBaseContentInsets);
+        }
         if (!mLastBaseContentInsets.equals(mBaseContentInsets)) {
             changed = true;
             mLastBaseContentInsets.set(mBaseContentInsets);
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index cab4758..eb11182 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -318,6 +318,13 @@
 #                        is not being compiled with that level. Remove once this has changed.
 LOCAL_CLANG_CFLAGS += -Wno-c++11-extensions
 
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+LOCAL_CFLAGS += -D__ANDROID_DEBUGGABLE__
+endif
+ifneq (,$(filter true, $(PRODUCT_FULL_TREBLE)))
+LOCAL_CFLAGS += -D__ANDROID_TREBLE__
+endif
+
 include $(BUILD_SHARED_LIBRARY)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 0e67d304..b171a7e 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -1019,6 +1019,12 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
+// This is the maximum possible size because the SkColorSpace must be
+// representable (and therefore serializable) using a matrix and numerical
+// transfer function.  If we allow more color space representations in the
+// framework, we may need to update this maximum size.
+static constexpr uint32_t kMaxColorSpaceSerializedBytes = 80;
+
 static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
     if (parcel == NULL) {
         SkDebugf("-------- unparcel parcel is NULL\n");
@@ -1035,7 +1041,17 @@
     if (kRGBA_F16_SkColorType == colorType) {
         colorSpace = SkColorSpace::MakeSRGBLinear();
     } else if (colorSpaceSize > 0) {
-        colorSpace = SkColorSpace::Deserialize(p->readInplace(colorSpaceSize), colorSpaceSize);
+        if (colorSpaceSize > kMaxColorSpaceSerializedBytes) {
+            ALOGD("Bitmap_createFromParcel: Serialized SkColorSpace is larger than expected: "
+                    "%d bytes\n", colorSpaceSize);
+        }
+
+        const void* data = p->readInplace(colorSpaceSize);
+        if (data) {
+            colorSpace = SkColorSpace::Deserialize(data, colorSpaceSize);
+        } else {
+            ALOGD("Bitmap_createFromParcel: Unable to read serialized SkColorSpace data\n");
+        }
     }
     const int         width = p->readInt32();
     const int         height = p->readInt32();
@@ -1178,6 +1194,11 @@
         size_t size = data->size();
         p->writeUint32(size);
         if (size > 0) {
+            if (size > kMaxColorSpaceSerializedBytes) {
+                ALOGD("Bitmap_writeToParcel: Serialized SkColorSpace is larger than expected: "
+                        "%zu bytes\n", size);
+            }
+
             p->write(data->data(), size);
         }
     } else {
diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp
index dcb2300..19f779f 100644
--- a/core/jni/android_os_HwBinder.cpp
+++ b/core/jni/android_os_HwBinder.cpp
@@ -23,6 +23,8 @@
 #include "android_os_HwParcel.h"
 #include "android_os_HwRemoteBinder.h"
 
+#include <cstring>
+
 #include <JNIHelp.h>
 #include <android/hidl/manager/1.0/IServiceManager.h>
 #include <android/hidl/base/1.0/IBase.h>
@@ -331,8 +333,19 @@
 
     IServiceManager::Transport transport = transportRet;
 
-    if (   transport != IServiceManager::Transport::EMPTY
-        && transport != IServiceManager::Transport::HWBINDER) {
+#ifdef __ANDROID_TREBLE__
+#ifdef __ANDROID_DEBUGGABLE__
+    const char* testingOverride = std::getenv("TREBLE_TESTING_OVERRIDE");
+    const bool vintfLegacy = (transport == IServiceManager::Transport::EMPTY)
+            && testingOverride && !strcmp(testingOverride, "true");
+#else // __ANDROID_TREBLE__ but not __ANDROID_DEBUGGABLE__
+    const bool vintfLegacy = false;
+#endif // __ANDROID_DEBUGGABLE__
+#else // not __ANDROID_TREBLE__
+    const bool vintfLegacy = (transport == IServiceManager::Transport::EMPTY);
+#endif // __ANDROID_TREBLE__";
+
+    if (transport != IServiceManager::Transport::HWBINDER && !vintfLegacy) {
         LOG(ERROR) << "service " << ifaceName << " declares transport method "
                    << toString(transport) << " but framework expects hwbinder.";
         signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index e1c0a21..192e3bb 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -25,6 +25,10 @@
 #include <GraphicsJNI.h>
 #include <ScopedPrimitiveArray.h>
 
+#include <gui/BufferItemConsumer.h>
+#include <gui/BufferQueue.h>
+#include <gui/Surface.h>
+
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
 #include <private/EGL/cache.h>
@@ -851,6 +855,75 @@
     return RenderProxy::copySurfaceInto(surface, left, top, right, bottom, &bitmap);
 }
 
+class ContextFactory : public IContextFactory {
+public:
+    virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) {
+        return new AnimationContext(clock);
+    }
+};
+
+static jobject android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode(JNIEnv* env,
+        jobject clazz, jlong renderNodePtr, jint jwidth, jint jheight) {
+    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
+    if (jwidth <= 0 || jheight <= 0) {
+        ALOGW("Invalid width %d or height %d", jwidth, jheight);
+        return nullptr;
+    }
+
+    uint32_t width = jwidth;
+    uint32_t height = jheight;
+
+    // Create a Surface wired up to a BufferItemConsumer
+    sp<IGraphicBufferProducer> producer;
+    sp<IGraphicBufferConsumer> rawConsumer;
+    BufferQueue::createBufferQueue(&producer, &rawConsumer);
+    rawConsumer->setMaxBufferCount(1);
+    sp<BufferItemConsumer> consumer = new BufferItemConsumer(rawConsumer,
+            GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_NEVER);
+    consumer->setDefaultBufferSize(width, height);
+    sp<Surface> surface = new Surface(producer);
+
+    // Render into the surface
+    {
+        ContextFactory factory;
+        RenderProxy proxy{false, renderNode, &factory};
+        proxy.loadSystemProperties();
+        proxy.setSwapBehavior(SwapBehavior::kSwap_discardBuffer);
+        proxy.initialize(surface);
+        // Shadows can't be used via this interface, so just set the light source
+        // to all 0s.
+        proxy.setup(0, 0, 0);
+        proxy.setLightCenter((Vector3){0, 0, 0});
+        nsecs_t vsync = systemTime(CLOCK_MONOTONIC);
+        UiFrameInfoBuilder(proxy.frameInfo())
+                .setVsync(vsync, vsync)
+                .addFlag(FrameInfoFlags::SurfaceCanvas);
+        proxy.syncAndDrawFrame();
+    }
+
+    // Yank out the GraphicBuffer
+    BufferItem bufferItem;
+    status_t err;
+    if ((err = consumer->acquireBuffer(&bufferItem, 0, true)) != OK) {
+        ALOGW("Failed to acquireBuffer, error %d (%s)", err, strerror(-err));
+        return nullptr;
+    }
+    sp<GraphicBuffer> buffer = bufferItem.mGraphicBuffer;
+    // We don't really care if this fails or not since we're just going to destroy this anyway
+    consumer->releaseBuffer(bufferItem);
+    if (!buffer.get()) {
+        ALOGW("GraphicBuffer is null?");
+        return nullptr;
+    }
+    if (buffer->getWidth() != width || buffer->getHeight() != height) {
+        ALOGW("GraphicBuffer size mismatch, got %dx%d expected %dx%d",
+                buffer->getWidth(), buffer->getHeight(), width, height);
+        // Continue I guess?
+    }
+    sk_sp<Bitmap> bitmap = Bitmap::createFrom(buffer);
+    return createBitmap(env, bitmap.release(), android::bitmap::kBitmapCreateFlag_Mutable);
+}
+
 // ----------------------------------------------------------------------------
 // FrameMetricsObserver
 // ----------------------------------------------------------------------------
@@ -947,6 +1020,8 @@
             (void*)android_view_ThreadedRenderer_removeFrameMetricsObserver },
     { "nCopySurfaceInto", "(Landroid/view/Surface;IIIILandroid/graphics/Bitmap;)I",
                 (void*)android_view_ThreadedRenderer_copySurfaceInto },
+    { "nCreateHardwareBitmap", "(JII)Landroid/graphics/Bitmap;",
+            (void*)android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode },
 };
 
 int register_android_view_ThreadedRenderer(JNIEnv* env) {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 8ed76de..f8044e2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1901,6 +1901,10 @@
                 android:description="@string/permdesc_useDataInBackground"
                 android:protectionLevel="normal" />
 
+    <!-- @hide Allows an application to set display offsets for the screen.
+         This permission is not available to third party applications. -->
+    <permission android:name="android.permission.SET_DISPLAY_OFFSET"
+        android:protectionLevel="signature|privileged" />
 
     <!-- ================================== -->
     <!-- Permissions affecting the system wallpaper -->
diff --git a/core/res/res/layout/activity_chooser_view_list_item.xml b/core/res/res/layout/activity_chooser_view_list_item.xml
index 66e400a..4678f76c 100644
--- a/core/res/res/layout/activity_chooser_view_list_item.xml
+++ b/core/res/res/layout/activity_chooser_view_list_item.xml
@@ -21,7 +21,7 @@
     android:paddingStart="?attr/listPreferredItemPaddingStart"
     android:paddingEnd="?attr/listPreferredItemPaddingEnd"
     android:minWidth="196dip"
-    android:background="?attr/activatedBackgroundIndicator"
+    android:background="?attr/selectableItemBackground"
     android:orientation="vertical" >
 
     <LinearLayout
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index cfe25b3..79bb109 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2290,8 +2290,9 @@
 
         <!-- Sets the padding, in pixels, of all four edges. Padding is defined as
              space between the edges of the view and the view's content. This value will take
-             precedence over any of the edge-specific values, including
-             paddingHorizontal and paddingVertical, if set. A view's size
+             precedence over any of the edge-specific values (paddingLeft, paddingTop,
+             paddingRight, paddingBottom, paddingHorizontal and paddingVertical), but will
+             not override paddingStart or paddingEnd, if set. A view's size
              will include its padding. If a {@link android.R.attr#background}
              is provided, the padding will initially be set to that (0 if the
              drawable does not have padding). Explicitly setting a padding value
@@ -2299,7 +2300,7 @@
         <attr name="padding" format="dimension" />
         <!-- Sets the padding, in pixels, of the left and right edges; see
              {@link android.R.attr#padding}. This value will take precedence over
-             paddingLeft, paddingRight, paddingStart, and paddingEnd, if set. -->
+             paddingLeft and paddingRight, but not paddingStart or paddingEnd (if set). -->
         <attr name="paddingHorizontal" format="dimension" />
         <!-- Sets the padding, in pixels, of the top and bottom edges; see
              {@link android.R.attr#padding}. This value will take precedence over
@@ -3203,11 +3204,10 @@
         <attr name="layout_marginEnd" format="dimension"  />
         <!--  Specifies extra space on the left and right sides of this view.
               Specifying layout_marginHorizontal is equivalent to specifying
-              either layout_marginLeft and layout_marginRight or
-              layout_marginStart and layout_marginEnd with that same value.
-              If both layout_marginHorizontal and any of layout_marginLeft,
-              layout_marginRight, layout_marginStart, and layout_marginEnd are
-              also specified, the layout_marginHorizontal value will take precedence over the
+              layout_marginLeft and layout_marginRight.
+              If both layout_marginHorizontal and either/both of layout_marginLeft
+              and layout_marginRight are also specified, the layout_marginHorizontal
+              value will take precedence over the
               edge-specific values. Also, layout_margin will always take precedence over
               any of these values, including layout_marginHorizontal.
               This space is outside this view's bounds.
@@ -3216,7 +3216,7 @@
         <!--  Specifies extra space on the top and bottom sides of this view.
               Specifying layout_marginVertical is equivalent to specifying
               layout_marginTop and layout_marginBottom with that same value.
-              If both layout_marginVertical and either/both layout_marginTop and
+              If both layout_marginVertical and either/both of layout_marginTop and
               layout_marginBottom are also specified, the layout_marginVertical value
               will take precedence over the edge-specific values.
               Also, layout_margin will always take precedence over
diff --git a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
index 906d7e9..a249925 100644
--- a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
@@ -38,6 +38,7 @@
     public void setup() {
         mContext = InstrumentationRegistry.getTargetContext();
         mView = new ImageFloatingTextView(mContext, null, 0, 0);
+        mView.setMaxLines(9);
         mTextView = new TextView(mContext, null, 0, 0);
         mTextView.setMaxLines(9);
     }
diff --git a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
index ab10e97..8616d58 100644
--- a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
+++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
@@ -84,7 +84,7 @@
     /**
      * Launcher icons design guideline
      */
-    private static final float SAFEZONE_SCALE = 72f/66f;
+    private static final float SAFEZONE_SCALE = 66f/72f;
 
     /**
      * All four sides of the layers are padded with extra inset so as to provide
@@ -676,12 +676,7 @@
 
     @Override
     public int getAlpha() {
-        final Drawable dr = getFirstNonNullDrawable();
-        if (dr != null) {
-            return dr.getAlpha();
-        } else {
-            return super.getAlpha();
-        }
+        return PixelFormat.TRANSLUCENT;
     }
 
     @Override
@@ -719,17 +714,6 @@
         }
     }
 
-    private Drawable getFirstNonNullDrawable() {
-        final ChildDrawable[] array = mLayerState.mChildren;
-        for (int i = 0; i < mLayerState.N_CHILDREN; i++) {
-            final Drawable dr = array[i].mDrawable;
-            if (dr != null) {
-                return dr;
-            }
-        }
-        return null;
-    }
-
     public void setOpacity(int opacity) {
         mLayerState.mOpacityOverride = opacity;
     }
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index 6b8a279..14bc555 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -36,14 +36,14 @@
  * session.
  */
 public final class AudioPlaybackConfiguration implements Parcelable {
-    private final static String TAG = new String("AudioPlaybackConfiguration");
+    private static final String TAG = new String("AudioPlaybackConfiguration");
 
-    private final static boolean DEBUG = false;
+    private static final boolean DEBUG = false;
 
     /** @hide */
-    public final static int PLAYER_PIID_INVALID = -1;
+    public static final int PLAYER_PIID_INVALID = -1;
     /** @hide */
-    public final static int PLAYER_UPID_INVALID = -1;
+    public static final int PLAYER_UPID_INVALID = -1;
 
     // information about the implementation
     /**
@@ -51,37 +51,62 @@
      * An unknown type of player
      */
     @SystemApi
-    public final static int PLAYER_TYPE_UNKNOWN = -1;
+    public static final int PLAYER_TYPE_UNKNOWN = -1;
     /**
      * @hide
      * Player backed by a java android.media.AudioTrack player
      */
     @SystemApi
-    public final static int PLAYER_TYPE_JAM_AUDIOTRACK = 1;
+    public static final int PLAYER_TYPE_JAM_AUDIOTRACK = 1;
     /**
      * @hide
      * Player backed by a java android.media.MediaPlayer player
      */
     @SystemApi
-    public final static int PLAYER_TYPE_JAM_MEDIAPLAYER = 2;
+    public static final int PLAYER_TYPE_JAM_MEDIAPLAYER = 2;
     /**
      * @hide
      * Player backed by a java android.media.SoundPool player
      */
     @SystemApi
-    public final static int PLAYER_TYPE_JAM_SOUNDPOOL = 3;
+    public static final int PLAYER_TYPE_JAM_SOUNDPOOL = 3;
     /**
      * @hide
      * Player backed by a C OpenSL ES AudioPlayer player with a BufferQueue source
      */
     @SystemApi
-    public final static int PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11;
+    public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11;
     /**
      * @hide
      * Player backed by a C OpenSL ES AudioPlayer player with a URI or FD source
      */
     @SystemApi
-    public final static int PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12;
+    public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12;
+
+    /**
+     * @hide
+     * Player backed an AAudio player.
+     * Note this type is not in System API so it will not be returned in public API calls
+     */
+    // TODO unhide for SystemApi, update getPlayerType()
+    public static final int PLAYER_TYPE_AAUDIO = 13;
+
+    /**
+     * @hide
+     * Player backed a hardware source, whose state is visible in the Android audio policy manager.
+     * Note this type is not in System API so it will not be returned in public API calls
+     */
+    // TODO unhide for SystemApi, update getPlayerType()
+    public static final int PLAYER_TYPE_HW_SOURCE = 14;
+
+    /**
+     * @hide
+     * Player is a proxy for an audio player whose audio and state doesn't go through the Android
+     * audio framework.
+     * Note this type is not in System API so it will not be returned in public API calls
+     */
+    // TODO unhide for SystemApi, update getPlayerType()
+    public static final int PLAYER_TYPE_EXTERNAL_PROXY = 15;
 
     /** @hide */
     @IntDef({
@@ -251,11 +276,20 @@
      * {@link #PLAYER_TYPE_JAM_AUDIOTRACK}, {@link #PLAYER_TYPE_JAM_MEDIAPLAYER},
      * {@link #PLAYER_TYPE_JAM_SOUNDPOOL}, {@link #PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE},
      * {@link #PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD}, or {@link #PLAYER_TYPE_UNKNOWN}.
+     * <br>Note that player types not exposed in the system API will be represented as
+     * {@link #PLAYER_TYPE_UNKNOWN}.
      * @return the type of the player.
      */
     @SystemApi
     public @PlayerType int getPlayerType() {
-        return mPlayerType;
+        switch (mPlayerType) {
+            case PLAYER_TYPE_AAUDIO:
+            case PLAYER_TYPE_HW_SOURCE:
+            case PLAYER_TYPE_EXTERNAL_PROXY:
+                return PLAYER_TYPE_UNKNOWN;
+            default:
+                return mPlayerType;
+        }
     }
 
     /**
@@ -442,7 +476,7 @@
 
     //=====================================================================
     // Inner class for corresponding IPlayer and its death monitoring
-    final static class IPlayerShell implements IBinder.DeathRecipient {
+    static final class IPlayerShell implements IBinder.DeathRecipient {
 
         final AudioPlaybackConfiguration mMonitor; // never null
         private IPlayer mIPlayer;
@@ -494,6 +528,9 @@
                 return "OpenSL ES AudioPlayer (Buffer Queue)";
             case PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD:
                 return "OpenSL ES AudioPlayer (URI/FD)";
+            case PLAYER_TYPE_AAUDIO: return "AAudio";
+            case PLAYER_TYPE_HW_SOURCE: return "hardware source";
+            case PLAYER_TYPE_EXTERNAL_PROXY: return "external proxy";
             default:
                 return "unknown player type - FIXME";
         }
diff --git a/native/android/Android.bp b/native/android/Android.bp
index eacda93..14f6ed3 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -19,3 +19,31 @@
     first_version: "9",
     unversioned_until: "current",
 }
+
+cc_defaults {
+    name: "libandroid_defaults",
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wunused",
+        "-Wunreachable-code",
+    ],
+}
+
+// Network library.
+cc_library_shared {
+    name: "libandroid_net",
+    defaults: ["libandroid_defaults"],
+    srcs: ["net.c"],
+
+    shared_libs: ["libnetd_client"],
+
+    include_dirs: ["bionic/libc/dns/include"],
+}
+
+llndk_library {
+    name: "libandroid_net",
+    export_include_dirs: ["include"],
+    symbol_file: "libandroid_net.map.txt",
+    unversioned: true,
+}
diff --git a/native/android/Android.mk b/native/android/Android.mk
index 6e15331..97dbf0f 100644
--- a/native/android/Android.mk
+++ b/native/android/Android.mk
@@ -58,20 +58,3 @@
 LOCAL_CFLAGS += $(common_cflags)
 
 include $(BUILD_SHARED_LIBRARY)
-
-# Network library.
-include $(CLEAR_VARS)
-LOCAL_MODULE := libandroid_net
-LOCAL_CFLAGS := $(common_cflags)
-LOCAL_SRC_FILES:= \
-    net.c \
-
-LOCAL_SHARED_LIBRARIES := \
-    libnetd_client \
-
-LOCAL_C_INCLUDES += \
-    frameworks/base/native/include \
-    bionic/libc/dns/include \
-    system/netd/include \
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/native/android/include/multinetwork.h b/native/android/include/multinetwork.h
new file mode 120000
index 0000000..f9d051a
--- /dev/null
+++ b/native/android/include/multinetwork.h
@@ -0,0 +1 @@
+../../../../native/include/android/multinetwork.h
\ No newline at end of file
diff --git a/native/android/libandroid_net.map.txt b/native/android/libandroid_net.map.txt
new file mode 100644
index 0000000..9b5a5a1
--- /dev/null
+++ b/native/android/libandroid_net.map.txt
@@ -0,0 +1,10 @@
+# These functions have been part of the NDK since API 24.
+# They are also all available to vendor code.
+LIBANDROID_NET {
+  global:
+    android_setsocknetwork; # vndk
+    android_setprocnetwork; # vndk
+    android_getaddrinfofornetwork; # vndk
+  local:
+    *;
+};
diff --git a/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java b/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java
deleted file mode 100644
index d9f4c44..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settingslib;
-
-import android.os.SystemClock;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Toast;
-
-/**
- * A touch listener which consumes touches when another window is partly or wholly obscuring the
- * window containing the view this listener is attached to.
- * Optionally accepts a string to show the user as a toast when consuming an insecure touch
- */
-public class SecureTouchListener implements View.OnTouchListener {
-
-    private static final long TAP_DEBOUNCE_TIME = 2000;
-    private long mLastToastTime = 0;
-    private String mWarningText;
-
-    public SecureTouchListener() {
-        this(null);
-    }
-
-    public SecureTouchListener(String warningText) {
-        mWarningText = warningText;
-    }
-
-    @Override
-    public boolean onTouch(View v, MotionEvent event) {
-        if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0
-                || (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
-            if (mWarningText != null) {
-                // Show a toast warning the user
-                final long currentTime = SystemClock.uptimeMillis();
-                if (currentTime - mLastToastTime > TAP_DEBOUNCE_TIME) {
-                    mLastToastTime = currentTime;
-                    Toast.makeText(v.getContext(), mWarningText, Toast.LENGTH_SHORT).show();
-                }
-            }
-            // Consume the touch event
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index be15e65..7a63b8a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -250,10 +250,17 @@
             mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
             updateAccessPointsLocked();
 
+            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);
+            }
         }
     }
 
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 05625c7..1ddbcad 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -52,6 +52,7 @@
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
+import android.annotation.MainThread;
 import android.annotation.SuppressLint;
 import android.app.AlertDialog;
 import android.app.Notification;
@@ -126,6 +127,8 @@
  * <li>Stops itself if it doesn't have any process left to monitor.
  * </ol>
  * </ol>
+ *
+ * TODO: There are multiple threads involved.  Add synchronization accordingly.
  */
 public class BugreportProgressService extends Service {
     private static final String TAG = "BugreportProgressService";
@@ -201,11 +204,15 @@
 
     private static final String NOTIFICATION_CHANNEL_ID = "bugreports";
 
+    private final Object mLock = new Object();
+
     /** Managed dumpstate processes (keyed by id) */
     private final SparseArray<DumpstateListener> mProcesses = new SparseArray<>();
 
     private Context mContext;
-    private ServiceHandler mMainHandler;
+
+    private Handler mMainThreadHandler;
+    private ServiceHandler mServiceHandler;
     private ScreenshotHandler mScreenshotHandler;
 
     private final BugreportInfoDialog mInfoDialog = new BugreportInfoDialog();
@@ -234,7 +241,8 @@
     @Override
     public void onCreate() {
         mContext = getApplicationContext();
-        mMainHandler = new ServiceHandler("BugreportProgressServiceMainThread");
+        mMainThreadHandler = new Handler(Looper.getMainLooper());
+        mServiceHandler = new ServiceHandler("BugreportProgressServiceMainThread");
         mScreenshotHandler = new ScreenshotHandler("BugreportProgressServiceScreenshotThread");
 
         mScreenshotsDir = new File(getFilesDir(), SCREENSHOT_DIR);
@@ -260,10 +268,10 @@
         Log.v(TAG, "onStartCommand(): " + dumpIntent(intent));
         if (intent != null) {
             // Handle it in a separate thread.
-            final Message msg = mMainHandler.obtainMessage();
+            final Message msg = mServiceHandler.obtainMessage();
             msg.what = MSG_SERVICE_COMMAND;
             msg.obj = intent;
-            mMainHandler.sendMessage(msg);
+            mServiceHandler.sendMessage(msg);
         }
 
         // If service is killed it cannot be recreated because it would not know which
@@ -278,7 +286,7 @@
 
     @Override
     public void onDestroy() {
-        mMainHandler.getLooper().quit();
+        mServiceHandler.getLooper().quit();
         mScreenshotHandler.getLooper().quit();
         super.onDestroy();
     }
@@ -613,7 +621,7 @@
             // ignore it
         }
 
-        mInfoDialog.initialize(mContext, info);
+        mMainThreadHandler.post(() -> mInfoDialog.initialize(mContext, info));
     }
 
     /**
@@ -652,11 +660,11 @@
     private void takeScreenshot(int id, int delay) {
         if (delay > 0) {
             Log.d(TAG, "Taking screenshot for " + id + " in " + delay + " seconds");
-            final Message msg = mMainHandler.obtainMessage();
+            final Message msg = mServiceHandler.obtainMessage();
             msg.what = MSG_DELAYED_SCREENSHOT;
             msg.arg1 = id;
             msg.arg2 = delay - 1;
-            mMainHandler.sendMessageDelayed(msg, DateUtils.SECOND_IN_MILLIS);
+            mServiceHandler.sendMessageDelayed(msg, DateUtils.SECOND_IN_MILLIS);
             return;
         }
 
@@ -696,7 +704,7 @@
         boolean taken = takeScreenshot(mContext, screenshotFile);
         setTakingScreenshot(false);
 
-        Message.obtain(mMainHandler, MSG_SCREENSHOT_RESPONSE, requestMsg.arg1, taken ? 1 : 0,
+        Message.obtain(mServiceHandler, MSG_SCREENSHOT_RESPONSE, requestMsg.arg1, taken ? 1 : 0,
                 screenshotFile).sendToTarget();
     }
 
@@ -1111,6 +1119,12 @@
      * description will be saved on {@code description.txt}.
      */
     private void addDetailsToZipFile(BugreportInfo info) {
+        synchronized (mLock) {
+            addDetailsToZipFileLocked(info);
+        }
+    }
+
+    private void addDetailsToZipFileLocked(BugreportInfo info) {
         if (info.bugreportFile == null) {
             // One possible reason is a bug in the Parcelization code.
             Log.wtf(TAG, "addDetailsToZipFile(): no bugreportFile on " + info);
@@ -1432,6 +1446,7 @@
         /**
          * Sets its internal state and displays the dialog.
          */
+        @MainThread
         void initialize(final Context context, BugreportInfo info) {
             final String dialogTitle =
                     context.getString(R.string.bugreport_info_dialog_title, info.id);
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
index 4ce1e36..3cd5d89 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
@@ -49,6 +49,8 @@
 
     public boolean isDismissGesture(MotionEvent ev);
 
+    public boolean isFalseGesture(MotionEvent ev);
+
     public boolean swipedFarEnough(float translation, float viewSize);
 
     public boolean swipedFastEnough(float translation, float velocity);
diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml
index f41c494..34e43ce 100644
--- a/packages/SystemUI/res/layout/qs_detail.xml
+++ b/packages/SystemUI/res/layout/qs_detail.xml
@@ -26,10 +26,6 @@
     android:paddingBottom="8dp"
     android:visibility="invisible">
 
-    <com.android.systemui.ResizingSpace
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/qs_detail_margin_top" />
-
     <include
         android:id="@+id/qs_detail_header"
         layout="@layout/qs_detail_header"
diff --git a/packages/SystemUI/res/layout/qs_detail_header.xml b/packages/SystemUI/res/layout/qs_detail_header.xml
index 871ed67..a1f0ee7 100644
--- a/packages/SystemUI/res/layout/qs_detail_header.xml
+++ b/packages/SystemUI/res/layout/qs_detail_header.xml
@@ -20,34 +20,46 @@
     android:layout_height="wrap_content"
     android:paddingLeft="@dimen/qs_detail_header_padding"
     android:paddingTop="@dimen/qs_detail_header_padding"
-    android:paddingBottom="@dimen/qs_detail_header_bottom_padding"
+    android:paddingBottom="@dimen/qs_detail_items_padding_top"
     android:paddingEnd="@dimen/qs_panel_padding"
     android:background="@drawable/btn_borderless_rect"
+    android:orientation="vertical"
     android:gravity="center">
 
-    <TextView
-        android:id="@android:id/title"
-        android:paddingStart="@dimen/qs_detail_header_text_padding"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:textDirection="locale"
-        android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+    <com.android.systemui.ResizingSpace
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/qs_detail_margin_top" />
 
-    <ImageView
-        android:id="@+id/settings"
-        android:layout_width="@dimen/qs_detail_image_width"
-        android:layout_height="@dimen/qs_detail_image_height"
-        android:background="?android:attr/selectableItemBackground"
-        android:padding="@dimen/qs_detail_image_padding"
-        android:src="@drawable/ic_settings"
-        android:visibility="gone"/>
-
-    <Switch
-        android:id="@android:id/toggle"
-        android:layout_width="wrap_content"
+    <LinearLayout
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:clickable="false"
-        android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@android:id/title"
+            android:paddingStart="@dimen/qs_detail_header_text_padding"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:textDirection="locale"
+            android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+
+        <ImageView
+            android:id="@+id/settings"
+            android:layout_width="@dimen/qs_detail_image_width"
+            android:layout_height="@dimen/qs_detail_image_height"
+            android:background="?android:attr/selectableItemBackground"
+            android:padding="@dimen/qs_detail_image_padding"
+            android:src="@drawable/ic_settings"
+            android:visibility="gone"/>
+
+        <Switch
+            android:id="@android:id/toggle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:clickable="false"
+            android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+
+    </LinearLayout>
 
 </com.android.keyguard.AlphaOptimizedLinearLayout>
diff --git a/packages/SystemUI/res/layout/qs_detail_items.xml b/packages/SystemUI/res/layout/qs_detail_items.xml
index b9cdf28..60cba67 100644
--- a/packages/SystemUI/res/layout/qs_detail_items.xml
+++ b/packages/SystemUI/res/layout/qs_detail_items.xml
@@ -20,7 +20,6 @@
     xmlns:sysui="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:paddingTop="@dimen/qs_detail_items_padding_top"
     android:paddingStart="@dimen/qs_detail_padding_start"
     android:paddingEnd="16dp">
 
diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml
index 8707840..200eabf 100644
--- a/packages/SystemUI/res/layout/zen_mode_panel.xml
+++ b/packages/SystemUI/res/layout/zen_mode_panel.xml
@@ -36,7 +36,6 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="16dp"
             android:layout_marginEnd="16dp"
-            android:layout_marginTop="8dp"
             android:layout_marginBottom="8dp" />
 
         <RelativeLayout
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 6604b6c..4245b11 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -249,7 +249,6 @@
     <dimen name="qs_panel_padding_bottom">0dp</dimen>
     <dimen name="qs_detail_header_height">56dp</dimen>
     <dimen name="qs_detail_header_padding">0dp</dimen>
-    <dimen name="qs_detail_header_bottom_padding">0dp</dimen>
     <dimen name="qs_detail_image_width">56dp</dimen>
     <dimen name="qs_detail_image_height">56dp</dimen>
     <dimen name="qs_detail_image_padding">16dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index c656b17..994a566 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1508,6 +1508,8 @@
     <string name="snooze_option_30_min">30 minutes</string>
     <!-- Notification: Menu row: Snooze options: 1 hour option. [CHAR LIMIT=50]-->
     <string name="snooze_option_1_hour">1 hour</string>
+    <!-- Notification: Menu row: Snooze options: 1 hour option. [CHAR LIMIT=50]-->
+    <string name="snooze_option_2_hour">2 hours</string>
     <!-- Notification: Menu row: Snooze undo button label. [CHAR LIMIT=50]-->
     <string name="snooze_undo">UNDO</string>
 
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 9c03ea6..74b745f 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -653,15 +653,19 @@
     }
 
     public boolean isDismissGesture(MotionEvent ev) {
+        return ev.getActionMasked() == MotionEvent.ACTION_UP
+                && !isFalseGesture(ev) && (swipedFastEnough() || swipedFarEnough())
+                && mCallback.canChildBeDismissed(mCurrView);
+    }
+
+    public boolean isFalseGesture(MotionEvent ev) {
         boolean falsingDetected = mCallback.isAntiFalsingNeeded();
         if (mFalsingManager.isClassiferEnabled()) {
             falsingDetected = falsingDetected && mFalsingManager.isFalseTouch();
         } else {
             falsingDetected = falsingDetected && !mTouchAboveFalsingThreshold;
         }
-        return !falsingDetected && (swipedFastEnough() || swipedFarEnough())
-                && ev.getActionMasked() == MotionEvent.ACTION_UP
-                && mCallback.canChildBeDismissed(mCurrView);
+        return falsingDetected;
     }
 
     protected boolean swipedFastEnough() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
index 8596b57..84524a6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
@@ -24,6 +24,7 @@
 public interface QSHost {
     void warn(String message, Throwable t);
     void collapsePanels();
+    void forceCollapsePanels();
     void openPanels();
     Context getContext();
     Collection<QSTile> getTiles();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index 9330541..02937d8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -143,6 +143,11 @@
     }
 
     @Override
+    public void forceCollapsePanels() {
+        mStatusBar.postAnimateForceCollapsePanels();
+    }
+
+    @Override
     public void openPanels() {
         mStatusBar.postAnimateOpenPanels();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index d2f3bb6..943a1764 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -204,7 +204,7 @@
         if (customTile != null) {
             verifyCaller(customTile);
             customTile.onDialogShown();
-            mHost.collapsePanels();
+            mHost.forceCollapsePanels();
             mServices.get(customTile).setShowingDialog(true);
         }
     }
@@ -224,7 +224,7 @@
         CustomTile customTile = getTileForToken(token);
         if (customTile != null) {
             verifyCaller(customTile);
-            mHost.collapsePanels();
+            mHost.forceCollapsePanels();
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index 012accd..d01bba8 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -160,7 +160,7 @@
     private boolean mHomeStackResizable;
     private boolean mAdjustedForIme;
     private DividerState mState;
-    private SurfaceFlingerVsyncChoreographer mSfChoreographer;
+    private final SurfaceFlingerVsyncChoreographer mSfChoreographer;
 
     private final Handler mHandler = new Handler() {
         @Override
@@ -250,20 +250,22 @@
     };
 
     public DividerView(Context context) {
-        super(context);
+        this(context, null);
     }
 
     public DividerView(Context context, @Nullable AttributeSet attrs) {
-        super(context, attrs);
+        this(context, attrs, 0);
     }
 
     public DividerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
+        this(context, attrs, defStyleAttr, 0);
     }
 
     public DividerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
             int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
+        mSfChoreographer = new SurfaceFlingerVsyncChoreographer(mHandler, context.getDisplay(),
+                Choreographer.getInstance());
     }
 
     @Override
@@ -313,8 +315,6 @@
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
         EventBus.getDefault().register(this);
-        mSfChoreographer = new SurfaceFlingerVsyncChoreographer(mHandler, getDisplay(),
-                Choreographer.getInstance());
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 3542500..a81b140 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -91,6 +91,7 @@
     }
 
     private LayoutListener mLayoutListener;
+    private boolean mLowPriorityStateUpdated;
     private final NotificationInflater mNotificationInflater;
     private int mIconTransformContentShift;
     private int mIconTransformContentShiftNoIcon;
@@ -1121,6 +1122,15 @@
         }
     }
 
+
+    public void setLowPriorityStateUpdated(boolean lowPriorityStateUpdated) {
+        mLowPriorityStateUpdated = lowPriorityStateUpdated;
+    }
+
+    public boolean hasLowPriorityStateUpdated() {
+        return mLowPriorityStateUpdated;
+    }
+
     public boolean isLowPriority() {
         return mIsLowPriority;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java
new file mode 100644
index 0000000..22fd37c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java
@@ -0,0 +1,32 @@
+/*
+ * 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.systemui.statusbar;
+
+/**
+ * An interface for running inflation tasks that allows aborting and superseding existing
+ * operations.
+ */
+public interface InflationTask {
+    void abort();
+
+    /**
+     * Supersedes an existing task. i.e another task was superceeded by this.
+     *
+     * @param task the task that was previously running
+     */
+    default void supersedeTask(InflationTask task) {}
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index f8bad05..1844946 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -24,7 +24,6 @@
 import android.content.pm.PackageManager;
 import android.content.Context;
 import android.graphics.drawable.Icon;
-import android.os.AsyncTask;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.service.notification.NotificationListenerService;
@@ -84,7 +83,7 @@
         public List<SnoozeCriterion> snoozeCriteria;
         private int mCachedContrastColor = COLOR_INVALID;
         private int mCachedContrastColorIsFor = COLOR_INVALID;
-        private Abortable mRunningTask = null;
+        private InflationTask mRunningTask = null;
 
         public Entry(StatusBarNotification n) {
             this.key = n.getKey();
@@ -225,10 +224,14 @@
             }
         }
 
-        public void setInflationTask(Abortable abortableTask) {
+        public void setInflationTask(InflationTask abortableTask) {
             // abort any existing inflation
+            InflationTask existing = mRunningTask;
             abortTask();
             mRunningTask = abortableTask;
+            if (existing != null && mRunningTask != null) {
+                mRunningTask.supersedeTask(existing);
+            }
         }
 
         public void onInflationTaskFinished() {
@@ -236,7 +239,7 @@
         }
 
         @VisibleForTesting
-        public Abortable getRunningTask() {
+        public InflationTask getRunningTask() {
             return mRunningTask;
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 7062216..427708b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -221,7 +221,9 @@
         boolean nonBlockable = false;
         try {
             final PackageInfo pkgInfo = pm.getPackageInfo(pkg, PackageManager.GET_SIGNATURES);
-            nonBlockable = Utils.isSystemPackage(getResources(), pm, pkgInfo);
+            nonBlockable = Utils.isSystemPackage(getResources(), pm, pkgInfo)
+                    && (mSingleNotificationChannel == null
+                    || !mSingleNotificationChannel.isBlockableSystem());
         } catch (PackageManager.NameNotFoundException e) {
             // unlikely.
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
index d4b8920..570de18 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
@@ -140,7 +140,7 @@
     @Override
     public void createMenu(ViewGroup parent) {
         mParent = (ExpandableNotificationRow) parent;
-        createMenuViews();
+        createMenuViews(true /* resetState */);
     }
 
     @Override
@@ -164,7 +164,7 @@
             // Menu hasn't been created yet, no need to do anything.
             return;
         }
-        createMenuViews();
+        createMenuViews(!isMenuVisible() /* resetState */);
     }
 
     @Override
@@ -179,7 +179,7 @@
         mParent.removeListener();
     }
 
-    private void createMenuViews() {
+    private void createMenuViews(boolean resetState) {
         // Filter the menu items based on the notification
         if (mParent != null && mParent.getStatusBarNotification() != null) {
             int flags = mParent.getStatusBarNotification().getNotification().flags;
@@ -201,7 +201,14 @@
         for (int i = 0; i < mMenuItems.size(); i++) {
             addMenuView(mMenuItems.get(i), mMenuContainer);
         }
-        resetState(false /* notify */);
+        if (resetState) {
+            resetState(false /* notify */);
+        } else {
+            mIconsPlaced = false;
+            setMenuLocation();
+            // If the # of items showing changed we need to update the snap position
+            showMenu(mParent, mOnLeft ? getSpaceForMenu() : -getSpaceForMenu(), 0 /* velocity */);
+        }
     }
 
     private void resetState(boolean notify) {
@@ -330,7 +337,8 @@
             } else {
                 snapBack(animView, velocity);
             }
-        } else if ((swipedEnoughToShowMenu() && (!gestureFastEnough || showMenuForSlowOnGoing))
+        } else if (!mSwipeHelper.isFalseGesture(ev)
+                && (swipedEnoughToShowMenu() && (!gestureFastEnough || showMenuForSlowOnGoing))
                 || (gestureTowardsMenu && !mSwipeHelper.isDismissGesture(ev))) {
             // Menu has not been snapped to previously and this is menu revealing gesture
             showMenu(animView, menuSnapTarget, velocity);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
index 8830c5d..8af1628 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
@@ -57,7 +57,7 @@
     private ViewGroup mSnoozeOptionContainer;
     private List<SnoozeOption> mSnoozeOptions;
     private int mCollapsedHeight;
-
+    private SnoozeOption mDefaultOption;
     private SnoozeOption mSelectedOption;
     private boolean mSnoozing;
     private boolean mExpanded;
@@ -86,7 +86,7 @@
         createOptionViews();
 
         // Default to first option in list
-        setSelected(mSnoozeOptions.get(0));
+        setSelected(mDefaultOption);
     }
 
     public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) {
@@ -119,7 +119,9 @@
         ArrayList<SnoozeOption> options = new ArrayList<>();
         options.add(createOption(R.string.snooze_option_15_min, 15));
         options.add(createOption(R.string.snooze_option_30_min, 30));
-        options.add(createOption(R.string.snooze_option_1_hour, 60));
+        mDefaultOption = createOption(R.string.snooze_option_1_hour, 60);
+        options.add(mDefaultOption);
+        options.add(createOption(R.string.snooze_option_2_hour, 60 * 2));
         return options;
     }
 
@@ -232,7 +234,7 @@
     @Override
     public View getContentView() {
         // Reset the view before use
-        setSelected(mSnoozeOptions.get(0));
+        setSelected(mDefaultOption);
         return this;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
index 4c3b574..4b08f2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
@@ -28,7 +28,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.systemui.R;
-import com.android.systemui.statusbar.Abortable;
+import com.android.systemui.statusbar.InflationTask;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 import com.android.systemui.statusbar.NotificationContentView;
 import com.android.systemui.statusbar.NotificationData;
@@ -130,6 +130,12 @@
      */
     @VisibleForTesting
     void inflateNotificationViews(int reInflateFlags) {
+        if (mRow.isRemoved()) {
+            // We don't want to reinflate anything for removed notifications. Otherwise views might
+            // be readded to the stack, leading to leaks. This may happen with low-priority groups
+            // where the removal of already removed children can lead to a reinflation.
+            return;
+        }
         StatusBarNotification sbn = mRow.getEntry().notification;
         new AsyncInflationTask(sbn, reInflateFlags, mRow, mIsLowPriority,
                 mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient,
@@ -485,17 +491,17 @@
     }
 
     public static class AsyncInflationTask extends AsyncTask<Void, Void, InflationProgress>
-            implements InflationCallback, Abortable {
+            implements InflationCallback, InflationTask {
 
         private final StatusBarNotification mSbn;
         private final Context mContext;
-        private final int mReInflateFlags;
         private final boolean mIsLowPriority;
         private final boolean mIsChildInGroup;
         private final boolean mUsesIncreasedHeight;
         private final InflationCallback mCallback;
         private final boolean mUsesIncreasedHeadsUpHeight;
         private final boolean mRedactAmbient;
+        private int mReInflateFlags;
         private ExpandableNotificationRow mRow;
         private Exception mError;
         private RemoteViews.OnClickHandler mRemoteViewClickHandler;
@@ -508,8 +514,6 @@
                 InflationCallback callback,
                 RemoteViews.OnClickHandler remoteViewClickHandler) {
             mRow = row;
-            NotificationData.Entry entry = row.getEntry();
-            entry.setInflationTask(this);
             mSbn = notification;
             mReInflateFlags = reInflateFlags;
             mContext = mRow.getContext();
@@ -520,6 +524,13 @@
             mRedactAmbient = redactAmbient;
             mRemoteViewClickHandler = remoteViewClickHandler;
             mCallback = callback;
+            NotificationData.Entry entry = row.getEntry();
+            entry.setInflationTask(this);
+        }
+
+        @VisibleForTesting
+        public int getReInflateFlags() {
+            return mReInflateFlags;
         }
 
         @Override
@@ -580,6 +591,14 @@
         }
 
         @Override
+        public void supersedeTask(InflationTask task) {
+            if (task instanceof AsyncInflationTask) {
+                // We want to inflate all flags of the previous task as well
+                mReInflateFlags |= ((AsyncInflationTask) task).mReInflateFlags;
+            }
+        }
+
+        @Override
         public void handleInflationException(StatusBarNotification notification, Exception e) {
             handleError(e);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
index 1bfc0cc..3491f81 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
@@ -22,14 +22,14 @@
 import android.view.ViewGroup;
 
 import com.android.systemui.R;
-import com.android.systemui.statusbar.Abortable;
+import com.android.systemui.statusbar.InflationTask;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 import com.android.systemui.statusbar.NotificationData;
 
 /**
  * An inflater task that asynchronously inflates a ExpandableNotificationRow
  */
-public class RowInflaterTask implements Abortable, AsyncLayoutInflater.OnInflateFinishedListener {
+public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInflateFinishedListener {
     private RowInflationFinishedListener mListener;
     private NotificationData.Entry mEntry;
     private boolean mCancelled;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
index 8dab069..09aff1b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
@@ -38,6 +38,7 @@
     private boolean mReorderingAllowed;
     private VisibilityLocationProvider mVisibilityLocationProvider;
     private ArraySet<View> mAllowedReorderViews = new ArraySet<>();
+    private ArraySet<View> mLowPriorityReorderingViews = new ArraySet<>();
     private ArraySet<View> mAddedChildren = new ArraySet<>();
     private boolean mPulsing;
 
@@ -115,6 +116,9 @@
         if (mAddedChildren.contains(row)) {
             return true;
         }
+        if (mLowPriorityReorderingViews.contains(row)) {
+            return true;
+        }
         if (mAllowedReorderViews.contains(row)
                 && !mVisibilityLocationProvider.isInVisibleLocation(row)) {
             return true;
@@ -130,6 +134,7 @@
     public void onReorderingFinished() {
         mAllowedReorderViews.clear();
         mAddedChildren.clear();
+        mLowPriorityReorderingViews.clear();
     }
 
     @Override
@@ -141,6 +146,10 @@
         }
     }
 
+    public void onLowPriorityUpdated(NotificationData.Entry entry) {
+        mLowPriorityReorderingViews.add(entry.row);
+    }
+
     /**
      * Notify the visual stability manager that a new view was added and should be allowed to
      * reorder next time.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 41a60e2..6fe8827 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -330,7 +330,7 @@
 
     private void updateRightAffordanceIcon() {
         IconState state = mRightButton.getIcon();
-        mRightAffordanceView.setVisibility(state.isVisible ? View.VISIBLE : View.GONE);
+        mRightAffordanceView.setVisibility(!mDozing && state.isVisible ? View.VISIBLE : View.GONE);
         mRightAffordanceView.setImageDrawable(state.drawable, state.tint);
         mRightAffordanceView.setContentDescription(state.contentDescription);
     }
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 a9eb20b..8cd8791 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
@@ -30,6 +30,7 @@
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
+import android.util.LayoutDirection;
 import android.util.Log;
 
 import com.android.settingslib.R;
@@ -192,6 +193,13 @@
 
     @Override
     public void draw(@NonNull Canvas canvas) {
+        boolean isRtl = getLayoutDirection() == LayoutDirection.RTL;
+        if (isRtl) {
+            canvas.save();
+            // Mirror the drawable
+            canvas.translate(canvas.getWidth(), 0);
+            canvas.scale(-1.0f, 1.0f);
+        }
         mFullPath.reset();
         mFullPath.setFillType(FillType.WINDING);
         float width = getBounds().width();
@@ -250,6 +258,9 @@
             }
             canvas.drawPath(mXPath, mForegroundPaint);
         }
+        if (isRtl) {
+            canvas.restore();
+        }
     }
 
     private void drawDot(Path fullPath, Path foregroundPath, float x, float y, float dotSize,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 699d367..51fb204 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1612,9 +1612,16 @@
     @Override
     public void onAsyncInflationFinished(Entry entry) {
         mPendingNotifications.remove(entry.key);
-        if (mNotificationData.get(entry.key) == null) {
+        // If there was an async task started after the removal, we don't want to add it back to
+        // the list, otherwise we might get leaks.
+        boolean isNew = mNotificationData.get(entry.key) == null;
+        if (isNew && !entry.row.isRemoved()) {
             addEntry(entry);
+        } else if (!isNew && entry.row.hasLowPriorityStateUpdated()) {
+            mVisualStabilityManager.onLowPriorityUpdated(entry);
+            updateNotificationShade();
         }
+        entry.row.setLowPriorityStateUpdated(false);
     }
 
     private boolean shouldSuppressFullScreenIntent(String key) {
@@ -1762,10 +1769,10 @@
                     continue;
                 }
                 toRemove.add(row);
-                toRemove.get(i).setKeepInParent(true);
+                row.setKeepInParent(true);
                 // we need to set this state earlier as otherwise we might generate some weird
                 // animations
-                toRemove.get(i).setRemoved();
+                row.setRemoved();
             }
         }
     }
@@ -2876,6 +2883,15 @@
         mHandler.post(mAnimateCollapsePanels);
     }
 
+    public void postAnimateForceCollapsePanels() {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
+            }
+        });
+    }
+
     public void postAnimateOpenPanels() {
         mHandler.sendEmptyMessage(MSG_OPEN_SETTINGS_PANEL);
     }
@@ -6233,7 +6249,10 @@
             StatusBarNotification sbn, ExpandableNotificationRow row) {
         row.setNeedsRedaction(needsRedaction(entry));
         boolean isLowPriority = mNotificationData.isAmbient(sbn.getKey());
+        boolean isUpdate = mNotificationData.get(entry.key) != null;
+        boolean wasLowPriority = row.isLowPriority();
         row.setIsLowPriority(isLowPriority);
+        row.setLowPriorityStateUpdated(isUpdate && (wasLowPriority != isLowPriority));
         // bind the click event to the content area
         mNotificationClicker.register(row, sbn);
 
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 eaf8925..78e0028 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
@@ -14,9 +14,6 @@
 
 package com.android.systemui.statusbar.policy;
 
-import com.android.systemui.Dependency;
-import com.android.systemui.plugins.Plugin;
-
 import java.util.Map;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
@@ -32,6 +29,11 @@
     interface Extension<T> {
         T get();
         void destroy();
+        /**
+         * Triggers the extension to cycle through each of the sources again because something
+         * (like configuration) may have changed.
+         */
+        T reload();
     }
 
     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 fefbaa3..cfc1d56 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
@@ -126,6 +126,12 @@
             }
         }
 
+        @Override
+        public T reload() {
+            notifyChanged();
+            return get();
+        }
+
         private void notifyChanged() {
             for (int i = 0; i < mProducers.size(); i++) {
                 final T item = mProducers.get(i).get();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
index 8e51ddb..cc7943b8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
@@ -194,6 +194,11 @@
         return true;
     }
 
+    @Override
+    public boolean hasFocusStateSpecified() {
+        return true;
+    }
+
     public void setPressed(boolean pressed) {
         if (mDark != mLastDark && pressed) {
             mRipplePaint = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 61fed2d..431f646 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -120,7 +120,7 @@
     private boolean mSwipingInProgress;
     private int mCurrentStackHeight = Integer.MAX_VALUE;
     private final Paint mBackgroundPaint = new Paint();
-    private boolean mShouldDrawNotificationBackground;
+    private final boolean mShouldDrawNotificationBackground;
 
     private float mExpandedHeight;
     private int mOwnScrollY;
@@ -451,7 +451,8 @@
     }
 
     protected void onDraw(Canvas canvas) {
-        if (mShouldDrawNotificationBackground && mCurrentBounds.top < mCurrentBounds.bottom) {
+        if (mShouldDrawNotificationBackground && !mAmbientState.isDark()
+                && mCurrentBounds.top < mCurrentBounds.bottom) {
             canvas.drawRect(0, mCurrentBounds.top, getWidth(), mCurrentBounds.bottom,
                     mBackgroundPaint);
         }
@@ -3688,11 +3689,8 @@
      * {@link #mAmbientState}'s dark mode is toggled.
      */
     private void updateWillNotDraw() {
-       if (mAmbientState.isDark()) {
-           setWillNotDraw(!DEBUG);
-       } else {
-           setWillNotDraw(!mShouldDrawNotificationBackground && !DEBUG);
-       }
+        boolean willDraw = !mAmbientState.isDark() && mShouldDrawNotificationBackground || DEBUG;
+        setWillNotDraw(!willDraw);
     }
 
     private void setBackgroundFadeAmount(float fadeAmount) {
@@ -4355,6 +4353,10 @@
             mStatusBar.setNotificationSnoozed(sbn, snoozeOption);
         }
 
+        public boolean isFalseGesture(MotionEvent ev) {
+            return super.isFalseGesture(ev);
+        }
+
         private void handleMenuCoveredOrDismissed() {
             if (mMenuExposedView != null && mMenuExposedView == mTranslatingParentView) {
                 mMenuExposedView = null;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
index 2f9bcff..e86a34a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
@@ -18,26 +18,25 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
 import android.media.AudioManager;
 import android.media.VolumePolicy;
 import android.os.Bundle;
 import android.os.Handler;
-import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 
+import com.android.settingslib.applications.InterestingConfigChanges;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.Dependency;
 import com.android.systemui.SystemUI;
 import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.plugins.PluginDependency;
 import com.android.systemui.plugins.PluginDependencyProvider;
-import com.android.systemui.plugins.PluginManager;
 import com.android.systemui.plugins.VolumeDialog;
 import com.android.systemui.plugins.VolumeDialogController;
 import com.android.systemui.qs.tiles.DndTile;
 import com.android.systemui.statusbar.policy.ExtensionController;
-import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.statusbar.policy.ExtensionController.Extension;
 import com.android.systemui.tuner.TunerService;
 
 import java.io.FileDescriptor;
@@ -60,6 +59,9 @@
     private final SystemUI mSysui;
     private final Context mContext;
     private final VolumeDialogControllerImpl mController;
+    private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges(
+            ActivityInfo.CONFIG_FONT_SCALE);
+    private final Extension mExtension;
     private VolumeDialog mDialog;
     private VolumePolicy mVolumePolicy = new VolumePolicy(
             DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT,  // volumeDownToEnterSilent
@@ -76,7 +78,7 @@
         // Allow plugins to reference the VolumeDialogController.
         Dependency.get(PluginDependencyProvider.class)
                 .allowPluginDependency(VolumeDialogController.class);
-        Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class)
+        mExtension = Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class)
                 .withPlugin(VolumeDialog.class)
                 .withDefault(this::createDefault)
                 .withCallback(dialog -> {
@@ -148,7 +150,9 @@
 
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
-        // noop
+        if (mConfigChanges.applyNewConfig(mContext.getResources())) {
+            mExtension.reload();
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
new file mode 100644
index 0000000..b597868
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -0,0 +1,128 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertFalse;
+
+import android.support.test.filters.LargeTest;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.internal.runner.ClassPathScanner;
+import android.support.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
+import android.support.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
+import android.support.test.internal.runner.TestLoader;
+import android.testing.AndroidTestingRunner;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.systemui.SysuiBaseFragmentTest;
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * This is named AAAPlusPlusVerifySysuiRequiredTestPropertiesTest for two reasons.
+ * a) Its so awesome it deserves an AAA++
+ * b) It should run first to draw attention to itself.
+ *
+ * For trues though: this test verifies that all the sysui tests extend the right classes.
+ * This matters because including tests with different context implementations in the same
+ * test suite causes errors, such as the incorrect settings provider being cached.
+ * For an example, see {@link com.android.systemui.DependencyTest}.
+ */
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class AAAPlusPlusVerifySysuiRequiredTestPropertiesTest extends SysuiTestCase {
+
+    private static final String TAG = "AAA++VerifyTest";
+
+    private static final Class[] BASE_CLS_WHITELIST = {
+            SysuiTestCase.class,
+            SysuiBaseFragmentTest.class,
+    };
+
+    private static final Class[] SUPPORTED_SIZES = {
+            SmallTest.class,
+            MediumTest.class,
+            LargeTest.class,
+            android.test.suitebuilder.annotation.SmallTest.class,
+            android.test.suitebuilder.annotation.MediumTest.class,
+            android.test.suitebuilder.annotation.LargeTest.class,
+    };
+
+    @Test
+    public void testAllClassInheritance() {
+        boolean anyClassWrong = false;
+        TestLoader loader = new TestLoader();
+        for (String className : getClassNamesFromClassPath()) {
+            Class<?> cls = loader.loadIfTest(className);
+            if (cls == null) continue;
+
+            boolean hasParent = false;
+            for (Class<?> parent : BASE_CLS_WHITELIST) {
+                if (parent.isAssignableFrom(cls)) {
+                    hasParent = true;
+                    break;
+                }
+            }
+            boolean hasSize = hasSize(cls);
+            if (!hasSize) {
+                anyClassWrong = true;
+                Log.e(TAG, cls.getName() + " does not have size annotation, such as @SmallTest");
+            }
+            if (!hasParent) {
+                anyClassWrong = true;
+                Log.e(TAG, cls.getName() + " does not extend any of " + getClsStr());
+            }
+        }
+
+        assertFalse("All sysui test classes must have size and extend one of " + getClsStr(),
+                anyClassWrong);
+    }
+
+    private boolean hasSize(Class<?> cls) {
+        for (int i = 0; i < SUPPORTED_SIZES.length; i++) {
+            if (cls.getDeclaredAnnotation(SUPPORTED_SIZES[i]) != null) return true;
+        }
+        return false;
+    }
+
+    private Collection<String> getClassNamesFromClassPath() {
+        ClassPathScanner scanner = new ClassPathScanner(mContext.getPackageCodePath());
+
+        ChainedClassNameFilter filter = new ChainedClassNameFilter();
+
+        filter.add(new ExternalClassNameFilter());
+        filter.add(s -> s.startsWith("com.android.systemui")
+                || s.startsWith("com.android.keyguard"));
+        try {
+            return scanner.getClassPathEntries(filter);
+        } catch (IOException e) {
+            Log.e(TAG, "Failed to scan classes", e);
+        }
+        return Collections.emptyList();
+    }
+
+    private String getClsStr() {
+        return TextUtils.join(",", Arrays.asList(BASE_CLS_WHITELIST)
+                .stream().map(cls -> cls.getSimpleName()).toArray());
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
index 1c9f813..855adb4 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
@@ -19,26 +19,26 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
 import android.text.TextUtils;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.TextView;
 
+import com.android.systemui.SysuiTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 
 import java.util.List;
 
-public class KeyguardClockAccessibilityDelegateTest {
+@SmallTest
+public class KeyguardClockAccessibilityDelegateTest extends SysuiTestCase {
 
-    private Context mContext;
     private TextView mView;
 
     @Before
     public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getContext();
         mView = new TextView(mContext);
         mView.setText(R.string.keyguard_widget_12_hours_format);
         mView.setContentDescription(mContext.getString(R.string.keyguard_widget_12_hours_format));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
index c297ae8..3426e11 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.os.Looper;
+import android.support.test.filters.SmallTest;
 
 import com.android.systemui.Dependency.DependencyKey;
 import com.android.systemui.statusbar.policy.FlashlightController;
@@ -30,6 +31,7 @@
 
 import java.io.PrintWriter;
 
+@SmallTest
 public class DependencyTest extends SysuiTestCase {
 
     public static final DependencyKey<Dumpable> DUMPABLE = new DependencyKey<>("dumpable");
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index 0aac1c0..9b67529 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -20,6 +20,7 @@
 import android.os.Looper;
 import android.os.MessageQueue;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
 import android.testing.LeakCheck;
 import android.util.Log;
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index d203602..7519b2d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -43,6 +43,7 @@
 import android.view.Display;
 
 import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.util.wakelock.WakeLockFake;
 
 import android.testing.UiThreadTest;
@@ -54,7 +55,7 @@
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 @UiThreadTest
-public class DozeMachineTest {
+public class DozeMachineTest extends SysuiTestCase {
 
     DozeMachine mMachine;
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
index ada8ac0..720e9f0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
@@ -25,13 +25,14 @@
 import android.support.test.filters.SmallTest;
 import android.view.Display;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.phone.DozeParameters;
 
 import org.junit.Before;
 import org.junit.Test;
 
 @SmallTest
-public class DozeScreenStatePreventingAdapterTest {
+public class DozeScreenStatePreventingAdapterTest extends SysuiTestCase {
 
     private DozeMachine.Service mInner;
     private DozeScreenStatePreventingAdapter mWrapper;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 8934460..97d9080 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -32,6 +32,7 @@
 import android.support.test.runner.AndroidJUnit4;
 
 import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.util.wakelock.WakeLock;
 import com.android.systemui.util.wakelock.WakeLockFake;
@@ -44,8 +45,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class DozeTriggersTest {
-    private Context mContext;
+public class DozeTriggersTest extends SysuiTestCase {
     private DozeTriggers mTriggers;
     private DozeMachine mMachine;
     private DozeHostFake mHost;
@@ -65,7 +65,6 @@
     @Before
     public void setUp() throws Exception {
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
-        mContext = InstrumentationRegistry.getContext();
         mMachine = mock(DozeMachine.class);
         mHost = new DozeHostFake();
         mConfig = DozeConfigurationUtil.createMockConfig();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
index 0f2878b..5fb0a3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
@@ -40,6 +40,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.keyguard.WorkLockActivity;
 import com.android.systemui.keyguard.WorkLockActivityController;
 import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -58,7 +59,7 @@
  */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class WorkLockActivityControllerTest {
+public class WorkLockActivityControllerTest extends SysuiTestCase {
     private static final int USER_ID = 333;
     private static final int TASK_ID = 444;
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
index 9b868db..9f3573f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
@@ -33,6 +33,7 @@
 import android.graphics.Color;
 import android.os.Looper;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.keyguard.WorkLockActivity;
 
 import org.junit.Before;
@@ -46,7 +47,7 @@
  */
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class WorkLockActivityTest {
+public class WorkLockActivityTest extends SysuiTestCase {
     private static final @UserIdInt int USER_ID = 270;
     private static final String TASK_LABEL = "task label";
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
index 9849800..0b4d9b5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
@@ -17,6 +17,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import android.support.test.filters.SmallTest;
+
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.VersionInfo.InvalidVersionException;
 import com.android.systemui.plugins.annotations.Requires;
@@ -28,6 +30,7 @@
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
+@SmallTest
 public class VersionInfoTest extends SysuiTestCase {
 
     @Rule
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
index 0a945ab..7cbe985 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
@@ -23,7 +23,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.support.test.filters.FlakyTest;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -45,7 +45,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
-@FlakyTest
+@SmallTest
 public class QSDetailTest extends SysuiTestCase {
 
     private MetricsLogger mMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
index 09c5725..402b12d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
@@ -20,7 +20,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.support.test.filters.FlakyTest;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -40,7 +40,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
-@FlakyTest
+@SmallTest
 public class QSFooterTest extends LeakCheckedTest {
 
     private QSFooter mFooter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index 601d4e2..0b7da1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -29,6 +29,7 @@
 import com.android.systemui.R;
 
 import android.os.Parcelable;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 
 import com.android.systemui.SysuiBaseFragmentTest;
@@ -50,7 +51,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper(setAsMainLooper = true)
-@FlakyTest
+@SmallTest
 public class QSFragmentTest extends SysuiBaseFragmentTest {
 
     private MetricsLogger mMockMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
index 5f6fc33..e5ff866 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
@@ -16,10 +16,10 @@
 
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
-import android.support.test.filters.FlakyTest;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -38,7 +38,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
-@FlakyTest
+@SmallTest
 public class QSPanelTest extends SysuiTestCase {
 
     private MetricsLogger mMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
index 6e7d99e..0239ab0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
@@ -18,6 +18,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -33,6 +34,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
+@SmallTest
 public class TileAdapterTest extends SysuiTestCase {
 
     private TileAdapter mTileAdapter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
index 59483f2..f9f4f497 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
@@ -24,6 +24,7 @@
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
 import android.service.quicksettings.Tile;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.UiThreadTest;
 import android.widget.ImageView;
@@ -39,6 +40,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @UiThreadTest
+@SmallTest
 public class QSIconViewImplTest extends SysuiTestCase {
 
     private QSIconViewImpl mIconView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
index 9ed9d28c..0500a54 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
@@ -30,6 +30,7 @@
 
 import android.content.Intent;
 import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -48,6 +49,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
+@SmallTest
 public class QSTileImplTest extends SysuiTestCase {
 
     public static final int POSITION = 14;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
index 9e15a05..17d7a41 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
@@ -17,6 +17,7 @@
 package com.android.systemui.settings;
 
 import android.content.Intent;
+import android.support.test.filters.SmallTest;
 
 import com.android.systemui.SysuiTestCase;
 
@@ -26,6 +27,7 @@
 /**
  * Testing functionality of the current user tracker
  */
+@SmallTest
 public class CurrentUserTrackerTest extends SysuiTestCase {
 
     private CurrentUserTracker mTracker;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index c13d13b..8cacb4b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -22,6 +22,7 @@
 import android.content.ComponentName;
 import android.graphics.Rect;
 import android.os.Bundle;
+import android.support.test.filters.SmallTest;
 
 import com.android.internal.statusbar.StatusBarIcon;
 import com.android.systemui.SysuiTestCase;
@@ -31,6 +32,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
+@SmallTest
 public class CommandQueueTest extends SysuiTestCase {
 
     private CommandQueue mCommandQueue;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index a3a0a6f..1161987 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -29,6 +29,7 @@
 import android.view.View;
 
 import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
+import com.android.systemui.SysuiTestCase;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -38,16 +39,13 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@FlakyTest
-public class ExpandableNotificationRowTest {
+public class ExpandableNotificationRowTest extends SysuiTestCase {
 
-    private Context mContext;
     private ExpandableNotificationRow mGroup;
     private NotificationTestHelper mNotificationTestHelper;
 
     @Before
     public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getTargetContext();
         mNotificationTestHelper = new NotificationTestHelper(mContext);
         mGroup = mNotificationTestHelper.createGroup();
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
index fecf901..8dcc408 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
@@ -35,18 +35,17 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
+import com.android.systemui.SysuiTestCase;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@FlakyTest
-public class NotificationContentViewTest {
+public class NotificationContentViewTest extends SysuiTestCase {
 
     NotificationContentView mView;
-    Context mContext;
 
     @Before
     @UiThreadTest
     public void setup() {
-        mContext = InstrumentationRegistry.getTargetContext();
         mView = new NotificationContentView(mContext, null);
         ExpandableNotificationRow row = new ExpandableNotificationRow(mContext, null);
         ExpandableNotificationRow mockRow = spy(row);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
index 00f2b18..fc9b608 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
@@ -26,6 +26,7 @@
 import android.widget.RemoteViews;
 
 import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.notification.NotificationCustomViewWrapper;
 import com.android.systemui.statusbar.notification.NotificationViewWrapper;
 
@@ -37,16 +38,13 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@FlakyTest
-public class NotificationCustomViewWrapperTest {
+public class NotificationCustomViewWrapperTest extends SysuiTestCase {
 
-    private Context mContext;
     private ExpandableNotificationRow mRow;
 
     @Before
     @UiThreadTest
     public void setUp() {
-        mContext = InstrumentationRegistry.getTargetContext();
         mRow = new ExpandableNotificationRow(mContext, null);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index c7d5e68..6380847 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.statusbar;
 
+import static android.print.PrintManager.PRINT_SPOOLER_PACKAGE_NAME;
+
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertNull;
@@ -74,6 +76,7 @@
 @UiThreadTest
 public class NotificationInfoTest extends SysuiTestCase {
     private static final String TEST_PACKAGE_NAME = "test_package";
+    private static final String TEST_SYSTEM_PACKAGE_NAME = PRINT_SPOOLER_PACKAGE_NAME;
     private static final int TEST_UID = 1;
     private static final String TEST_CHANNEL = "test_channel";
     private static final String TEST_CHANNEL_NAME = "TEST CHANNEL NAME";
@@ -95,11 +98,18 @@
         // PackageManager must return a packageInfo and applicationInfo.
         final PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = TEST_PACKAGE_NAME;
-        when(mMockPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo);
+        when(mMockPackageManager.getPackageInfo(eq(TEST_PACKAGE_NAME), anyInt()))
+                .thenReturn(packageInfo);
         final ApplicationInfo applicationInfo = new ApplicationInfo();
         applicationInfo.uid = TEST_UID;  // non-zero
         when(mMockPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(
                 applicationInfo);
+        final PackageInfo systemPackageInfo = new PackageInfo();
+        systemPackageInfo.packageName = TEST_SYSTEM_PACKAGE_NAME;
+        when(mMockPackageManager.getPackageInfo(eq(TEST_SYSTEM_PACKAGE_NAME), anyInt()))
+                .thenReturn(systemPackageInfo);
+        when(mMockPackageManager.getPackageInfo(eq("android"), anyInt()))
+                .thenReturn(packageInfo);
 
         // Package has one channel by default.
         when(mMockINotificationManager.getNumNotificationChannelsForPackage(
@@ -605,6 +615,45 @@
     }
 
     @Test
+    public void testEnabledSwitchInvisibleIfNonBlockableSystemChannel() throws Exception {
+        mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+        mNotificationChannel.setBlockableSystem(false);
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_SYSTEM_PACKAGE_NAME, Arrays.asList(mNotificationChannel),
+                mNotificationChannel.getImportance(), mSbn, null, null, null,
+                null, null);
+
+        Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+        assertEquals(View.INVISIBLE, enabledSwitch.getVisibility());
+    }
+
+    @Test
+    public void testEnabledSwitchVisibleIfBlockableSystemChannel() throws Exception {
+        mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+        mNotificationChannel.setBlockableSystem(true);
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_SYSTEM_PACKAGE_NAME, Arrays.asList(mNotificationChannel),
+                mNotificationChannel.getImportance(), mSbn, null, null, null,
+                null, null);
+
+        Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+        assertEquals(View.VISIBLE, enabledSwitch.getVisibility());
+    }
+
+    @Test
+    public void testEnabledSwitchInvisibleIfMultiChannelSummary() throws Exception {
+        mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+        mNotificationChannel.setBlockableSystem(true);
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_PACKAGE_NAME, Arrays.asList(mNotificationChannel, mDefaultNotificationChannel),
+                mNotificationChannel.getImportance(), mSbn, null, null, null,
+                null, Collections.singleton(TEST_PACKAGE_NAME));
+
+        Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+        assertEquals(View.INVISIBLE, enabledSwitch.getVisibility());
+    }
+
+    @Test
     public void testNonBlockableAppDoesNotBecomeBlocked() throws Exception {
         mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
index 9249df6..e0d8042 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
@@ -16,6 +16,7 @@
 
 import static junit.framework.Assert.assertTrue;
 
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -30,6 +31,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper(setAsMainLooper = true)
+@SmallTest
 public class NotificationMenuRowTest extends LeakCheckedTest {
 
     @Before
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
index f9f40a6..ee8db88 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
@@ -33,9 +33,11 @@
 import android.widget.RemoteViews;
 
 import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 import com.android.systemui.statusbar.NotificationData;
 import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.InflationTask;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -47,17 +49,14 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@FlakyTest
-public class NotificationInflaterTest {
+public class NotificationInflaterTest extends SysuiTestCase {
 
-    private Context mContext;
     private NotificationInflater mNotificationInflater;
     private Notification.Builder mBuilder;
     private ExpandableNotificationRow mRow;
 
     @Before
     public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getTargetContext();
         mBuilder = new Notification.Builder(mContext).setSmallIcon(
                 R.drawable.ic_person)
                 .setContentTitle("Title")
@@ -132,7 +131,29 @@
         mRow.getEntry().abortTask();
         runThenWaitForInflation(() -> mNotificationInflater.inflateNotificationViews(),
                 mNotificationInflater);
-        Assert.assertNull(mRow.getEntry().getRunningTask() );
+        verify(mRow).onNotificationUpdated();
+    }
+
+    @Test
+    public void testRemovedNotInflated() throws Exception {
+        mRow.setRemoved();
+        mNotificationInflater.inflateNotificationViews();
+        Assert.assertNull(mRow.getEntry().getRunningTask());
+    }
+
+
+    @Test
+    public void testSupersedesExistingTask() throws Exception {
+        mNotificationInflater.inflateNotificationViews();
+        mNotificationInflater.setIsLowPriority(true);
+        mNotificationInflater.setIsChildInGroup(true);
+        InflationTask runningTask = mRow.getEntry().getRunningTask();
+        NotificationInflater.AsyncInflationTask asyncInflationTask =
+                (NotificationInflater.AsyncInflationTask) runningTask;
+        Assert.assertSame("Successive inflations don't inherit the previous flags!",
+                asyncInflationTask.getReInflateFlags(),
+                NotificationInflater.FLAG_REINFLATE_ALL);
+        runningTask.abort();
     }
 
     public static void runThenWaitForInflation(Runnable block,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
index 7a72afd..ebeb24c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
@@ -18,9 +18,11 @@
 
 import android.content.Context;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.view.View;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 
 import org.junit.Before;
@@ -28,14 +30,8 @@
 import org.junit.runner.RunWith;
 
 @RunWith(AndroidJUnit4.class)
-public class NotificationViewWrapperTest {
-
-    private Context mContext;
-
-    @Before
-    public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getTargetContext();
-    }
+@SmallTest
+public class NotificationViewWrapperTest extends SysuiTestCase {
 
     @Test
     public void constructor_doesntUseViewContext() throws Exception {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
index e4c43735..95ce0d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
@@ -20,6 +20,7 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 import com.android.systemui.statusbar.NotificationData;
 import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
@@ -37,7 +38,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class VisualStabilityManagerTest {
+public class VisualStabilityManagerTest extends SysuiTestCase {
 
     private VisualStabilityManager mVisualStabilityManager = new VisualStabilityManager();
     private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
index e41a827..0937ce2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
@@ -22,6 +22,8 @@
 import com.android.internal.app.NightDisplayController;
 import com.android.systemui.Prefs;
 import com.android.systemui.Prefs.Key;
+
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.qs.QSTileHost;
@@ -33,6 +35,7 @@
 import org.mockito.Mockito;
 
 @RunWith(AndroidTestingRunner.class)
+@SmallTest
 public class AutoTileManagerTest extends SysuiTestCase {
 
     private QSTileHost mQsTileHost;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 6ddbffc..66524cc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.Mockito.when;
 
 import android.app.StatusBarManager;
+import android.support.test.filters.SmallTest;
 import android.view.View;
 import android.view.ViewPropertyAnimator;
 
@@ -39,6 +40,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper(setAsMainLooper = true)
+@SmallTest
 public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
 
     private NotificationIconAreaController mMockNotificiationAreaController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
index ee104402..e89ff97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
@@ -18,6 +18,8 @@
 
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,7 +30,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class DozeParametersTest {
+public class DozeParametersTest extends SysuiTestCase {
 
     @Test
     public void test_inOutMatcher_defaultIn() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
index 53d842a..a120cec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
@@ -20,6 +20,7 @@
 
 import android.content.Context;
 import android.os.Looper;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.LeakCheck.Tracker;
 import android.view.Display;
@@ -46,6 +47,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper(setAsMainLooper = true)
+@SmallTest
 public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
 
     public NavigationBarFragmentTest() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
index ecae39a..5db7792 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
@@ -18,6 +18,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper.RunWithLooper;
 import android.view.ViewGroup;
@@ -36,6 +37,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
+@SmallTest
 public class StatusBarIconControllerTest extends LeakCheckedTest {
 
     @Before
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
index f516d74..2eb9560 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
@@ -20,6 +20,7 @@
 
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothProfile;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -40,6 +41,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
+@SmallTest
 public class BluetoothControllerImplTest extends SysuiTestCase {
 
     private LocalBluetoothManager mMockBluetoothManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index 3ed1681..cb20639 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -20,6 +20,7 @@
 import android.telephony.SubscriptionInfo;
 import android.test.suitebuilder.annotation.SmallTest;
 import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
 import com.android.systemui.statusbar.policy.NetworkController.IconState;
 import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
@@ -40,7 +41,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class CallbackHandlerTest {
+public class CallbackHandlerTest extends SysuiTestCase {
 
     private CallbackHandler mHandler;
     private HandlerThread mHandlerThread;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
index 3e79a04..3d79d5b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
@@ -20,6 +20,8 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
+import android.support.test.filters.SmallTest;
+
 import com.android.systemui.Dependency;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.plugins.OverlayPlugin;
@@ -34,6 +36,7 @@
 import java.util.Map;
 import java.util.function.Consumer;
 
+@SmallTest
 public class ExtensionControllerTest extends SysuiTestCase {
 
     private PluginManager mPluginManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
index 21fddf2..f859235 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.ArgumentMatchers.argThat;
 
 import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 import android.testing.TestableLooper.RunWithLooper;
@@ -40,6 +41,7 @@
 
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
+@SmallTest
 public class KeyButtonViewTest extends SysuiTestCase {
 
     private KeyButtonView mKeyButtonView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
index 4932ba1..e6c8815 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
@@ -25,6 +25,7 @@
 import android.view.NotificationHeaderView;
 import android.view.View;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 import com.android.systemui.statusbar.NotificationTestHelper;
 
@@ -36,17 +37,14 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-@FlakyTest
-public class NotificationChildrenContainerTest {
+public class NotificationChildrenContainerTest extends SysuiTestCase {
 
-    private Context mContext;
     private ExpandableNotificationRow mGroup;
     private int mId;
     private NotificationTestHelper mNotificationTestHelper;
 
     @Before
     public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getTargetContext();
         mNotificationTestHelper = new NotificationTestHelper(mContext);
         mGroup = mNotificationTestHelper.createGroup();
     }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
index 9a825c1..a3b258f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
@@ -27,13 +27,15 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.systemui.SysuiTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class GarbageMonitorTest {
+public class GarbageMonitorTest extends SysuiTestCase {
 
     private LeakReporter mLeakReporter;
     private TrackedGarbage mTrackedGarbage;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
index 11722fe..f1965a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
@@ -20,6 +20,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
 
 import org.junit.Before;
@@ -35,7 +36,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class LeakDetectorTest {
+public class LeakDetectorTest extends SysuiTestCase {
 
     private LeakDetector mLeakDetector;
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
index 1194849..6711ce8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
@@ -24,6 +24,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.NotificationManager;
+import android.support.test.filters.MediumTest;
 import android.support.test.runner.AndroidJUnit4;
 
 import com.android.systemui.SysuiTestCase;
@@ -38,6 +39,7 @@
 import java.io.PrintWriter;
 
 @RunWith(AndroidJUnit4.class)
+@MediumTest
 public class LeakReporterTest extends SysuiTestCase {
 
     private LeakDetector mLeakDetector;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
index 9da67b7..b8a3e39 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
@@ -21,12 +21,14 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.systemui.SysuiTestCase;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class ReferenceTestUtilsTest {
+public class ReferenceTestUtilsTest extends SysuiTestCase {
 
     @Test
     public void testCollectionWaiter_doesntBlockIndefinitely() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
index fb1c1aa..9787df9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
@@ -23,6 +23,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.systemui.SysuiTestCase;
 import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
 
 import org.junit.Before;
@@ -31,7 +32,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class WeakIdentityHashMapTest {
+public class WeakIdentityHashMapTest extends SysuiTestCase {
 
     WeakIdentityHashMap<Object, Object> mMap;
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
index f6692eb..39316ed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
@@ -24,13 +24,15 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.systemui.SysuiTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class SettableWakeLockTest {
+public class SettableWakeLockTest extends SysuiTestCase {
 
     private WakeLockFake mFake;
     private SettableWakeLock mSettable;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
index 5394499..9b7c597 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
@@ -25,6 +25,8 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.systemui.SysuiTestCase;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -32,7 +34,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class WakeLockTest {
+public class WakeLockTest extends SysuiTestCase {
 
     WakeLock mWakeLock;
     PowerManager.WakeLock mInner;
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 b9d188a..00846dc 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
@@ -97,5 +97,10 @@
         public void destroy() {
             mTracker.getLeakInfo(mAllocation).clearAllocations();
         }
+
+        @Override
+        public T reload() {
+            return null;
+        }
     }
 }
diff --git a/preloaded-classes b/preloaded-classes
index 493e980..9612231 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -33,9 +33,13 @@
 [Landroid.animation.Animator;
 [Landroid.animation.Keyframe$FloatKeyframe;
 [Landroid.animation.Keyframe$IntKeyframe;
-[Landroid.animation.Keyframe$ObjectKeyframe;
 [Landroid.animation.PropertyValuesHolder;
 [Landroid.app.LoaderManagerImpl;
+[Landroid.app.Notification$Action;
+[Landroid.app.NotificationChannel;
+[Landroid.app.RemoteInput;
+[Landroid.app.job.JobInfo$TriggerContentUri;
+[Landroid.bluetooth.BluetoothDevice;
 [Landroid.content.ContentProviderResult;
 [Landroid.content.ContentValues;
 [Landroid.content.Intent;
@@ -60,6 +64,9 @@
 [Landroid.graphics.Bitmap$Config;
 [Landroid.graphics.Bitmap;
 [Landroid.graphics.Canvas$EdgeType;
+[Landroid.graphics.ColorSpace$Model;
+[Landroid.graphics.ColorSpace$Named;
+[Landroid.graphics.ColorSpace;
 [Landroid.graphics.FontFamily;
 [Landroid.graphics.Interpolator$Result;
 [Landroid.graphics.Matrix$ScaleToFit;
@@ -69,7 +76,9 @@
 [Landroid.graphics.Paint$Style;
 [Landroid.graphics.Path$Direction;
 [Landroid.graphics.Path$FillType;
+[Landroid.graphics.Point;
 [Landroid.graphics.PorterDuff$Mode;
+[Landroid.graphics.Rect;
 [Landroid.graphics.Region$Op;
 [Landroid.graphics.Shader$TileMode;
 [Landroid.graphics.Typeface;
@@ -77,6 +86,13 @@
 [Landroid.graphics.drawable.GradientDrawable$Orientation;
 [Landroid.graphics.drawable.LayerDrawable$ChildDrawable;
 [Landroid.graphics.drawable.RippleForeground;
+[Landroid.graphics.fonts.FontVariationAxis;
+[Landroid.hardware.camera2.marshal.MarshalQueryable;
+[Landroid.hardware.camera2.params.Face;
+[Landroid.hardware.camera2.params.HighSpeedVideoConfiguration;
+[Landroid.hardware.camera2.params.MeteringRectangle;
+[Landroid.hardware.camera2.params.StreamConfiguration;
+[Landroid.hardware.camera2.params.StreamConfigurationDuration;
 [Landroid.hardware.soundtrigger.SoundTrigger$ConfidenceLevel;
 [Landroid.hardware.soundtrigger.SoundTrigger$Keyphrase;
 [Landroid.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionExtra;
@@ -89,8 +105,6 @@
 [Landroid.icu.impl.Trie2$ValueWidth;
 [Landroid.icu.impl.UCharacterProperty$BinaryProperty;
 [Landroid.icu.impl.UCharacterProperty$IntProperty;
-[Landroid.icu.text.DateFormatSymbols$CalendarDataSink$AliasType;
-[Landroid.icu.text.DateFormatSymbols$CapitalizationContextUsage;
 [Landroid.icu.text.DisplayContext$Type;
 [Landroid.icu.text.DisplayContext;
 [Landroid.icu.text.PluralRules$Operand;
@@ -98,29 +112,37 @@
 [Landroid.icu.text.PluralRules$SampleType;
 [Landroid.icu.text.TimeZoneNames$NameType;
 [Landroid.icu.text.UnicodeSet;
-[Landroid.icu.util.BytesTrie$Result;
 [Landroid.icu.util.Currency$CurrencyUsage;
 [Landroid.icu.util.ULocale$Category;
 [Landroid.icu.util.ULocale;
 [Landroid.icu.util.UResourceBundle$RootType;
 [Landroid.media.AudioGain;
-[Landroid.media.MediaCodecInfo$CodecProfileLevel;
-[Landroid.net.Network;
+[Landroid.net.IpConfiguration$IpAssignment;
+[Landroid.net.IpConfiguration$ProxySettings;
+[Landroid.net.LocalSocketAddress$Namespace;
 [Landroid.net.NetworkInfo$DetailedState;
 [Landroid.net.NetworkInfo$State;
+[Landroid.net.NetworkKey;
 [Landroid.net.NetworkRequest$Type;
+[Landroid.net.ScoredNetwork;
 [Landroid.net.Uri;
+[Landroid.net.wifi.ScanResult$InformationElement;
 [Landroid.net.wifi.SupplicantState;
 [Landroid.os.AsyncTask$Status;
-[Landroid.os.IBinder;
 [Landroid.os.MessageQueue$IdleHandler;
 [Landroid.os.Parcel;
 [Landroid.os.Parcelable;
 [Landroid.os.PatternMatcher;
+[Landroid.os.PersistableBundle;
 [Landroid.os.storage.StorageVolume;
+[Landroid.service.notification.StatusBarNotification;
 [Landroid.system.StructPollfd;
 [Landroid.telephony.TelephonyManager$MultiSimVariants;
 [Landroid.text.DynamicLayout$ChangeWatcher;
+[Landroid.text.FontConfig$Alias;
+[Landroid.text.FontConfig$Family;
+[Landroid.text.FontConfig$Font;
+[Landroid.text.Hyphenator$HyphenationData;
 [Landroid.text.InputFilter;
 [Landroid.text.Layout$Alignment;
 [Landroid.text.Layout$Directions;
@@ -142,30 +164,33 @@
 [Landroid.text.style.SpellCheckSpan;
 [Landroid.text.style.SuggestionSpan;
 [Landroid.text.style.TabStopSpan;
-[Landroid.text.style.URLSpan;
 [Landroid.text.style.WrapTogetherSpan;
 [Landroid.util.LongSparseArray;
+[Landroid.util.Pair;
 [Landroid.util.Range;
 [Landroid.util.Rational;
+[Landroid.util.Size;
 [Landroid.view.Choreographer$CallbackQueue;
 [Landroid.view.Display$Mode;
+[Landroid.view.Display;
 [Landroid.view.HandlerActionQueue$HandlerAction;
 [Landroid.view.MenuItem;
 [Landroid.view.View;
-[Landroid.widget.Editor$TextRenderNode;
 [Landroid.widget.Editor$TextViewPositionListener;
 [Landroid.widget.ImageView$ScaleType;
 [Landroid.widget.TextView$BufferType;
 [Landroid.widget.TextView$ChangeWatcher;
-[Lcom.android.dex.TableOfContents$Section;
 [Lcom.android.internal.policy.PhoneWindow$PanelFeatureState;
+[Lcom.android.internal.telephony.IccCardConstants$State;
 [Lcom.android.internal.telephony.PhoneConstants$State;
+[Lcom.android.internal.util.StateMachine$SmHandler$StateInfo;
 [Lcom.android.okhttp.CipherSuite;
 [Lcom.android.okhttp.ConnectionSpec;
 [Lcom.android.okhttp.HttpUrl$Builder$ParseResult;
 [Lcom.android.okhttp.Protocol;
 [Lcom.android.okhttp.TlsVersion;
 [Lcom.android.org.bouncycastle.asn1.ASN1ObjectIdentifier;
+[Lcom.android.org.conscrypt.OpenSSLSignature$EngineType;
 [Lcom.android.org.conscrypt.OpenSSLX509CertPath$Encoding;
 [Lcom.android.org.conscrypt.OpenSSLX509Certificate;
 [Lcom.android.org.conscrypt.ct.CTLogInfo;
@@ -177,7 +202,6 @@
 [Ljava.io.IOException;
 [Ljava.io.ObjectInputStream$HandleTable$HandleList;
 [Ljava.io.ObjectStreamField;
-[Ljava.lang.Boolean;
 [Ljava.lang.Byte;
 [Ljava.lang.CharSequence;
 [Ljava.lang.Character$UnicodeBlock;
@@ -213,6 +237,7 @@
 [Ljava.math.RoundingMode;
 [Ljava.net.InetAddress;
 [Ljava.net.Proxy$Type;
+[Ljava.nio.ByteBuffer;
 [Ljava.nio.file.attribute.FileAttribute;
 [Ljava.security.CryptoPrimitive;
 [Ljava.security.Provider;
@@ -239,6 +264,12 @@
 [Ljava.util.concurrent.TimeUnit;
 [Ljava.util.logging.Handler;
 [Ljava.util.regex.Pattern;
+[Ljava.util.stream.StreamOpFlag$Type;
+[Ljava.util.stream.StreamOpFlag;
+[Ljava.util.stream.StreamShape;
+[Ljavax.crypto.Cipher$InitType;
+[Ljavax.crypto.Cipher$NeedToSet;
+[Ljavax.microedition.khronos.egl.EGLConfig;
 [Ljavax.net.ssl.KeyManager;
 [Ljavax.net.ssl.TrustManager;
 [Ljavax.security.cert.X509Certificate;
@@ -249,6 +280,7 @@
 [Lorg.apache.http.Header;
 [Lorg.json.JSONStringer$Scope;
 [Lorg.kxml2.io.KXmlParser$ValueContext;
+[Lsun.invoke.util.Wrapper;
 [Lsun.misc.FDBigInteger;
 [Lsun.misc.FormattedFloatingDecimal$Form;
 [Lsun.security.jca.ProviderConfig;
@@ -256,7 +288,7 @@
 [Lsun.security.pkcs.SignerInfo;
 [Lsun.security.util.DerOutputStream;
 [Lsun.security.util.DerValue;
-[Lsun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator;
+[Lsun.security.util.DisabledAlgorithmConstraints$Constraint$Operator;
 [Lsun.security.util.ObjectIdentifier;
 [Lsun.security.x509.AVA;
 [Lsun.security.x509.RDN;
@@ -270,18 +302,25 @@
 [[Ljava.lang.Object;
 [[Ljava.lang.String;
 [[Ljava.lang.annotation.Annotation;
-[[[I
 android.R$styleable
 android.accounts.Account
 android.accounts.Account$1
 android.accounts.AccountManager
 android.accounts.AccountManager$1
+android.accounts.AccountManager$19
+android.accounts.AccountManager$BaseFutureTask
+android.accounts.AccountManager$BaseFutureTask$1
+android.accounts.AccountManager$BaseFutureTask$Response
+android.accounts.AccountManager$Future2Task
+android.accounts.AccountManagerCallback
 android.accounts.AccountManagerFuture
 android.accounts.AccountsException
 android.accounts.AuthenticatorException
 android.accounts.IAccountManager
 android.accounts.IAccountManager$Stub
 android.accounts.IAccountManager$Stub$Proxy
+android.accounts.IAccountManagerResponse
+android.accounts.IAccountManagerResponse$Stub
 android.accounts.OnAccountsUpdateListener
 android.accounts.OperationCanceledException
 android.animation.AnimationHandler
@@ -303,7 +342,6 @@
 android.animation.AnimatorSet$Builder
 android.animation.AnimatorSet$Node
 android.animation.AnimatorSet$SeekState
-android.animation.ArgbEvaluator
 android.animation.FloatEvaluator
 android.animation.FloatKeyframeSet
 android.animation.IntEvaluator
@@ -311,7 +349,6 @@
 android.animation.Keyframe
 android.animation.Keyframe$FloatKeyframe
 android.animation.Keyframe$IntKeyframe
-android.animation.Keyframe$ObjectKeyframe
 android.animation.KeyframeSet
 android.animation.Keyframes
 android.animation.Keyframes$FloatKeyframes
@@ -335,17 +372,23 @@
 android.animation.TypeEvaluator
 android.animation.ValueAnimator
 android.animation.ValueAnimator$AnimatorUpdateListener
-android.app.-$Lambda$36$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$39$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$7$u_rp3dnwvfyMTggc6hVftcuYJ3E
-android.app.ActionBar
-android.app.ActionBar$LayoutParams
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU$1
+android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI$1
 android.app.Activity
 android.app.Activity$HostCallbacks
 android.app.ActivityManager
 android.app.ActivityManager$1
+android.app.ActivityManager$RecentTaskInfo
+android.app.ActivityManager$RecentTaskInfo$1
 android.app.ActivityManager$RunningAppProcessInfo
 android.app.ActivityManager$RunningAppProcessInfo$1
+android.app.ActivityManager$RunningServiceInfo
+android.app.ActivityManager$RunningServiceInfo$1
+android.app.ActivityManager$RunningTaskInfo
+android.app.ActivityManager$RunningTaskInfo$1
 android.app.ActivityManager$StackId
 android.app.ActivityManager$TaskDescription
 android.app.ActivityManager$TaskDescription$1
@@ -353,8 +396,8 @@
 android.app.ActivityThread
 android.app.ActivityThread$1
 android.app.ActivityThread$2
-android.app.ActivityThread$3
 android.app.ActivityThread$ActivityClientRecord
+android.app.ActivityThread$ActivityConfigChangeData
 android.app.ActivityThread$AppBindData
 android.app.ActivityThread$ApplicationThread
 android.app.ActivityThread$BindServiceData
@@ -374,38 +417,31 @@
 android.app.ActivityThread$StopInfo
 android.app.ActivityTransitionState
 android.app.AlertDialog
-android.app.AlertDialog$Builder
 android.app.AppGlobals
 android.app.AppOpsManager
+android.app.AppOpsManager$OnOpChangedListener
 android.app.Application
 android.app.Application$ActivityLifecycleCallbacks
 android.app.ApplicationErrorReport$CrashInfo
 android.app.ApplicationLoaders
 android.app.ApplicationPackageManager
+android.app.ApplicationPackageManager$OnPermissionsChangeListenerDelegate
 android.app.ApplicationPackageManager$ResourceName
-android.app.BackStackRecord
-android.app.BackStackRecord$Op
 android.app.ContentProviderHolder
 android.app.ContentProviderHolder$1
 android.app.ContextImpl
 android.app.ContextImpl$ApplicationContentResolver
+android.app.DexLoadReporter
 android.app.Dialog
 android.app.Dialog$ListenersHandler
-android.app.DialogFragment
 android.app.DownloadManager
 android.app.Fragment
-android.app.Fragment$1
 android.app.FragmentContainer
 android.app.FragmentController
 android.app.FragmentHostCallback
 android.app.FragmentManager
-android.app.FragmentManager$BackStackEntry
 android.app.FragmentManagerImpl
 android.app.FragmentManagerImpl$1
-android.app.FragmentManagerImpl$OpGenerator
-android.app.FragmentTransaction
-android.app.FragmentTransition
-android.app.FragmentTransition$FragmentContainerTransition
 android.app.IActivityManager
 android.app.IActivityManager$Stub
 android.app.IActivityManager$Stub$Proxy
@@ -426,14 +462,19 @@
 android.app.IUiModeManager
 android.app.IUiModeManager$Stub
 android.app.IUiModeManager$Stub$Proxy
+android.app.IUserSwitchObserver
+android.app.IUserSwitchObserver$Stub
+android.app.IWallpaperManager
+android.app.IWallpaperManager$Stub
+android.app.IWallpaperManagerCallback
+android.app.IWallpaperManagerCallback$Stub
 android.app.Instrumentation
 android.app.IntentReceiverLeaked
 android.app.IntentService
 android.app.IntentService$ServiceHandler
+android.app.JobSchedulerImpl
 android.app.KeyguardManager
-android.app.ListActivity
 android.app.LoadedApk
-android.app.LoadedApk$DexLoadReporter
 android.app.LoadedApk$ReceiverDispatcher
 android.app.LoadedApk$ReceiverDispatcher$Args
 android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
@@ -447,10 +488,24 @@
 android.app.LoaderManagerImpl
 android.app.NativeActivity
 android.app.Notification
+android.app.Notification$1
 android.app.Notification$Action
+android.app.Notification$Action$1
+android.app.Notification$BigPictureStyle
 android.app.Notification$BigTextStyle
 android.app.Notification$Builder
+android.app.Notification$BuilderRemoteViews
+android.app.Notification$DecoratedCustomViewStyle
+android.app.Notification$DecoratedMediaCustomViewStyle
+android.app.Notification$InboxStyle
+android.app.Notification$MediaStyle
+android.app.Notification$MessagingStyle
+android.app.Notification$StandardTemplateParams
 android.app.Notification$Style
+android.app.NotificationChannel
+android.app.NotificationChannel$1
+android.app.NotificationChannelGroup
+android.app.NotificationChannelGroup$1
 android.app.NotificationManager
 android.app.PendingIntent
 android.app.PendingIntent$1
@@ -459,6 +514,7 @@
 android.app.QueuedWork
 android.app.QueuedWork$QueuedWorkHandler
 android.app.ReceiverRestrictedContext
+android.app.RemoteInput
 android.app.ResourcesManager
 android.app.ResourcesManager$1
 android.app.ResourcesManager$ActivityResources
@@ -466,6 +522,8 @@
 android.app.ResultInfo$1
 android.app.Service
 android.app.ServiceConnectionLeaked
+android.app.ServiceStartArgs
+android.app.ServiceStartArgs$1
 android.app.SharedElementCallback
 android.app.SharedElementCallback$1
 android.app.SharedPreferencesImpl
@@ -555,12 +613,17 @@
 android.app.SystemServiceRegistry$78
 android.app.SystemServiceRegistry$79
 android.app.SystemServiceRegistry$8
+android.app.SystemServiceRegistry$80
+android.app.SystemServiceRegistry$81
+android.app.SystemServiceRegistry$82
 android.app.SystemServiceRegistry$9
 android.app.SystemServiceRegistry$CachedServiceFetcher
 android.app.SystemServiceRegistry$ServiceFetcher
 android.app.SystemServiceRegistry$StaticApplicationContextServiceFetcher
 android.app.SystemServiceRegistry$StaticServiceFetcher
 android.app.UiModeManager
+android.app.UserSwitchObserver
+android.app.VrManager
 android.app.WallpaperManager
 android.app.admin.DevicePolicyManager
 android.app.admin.IDevicePolicyManager
@@ -569,6 +632,7 @@
 android.app.admin.SecurityLog
 android.app.admin.SecurityLog$SecurityEvent
 android.app.admin.SecurityLog$SecurityEvent$1
+android.app.backup.BackupAgent
 android.app.backup.BackupDataInput
 android.app.backup.BackupDataInput$EntityHeader
 android.app.backup.BackupDataOutput
@@ -578,33 +642,82 @@
 android.app.backup.FileBackupHelperBase
 android.app.backup.FullBackup
 android.app.backup.FullBackupDataOutput
+android.app.backup.IBackupManager
+android.app.backup.IBackupManager$Stub
+android.app.backup.IBackupManager$Stub$Proxy
+android.app.job.IJobCallback
+android.app.job.IJobCallback$Stub
+android.app.job.IJobCallback$Stub$Proxy
+android.app.job.IJobScheduler
+android.app.job.IJobScheduler$Stub
+android.app.job.IJobScheduler$Stub$Proxy
+android.app.job.IJobService
+android.app.job.IJobService$Stub
 android.app.job.JobInfo
+android.app.job.JobInfo$1
+android.app.job.JobInfo$Builder
+android.app.job.JobInfo$TriggerContentUri
+android.app.job.JobInfo$TriggerContentUri$1
+android.app.job.JobParameters
+android.app.job.JobParameters$1
 android.app.job.JobScheduler
 android.app.job.JobService
+android.app.job.JobService$1
+android.app.job.JobServiceEngine
+android.app.job.JobServiceEngine$JobHandler
+android.app.job.JobServiceEngine$JobInterface
 android.app.trust.ITrustManager
 android.app.trust.ITrustManager$Stub
 android.app.trust.ITrustManager$Stub$Proxy
 android.app.trust.TrustManager
+android.app.usage.IUsageStatsManager
+android.app.usage.IUsageStatsManager$Stub
 android.app.usage.NetworkStatsManager
 android.app.usage.StorageStatsManager
+android.app.usage.UsageEvents
+android.app.usage.UsageEvents$1
 android.app.usage.UsageStatsManager
 android.appwidget.AppWidgetManager
+android.appwidget.AppWidgetProvider
+android.bluetooth.BluetoothActivityEnergyInfo
 android.bluetooth.BluetoothAdapter
 android.bluetooth.BluetoothAdapter$1
+android.bluetooth.BluetoothDevice
+android.bluetooth.BluetoothDevice$1
+android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothHeadset
+android.bluetooth.BluetoothHeadset$1
+android.bluetooth.BluetoothHeadset$2
+android.bluetooth.BluetoothHeadset$3
 android.bluetooth.BluetoothManager
+android.bluetooth.BluetoothProfile
+android.bluetooth.BluetoothProfile$ServiceListener
 android.bluetooth.IBluetooth
 android.bluetooth.IBluetooth$Stub
 android.bluetooth.IBluetooth$Stub$Proxy
+android.bluetooth.IBluetoothA2dp
+android.bluetooth.IBluetoothA2dp$Stub
+android.bluetooth.IBluetoothGatt
+android.bluetooth.IBluetoothGatt$Stub
+android.bluetooth.IBluetoothHeadset
+android.bluetooth.IBluetoothHeadset$Stub
+android.bluetooth.IBluetoothHeadset$Stub$Proxy
 android.bluetooth.IBluetoothManager
 android.bluetooth.IBluetoothManager$Stub
 android.bluetooth.IBluetoothManager$Stub$Proxy
 android.bluetooth.IBluetoothManagerCallback
 android.bluetooth.IBluetoothManagerCallback$Stub
+android.bluetooth.IBluetoothProfileServiceConnection
+android.bluetooth.IBluetoothProfileServiceConnection$Stub
+android.bluetooth.IBluetoothStateChangeCallback
+android.bluetooth.IBluetoothStateChangeCallback$Stub
+android.companion.CompanionDeviceManager
+android.content.AbstractThreadedSyncAdapter
+android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
 android.content.ActivityNotFoundException
 android.content.BroadcastReceiver
 android.content.BroadcastReceiver$PendingResult
 android.content.BroadcastReceiver$PendingResult$1
-android.content.ClipData
 android.content.ClipboardManager
 android.content.ComponentCallbacks
 android.content.ComponentCallbacks2
@@ -614,12 +727,10 @@
 android.content.ContentProvider$Transport
 android.content.ContentProviderClient
 android.content.ContentProviderNative
-android.content.ContentProviderOperation
 android.content.ContentProviderProxy
 android.content.ContentProviderResult
 android.content.ContentResolver
 android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$ParcelFileDescriptorInner
 android.content.ContentUris
 android.content.ContentValues
 android.content.ContentValues$1
@@ -638,8 +749,13 @@
 android.content.IIntentSender
 android.content.IIntentSender$Stub
 android.content.IIntentSender$Stub$Proxy
+android.content.ISyncAdapter
+android.content.ISyncAdapter$Stub
+android.content.ISyncContext
+android.content.ISyncContext$Stub
 android.content.Intent
 android.content.Intent$1
+android.content.Intent$FilterComparison
 android.content.IntentFilter
 android.content.IntentFilter$1
 android.content.IntentFilter$MalformedMimeTypeException
@@ -651,6 +767,10 @@
 android.content.SharedPreferences
 android.content.SharedPreferences$Editor
 android.content.SharedPreferences$OnSharedPreferenceChangeListener
+android.content.SyncResult
+android.content.SyncResult$1
+android.content.SyncStats
+android.content.SyncStats$1
 android.content.UndoManager
 android.content.UndoOwner
 android.content.UriMatcher
@@ -658,6 +778,7 @@
 android.content.pm.ActivityInfo$1
 android.content.pm.ApplicationInfo
 android.content.pm.ApplicationInfo$1
+android.content.pm.BaseParceledListSlice
 android.content.pm.ComponentInfo
 android.content.pm.ConfigurationInfo
 android.content.pm.ConfigurationInfo$1
@@ -665,19 +786,24 @@
 android.content.pm.FeatureGroupInfo$1
 android.content.pm.FeatureInfo
 android.content.pm.FeatureInfo$1
+android.content.pm.IOnPermissionsChangeListener
+android.content.pm.IOnPermissionsChangeListener$Stub
+android.content.pm.IPackageInstaller
+android.content.pm.IPackageInstaller$Stub
 android.content.pm.IPackageManager
 android.content.pm.IPackageManager$Stub
 android.content.pm.IPackageManager$Stub$Proxy
+android.content.pm.IShortcutService
+android.content.pm.IShortcutService$Stub
 android.content.pm.InstrumentationInfo
 android.content.pm.InstrumentationInfo$1
 android.content.pm.LauncherApps
 android.content.pm.PackageInfo
 android.content.pm.PackageInfo$1
-android.content.pm.PackageInstaller
-android.content.pm.PackageInstaller$SessionInfo
 android.content.pm.PackageItemInfo
 android.content.pm.PackageManager
 android.content.pm.PackageManager$NameNotFoundException
+android.content.pm.PackageManager$OnPermissionsChangedListener
 android.content.pm.PackageParser$PackageParserException
 android.content.pm.ParceledListSlice
 android.content.pm.ParceledListSlice$1
@@ -691,6 +817,8 @@
 android.content.pm.ResolveInfo$1
 android.content.pm.ServiceInfo
 android.content.pm.ServiceInfo$1
+android.content.pm.ShortcutInfo
+android.content.pm.ShortcutInfo$1
 android.content.pm.ShortcutManager
 android.content.pm.Signature
 android.content.pm.Signature$1
@@ -703,6 +831,7 @@
 android.content.res.ColorStateList
 android.content.res.ColorStateList$1
 android.content.res.ColorStateList$ColorStateListFactory
+android.content.res.CompatResources
 android.content.res.CompatibilityInfo
 android.content.res.CompatibilityInfo$1
 android.content.res.CompatibilityInfo$2
@@ -764,6 +893,7 @@
 android.database.Observable
 android.database.SQLException
 android.database.sqlite.DatabaseObjectNotClosedException
+android.database.sqlite.SQLiteCantOpenDatabaseException
 android.database.sqlite.SQLiteClosable
 android.database.sqlite.SQLiteConnection
 android.database.sqlite.SQLiteConnection$Operation
@@ -778,13 +908,13 @@
 android.database.sqlite.SQLiteCustomFunction
 android.database.sqlite.SQLiteDatabase
 android.database.sqlite.SQLiteDatabase$1
-android.database.sqlite.SQLiteDatabase$CursorFactory
 android.database.sqlite.SQLiteDatabaseConfiguration
 android.database.sqlite.SQLiteDatabaseCorruptException
 android.database.sqlite.SQLiteDatabaseLockedException
 android.database.sqlite.SQLiteDebug
 android.database.sqlite.SQLiteDebug$PagerStats
 android.database.sqlite.SQLiteDirectCursorDriver
+android.database.sqlite.SQLiteDoneException
 android.database.sqlite.SQLiteException
 android.database.sqlite.SQLiteGlobal
 android.database.sqlite.SQLiteOpenHelper
@@ -795,6 +925,7 @@
 android.database.sqlite.SQLiteSession$Transaction
 android.database.sqlite.SQLiteStatement
 android.database.sqlite.SQLiteStatementInfo
+android.database.sqlite.SQLiteTransactionListener
 android.ddm.DdmHandleAppName
 android.ddm.DdmHandleExit
 android.ddm.DdmHandleHeap
@@ -804,6 +935,13 @@
 android.ddm.DdmHandleThread
 android.ddm.DdmHandleViewDebug
 android.ddm.DdmRegister
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$1
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$2
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$4
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$6
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$7
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$8
 android.graphics.BaseCanvas
 android.graphics.Bitmap
 android.graphics.Bitmap$1
@@ -822,6 +960,13 @@
 android.graphics.Color
 android.graphics.ColorFilter
 android.graphics.ColorMatrixColorFilter
+android.graphics.ColorSpace
+android.graphics.ColorSpace$Lab
+android.graphics.ColorSpace$Model
+android.graphics.ColorSpace$Named
+android.graphics.ColorSpace$Rgb
+android.graphics.ColorSpace$Rgb$TransferParameters
+android.graphics.ColorSpace$Xyz
 android.graphics.ComposePathEffect
 android.graphics.ComposeShader
 android.graphics.CornerPathEffect
@@ -863,7 +1008,6 @@
 android.graphics.PathEffect
 android.graphics.PathMeasure
 android.graphics.Picture
-android.graphics.PixelFormat
 android.graphics.Point
 android.graphics.Point$1
 android.graphics.PointF
@@ -891,6 +1035,7 @@
 android.graphics.Typeface
 android.graphics.Xfermode
 android.graphics.YuvImage
+android.graphics.drawable.AdaptiveIconDrawable
 android.graphics.drawable.Animatable
 android.graphics.drawable.Animatable2
 android.graphics.drawable.AnimatedStateListDrawable
@@ -923,6 +1068,7 @@
 android.graphics.drawable.Icon$1
 android.graphics.drawable.InsetDrawable
 android.graphics.drawable.InsetDrawable$InsetState
+android.graphics.drawable.InsetDrawable$InsetValue
 android.graphics.drawable.LayerDrawable
 android.graphics.drawable.LayerDrawable$ChildDrawable
 android.graphics.drawable.LayerDrawable$LayerState
@@ -948,6 +1094,7 @@
 android.graphics.drawable.StateListDrawable
 android.graphics.drawable.StateListDrawable$StateListState
 android.graphics.drawable.TransitionDrawable
+android.graphics.drawable.TransitionDrawable$TransitionState
 android.graphics.drawable.VectorDrawable
 android.graphics.drawable.VectorDrawable$VFullPath
 android.graphics.drawable.VectorDrawable$VFullPath$1
@@ -978,6 +1125,7 @@
 android.graphics.drawable.shapes.OvalShape
 android.graphics.drawable.shapes.RectShape
 android.graphics.drawable.shapes.Shape
+android.graphics.fonts.FontVariationAxis
 android.graphics.pdf.PdfDocument
 android.graphics.pdf.PdfEditor
 android.graphics.pdf.PdfRenderer
@@ -987,6 +1135,9 @@
 android.hardware.ConsumerIrManager
 android.hardware.HardwareBuffer
 android.hardware.HardwareBuffer$1
+android.hardware.ICameraService
+android.hardware.ICameraService$Stub
+android.hardware.ICameraService$Stub$Proxy
 android.hardware.Sensor
 android.hardware.SensorEvent
 android.hardware.SensorEventListener
@@ -995,14 +1146,88 @@
 android.hardware.SerialPort
 android.hardware.SystemSensorManager
 android.hardware.SystemSensorManager$BaseEventQueue
+android.hardware.SystemSensorManager$SensorEventQueue
+android.hardware.camera2.CameraAccessException
+android.hardware.camera2.CameraCharacteristics
+android.hardware.camera2.CameraCharacteristics$1
+android.hardware.camera2.CameraCharacteristics$2
+android.hardware.camera2.CameraCharacteristics$3
+android.hardware.camera2.CameraCharacteristics$4
+android.hardware.camera2.CameraCharacteristics$5
 android.hardware.camera2.CameraCharacteristics$Key
 android.hardware.camera2.CameraManager
+android.hardware.camera2.CameraMetadata
+android.hardware.camera2.CaptureRequest
+android.hardware.camera2.CaptureRequest$1
+android.hardware.camera2.CaptureRequest$2
 android.hardware.camera2.CaptureRequest$Key
+android.hardware.camera2.CaptureResult
+android.hardware.camera2.CaptureResult$1
+android.hardware.camera2.CaptureResult$2
+android.hardware.camera2.CaptureResult$3
 android.hardware.camera2.CaptureResult$Key
 android.hardware.camera2.DngCreator
 android.hardware.camera2.impl.CameraMetadataNative
+android.hardware.camera2.impl.CameraMetadataNative$1
+android.hardware.camera2.impl.CameraMetadataNative$10
+android.hardware.camera2.impl.CameraMetadataNative$11
+android.hardware.camera2.impl.CameraMetadataNative$12
+android.hardware.camera2.impl.CameraMetadataNative$13
+android.hardware.camera2.impl.CameraMetadataNative$14
+android.hardware.camera2.impl.CameraMetadataNative$15
+android.hardware.camera2.impl.CameraMetadataNative$16
+android.hardware.camera2.impl.CameraMetadataNative$17
+android.hardware.camera2.impl.CameraMetadataNative$18
+android.hardware.camera2.impl.CameraMetadataNative$19
+android.hardware.camera2.impl.CameraMetadataNative$2
+android.hardware.camera2.impl.CameraMetadataNative$3
+android.hardware.camera2.impl.CameraMetadataNative$4
+android.hardware.camera2.impl.CameraMetadataNative$5
+android.hardware.camera2.impl.CameraMetadataNative$6
+android.hardware.camera2.impl.CameraMetadataNative$7
+android.hardware.camera2.impl.CameraMetadataNative$8
+android.hardware.camera2.impl.CameraMetadataNative$9
+android.hardware.camera2.impl.CameraMetadataNative$Key
+android.hardware.camera2.impl.GetCommand
+android.hardware.camera2.impl.SetCommand
 android.hardware.camera2.legacy.LegacyCameraDevice
 android.hardware.camera2.legacy.PerfMeasurement
+android.hardware.camera2.marshal.MarshalQueryable
+android.hardware.camera2.marshal.MarshalRegistry
+android.hardware.camera2.marshal.impl.MarshalQueryableArray
+android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern
+android.hardware.camera2.marshal.impl.MarshalQueryableBoolean
+android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform
+android.hardware.camera2.marshal.impl.MarshalQueryableEnum
+android.hardware.camera2.marshal.impl.MarshalQueryableHighSpeedVideoConfiguration
+android.hardware.camera2.marshal.impl.MarshalQueryableMeteringRectangle
+android.hardware.camera2.marshal.impl.MarshalQueryableNativeByteToInteger
+android.hardware.camera2.marshal.impl.MarshalQueryablePair
+android.hardware.camera2.marshal.impl.MarshalQueryableParcelable
+android.hardware.camera2.marshal.impl.MarshalQueryablePrimitive
+android.hardware.camera2.marshal.impl.MarshalQueryableRange
+android.hardware.camera2.marshal.impl.MarshalQueryableRect
+android.hardware.camera2.marshal.impl.MarshalQueryableReprocessFormatsMap
+android.hardware.camera2.marshal.impl.MarshalQueryableRggbChannelVector
+android.hardware.camera2.marshal.impl.MarshalQueryableSize
+android.hardware.camera2.marshal.impl.MarshalQueryableSizeF
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration
+android.hardware.camera2.marshal.impl.MarshalQueryableString
+android.hardware.camera2.params.BlackLevelPattern
+android.hardware.camera2.params.ColorSpaceTransform
+android.hardware.camera2.params.Face
+android.hardware.camera2.params.HighSpeedVideoConfiguration
+android.hardware.camera2.params.LensShadingMap
+android.hardware.camera2.params.MeteringRectangle
+android.hardware.camera2.params.ReprocessFormatsMap
+android.hardware.camera2.params.RggbChannelVector
+android.hardware.camera2.params.StreamConfiguration
+android.hardware.camera2.params.StreamConfigurationDuration
+android.hardware.camera2.params.StreamConfigurationMap
+android.hardware.camera2.params.TonemapCurve
+android.hardware.camera2.utils.TypeReference
+android.hardware.camera2.utils.TypeReference$SpecializedTypeReference
 android.hardware.display.DisplayManager
 android.hardware.display.DisplayManager$DisplayListener
 android.hardware.display.DisplayManagerGlobal
@@ -1083,8 +1308,8 @@
 android.icu.impl.CacheValue$NullValue
 android.icu.impl.CacheValue$SoftValue
 android.icu.impl.CacheValue$Strength
-android.icu.impl.CalendarUtil
-android.icu.impl.CalendarUtil$CalendarPreferences
+android.icu.impl.CaseMapImpl
+android.icu.impl.CaseMapImpl$StringContextIterator
 android.icu.impl.CharTrie
 android.icu.impl.ClassLoaderUtil
 android.icu.impl.CurrencyData
@@ -1130,7 +1355,6 @@
 android.icu.impl.ICUResourceBundleImpl$ResourceArray
 android.icu.impl.ICUResourceBundleImpl$ResourceContainer
 android.icu.impl.ICUResourceBundleImpl$ResourceInt
-android.icu.impl.ICUResourceBundleImpl$ResourceIntVector
 android.icu.impl.ICUResourceBundleImpl$ResourceString
 android.icu.impl.ICUResourceBundleImpl$ResourceTable
 android.icu.impl.ICUResourceBundleReader
@@ -1172,7 +1396,6 @@
 android.icu.impl.ReplaceableUCharacterIterator
 android.icu.impl.RuleCharacterIterator
 android.icu.impl.SimpleCache
-android.icu.impl.SimpleFormatterImpl
 android.icu.impl.SoftCache
 android.icu.impl.StandardPlural
 android.icu.impl.StringPrepDataReader
@@ -1189,6 +1412,9 @@
 android.icu.impl.Trie2_16
 android.icu.impl.UBiDiProps
 android.icu.impl.UBiDiProps$IsAcceptable
+android.icu.impl.UCaseProps
+android.icu.impl.UCaseProps$ContextIterator
+android.icu.impl.UCaseProps$IsAcceptable
 android.icu.impl.UCharacterProperty
 android.icu.impl.UCharacterProperty$1
 android.icu.impl.UCharacterProperty$10
@@ -1246,15 +1472,12 @@
 android.icu.text.BreakIteratorFactory
 android.icu.text.BreakIteratorFactory$BFService
 android.icu.text.BreakIteratorFactory$BFService$1RBBreakIteratorFactory
+android.icu.text.CaseMap
+android.icu.text.CaseMap$Upper
 android.icu.text.CurrencyDisplayNames
 android.icu.text.CurrencyMetaInfo
 android.icu.text.CurrencyMetaInfo$CurrencyDigits
 android.icu.text.CurrencyMetaInfo$CurrencyFilter
-android.icu.text.DateFormatSymbols
-android.icu.text.DateFormatSymbols$1
-android.icu.text.DateFormatSymbols$CalendarDataSink
-android.icu.text.DateFormatSymbols$CalendarDataSink$AliasType
-android.icu.text.DateFormatSymbols$CapitalizationContextUsage
 android.icu.text.DecimalFormat
 android.icu.text.DecimalFormat$Unit
 android.icu.text.DecimalFormatSymbols
@@ -1322,7 +1545,6 @@
 android.icu.text.UnicodeFilter
 android.icu.text.UnicodeMatcher
 android.icu.text.UnicodeSet
-android.icu.util.BytesTrie$Result
 android.icu.util.Currency
 android.icu.util.Currency$1
 android.icu.util.Currency$CurrencyUsage
@@ -1344,14 +1566,30 @@
 android.icu.util.ULocale$Type
 android.icu.util.UResourceBundle
 android.icu.util.UResourceBundle$RootType
-android.icu.util.UResourceBundleIterator
 android.icu.util.UResourceTypeMismatchException
 android.icu.util.VersionInfo
+android.location.BatchedLocationCallbackTransport
+android.location.BatchedLocationCallbackTransport$CallbackTransport
 android.location.CountryDetector
+android.location.GnssMeasurementCallbackTransport
+android.location.GnssMeasurementCallbackTransport$ListenerTransport
+android.location.GnssNavigationMessageCallbackTransport
+android.location.GnssNavigationMessageCallbackTransport$ListenerTransport
+android.location.IBatchedLocationCallback
+android.location.IBatchedLocationCallback$Stub
+android.location.IGnssMeasurementsListener
+android.location.IGnssMeasurementsListener$Stub
+android.location.IGnssNavigationMessageListener
+android.location.IGnssNavigationMessageListener$Stub
+android.location.ILocationManager
+android.location.ILocationManager$Stub
+android.location.ILocationManager$Stub$Proxy
+android.location.LocalListenerHelper
 android.location.Location
-android.location.Location$1
-android.location.Location$2
+android.location.LocationListener
 android.location.LocationManager
+android.location.LocationRequest
+android.location.LocationRequest$1
 android.media.AudioAttributes
 android.media.AudioAttributes$1
 android.media.AudioAttributes$Builder
@@ -1396,6 +1634,8 @@
 android.media.IPlayer$Stub
 android.media.IRecordingConfigDispatcher
 android.media.IRecordingConfigDispatcher$Stub
+android.media.IRingtonePlayer
+android.media.IRingtonePlayer$Stub
 android.media.Image
 android.media.ImageReader
 android.media.ImageReader$SurfaceImage
@@ -1403,11 +1643,9 @@
 android.media.ImageWriter$WriterSurfaceImage
 android.media.JetPlayer
 android.media.MediaCodec
-android.media.MediaCodecInfo
-android.media.MediaCodecInfo$CodecCapabilities
-android.media.MediaCodecInfo$CodecProfileLevel
 android.media.MediaCodecList
 android.media.MediaCrypto
+android.media.MediaDescrambler
 android.media.MediaDrm
 android.media.MediaExtractor
 android.media.MediaFormat
@@ -1415,7 +1653,6 @@
 android.media.MediaMetadataRetriever
 android.media.MediaMuxer
 android.media.MediaPlayer
-android.media.MediaPlayer$OnCompletionListener
 android.media.MediaRecorder
 android.media.MediaRouter
 android.media.MediaScanner
@@ -1423,23 +1660,49 @@
 android.media.PlaybackParams
 android.media.PlaybackParams$1
 android.media.PlayerBase
-android.media.PlayerBase$1
-android.media.PlayerBase$2
+android.media.PlayerBase$IAppOpsCallbackWrapper
+android.media.PlayerBase$IPlayerWrapper
 android.media.PlayerBase$PlayerIdCard
 android.media.PlayerBase$PlayerIdCard$1
 android.media.RemoteDisplay
 android.media.ResampleInputStream
+android.media.SoundPool
 android.media.SubtitleController$Listener
 android.media.ToneGenerator
+android.media.VolumeAutomation
+android.media.VolumeShaper$Configuration
+android.media.VolumeShaper$Configuration$1
+android.media.VolumeShaper$Configuration$Builder
+android.media.VolumeShaper$Operation
+android.media.VolumeShaper$Operation$1
+android.media.VolumeShaper$Operation$Builder
+android.media.VolumeShaper$State
+android.media.VolumeShaper$State$1
 android.media.audiopolicy.AudioMix
 android.media.audiopolicy.AudioMixingRule
 android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
 android.media.midi.MidiManager
 android.media.projection.MediaProjectionManager
+android.media.session.IActiveSessionsListener
+android.media.session.IActiveSessionsListener$Stub
+android.media.session.ISessionController
+android.media.session.ISessionController$Stub
+android.media.session.ISessionControllerCallback
+android.media.session.ISessionControllerCallback$Stub
+android.media.session.ISessionManager
+android.media.session.ISessionManager$Stub
+android.media.session.MediaController
+android.media.session.MediaController$CallbackStub
+android.media.session.MediaController$TransportControls
+android.media.session.MediaSession$Token
+android.media.session.MediaSession$Token$1
 android.media.session.MediaSessionManager
+android.media.session.PlaybackState
+android.media.session.PlaybackState$1
+android.media.session.PlaybackState$CustomAction
+android.media.session.PlaybackState$CustomAction$1
 android.media.soundtrigger.SoundTriggerManager
 android.media.tv.TvInputManager
-android.metrics.LogMaker
 android.mtp.MtpDatabase
 android.mtp.MtpDevice
 android.mtp.MtpDeviceInfo
@@ -1454,21 +1717,36 @@
 android.net.ConnectivityManager$CallbackHandler
 android.net.ConnectivityManager$NetworkCallback
 android.net.ConnectivityThread
-# Must not be initialized, creates a thread.
-# android.net.ConnectivityThread$Singleton
 android.net.Credentials
+android.net.DhcpInfo
+android.net.DhcpInfo$1
 android.net.EthernetManager
 android.net.IConnectivityManager
 android.net.IConnectivityManager$Stub
 android.net.IConnectivityManager$Stub$Proxy
+android.net.INetworkPolicyManager
+android.net.INetworkPolicyManager$Stub
+android.net.INetworkScoreService
+android.net.INetworkScoreService$Stub
+android.net.INetworkScoreService$Stub$Proxy
+android.net.INetworkStatsService
+android.net.INetworkStatsService$Stub
+android.net.INetworkStatsService$Stub$Proxy
+android.net.IpConfiguration
+android.net.IpConfiguration$1
+android.net.IpConfiguration$IpAssignment
+android.net.IpConfiguration$ProxySettings
 android.net.IpPrefix
 android.net.IpPrefix$1
+android.net.IpSecManager
 android.net.LinkAddress
 android.net.LinkAddress$1
 android.net.LinkProperties
 android.net.LinkProperties$1
 android.net.LocalServerSocket
 android.net.LocalSocket
+android.net.LocalSocketAddress
+android.net.LocalSocketAddress$Namespace
 android.net.LocalSocketImpl
 android.net.LocalSocketImpl$SocketInputStream
 android.net.LocalSocketImpl$SocketOutputStream
@@ -1476,16 +1754,20 @@
 android.net.Network$1
 android.net.NetworkCapabilities
 android.net.NetworkCapabilities$1
+android.net.NetworkFactory
 android.net.NetworkInfo
 android.net.NetworkInfo$1
 android.net.NetworkInfo$DetailedState
 android.net.NetworkInfo$State
+android.net.NetworkKey
+android.net.NetworkKey$1
 android.net.NetworkPolicyManager
 android.net.NetworkRequest
 android.net.NetworkRequest$1
 android.net.NetworkRequest$Builder
 android.net.NetworkRequest$Type
 android.net.NetworkScoreManager
+android.net.NetworkSpecifier
 android.net.NetworkStats
 android.net.NetworkStats$1
 android.net.NetworkUtils
@@ -1493,6 +1775,14 @@
 android.net.ProxyInfo
 android.net.RouteInfo
 android.net.RouteInfo$1
+android.net.RssiCurve
+android.net.RssiCurve$1
+android.net.SSLCertificateSocketFactory
+android.net.SSLCertificateSocketFactory$1
+android.net.SSLSessionCache
+android.net.ScoredNetwork
+android.net.ScoredNetwork$1
+android.net.StaticIpConfiguration
 android.net.TrafficStats
 android.net.Uri
 android.net.Uri$1
@@ -1507,23 +1797,33 @@
 android.net.Uri$PathSegments
 android.net.Uri$PathSegmentsBuilder
 android.net.Uri$StringUri
+android.net.WifiKey
+android.net.WifiKey$1
 android.net.nsd.NsdManager
 android.net.wifi.IWifiManager
 android.net.wifi.IWifiManager$Stub
 android.net.wifi.IWifiManager$Stub$Proxy
+android.net.wifi.ParcelUtil
 android.net.wifi.RttManager
+android.net.wifi.ScanResult
+android.net.wifi.ScanResult$1
+android.net.wifi.ScanResult$InformationElement
 android.net.wifi.SupplicantState
 android.net.wifi.SupplicantState$1
+android.net.wifi.WifiConfiguration
+android.net.wifi.WifiConfiguration$1
+android.net.wifi.WifiConfiguration$NetworkSelectionStatus
+android.net.wifi.WifiEnterpriseConfig
+android.net.wifi.WifiEnterpriseConfig$1
 android.net.wifi.WifiInfo
 android.net.wifi.WifiInfo$1
 android.net.wifi.WifiManager
+android.net.wifi.WifiManager$WifiLock
 android.net.wifi.WifiScanner
 android.net.wifi.WifiSsid
 android.net.wifi.WifiSsid$1
 android.net.wifi.aware.WifiAwareManager
 android.net.wifi.p2p.WifiP2pManager
-android.nfc.INfcAdapter
-android.nfc.INfcAdapter$Stub
 android.nfc.NfcManager
 android.opengl.EGL14
 android.opengl.EGLConfig
@@ -1545,7 +1845,8 @@
 android.opengl.GLUtils
 android.opengl.Matrix
 android.opengl.Visibility
-android.os.-$Lambda$5$6x30vPJhBKUfNY8tswxuZo3DCe0
+android.os.-$Lambda$6x30vPJhBKUfNY8tswxuZo3DCe0
+android.os.AsyncResult
 android.os.AsyncTask$1
 android.os.AsyncTask$2
 android.os.AsyncTask$3
@@ -1590,10 +1891,15 @@
 android.os.HwBlob
 android.os.HwParcel
 android.os.HwRemoteBinder
+android.os.IBatteryPropertiesRegistrar
+android.os.IBatteryPropertiesRegistrar$Stub
+android.os.IBatteryPropertiesRegistrar$Stub$Proxy
 android.os.IBinder
 android.os.IBinder$DeathRecipient
 android.os.ICancellationSignal
 android.os.ICancellationSignal$Stub
+android.os.IDeviceIdleController
+android.os.IDeviceIdleController$Stub
 android.os.IHwBinder
 android.os.IInterface
 android.os.IMessenger
@@ -1605,6 +1911,7 @@
 android.os.IPowerManager
 android.os.IPowerManager$Stub
 android.os.IPowerManager$Stub$Proxy
+android.os.IRemoteCallback
 android.os.IServiceManager
 android.os.IUserManager
 android.os.IUserManager$Stub
@@ -1627,12 +1934,12 @@
 android.os.Parcel$1
 android.os.ParcelFileDescriptor
 android.os.ParcelFileDescriptor$1
-android.os.ParcelFileDescriptor$AutoCloseInputStream
+android.os.ParcelUuid
+android.os.ParcelUuid$1
 android.os.Parcelable
 android.os.Parcelable$ClassLoaderCreator
 android.os.Parcelable$Creator
-android.os.ParcelableParcel
-android.os.ParcelableParcel$1
+android.os.ParcelableException
 android.os.PatternMatcher
 android.os.PatternMatcher$1
 android.os.PersistableBundle
@@ -1642,9 +1949,12 @@
 android.os.PowerManager$WakeLock$1
 android.os.Process
 android.os.RecoverySystem
+android.os.Registrant
+android.os.RemoteCallbackList
 android.os.RemoteException
 android.os.ResultReceiver
 android.os.SELinux
+android.os.Seccomp
 android.os.ServiceManager
 android.os.ServiceManager$ServiceNotFoundException
 android.os.ServiceManagerNative
@@ -1685,43 +1995,52 @@
 android.os.Trace
 android.os.Trace$1
 android.os.UEventObserver
+android.os.UpdateLock
 android.os.UserHandle
 android.os.UserHandle$1
 android.os.UserManager
 android.os.Vibrator
+android.os.VintfObject
+android.os.VintfRuntimeInfo
+android.os.WorkSource
+android.os.WorkSource$1
 android.os.ZygoteProcess
 android.os.ZygoteStartFailedEx
 android.os.health.SystemHealthManager
+android.os.storage.IObbActionListener
+android.os.storage.IObbActionListener$Stub
 android.os.storage.IStorageManager
 android.os.storage.IStorageManager$Stub
 android.os.storage.IStorageManager$Stub$Proxy
 android.os.storage.StorageManager
+android.os.storage.StorageManager$ObbActionListener
 android.os.storage.StorageVolume
 android.os.storage.StorageVolume$1
-android.preference.PreferenceActivity
-android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
 android.preference.PreferenceManager
-android.preference.PreferenceManager$OnPreferenceTreeClickListener
 android.print.PrintManager
-android.provider.-$Lambda$46$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$a7Jyr6j_Mb70hHJ2ssL1AAhKh4c
 android.provider.BaseColumns
+android.provider.CalendarContract$CalendarColumns
+android.provider.CalendarContract$CalendarSyncColumns
+android.provider.CalendarContract$EventsColumns
+android.provider.CalendarContract$SyncColumns
 android.provider.ContactsContract
 android.provider.ContactsContract$CommonDataKinds$BaseTypes
 android.provider.ContactsContract$CommonDataKinds$CommonColumns
-android.provider.ContactsContract$CommonDataKinds$Phone
 android.provider.ContactsContract$ContactCounts
 android.provider.ContactsContract$ContactNameColumns
 android.provider.ContactsContract$ContactOptionsColumns
 android.provider.ContactsContract$ContactStatusColumns
-android.provider.ContactsContract$Contacts
 android.provider.ContactsContract$ContactsColumns
-android.provider.ContactsContract$Data
 android.provider.ContactsContract$DataColumns
 android.provider.ContactsContract$DataColumnsWithJoins
 android.provider.ContactsContract$DataUsageStatColumns
 android.provider.ContactsContract$RawContactsColumns
 android.provider.ContactsContract$StatusColumns
-android.provider.MediaStore$MediaColumns
+android.provider.Downloads$Impl
+android.provider.FontsContract
+android.provider.FontsContract$1
 android.provider.Settings
 android.provider.Settings$ContentProviderHolder
 android.provider.Settings$GenerationTracker
@@ -1768,6 +2087,12 @@
 android.security.net.config.RootTrustManagerFactorySpi
 android.security.net.config.SystemCertificateSource
 android.security.net.config.TrustedCertificateStoreAdapter
+android.security.net.config.UserCertificateSource
+android.service.notification.StatusBarNotification
+android.service.oemlock.OemLockManager
+android.service.persistentdata.IPersistentDataBlockService
+android.service.persistentdata.IPersistentDataBlockService$Stub
+android.service.persistentdata.IPersistentDataBlockService$Stub$Proxy
 android.service.persistentdata.PersistentDataBlockManager
 android.system.ErrnoException
 android.system.GaiException
@@ -1791,11 +2116,30 @@
 android.system.UnixSocketAddress
 android.telecom.TelecomManager
 android.telephony.CarrierConfigManager
-android.telephony.PhoneNumberUtils
+android.telephony.CellIdentityWcdma
+android.telephony.CellIdentityWcdma$1
+android.telephony.CellInfo
+android.telephony.CellInfo$1
+android.telephony.CellInfoWcdma
+android.telephony.CellInfoWcdma$1
+android.telephony.CellLocation
+android.telephony.CellSignalStrength
+android.telephony.CellSignalStrengthWcdma
+android.telephony.CellSignalStrengthWcdma$1
 android.telephony.PhoneStateListener
+android.telephony.PhoneStateListener$1
+android.telephony.PhoneStateListener$IPhoneStateListenerStub
 android.telephony.Rlog
 android.telephony.ServiceState
+android.telephony.ServiceState$1
+android.telephony.SignalStrength
+android.telephony.SignalStrength$1
+android.telephony.SubscriptionInfo
+android.telephony.SubscriptionInfo$1
 android.telephony.SubscriptionManager
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener$1
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener$2
 android.telephony.TelephonyManager
 android.telephony.TelephonyManager$MultiSimVariants
 android.text.AndroidBidi
@@ -1808,20 +2152,13 @@
 android.text.Editable
 android.text.Editable$Factory
 android.text.FontConfig
-android.text.FontConfig$1
 android.text.FontConfig$Alias
-android.text.FontConfig$Alias$1
-android.text.FontConfig$Axis
-android.text.FontConfig$Axis$1
 android.text.FontConfig$Family
-android.text.FontConfig$Family$1
 android.text.FontConfig$Font
-android.text.FontConfig$Font$1
 android.text.GetChars
 android.text.GraphicsOperations
-android.text.Html
-android.text.Html$HtmlParser
 android.text.Hyphenator
+android.text.Hyphenator$HyphenationData
 android.text.InputFilter
 android.text.InputType
 android.text.Layout
@@ -1862,11 +2199,13 @@
 android.text.TextUtils
 android.text.TextUtils$1
 android.text.TextUtils$EllipsizeCallback
+android.text.TextUtils$SimpleStringSplitter
+android.text.TextUtils$StringSplitter
 android.text.TextUtils$TruncateAt
 android.text.TextWatcher
-android.text.format.DateFormat
-android.text.format.DateUtils
 android.text.format.Time
+android.text.format.Time$TimeCalculator
+android.text.format.TimeFormatter
 android.text.method.AllCapsTransformationMethod
 android.text.method.ArrowKeyMovementMethod
 android.text.method.BaseKeyListener
@@ -1887,9 +2226,7 @@
 android.text.method.TransformationMethod2
 android.text.style.AlignmentSpan
 android.text.style.CharacterStyle
-android.text.style.ClickableSpan
 android.text.style.EasyEditSpan
-android.text.style.ForegroundColorSpan
 android.text.style.LeadingMarginSpan
 android.text.style.LineBackgroundSpan
 android.text.style.LineHeightSpan
@@ -1900,7 +2237,6 @@
 android.text.style.StyleSpan
 android.text.style.SuggestionSpan
 android.text.style.TabStopSpan
-android.text.style.URLSpan
 android.text.style.UpdateAppearance
 android.text.style.UpdateLayout
 android.text.style.WrapTogetherSpan
@@ -1923,7 +2259,6 @@
 android.transition.PathMotion
 android.transition.Transition
 android.transition.Transition$1
-android.transition.Transition$EpicenterCallback
 android.transition.TransitionInflater
 android.transition.TransitionManager
 android.transition.TransitionSet
@@ -1935,6 +2270,7 @@
 android.util.ArrayMap$1
 android.util.ArraySet
 android.util.ArraySet$1
+android.util.AtomicFile
 android.util.AttributeSet
 android.util.Base64
 android.util.Base64$Coder
@@ -1951,6 +2287,7 @@
 android.util.Log
 android.util.Log$1
 android.util.Log$ImmediateLogWriter
+android.util.Log$TerribleFailure
 android.util.Log$TerribleFailureHandler
 android.util.LogPrinter
 android.util.LongArray
@@ -1959,16 +2296,20 @@
 android.util.LruCache
 android.util.MapCollections
 android.util.MapCollections$ArrayIterator
+android.util.MapCollections$EntrySet
 android.util.MapCollections$KeySet
+android.util.MapCollections$MapIterator
+android.util.MapCollections$ValuesCollection
 android.util.MathUtils
 android.util.MemoryIntArray
 android.util.MemoryIntArray$1
+android.util.MergedConfiguration
+android.util.MergedConfiguration$1
 android.util.MutableInt
 android.util.MutableLong
 android.util.Pair
 android.util.PathParser
 android.util.PathParser$PathData
-android.util.Patterns
 android.util.Pools$Pool
 android.util.Pools$SimplePool
 android.util.Pools$SynchronizedPool
@@ -1983,13 +2324,19 @@
 android.util.SparseArray
 android.util.SparseBooleanArray
 android.util.SparseIntArray
+android.util.SparseLongArray
 android.util.StateSet
 android.util.SuperNotCalledException
+android.util.TimeUtils
 android.util.TypedValue
 android.util.Xml
 android.util.jar.StrictJarFile
-android.view.-$Lambda$48$iU_USrtPm1XIm5H9QYQvXfBGDE4
-android.view.-$Lambda$49$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$1
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$2
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$3
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4$1
 android.view.AbsSavedState
 android.view.AbsSavedState$1
 android.view.AbsSavedState$2
@@ -2017,11 +2364,12 @@
 android.view.DisplayInfo
 android.view.DisplayInfo$1
 android.view.DisplayListCanvas
-android.view.DragEvent
 android.view.FallbackEventHandler
 android.view.FocusFinder
 android.view.FocusFinder$1
-android.view.FocusFinder$SequentialFocusComparator
+android.view.FocusFinder$FocusSorter
+android.view.FocusFinder$UserSpecifiedFocusComparator
+android.view.FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter
 android.view.FrameInfo
 android.view.FrameMetrics
 android.view.FrameMetricsObserver
@@ -2039,6 +2387,8 @@
 android.view.IGraphicsStats
 android.view.IGraphicsStats$Stub
 android.view.IGraphicsStats$Stub$Proxy
+android.view.IGraphicsStatsCallback
+android.view.IGraphicsStatsCallback$Stub
 android.view.IRotationWatcher
 android.view.IRotationWatcher$Stub
 android.view.IWindow
@@ -2067,7 +2417,6 @@
 android.view.KeyCharacterMap
 android.view.KeyCharacterMap$1
 android.view.KeyCharacterMap$FallbackAction
-android.view.KeyCharacterMap$KeyData
 android.view.KeyEvent
 android.view.KeyEvent$1
 android.view.KeyEvent$Callback
@@ -2095,7 +2444,6 @@
 android.view.RenderNodeAnimator$1
 android.view.RenderNodeAnimatorSetHelper
 android.view.SearchEvent
-android.view.SoundEffectConstants
 android.view.SubMenu
 android.view.Surface
 android.view.Surface$1
@@ -2103,7 +2451,6 @@
 android.view.Surface$OutOfResourcesException
 android.view.SurfaceControl
 android.view.SurfaceControl$PhysicalDisplayInfo
-android.view.SurfaceHolder
 android.view.SurfaceHolder$Callback
 android.view.SurfaceHolder$Callback2
 android.view.SurfaceSession
@@ -2112,6 +2459,7 @@
 android.view.ThreadedRenderer
 android.view.ThreadedRenderer$DrawCallbacks
 android.view.ThreadedRenderer$ProcessInitializer
+android.view.ThreadedRenderer$ProcessInitializer$1
 android.view.VelocityTracker
 android.view.VelocityTracker$Estimator
 android.view.View
@@ -2151,7 +2499,6 @@
 android.view.View$TransformationInfo
 android.view.View$UnsetPressedState
 android.view.ViewConfiguration
-android.view.ViewDebug$HierarchyHandler
 android.view.ViewGroup
 android.view.ViewGroup$1
 android.view.ViewGroup$2
@@ -2159,13 +2506,11 @@
 android.view.ViewGroup$MarginLayoutParams
 android.view.ViewGroup$OnHierarchyChangeListener
 android.view.ViewGroup$TouchTarget
-android.view.ViewGroupOverlay
 android.view.ViewManager
 android.view.ViewOutlineProvider
 android.view.ViewOutlineProvider$1
 android.view.ViewOutlineProvider$2
 android.view.ViewOutlineProvider$3
-android.view.ViewOverlay
 android.view.ViewParent
 android.view.ViewPropertyAnimator
 android.view.ViewPropertyAnimator$1
@@ -2176,7 +2521,9 @@
 android.view.ViewRootImpl$1
 android.view.ViewRootImpl$4
 android.view.ViewRootImpl$AccessibilityInteractionConnectionManager
+android.view.ViewRootImpl$ActivityConfigCallback
 android.view.ViewRootImpl$AsyncInputStage
+android.view.ViewRootImpl$ConfigChangedCallback
 android.view.ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable
 android.view.ViewRootImpl$ConsumeBatchedInputRunnable
 android.view.ViewRootImpl$EarlyPostImeInputStage
@@ -2200,12 +2547,12 @@
 android.view.ViewRootImpl$ViewRootHandler
 android.view.ViewRootImpl$W
 android.view.ViewRootImpl$WindowInputEventReceiver
+android.view.ViewRootImpl$WindowStoppedCallback
 android.view.ViewStub
 android.view.ViewTreeObserver
 android.view.ViewTreeObserver$CopyOnWriteArray
 android.view.ViewTreeObserver$CopyOnWriteArray$Access
 android.view.ViewTreeObserver$InternalInsetsInfo
-android.view.ViewTreeObserver$OnGlobalFocusChangeListener
 android.view.ViewTreeObserver$OnGlobalLayoutListener
 android.view.ViewTreeObserver$OnPreDrawListener
 android.view.ViewTreeObserver$OnScrollChangedListener
@@ -2223,6 +2570,7 @@
 android.view.WindowInsets
 android.view.WindowLeaked
 android.view.WindowManager
+android.view.WindowManager$BadTokenException
 android.view.WindowManager$LayoutParams
 android.view.WindowManager$LayoutParams$1
 android.view.WindowManagerGlobal
@@ -2235,7 +2583,8 @@
 android.view.accessibility.AccessibilityManager$1
 android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener
 android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener
-android.view.accessibility.AccessibilityManager$MyHandler
+android.view.accessibility.AccessibilityManager$MyCallback
+android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
 android.view.accessibility.AccessibilityNodeInfo
 android.view.accessibility.AccessibilityNodeProvider
 android.view.accessibility.AccessibilityRecord
@@ -2249,12 +2598,8 @@
 android.view.animation.AccelerateInterpolator
 android.view.animation.AlphaAnimation
 android.view.animation.Animation
-android.view.animation.Animation$1
-android.view.animation.Animation$2
-android.view.animation.Animation$3
 android.view.animation.Animation$AnimationListener
 android.view.animation.Animation$NoImagePreloadHolder
-android.view.animation.AnimationSet
 android.view.animation.AnimationUtils
 android.view.animation.AnimationUtils$1
 android.view.animation.AnimationUtils$AnimationState
@@ -2263,10 +2608,17 @@
 android.view.animation.Interpolator
 android.view.animation.LinearInterpolator
 android.view.animation.PathInterpolator
-android.view.animation.ScaleAnimation
 android.view.animation.Transformation
-android.view.animation.TranslateAnimation
-android.view.autofill.AutoFillManager
+android.view.autofill.AutofillManager
+android.view.autofill.AutofillManager$AutofillClient
+android.view.autofill.AutofillManager$AutofillManagerClient
+android.view.autofill.Helper
+android.view.autofill.IAutoFillManager
+android.view.autofill.IAutoFillManager$Stub
+android.view.autofill.IAutoFillManager$Stub$Proxy
+android.view.autofill.IAutoFillManagerClient
+android.view.autofill.IAutoFillManagerClient$Stub
+android.view.autofill.IAutofillWindowPresenter
 android.view.inputmethod.BaseInputConnection
 android.view.inputmethod.ComposingText
 android.view.inputmethod.CursorAnchorInfo$Builder
@@ -2278,38 +2630,22 @@
 android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
 android.view.inputmethod.InputMethodManager$FinishedInputEventCallback
 android.view.inputmethod.InputMethodManager$H
-android.view.inputmethod.InputMethodManager$ImeInputEventSender
-android.view.inputmethod.InputMethodManager$PendingEvent
 android.view.textclassifier.TextClassificationManager
-android.view.textservice.SpellCheckerSubtype
-android.view.textservice.SpellCheckerSubtype$1
 android.view.textservice.TextServicesManager
-android.webkit.IWebViewUpdateService
-android.webkit.IWebViewUpdateService$Stub
-android.webkit.IWebViewUpdateService$Stub$Proxy
-android.webkit.MimeTypeMap
-android.webkit.WebView
 android.webkit.WebViewFactory
 android.webkit.WebViewFactory$MissingWebViewPackageException
-android.webkit.WebViewProviderResponse
-android.webkit.WebViewProviderResponse$1
 android.widget.AbsListView
 android.widget.AbsListView$AdapterDataSetObserver
 android.widget.AbsListView$LayoutParams
 android.widget.AbsListView$OnScrollListener
 android.widget.AbsListView$RecycleBin
-android.widget.AbsListView$SavedState
-android.widget.AbsListView$SavedState$1
 android.widget.AbsSeekBar
 android.widget.AbsSpinner
-android.widget.AbsoluteLayout
-android.widget.ActionMenuView$OnMenuItemClickListener
 android.widget.Adapter
 android.widget.AdapterView
 android.widget.AdapterView$AdapterDataSetObserver
 android.widget.AdapterView$OnItemClickListener
 android.widget.AdapterView$OnItemSelectedListener
-android.widget.ArrayAdapter
 android.widget.AutoCompleteTextView
 android.widget.BaseAdapter
 android.widget.Button
@@ -2317,7 +2653,6 @@
 android.widget.Checkable
 android.widget.CheckedTextView
 android.widget.CompoundButton
-android.widget.CompoundButton$OnCheckedChangeListener
 android.widget.EdgeEffect
 android.widget.EditText
 android.widget.Editor
@@ -2330,15 +2665,12 @@
 android.widget.Editor$SpanController
 android.widget.Editor$SuggestionHelper
 android.widget.Editor$SuggestionHelper$SuggestionSpanComparator
-android.widget.Editor$TextRenderNode
 android.widget.Editor$TextViewPositionListener
 android.widget.Editor$UndoInputFilter
 android.widget.Filter$FilterListener
 android.widget.Filterable
-android.widget.ForwardingListener
 android.widget.FrameLayout
 android.widget.FrameLayout$LayoutParams
-android.widget.HeaderViewListAdapter
 android.widget.HorizontalScrollView
 android.widget.ImageButton
 android.widget.ImageView
@@ -2346,25 +2678,14 @@
 android.widget.LinearLayout
 android.widget.LinearLayout$LayoutParams
 android.widget.ListAdapter
-android.widget.ListPopupWindow
-android.widget.ListPopupWindow$ListSelectorHider
-android.widget.ListPopupWindow$PopupDataSetObserver
-android.widget.ListPopupWindow$PopupScrollListener
-android.widget.ListPopupWindow$PopupTouchInterceptor
-android.widget.ListPopupWindow$ResizePopupRunnable
 android.widget.ListView
 android.widget.ListView$ArrowScrollFocusResult
 android.widget.MultiAutoCompleteTextView
 android.widget.OverScroller
 android.widget.OverScroller$SplineOverScroller
 android.widget.PopupWindow
-android.widget.PopupWindow$1
-android.widget.PopupWindow$2
-android.widget.PopupWindow$OnDismissListener
 android.widget.ProgressBar
 android.widget.ProgressBar$1
-android.widget.ProgressBar$SavedState
-android.widget.ProgressBar$SavedState$1
 android.widget.RadioButton
 android.widget.RatingBar
 android.widget.RelativeLayout
@@ -2372,9 +2693,20 @@
 android.widget.RelativeLayout$DependencyGraph$Node
 android.widget.RelativeLayout$LayoutParams
 android.widget.RemoteViews
+android.widget.RemoteViews$1
+android.widget.RemoteViews$2
+android.widget.RemoteViews$3
+android.widget.RemoteViews$Action
+android.widget.RemoteViews$ActionException
+android.widget.RemoteViews$BitmapCache
+android.widget.RemoteViews$MemoryUsageCounter
+android.widget.RemoteViews$MutablePair
+android.widget.RemoteViews$OnClickHandler
+android.widget.RemoteViews$ReflectionAction
 android.widget.RemoteViews$RemoteView
+android.widget.RemoteViews$RuntimeAction
+android.widget.RemoteViews$SetOnClickPendingIntent
 android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
-android.widget.RtlSpacingHelper
 android.widget.ScrollBarDrawable
 android.widget.ScrollView
 android.widget.Scroller
@@ -2389,43 +2721,6 @@
 android.widget.TextView$CharWrapper
 android.widget.TextView$Drawables
 android.widget.TextView$OnEditorActionListener
-android.widget.TextView$SavedState
-android.widget.TextView$SavedState$1
-android.widget.ThemedSpinnerAdapter
-android.widget.Toast
-android.widget.Toolbar
-android.widget.Toolbar$1
-android.widget.Toolbar$2
-android.widget.Toolbar$LayoutParams
-android.widget.WrapperListAdapter
-com.android.dex.ClassData
-com.android.dex.ClassData$Method
-com.android.dex.ClassDef
-com.android.dex.Code
-com.android.dex.Dex
-com.android.dex.Dex$ClassDefIterable
-com.android.dex.Dex$FieldIdTable
-com.android.dex.Dex$MethodIdTable
-com.android.dex.Dex$ProtoIdTable
-com.android.dex.Dex$Section
-com.android.dex.Dex$StringTable
-com.android.dex.Dex$TypeIndexToDescriptorIndexTable
-com.android.dex.Dex$TypeIndexToDescriptorTable
-com.android.dex.DexException
-com.android.dex.DexFormat
-com.android.dex.FieldId
-com.android.dex.Leb128
-com.android.dex.MethodId
-com.android.dex.Mutf8
-com.android.dex.TableOfContents
-com.android.dex.TableOfContents$Section
-com.android.dex.TypeList
-com.android.dex.util.ByteInput
-com.android.dex.util.ByteOutput
-com.android.dex.util.ExceptionWithContext
-com.android.dex.util.FileUtils
-com.android.i18n.phonenumbers.NumberParseException
-com.android.i18n.phonenumbers.PhoneNumberUtil
 com.android.internal.R$styleable
 com.android.internal.app.IAppOpsCallback
 com.android.internal.app.IAppOpsCallback$Stub
@@ -2435,8 +2730,13 @@
 com.android.internal.app.IBatteryStats
 com.android.internal.app.IBatteryStats$Stub
 com.android.internal.app.IBatteryStats$Stub$Proxy
+com.android.internal.app.IVoiceInteractionManagerService
+com.android.internal.app.IVoiceInteractionManagerService$Stub
 com.android.internal.app.IVoiceInteractor
 com.android.internal.app.IVoiceInteractor$Stub
+com.android.internal.appwidget.IAppWidgetService
+com.android.internal.appwidget.IAppWidgetService$Stub
+com.android.internal.appwidget.IAppWidgetService$Stub$Proxy
 com.android.internal.content.NativeLibraryHelper
 com.android.internal.content.ReferrerIntent
 com.android.internal.content.ReferrerIntent$1
@@ -2448,7 +2748,6 @@
 com.android.internal.logging.AndroidConfig
 com.android.internal.logging.AndroidHandler
 com.android.internal.logging.AndroidHandler$1
-com.android.internal.logging.EventLogTags
 com.android.internal.logging.MetricsLogger
 com.android.internal.net.NetworkStatsFactory
 com.android.internal.os.AndroidPrintStream
@@ -2456,7 +2755,10 @@
 com.android.internal.os.BinderInternal$GcWatcher
 com.android.internal.os.FuseAppLoop
 com.android.internal.os.FuseAppLoop$1
-com.android.internal.os.FuseAppLoop$UnmountedException
+com.android.internal.os.FuseUnavailableMountException
+com.android.internal.os.HandlerCaller
+com.android.internal.os.HandlerCaller$Callback
+com.android.internal.os.HandlerCaller$MyHandler
 com.android.internal.os.LoggingPrintStream
 com.android.internal.os.LoggingPrintStream$1
 com.android.internal.os.PathClassLoaderFactory
@@ -2477,6 +2779,7 @@
 com.android.internal.os.ZygoteServer
 com.android.internal.policy.DecorContext
 com.android.internal.policy.DecorView
+com.android.internal.policy.DecorView$ColorViewAttributes
 com.android.internal.policy.DecorView$ColorViewState
 com.android.internal.policy.PhoneFallbackEventHandler
 com.android.internal.policy.PhoneLayoutInflater
@@ -2486,6 +2789,20 @@
 com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
 com.android.internal.policy.PhoneWindow$RotationWatcher
 com.android.internal.policy.PhoneWindow$RotationWatcher$1
+com.android.internal.telecom.ITelecomService
+com.android.internal.telecom.ITelecomService$Stub
+com.android.internal.telephony.ICarrierConfigLoader
+com.android.internal.telephony.ICarrierConfigLoader$Stub
+com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
+com.android.internal.telephony.IOnSubscriptionsChangedListener
+com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub
+com.android.internal.telephony.IPhoneStateListener
+com.android.internal.telephony.IPhoneStateListener$Stub
+com.android.internal.telephony.IPhoneSubInfo
+com.android.internal.telephony.IPhoneSubInfo$Stub
+com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
+com.android.internal.telephony.ISms
+com.android.internal.telephony.ISms$Stub
 com.android.internal.telephony.ISub
 com.android.internal.telephony.ISub$Stub
 com.android.internal.telephony.ISub$Stub$Proxy
@@ -2495,19 +2812,31 @@
 com.android.internal.telephony.ITelephonyRegistry
 com.android.internal.telephony.ITelephonyRegistry$Stub
 com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
+com.android.internal.telephony.IccCardConstants$State
 com.android.internal.telephony.PhoneConstants$State
 com.android.internal.textservice.ITextServicesManager
 com.android.internal.textservice.ITextServicesManager$Stub
-com.android.internal.textservice.ITextServicesManager$Stub$Proxy
-com.android.internal.transition.EpicenterTranslateClipReveal
-com.android.internal.transition.TransitionConstants
 com.android.internal.util.ArrayUtils
+com.android.internal.util.AsyncChannel
+com.android.internal.util.AsyncChannel$DeathMonitor
+com.android.internal.util.BitUtils
+com.android.internal.util.ExponentiallyBucketedHistogram
 com.android.internal.util.FastPrintWriter
 com.android.internal.util.FastPrintWriter$DummyWriter
 com.android.internal.util.FastXmlSerializer
 com.android.internal.util.GrowingArrayUtils
+com.android.internal.util.IState
+com.android.internal.util.IntPair
 com.android.internal.util.LineBreakBufferedWriter
 com.android.internal.util.Preconditions
+com.android.internal.util.State
+com.android.internal.util.StateMachine
+com.android.internal.util.StateMachine$LogRec
+com.android.internal.util.StateMachine$LogRecords
+com.android.internal.util.StateMachine$SmHandler
+com.android.internal.util.StateMachine$SmHandler$HaltingState
+com.android.internal.util.StateMachine$SmHandler$QuittingState
+com.android.internal.util.StateMachine$SmHandler$StateInfo
 com.android.internal.util.VirtualRefBasePtr
 com.android.internal.util.XmlUtils
 com.android.internal.util.XmlUtils$WriteMapCallback
@@ -2530,13 +2859,11 @@
 com.android.internal.view.animation.HasNativeInterpolator
 com.android.internal.view.animation.NativeInterpolatorFactory
 com.android.internal.view.animation.NativeInterpolatorFactoryHelper
-com.android.internal.view.menu.MenuBuilder
 com.android.internal.view.menu.MenuBuilder$Callback
-com.android.internal.view.menu.MenuItemImpl
 com.android.internal.view.menu.MenuPresenter$Callback
-com.android.internal.view.menu.ShowableListMenu
 com.android.internal.widget.BackgroundFallback
 com.android.internal.widget.DecorContentParent
+com.android.internal.widget.LockPatternUtils
 com.android.okhttp.Address
 com.android.okhttp.Authenticator
 com.android.okhttp.CacheControl
@@ -2618,6 +2945,8 @@
 com.android.okhttp.okio.BufferedSink
 com.android.okhttp.okio.BufferedSource
 com.android.okhttp.okio.ForwardingTimeout
+com.android.okhttp.okio.GzipSource
+com.android.okhttp.okio.InflaterSource
 com.android.okhttp.okio.Okio
 com.android.okhttp.okio.Okio$1
 com.android.okhttp.okio.Okio$2
@@ -2718,6 +3047,7 @@
 com.android.org.conscrypt.AbstractSessionContext
 com.android.org.conscrypt.AbstractSessionContext$1
 com.android.org.conscrypt.AddressUtils
+com.android.org.conscrypt.ArrayUtils
 com.android.org.conscrypt.ByteArray
 com.android.org.conscrypt.CertBlacklist
 com.android.org.conscrypt.CertificatePriorityComparator
@@ -2728,6 +3058,8 @@
 com.android.org.conscrypt.EvpMdRef$MD5
 com.android.org.conscrypt.EvpMdRef$SHA1
 com.android.org.conscrypt.EvpMdRef$SHA256
+com.android.org.conscrypt.FileClientSessionCache
+com.android.org.conscrypt.FileClientSessionCache$Impl
 com.android.org.conscrypt.Hex
 com.android.org.conscrypt.JSSEProvider
 com.android.org.conscrypt.KeyManagerFactoryImpl
@@ -2741,6 +3073,8 @@
 com.android.org.conscrypt.NativeRef$EVP_MD_CTX
 com.android.org.conscrypt.NativeRef$EVP_PKEY
 com.android.org.conscrypt.OpenSSLBIOInputStream
+com.android.org.conscrypt.OpenSSLContextImpl
+com.android.org.conscrypt.OpenSSLContextImpl$TLSv12
 com.android.org.conscrypt.OpenSSLECGroupContext
 com.android.org.conscrypt.OpenSSLECPointContext
 com.android.org.conscrypt.OpenSSLECPublicKey
@@ -2756,6 +3090,10 @@
 com.android.org.conscrypt.OpenSSLRSAPublicKey
 com.android.org.conscrypt.OpenSSLRandom
 com.android.org.conscrypt.OpenSSLSessionImpl
+com.android.org.conscrypt.OpenSSLSignature
+com.android.org.conscrypt.OpenSSLSignature$EngineType
+com.android.org.conscrypt.OpenSSLSignature$RSAPKCS1Padding
+com.android.org.conscrypt.OpenSSLSignature$SHA1RSA
 com.android.org.conscrypt.OpenSSLSocketFactoryImpl
 com.android.org.conscrypt.OpenSSLSocketImpl
 com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream
@@ -2770,9 +3108,11 @@
 com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
 com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
 com.android.org.conscrypt.Platform
+com.android.org.conscrypt.SSLClientSessionCache
 com.android.org.conscrypt.SSLParametersImpl
 com.android.org.conscrypt.SSLParametersImpl$AliasChooser
 com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks
+com.android.org.conscrypt.SSLUtils
 com.android.org.conscrypt.ServerSessionContext
 com.android.org.conscrypt.TrustManagerFactoryImpl
 com.android.org.conscrypt.TrustManagerImpl
@@ -2781,8 +3121,7 @@
 com.android.org.conscrypt.TrustedCertificateIndex
 com.android.org.conscrypt.TrustedCertificateKeyStoreSpi
 com.android.org.conscrypt.TrustedCertificateStore
-com.android.org.conscrypt.TrustedCertificateStore$1
-com.android.org.conscrypt.TrustedCertificateStore$CertSelector
+com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder
 com.android.org.conscrypt.ct.CTLogInfo
 com.android.org.conscrypt.ct.CTLogStore
 com.android.org.conscrypt.ct.CTLogStoreImpl
@@ -2792,16 +3131,20 @@
 com.android.org.conscrypt.ct.CTVerifier
 com.android.org.conscrypt.ct.KnownLogs
 com.android.org.conscrypt.ct.SerializationException
-com.android.org.conscrypt.util.ArrayUtils
 com.android.server.NetworkManagementSocketTagger
 com.android.server.NetworkManagementSocketTagger$1
 com.android.server.NetworkManagementSocketTagger$SocketTags
 com.google.android.collect.Lists
 com.google.android.collect.Maps
+com.google.android.gles_jni.EGLConfigImpl
+com.google.android.gles_jni.EGLContextImpl
+com.google.android.gles_jni.EGLDisplayImpl
 com.google.android.gles_jni.EGLImpl
+com.google.android.gles_jni.EGLSurfaceImpl
 com.google.android.gles_jni.GLImpl
 dalvik.annotation.optimization.CriticalNative
 dalvik.annotation.optimization.FastNative
+dalvik.system.-$Lambda$xxvwQBVHC44UYbpcpA8j0sUqLOo
 dalvik.system.BaseDexClassLoader
 dalvik.system.BaseDexClassLoader$Reporter
 dalvik.system.BlockGuard
@@ -2816,6 +3159,7 @@
 dalvik.system.CloseGuard$Reporter
 dalvik.system.CloseGuard$Tracker
 dalvik.system.DalvikLogHandler
+dalvik.system.DalvikLogging
 dalvik.system.DexClassLoader
 dalvik.system.DexFile
 dalvik.system.DexFile$DFEnum
@@ -2824,7 +3168,6 @@
 dalvik.system.DexPathList$NativeLibraryElement
 dalvik.system.EmulatedStackFrame
 dalvik.system.EmulatedStackFrame$Range
-dalvik.system.InMemoryDexClassLoader$DexData
 dalvik.system.PathClassLoader
 dalvik.system.SocketTagger
 dalvik.system.SocketTagger$1
@@ -2836,7 +3179,6 @@
 java.io.BufferedInputStream
 java.io.BufferedOutputStream
 java.io.BufferedReader
-java.io.BufferedWriter
 java.io.ByteArrayInputStream
 java.io.ByteArrayOutputStream
 java.io.CharArrayWriter
@@ -2854,6 +3196,7 @@
 java.io.Externalizable
 java.io.File
 java.io.File$PathStatus
+java.io.File$TempDirectory
 java.io.FileDescriptor
 java.io.FileDescriptor$1
 java.io.FileFilter
@@ -2863,7 +3206,6 @@
 java.io.FileOutputStream
 java.io.FileReader
 java.io.FileSystem
-java.io.FileWriter
 java.io.FilenameFilter
 java.io.FilterInputStream
 java.io.FilterOutputStream
@@ -2872,7 +3214,6 @@
 java.io.InputStream
 java.io.InputStreamReader
 java.io.InterruptedIOException
-java.io.InvalidClassException
 java.io.InvalidObjectException
 java.io.ObjectInput
 java.io.ObjectInputStream
@@ -2883,17 +3224,8 @@
 java.io.ObjectInputStream$ValidationList
 java.io.ObjectOutput
 java.io.ObjectOutputStream
-java.io.ObjectOutputStream$BlockDataOutputStream
-java.io.ObjectOutputStream$HandleTable
 java.io.ObjectOutputStream$PutField
-java.io.ObjectOutputStream$ReplaceTable
 java.io.ObjectStreamClass
-java.io.ObjectStreamClass$2
-java.io.ObjectStreamClass$Caches
-java.io.ObjectStreamClass$EntryFuture
-java.io.ObjectStreamClass$FieldReflector
-java.io.ObjectStreamClass$FieldReflectorKey
-java.io.ObjectStreamClass$WeakClassKey
 java.io.ObjectStreamConstants
 java.io.ObjectStreamException
 java.io.ObjectStreamField
@@ -2904,17 +3236,15 @@
 java.io.PushbackInputStream
 java.io.RandomAccessFile
 java.io.Reader
-java.io.SequenceInputStream
 java.io.Serializable
 java.io.SerializablePermission
 java.io.StringReader
 java.io.StringWriter
-java.io.UTFDataFormatException
 java.io.UnixFileSystem
 java.io.UnsupportedEncodingException
 java.io.Writer
-java.lang.-$Lambda$250$S9HjrJh0nDg7IyU6wZdPArnZWRQ
-java.lang.-$Lambda$251$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ$1
 java.lang.AbstractMethodError
 java.lang.AbstractStringBuilder
 java.lang.AndroidHardcodedSystemProperties
@@ -2980,6 +3310,7 @@
 java.lang.Long$LongCache
 java.lang.Math
 java.lang.Math$RandomNumberGeneratorHolder
+java.lang.NegativeArraySizeException
 java.lang.NoClassDefFoundError
 java.lang.NoSuchFieldError
 java.lang.NoSuchFieldException
@@ -3036,6 +3367,7 @@
 java.lang.UnsatisfiedLinkError
 java.lang.UnsupportedOperationException
 java.lang.VMClassLoader
+java.lang.VerifyError
 java.lang.VirtualMachineError
 java.lang.Void
 java.lang.annotation.Annotation
@@ -3044,18 +3376,22 @@
 java.lang.annotation.Inherited
 java.lang.annotation.Retention
 java.lang.annotation.Target
+java.lang.invoke.CallSite
+java.lang.invoke.ConstantCallSite
 java.lang.invoke.MethodHandle
 java.lang.invoke.MethodHandleImpl
 java.lang.invoke.MethodHandleImpl$HandleInfo
 java.lang.invoke.MethodHandleInfo
 java.lang.invoke.MethodHandleStatics
 java.lang.invoke.MethodHandles
+java.lang.invoke.MethodHandles$Lookup
 java.lang.invoke.MethodType
 java.lang.invoke.MethodType$ConcurrentWeakInternSet
 java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
 java.lang.invoke.MethodTypeForm
 java.lang.invoke.Transformers$BindTo
 java.lang.invoke.Transformers$Collector
+java.lang.invoke.Transformers$Construct
 java.lang.invoke.Transformers$Spreader
 java.lang.invoke.Transformers$Transformer
 java.lang.invoke.Transformers$VarargsCollector
@@ -3074,6 +3410,7 @@
 java.lang.reflect.Executable
 java.lang.reflect.Executable$GenericInfo
 java.lang.reflect.Field
+java.lang.reflect.GenericArrayType
 java.lang.reflect.GenericDeclaration
 java.lang.reflect.InvocationHandler
 java.lang.reflect.InvocationTargetException
@@ -3093,12 +3430,14 @@
 java.lang.reflect.Proxy$ProxyClassFactory
 java.lang.reflect.Type
 java.lang.reflect.TypeVariable
+java.lang.reflect.UndeclaredThrowableException
 java.lang.reflect.WeakCache
 java.lang.reflect.WeakCache$CacheKey
 java.lang.reflect.WeakCache$CacheValue
 java.lang.reflect.WeakCache$Factory
 java.lang.reflect.WeakCache$LookupValue
 java.lang.reflect.WeakCache$Value
+java.lang.reflect.WildcardType
 java.math.BigDecimal
 java.math.BigInt
 java.math.BigInteger
@@ -3127,7 +3466,6 @@
 java.net.NetworkInterface
 java.net.Parts
 java.net.PlainSocketImpl
-java.net.ProtocolException
 java.net.Proxy
 java.net.Proxy$Type
 java.net.ProxySelector
@@ -3150,7 +3488,6 @@
 java.net.URISyntaxException
 java.net.URL
 java.net.URLConnection
-java.net.URLDecoder
 java.net.URLEncoder
 java.net.URLStreamHandler
 java.net.URLStreamHandlerFactory
@@ -3195,6 +3532,7 @@
 java.nio.channels.InterruptibleChannel
 java.nio.channels.MulticastChannel
 java.nio.channels.NetworkChannel
+java.nio.channels.OverlappingFileLockException
 java.nio.channels.ReadableByteChannel
 java.nio.channels.ScatteringByteChannel
 java.nio.channels.SeekableByteChannel
@@ -3238,7 +3576,6 @@
 java.security.KeyFactory
 java.security.KeyFactorySpi
 java.security.KeyManagementException
-java.security.KeyPair
 java.security.KeyStore
 java.security.KeyStore$1
 java.security.KeyStoreException
@@ -3318,11 +3655,11 @@
 java.security.spec.EllipticCurve
 java.security.spec.EncodedKeySpec
 java.security.spec.InvalidKeySpecException
+java.security.spec.InvalidParameterSpecException
 java.security.spec.KeySpec
 java.security.spec.RSAPublicKeySpec
 java.security.spec.X509EncodedKeySpec
 java.text.AttributedCharacterIterator$Attribute
-java.text.CalendarBuilder
 java.text.CharacterIterator
 java.text.DateFormat
 java.text.DateFormat$Field
@@ -3343,16 +3680,16 @@
 java.text.SimpleDateFormat
 java.text.StringCharacterIterator
 java.time.DateTimeException
-java.util.-$Lambda$181$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$182$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$183$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$184$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$267$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$268$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$291$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$292$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$293$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$294$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$1
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$2
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$3
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$4
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$5
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$1
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$2
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$3
 java.util.AbstractCollection
 java.util.AbstractList
 java.util.AbstractList$Itr
@@ -3466,6 +3803,7 @@
 java.util.Formatter$FormatSpecifier
 java.util.Formatter$FormatSpecifierParser
 java.util.Formatter$FormatString
+java.util.FormatterClosedException
 java.util.GregorianCalendar
 java.util.HashMap
 java.util.HashMap$EntryIterator
@@ -3482,7 +3820,6 @@
 java.util.Hashtable$Enumerator
 java.util.Hashtable$HashtableEntry
 java.util.IdentityHashMap
-java.util.IdentityHashMap$IdentityHashMapIterator
 java.util.IdentityHashMap$KeySet
 java.util.IllegalFormatException
 java.util.IllformedLocaleException
@@ -3509,6 +3846,7 @@
 java.util.Locale$FilteringMode
 java.util.Locale$LanguageRange
 java.util.Locale$LocaleKey
+java.util.Locale$NoImagePreloadHolder
 java.util.Map
 java.util.Map$Entry
 java.util.MissingResourceException
@@ -3519,6 +3857,7 @@
 java.util.PrimitiveIterator
 java.util.PrimitiveIterator$OfInt
 java.util.PriorityQueue
+java.util.PriorityQueue$Itr
 java.util.Properties
 java.util.Properties$LineReader
 java.util.Queue
@@ -3528,7 +3867,6 @@
 java.util.RegularEnumSet
 java.util.ResourceBundle
 java.util.ResourceBundle$1
-java.util.Scanner
 java.util.Set
 java.util.SimpleTimeZone
 java.util.SortedMap
@@ -3551,10 +3889,15 @@
 java.util.TimSort
 java.util.TimeZone
 java.util.TreeMap
+java.util.TreeMap$AscendingSubMap
+java.util.TreeMap$AscendingSubMap$AscendingEntrySetView
 java.util.TreeMap$EntryIterator
 java.util.TreeMap$EntrySet
 java.util.TreeMap$KeyIterator
 java.util.TreeMap$KeySet
+java.util.TreeMap$NavigableSubMap
+java.util.TreeMap$NavigableSubMap$EntrySetView
+java.util.TreeMap$NavigableSubMap$SubMapIterator
 java.util.TreeMap$PrivateEntryIterator
 java.util.TreeMap$TreeMapEntry
 java.util.TreeMap$ValueIterator
@@ -3563,6 +3906,7 @@
 java.util.UUID
 java.util.UUID$Holder
 java.util.Vector
+java.util.Vector$1
 java.util.Vector$Itr
 java.util.WeakHashMap
 java.util.WeakHashMap$Entry
@@ -3571,8 +3915,9 @@
 java.util.WeakHashMap$KeyIterator
 java.util.WeakHashMap$KeySet
 java.util.WeakHashMap$Values
-java.util.concurrent.-$Lambda$269$xR9BLpu6SifNikvFgr4lEiECBsk
+java.util.concurrent.-$Lambda$xR9BLpu6SifNikvFgr4lEiECBsk
 java.util.concurrent.AbstractExecutorService
+java.util.concurrent.ArrayBlockingQueue
 java.util.concurrent.BlockingQueue
 java.util.concurrent.Callable
 java.util.concurrent.CancellationException
@@ -3625,6 +3970,8 @@
 java.util.concurrent.ConcurrentHashMap$TreeNode
 java.util.concurrent.ConcurrentHashMap$ValueIterator
 java.util.concurrent.ConcurrentHashMap$ValuesView
+java.util.concurrent.ConcurrentLinkedDeque
+java.util.concurrent.ConcurrentLinkedDeque$Node
 java.util.concurrent.ConcurrentLinkedQueue
 java.util.concurrent.ConcurrentLinkedQueue$Node
 java.util.concurrent.ConcurrentMap
@@ -3673,6 +4020,7 @@
 java.util.concurrent.ThreadLocalRandom
 java.util.concurrent.ThreadPoolExecutor
 java.util.concurrent.ThreadPoolExecutor$AbortPolicy
+java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
 java.util.concurrent.ThreadPoolExecutor$Worker
 java.util.concurrent.TimeUnit
 java.util.concurrent.TimeUnit$1
@@ -3687,6 +4035,7 @@
 java.util.concurrent.atomic.AtomicInteger
 java.util.concurrent.atomic.AtomicLong
 java.util.concurrent.atomic.AtomicReference
+java.util.concurrent.atomic.AtomicReferenceArray
 java.util.concurrent.atomic.AtomicReferenceFieldUpdater
 java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
 java.util.concurrent.locks.AbstractOwnableSynchronizer
@@ -3706,12 +4055,15 @@
 java.util.concurrent.locks.ReentrantReadWriteLock$Sync
 java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
 java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
-java.util.function.-$Lambda$276$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk$1
 java.util.function.BiConsumer
 java.util.function.BiFunction
 java.util.function.BinaryOperator
 java.util.function.Consumer
 java.util.function.DoubleBinaryOperator
+java.util.function.DoubleUnaryOperator
 java.util.function.Function
 java.util.function.IntBinaryOperator
 java.util.function.IntConsumer
@@ -3751,6 +4103,7 @@
 java.util.logging.LogManager$LoggerWeakRef
 java.util.logging.LogManager$RootLogger
 java.util.logging.LogManager$SystemLoggerContext
+java.util.logging.LogRecord
 java.util.logging.Logger
 java.util.logging.Logger$LoggerBundle
 java.util.logging.LoggingPermission
@@ -3762,12 +4115,24 @@
 java.util.regex.Matcher
 java.util.regex.Pattern
 java.util.regex.PatternSyntaxException
+java.util.stream.AbstractPipeline
 java.util.stream.BaseStream
 java.util.stream.DoubleStream
 java.util.stream.IntStream
 java.util.stream.LongStream
+java.util.stream.PipelineHelper
+java.util.stream.ReferencePipeline
+java.util.stream.ReferencePipeline$Head
+java.util.stream.Sink
+java.util.stream.Sink$ChainedReference
 java.util.stream.Stream
+java.util.stream.StreamOpFlag
+java.util.stream.StreamOpFlag$MaskBuilder
+java.util.stream.StreamOpFlag$Type
+java.util.stream.StreamShape
 java.util.stream.StreamSupport
+java.util.stream.TerminalOp
+java.util.stream.TerminalSink
 java.util.zip.Adler32
 java.util.zip.CRC32
 java.util.zip.CheckedInputStream
@@ -3790,13 +4155,26 @@
 java.util.zip.ZipUtils
 javax.crypto.BadPaddingException
 javax.crypto.Cipher
+javax.crypto.Cipher$CipherSpiAndProvider
+javax.crypto.Cipher$InitParams
+javax.crypto.Cipher$InitType
+javax.crypto.Cipher$NeedToSet
+javax.crypto.Cipher$SpiAndProviderUpdater
+javax.crypto.Cipher$Transform
+javax.crypto.CipherSpi
 javax.crypto.IllegalBlockSizeException
+javax.crypto.JceSecurity
 javax.crypto.NoSuchPaddingException
 javax.crypto.SecretKey
+javax.crypto.ShortBufferException
 javax.crypto.spec.IvParameterSpec
 javax.crypto.spec.SecretKeySpec
 javax.microedition.khronos.egl.EGL
 javax.microedition.khronos.egl.EGL10
+javax.microedition.khronos.egl.EGLConfig
+javax.microedition.khronos.egl.EGLContext
+javax.microedition.khronos.egl.EGLDisplay
+javax.microedition.khronos.egl.EGLSurface
 javax.microedition.khronos.opengles.GL
 javax.microedition.khronos.opengles.GL10
 javax.microedition.khronos.opengles.GL10Ext
@@ -3828,6 +4206,7 @@
 javax.net.ssl.SSLSessionContext
 javax.net.ssl.SSLSocket
 javax.net.ssl.SSLSocketFactory
+javax.net.ssl.SSLSocketFactory$1
 javax.net.ssl.TrustManager
 javax.net.ssl.TrustManagerFactory
 javax.net.ssl.TrustManagerFactory$1
@@ -3865,11 +4244,11 @@
 libcore.io.IoTracker$Mode
 libcore.io.IoUtils
 libcore.io.Libcore
+libcore.io.Linux
 libcore.io.Memory
 libcore.io.MemoryMappedFile
 libcore.io.NioBufferIterator
 libcore.io.Os
-libcore.io.Posix
 libcore.net.NetworkSecurityPolicy
 libcore.net.NetworkSecurityPolicy$DefaultNetworkSecurityPolicy
 libcore.net.UriCodec
@@ -3879,9 +4258,11 @@
 libcore.reflect.AnnotationFactory
 libcore.reflect.AnnotationMember
 libcore.reflect.AnnotationMember$DefaultValues
+libcore.reflect.GenericArrayTypeImpl
 libcore.reflect.GenericSignatureParser
-libcore.reflect.InternalNames
 libcore.reflect.ListOfTypes
+libcore.reflect.ListOfVariables
+libcore.reflect.ParameterizedTypeImpl
 libcore.reflect.Types
 libcore.util.BasicLruCache
 libcore.util.CharsetUtils
@@ -3890,10 +4271,18 @@
 libcore.util.NativeAllocationRegistry
 libcore.util.NativeAllocationRegistry$CleanerRunner
 libcore.util.NativeAllocationRegistry$CleanerThunk
+libcore.util.TimeZoneDataFiles
 libcore.util.ZoneInfo
+libcore.util.ZoneInfo$CheckedArithmeticException
+libcore.util.ZoneInfo$OffsetInterval
+libcore.util.ZoneInfo$WallTime
 libcore.util.ZoneInfoDB
 libcore.util.ZoneInfoDB$TzData
 libcore.util.ZoneInfoDB$TzData$1
+org.apache.commons.logging.Log
+org.apache.commons.logging.LogFactory
+org.apache.commons.logging.impl.Jdk14Logger
+org.apache.commons.logging.impl.WeakHashtable
 org.apache.harmony.dalvik.NativeTestTarget
 org.apache.harmony.dalvik.ddmc.Chunk
 org.apache.harmony.dalvik.ddmc.ChunkHandler
@@ -3904,21 +4293,62 @@
 org.apache.harmony.xml.ExpatParser
 org.apache.http.Header
 org.apache.http.HttpEntity
-org.apache.http.HttpEntityEnclosingRequest
+org.apache.http.HttpException
+org.apache.http.HttpHost
 org.apache.http.HttpMessage
 org.apache.http.HttpRequest
+org.apache.http.HttpRequestInterceptor
 org.apache.http.HttpResponse
+org.apache.http.ProtocolException
 org.apache.http.ProtocolVersion
 org.apache.http.StatusLine
 org.apache.http.client.HttpClient
+org.apache.http.client.ResponseHandler
 org.apache.http.client.methods.HttpUriRequest
+org.apache.http.client.params.HttpClientParams
+org.apache.http.conn.ClientConnectionManager
+org.apache.http.conn.ClientConnectionOperator
+org.apache.http.conn.ClientConnectionRequest
 org.apache.http.conn.ConnectTimeoutException
+org.apache.http.conn.ConnectionReleaseTrigger
+org.apache.http.conn.params.ConnManagerPNames
+org.apache.http.conn.params.ConnManagerParams
+org.apache.http.conn.params.ConnManagerParams$1
+org.apache.http.conn.params.ConnPerRoute
+org.apache.http.conn.scheme.LayeredSocketFactory
+org.apache.http.conn.scheme.PlainSocketFactory
+org.apache.http.conn.scheme.Scheme
+org.apache.http.conn.scheme.SchemeRegistry
+org.apache.http.conn.scheme.SocketFactory
+org.apache.http.conn.ssl.AbstractVerifier
+org.apache.http.conn.ssl.AllowAllHostnameVerifier
+org.apache.http.conn.ssl.BrowserCompatHostnameVerifier
+org.apache.http.conn.ssl.SSLSocketFactory
+org.apache.http.conn.ssl.StrictHostnameVerifier
+org.apache.http.conn.ssl.X509HostnameVerifier
 org.apache.http.entity.AbstractHttpEntity
+org.apache.http.impl.client.AbstractHttpClient
+org.apache.http.impl.client.DefaultHttpClient
+org.apache.http.impl.conn.DefaultClientConnectionOperator
+org.apache.http.impl.conn.IdleConnectionHandler
+org.apache.http.impl.conn.tsccm.AbstractConnPool
+org.apache.http.impl.conn.tsccm.ConnPoolByRoute
+org.apache.http.impl.conn.tsccm.RefQueueHandler
+org.apache.http.impl.conn.tsccm.RefQueueWorker
+org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
 org.apache.http.message.AbstractHttpMessage
 org.apache.http.message.BasicHeader
 org.apache.http.message.BasicHttpResponse
 org.apache.http.message.BasicStatusLine
 org.apache.http.message.HeaderGroup
+org.apache.http.params.AbstractHttpParams
+org.apache.http.params.BasicHttpParams
+org.apache.http.params.CoreConnectionPNames
+org.apache.http.params.CoreProtocolPNames
+org.apache.http.params.HttpConnectionParams
+org.apache.http.params.HttpParams
+org.apache.http.params.HttpProtocolParams
+org.apache.http.protocol.HttpContext
 org.ccil.cowan.tagsoup.AttributesImpl
 org.ccil.cowan.tagsoup.AutoDetector
 org.ccil.cowan.tagsoup.Element
@@ -3942,12 +4372,24 @@
 org.kxml2.io.KXmlParser
 org.kxml2.io.KXmlParser$ValueContext
 org.xml.sax.Attributes
+org.xml.sax.ContentHandler
+org.xml.sax.DTDHandler
+org.xml.sax.EntityResolver
+org.xml.sax.ErrorHandler
+org.xml.sax.InputSource
+org.xml.sax.Locator
 org.xml.sax.SAXException
+org.xml.sax.SAXNotRecognizedException
+org.xml.sax.SAXNotSupportedException
+org.xml.sax.XMLReader
+org.xml.sax.helpers.DefaultHandler
 org.xmlpull.v1.XmlPullParser
 org.xmlpull.v1.XmlPullParserException
 org.xmlpull.v1.XmlSerializer
 sun.invoke.util.BytecodeDescriptor
+sun.invoke.util.VerifyAccess
 sun.invoke.util.Wrapper
+sun.invoke.util.Wrapper$Format
 sun.misc.Cleaner
 sun.misc.CompoundEnumeration
 sun.misc.FDBigInteger
@@ -3984,7 +4426,6 @@
 sun.nio.ch.DatagramChannelImpl
 sun.nio.ch.DatagramDispatcher
 sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
 sun.nio.ch.FileChannelImpl
 sun.nio.ch.FileChannelImpl$Unmapper
 sun.nio.ch.FileDispatcher
@@ -4004,6 +4445,10 @@
 sun.nio.ch.SharedFileLockTable
 sun.nio.ch.SharedFileLockTable$FileLockReference
 sun.nio.ch.SocketChannelImpl
+sun.nio.ch.Util
+sun.nio.ch.Util$1
+sun.nio.ch.Util$BufferCache
+sun.nio.cs.ArrayDecoder
 sun.nio.cs.ArrayEncoder
 sun.nio.cs.StreamDecoder
 sun.nio.cs.StreamEncoder
@@ -4037,14 +4482,15 @@
 sun.security.provider.certpath.PKIXMasterCertPathValidator
 sun.security.provider.certpath.PolicyChecker
 sun.security.provider.certpath.PolicyNodeImpl
-sun.security.util.-$Lambda$179$Kli5xKA4dAwmFO1sy_hpNWmbfH4
 sun.security.util.AbstractAlgorithmConstraints
+sun.security.util.AbstractAlgorithmConstraints$1
 sun.security.util.AlgorithmDecomposer
 sun.security.util.BitArray
 sun.security.util.ByteArrayLexOrder
 sun.security.util.ByteArrayTagOrder
 sun.security.util.Cache
 sun.security.util.Cache$EqualByteArray
+sun.security.util.CertConstraintParameters
 sun.security.util.Debug
 sun.security.util.DerEncoder
 sun.security.util.DerIndefLenConverter
@@ -4053,9 +4499,10 @@
 sun.security.util.DerOutputStream
 sun.security.util.DerValue
 sun.security.util.DisabledAlgorithmConstraints
+sun.security.util.DisabledAlgorithmConstraints$Constraint
+sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator
+sun.security.util.DisabledAlgorithmConstraints$Constraints
 sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraints
 sun.security.util.KeyUtil
 sun.security.util.Length
 sun.security.util.MemoryCache
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 93b5ed5..03f25bf 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -711,10 +711,13 @@
             ContentResolver resolver = mContext.getContentResolver();
             resolver.registerContentObserver(Settings.Secure.getUriFor(
                     Settings.Secure.AUTOFILL_SERVICE), false, this, UserHandle.USER_ALL);
+            resolver.registerContentObserver(Settings.Secure.getUriFor(
+                    Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL);
         }
 
         @Override
         public void onChange(boolean selfChange, Uri uri, int userId) {
+            if (sVerbose) Slog.v(TAG, "onChange(): uri=" + uri + ", userId=" + userId);
             synchronized (mLock) {
                 updateCachedServiceLocked(userId);
             }
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 2cb0bd5..7abaf7f 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -51,7 +51,6 @@
 import android.service.autofill.FillResponse;
 import android.service.autofill.IAutoFillService;
 import android.text.TextUtils;
-import android.util.ArrayMap;
 import android.util.LocalLog;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -99,6 +98,12 @@
      */
     private boolean mDisabled;
 
+    /**
+     * Caches whether the setup completed for the current user.
+     */
+    @GuardedBy("mLock")
+    private boolean mSetupComplete;
+
     private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
         switch (msg.what) {
             case MSG_SERVICE_SAVE:
@@ -171,6 +176,12 @@
         }
     }
 
+    private boolean isSetupCompletedLocked() {
+        final String setupComplete = Settings.Secure.getStringForUser(
+                mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, mUserId);
+        return "1".equals(setupComplete);
+    }
+
     private String getComponentNameFromSettings() {
         return Settings.Secure.getStringForUser(
                 mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, mUserId);
@@ -178,6 +189,12 @@
 
     void updateLocked(boolean disabled) {
         final boolean wasEnabled = isEnabled();
+        if (sVerbose) {
+            Slog.v(TAG, "updateLocked(u=" + mUserId + "): wasEnabled=" + wasEnabled
+                    + ", mSetupComplete= " + mSetupComplete
+                    + ", disabled=" + disabled + ", mDisabled=" + mDisabled);
+        }
+        mSetupComplete = isSetupCompletedLocked();
         mDisabled = disabled;
         ComponentName serviceComponent = null;
         ServiceInfo serviceInfo = null;
@@ -199,8 +216,9 @@
             } else {
                 mInfo = null;
             }
-            if (wasEnabled != isEnabled()) {
-                if (!isEnabled()) {
+            final boolean isEnabled = isEnabled();
+            if (wasEnabled != isEnabled) {
+                if (!isEnabled) {
                     final int sessionCount = mSessions.size();
                     for (int i = sessionCount - 1; i >= 0; i--) {
                         final Session session = mSessions.valueAt(i);
@@ -534,6 +552,7 @@
         pw.print(prefix); pw.print("Default component: ");
             pw.println(mContext.getString(R.string.config_defaultAutofillService));
         pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
+        pw.print(prefix); pw.print("Setup complete: "); pw.println(mSetupComplete);
         pw.print(prefix); pw.print("Last prune: "); pw.println(mLastPrune);
 
         final int size = mSessions.size();
@@ -617,7 +636,7 @@
     }
 
     boolean isEnabled() {
-        return mInfo != null && !mDisabled;
+        return mSetupComplete && mInfo != null && !mDisabled;
     }
 
     @Override
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index f3ca075..bad8dcf 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -682,7 +682,6 @@
                 removeSelf();
                 return;
             }
-            resetViewStatesLocked(dataset, ViewState.STATE_WAITING_DATASET_AUTH);
         }
 
         final Parcelable result = data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT);
@@ -1362,7 +1361,6 @@
             }
 
             // ...or handle authentication.
-            // TODO(b/37424539): proper implementation
             mService.setDatasetAuthenticationSelected(dataset.getId());
             setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH, false);
             final Intent fillInIntent = createAuthFillInIntent(
@@ -1455,21 +1453,36 @@
             }
             try {
                 if (sDebug) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
+
                 // Skip null values as a null values means no change
                 final int entryCount = dataset.getFieldIds().size();
                 final List<AutofillId> ids = new ArrayList<>(entryCount);
                 final List<AutofillValue> values = new ArrayList<>(entryCount);
+                boolean waitingDatasetAuth = false;
                 for (int i = 0; i < entryCount; i++) {
                     if (dataset.getFieldValues().get(i) == null) {
                         continue;
                     }
-                    ids.add(dataset.getFieldIds().get(i));
+                    final AutofillId viewId = dataset.getFieldIds().get(i);
+                    ids.add(viewId);
                     values.add(dataset.getFieldValues().get(i));
+                    final ViewState viewState = mViewStates.get(viewId);
+                    if (viewState != null
+                            && (viewState.getState() & ViewState.STATE_WAITING_DATASET_AUTH) != 0) {
+                        if (sVerbose) {
+                            Slog.v(TAG, "autofillApp(): view " + viewId + " waiting auth");
+                        }
+                        waitingDatasetAuth = true;
+                        viewState.resetState(ViewState.STATE_WAITING_DATASET_AUTH);
+                    }
                 }
                 if (!ids.isEmpty()) {
+                    if (waitingDatasetAuth) {
+                        hideFillUiIfOwnedByMe();
+                    }
                     mClient.autofill(id, ids, values);
+                    setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
                 }
-                setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
             } catch (RemoteException e) {
                 Slog.w(TAG, "Error autofilling activity: " + e);
             }
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index f87fa19..8a52c96 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -174,7 +174,7 @@
      * fill UI is ready to be displayed (i.e. when response and bounds are set).
      */
     void maybeCallOnFillReady() {
-        if ((mState & (STATE_AUTOFILLED | STATE_WAITING_DATASET_AUTH)) != 0) {
+        if ((mState & STATE_AUTOFILLED) != 0) {
             if (sDebug) Slog.d(TAG, "Ignoring UI for " + id + " on " + getStateAsString());
             return;
         }
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7ae4138..4b12bc4 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -175,6 +175,9 @@
         implements PendingIntent.OnFinished {
     private static final String TAG = ConnectivityService.class.getSimpleName();
 
+    public static final String DIAG_ARG = "--diag";
+    public static final String SHORT_ARG = "--short";
+
     private static final boolean DBG = true;
     private static final boolean VDBG = false;
 
@@ -1852,7 +1855,7 @@
         final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");
         if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
 
-        if (argsContain(args, "--diag")) {
+        if (argsContain(args, DIAG_ARG)) {
             dumpNetworkDiagnostics(pw);
             return;
         }
@@ -1938,7 +1941,7 @@
             pw.decreaseIndent();
         }
 
-        if (argsContain(args, "--short") == false) {
+        if (argsContain(args, SHORT_ARG) == false) {
             pw.println();
             synchronized (mValidationLogs) {
                 pw.println("mValidationLogs (most recent first):");
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 9e054c3..3460419 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1727,7 +1727,7 @@
                             record.mReceiver.mIdentity.mUid,
                             record.mReceiver.mIdentity.mPackageName,
                             record.mReceiver.mAllowedResolutionLevel)) {
-                        LocationRequest locationRequest = record.mRequest;
+                        LocationRequest locationRequest = record.mRealRequest;
                         long interval = locationRequest.getInterval();
 
                         if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
@@ -1740,6 +1740,7 @@
                             }
                         }
 
+                        record.mRequest = locationRequest;
                         providerRequest.locationRequests.add(locationRequest);
                         if (interval < providerRequest.interval) {
                             providerRequest.reportLocation = true;
@@ -1832,7 +1833,8 @@
 
     private class UpdateRecord {
         final String mProvider;
-        final LocationRequest mRequest;
+        final LocationRequest mRealRequest;  // original request from client
+        LocationRequest mRequest;  // possibly throttled version of the request
         final Receiver mReceiver;
         boolean mIsForegroundUid;
         Location mLastFixBroadcast;
@@ -1843,6 +1845,7 @@
          */
         UpdateRecord(String provider, LocationRequest request, Receiver receiver) {
             mProvider = provider;
+            mRealRequest = request;
             mRequest = request;
             mReceiver = receiver;
             mIsForegroundUid = isImportanceForeground(
@@ -1892,7 +1895,7 @@
         public String toString() {
             return "UpdateRecord[" + mProvider + " " + mReceiver.mIdentity.mPackageName
                     + "(" + mReceiver.mIdentity.mUid + (mIsForegroundUid ? " foreground" : " background")
-                    + ")" + " " + mRequest + "]";
+                    + ")" + " " + mRealRequest + "]";
         }
     }
 
@@ -2533,7 +2536,7 @@
         }
 
         // Check whether sufficient time has passed
-        long minTime = record.mRequest.getFastestInterval();
+        long minTime = record.mRealRequest.getFastestInterval();
         long delta = (loc.getElapsedRealtimeNanos() - lastLoc.getElapsedRealtimeNanos())
                 / NANOS_PER_MILLI;
         if (delta < minTime - MAX_PROVIDER_SCHEDULING_JITTER_MS) {
@@ -2541,7 +2544,7 @@
         }
 
         // Check whether sufficient distance has been traveled
-        double minDistance = record.mRequest.getSmallestDisplacement();
+        double minDistance = record.mRealRequest.getSmallestDisplacement();
         if (minDistance > 0.0) {
             if (loc.distanceTo(lastLoc) <= minDistance) {
                 return false;
@@ -2549,12 +2552,12 @@
         }
 
         // Check whether sufficient number of udpates is left
-        if (record.mRequest.getNumUpdates() <= 0) {
+        if (record.mRealRequest.getNumUpdates() <= 0) {
             return false;
         }
 
         // Check whether the expiry date has passed
-        return record.mRequest.getExpireAt() >= now;
+        return record.mRealRequest.getExpireAt() >= now;
     }
 
     private void handleLocationChangedLocked(Location location, boolean passive) {
@@ -2672,7 +2675,7 @@
                         Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
                         receiverDead = true;
                     }
-                    r.mRequest.decrementNumUpdates();
+                    r.mRealRequest.decrementNumUpdates();
                 }
             }
 
@@ -2688,7 +2691,7 @@
             }
 
             // track expired records
-            if (r.mRequest.getNumUpdates() <= 0 || r.mRequest.getExpireAt() < now) {
+            if (r.mRealRequest.getNumUpdates() <= 0 || r.mRealRequest.getExpireAt() < now) {
                 if (deadUpdateRecords == null) {
                     deadUpdateRecords = new ArrayList<>();
                 }
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 9fa6624..03e9dd2 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -222,7 +222,9 @@
         long[] clickEffectTimings = getLongIntArray(context.getResources(),
                 com.android.internal.R.array.config_virtualKeyVibePattern);
         VibrationEffect clickEffect;
-        if (clickEffectTimings.length == 1) {
+        if (clickEffectTimings.length == 0) {
+            clickEffect = null;
+        } else if (clickEffectTimings.length == 1) {
             clickEffect = VibrationEffect.createOneShot(
                     clickEffectTimings[0], VibrationEffect.DEFAULT_AMPLITUDE);
         } else {
@@ -232,7 +234,6 @@
                 new long[] {0, 30, 100, 30} /*timings*/, -1);
 
         mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect };
-
     }
 
     public void systemReady() {
@@ -701,7 +702,7 @@
                 }
             }
             final int id = prebaked.getId();
-            if (id < 0 || id >= mFallbackEffects.length) {
+            if (id < 0 || id >= mFallbackEffects.length || mFallbackEffects[id] == null) {
                 Slog.w(TAG, "Failed to play prebaked effect, no fallback");
                 return 0;
             }
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index bb6637d..fbab26a 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -10589,8 +10589,7 @@
                                 mStackSupervisor.getStack(PINNED_STACK_ID);
                         if (pinnedStack != null) {
                             pinnedStack.animateResizePinnedStack(null /* sourceHintBounds */,
-                                    destBounds, animationDuration,
-                                    false /* schedulePipModeChangedOnAnimationEnd */);
+                                    destBounds, animationDuration, false /* fromFullscreen */);
                         }
                     } else {
                         throw new IllegalArgumentException("Stack: " + stackId
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 7df9b69..93e1ab4 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -4042,6 +4042,9 @@
                 mStackSupervisor.moveHomeStackTaskToTop(reason);
             }
 
+            // The following block can be executed multiple times if there is more than one overlay.
+            // {@link ActivityStackSupervisor#removeTaskByIdLocked} handles this by reverse lookup
+            // of the task by id and exiting early if not found.
             if (onlyHasTaskOverlays) {
                 // When destroying a task, tell the supervisor to remove it so that any activity it
                 // has can be cleaned up correctly. This is currently the only place where we remove
@@ -4053,7 +4056,12 @@
                 mStackSupervisor.removeTaskByIdLocked(task.taskId, false /* killProcess */,
                         !REMOVE_FROM_RECENTS, PAUSE_IMMEDIATELY);
             }
-            removeTask(task, reason, REMOVE_TASK_MODE_DESTROYING);
+
+            // We must keep the task around until all activities are destroyed. The following
+            // statement will only execute once since overlays are also considered activities.
+            if (lastActivity) {
+                removeTask(task, reason, REMOVE_TASK_MODE_DESTROYING);
+            }
         }
         cleanUpActivityServicesLocked(r);
         r.removeUriPermissionsLocked();
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 79ea7ba..e180aef 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2986,18 +2986,21 @@
             mWindowManager.continueSurfaceLayout();
         }
 
-        // The task might have already been running and its visibility needs to be synchronized
-        // with the visibility of the stack / windows.
+        // Calculate the default bounds (don't use existing stack bounds as we may have just created
+        // the stack, and schedule the start of the animation into PiP (the bounds animator that
+        // is triggered by this is posted on another thread)
+        final Rect destBounds = stack.getPictureInPictureBounds(aspectRatio,
+                false /* useExistingStackBounds */);
+        stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
+                true /* fromFullscreen */);
+
+        // Update the visibility of all activities after the they have been reparented to the new
+        // stack.  This MUST run after the animation above is scheduled to ensure that the windows
+        // drawn signal is scheduled after the bounds animation start call on the bounds animator
+        // thread.
         ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
         resumeFocusedStackTopActivityLocked();
 
-        // Calculate the default bounds (don't use existing stack bounds as we may have just created
-        // the stack
-        final Rect destBounds = stack.getPictureInPictureBounds(aspectRatio,
-                false /* useExistingStackBounds */);
-
-        stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
-                true /* schedulePipModeChangedOnAnimationEnd */);
         mService.mTaskChangeNotificationController.notifyActivityPinned(r.packageName,
                 r.getTask().taskId);
     }
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 34cdb54..702bf92 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -50,12 +50,12 @@
     }
 
     void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
-            boolean schedulePipModeChangedOnAnimationEnd) {
+            boolean fromFullscreen) {
         if (skipResizeAnimation(toBounds == null /* toFullscreen */)) {
             mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
         } else {
             getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds,
-                    animationDuration, schedulePipModeChangedOnAnimationEnd);
+                    animationDuration, fromFullscreen);
         }
     }
 
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index b222e3a..53c7f84 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -302,6 +302,10 @@
                     pw.print(" hasAboveClient="); pw.print(hasAboveClient);
                     pw.print(" treatLikeActivity="); pw.println(treatLikeActivity);
         }
+        if (hasTopUi || hasOverlayUi) {
+            pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi);
+                    pw.print(" hasOverlayUi="); pw.println(hasOverlayUi);
+        }
         if (foregroundServices || forcingToImportant != null) {
             pw.print(prefix); pw.print("foregroundServices="); pw.print(foregroundServices);
                     pw.print(" forcingToImportant="); pw.println(forcingToImportant);
@@ -428,12 +432,6 @@
                 pw.print(prefix); pw.print("  - "); pw.println(receivers.valueAt(i));
             }
         }
-        if (hasTopUi) {
-            pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi);
-        }
-        if (hasOverlayUi) {
-            pw.print(prefix); pw.print("hasOverlayUi="); pw.print(hasOverlayUi);
-        }
     }
 
     ProcessRecord(BatteryStatsImpl _batteryStats, ApplicationInfo _info,
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 81a1458..901092e 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -20,6 +20,7 @@
 import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
 import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
 import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
+import static com.android.server.ConnectivityService.SHORT_ARG;
 
 import android.app.Notification;
 import android.app.NotificationManager;
@@ -47,6 +48,7 @@
 import android.net.NetworkState;
 import android.net.NetworkUtils;
 import android.net.RouteInfo;
+import android.net.util.SharedLog;
 import android.net.wifi.WifiManager;
 import android.os.Binder;
 import android.os.Bundle;
@@ -62,7 +64,6 @@
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
-import android.util.LocalLog;
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -147,9 +148,7 @@
         }
     }
 
-    private final static int MAX_LOG_RECORDS = 500;
-
-    private final LocalLog mLocalLog = new LocalLog(MAX_LOG_RECORDS);
+    private final SharedLog mLog = new SharedLog(TAG);
 
     // used to synchronize public access to members
     private final Object mPublicSync;
@@ -180,7 +179,7 @@
     public Tethering(Context context, INetworkManagementService nmService,
             INetworkStatsService statsService, INetworkPolicyManager policyManager,
             Looper looper, MockableSystemProperties systemProperties) {
-        mLocalLog.log("CONSTRUCTED");
+        mLog.mark("constructed");
         mContext = context;
         mNMService = nmService;
         mStatsService = statsService;
@@ -195,9 +194,9 @@
         mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
         mTetherMasterSM.start();
 
-        mOffloadController = new OffloadController(mTetherMasterSM.getHandler());
+        mOffloadController = new OffloadController(mTetherMasterSM.getHandler(), mLog);
         mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
-                mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
+                mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog);
         mForwardedDownstreams = new HashSet<>();
 
         mStateReceiver = new StateReceiver();
@@ -1094,7 +1093,7 @@
             addState(mSetDnsForwardersErrorState);
 
             mNotifyList = new ArrayList<>();
-            mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList);
+            mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mLog);
             setInitialState(mInitialState);
         }
 
@@ -1141,7 +1140,7 @@
                 try {
                     mNMService.setIpForwardingEnabled(true);
                 } catch (Exception e) {
-                    mLocalLog.log("ERROR " + e);
+                    mLog.e(e);
                     transitionTo(mSetIpForwardingEnabledErrorState);
                     return false;
                 }
@@ -1154,12 +1153,12 @@
                         mNMService.stopTethering();
                         mNMService.startTethering(cfg.dhcpRanges);
                     } catch (Exception ee) {
-                        mLocalLog.log("ERROR " + ee);
+                        mLog.e(ee);
                         transitionTo(mStartTetheringErrorState);
                         return false;
                     }
                 }
-                mLocalLog.log("SET master tether settings: ON");
+                mLog.log("SET master tether settings: ON");
                 return true;
             }
 
@@ -1167,19 +1166,19 @@
                 try {
                     mNMService.stopTethering();
                 } catch (Exception e) {
-                    mLocalLog.log("ERROR " + e);
+                    mLog.e(e);
                     transitionTo(mStopTetheringErrorState);
                     return false;
                 }
                 try {
                     mNMService.setIpForwardingEnabled(false);
                 } catch (Exception e) {
-                    mLocalLog.log("ERROR " + e);
+                    mLog.e(e);
                     transitionTo(mSetIpForwardingDisabledErrorState);
                     return false;
                 }
                 transitionTo(mInitialState);
-                mLocalLog.log("SET master tether settings: OFF");
+                mLog.log("SET master tether settings: OFF");
                 return true;
             }
 
@@ -1305,13 +1304,13 @@
                 }
                 try {
                     mNMService.setDnsForwarders(network, dnsServers);
-                    mLocalLog.log(String.format(
-                            "SET DNS forwarders: network=%s dnsServers=[%s]",
+                    mLog.log(String.format(
+                            "SET DNS forwarders: network=%s dnsServers=%s",
                             network, Arrays.toString(dnsServers)));
                 } catch (Exception e) {
                     // TODO: Investigate how this can fail and what exactly
                     // happens if/when such failures occur.
-                    mLocalLog.log("ERROR setting DNS forwarders failed, " + e);
+                    mLog.e("setting DNS forwarders failed, " + e);
                     transitionTo(mSetDnsForwardersErrorState);
                 }
             }
@@ -1788,12 +1787,23 @@
 
         pw.println("Log:");
         pw.increaseIndent();
-        mLocalLog.readOnlyLocalLog().dump(fd, pw, args);
+        if (argsContain(args, SHORT_ARG)) {
+            pw.println("<log removed for brevity>");
+        } else {
+            mLog.dump(fd, pw, args);
+        }
         pw.decreaseIndent();
 
         pw.decreaseIndent();
     }
 
+    private static boolean argsContain(String[] args, String target) {
+        for (String arg : args) {
+            if (arg.equals(target)) return true;
+        }
+        return false;
+    }
+
     @Override
     public void notifyInterfaceStateChange(String iface, TetherInterfaceStateMachine who,
                                            int state, int error) {
@@ -1807,8 +1817,7 @@
             }
         }
 
-        mLocalLog.log(String.format("OBSERVED iface=%s state=%s error=%s",
-                iface, state, error));
+        mLog.log(String.format("OBSERVED iface=%s state=%s error=%s", iface, state, error));
 
         try {
             // Notify that we're tethering (or not) this interface.
@@ -1846,8 +1855,8 @@
     private void trackNewTetherableInterface(String iface, int interfaceType) {
         TetherState tetherState;
         tetherState = new TetherState(new TetherInterfaceStateMachine(iface, mLooper,
-                interfaceType, mNMService, mStatsService, this,
-                new IPv6TetheringInterfaceServices(iface, mNMService)));
+                interfaceType, mLog, mNMService, mStatsService, this,
+                new IPv6TetheringInterfaceServices(iface, mNMService, mLog)));
         mTetherStates.put(iface, tetherState);
         tetherState.stateMachine.start();
     }
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
index 2485654..518f6c1 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
@@ -25,6 +25,7 @@
 import android.net.NetworkState;
 import android.net.RouteInfo;
 import android.net.util.NetworkConstants;
+import android.net.util.SharedLog;
 import android.util.Log;
 
 import java.net.Inet6Address;
@@ -64,6 +65,7 @@
     }
 
     private final ArrayList<TetherInterfaceStateMachine> mNotifyList;
+    private final SharedLog mLog;
     // NOTE: mActiveDownstreams is a list and not a hash data structure because
     // we keep active downstreams in arrival order.  This is done so /64s can
     // be parceled out on a "first come, first served" basis and a /64 used by
@@ -74,8 +76,10 @@
     private short mNextSubnetId;
     private NetworkState mUpstreamNetworkState;
 
-    public IPv6TetheringCoordinator(ArrayList<TetherInterfaceStateMachine> notifyList) {
+    public IPv6TetheringCoordinator(ArrayList<TetherInterfaceStateMachine> notifyList,
+                                    SharedLog log) {
         mNotifyList = notifyList;
+        mLog = log.forSubComponent(TAG);
         mActiveDownstreams = new LinkedList<>();
         mUniqueLocalPrefix = generateUniqueLocalPrefix();
         mNextSubnetId = 0;
@@ -115,7 +119,7 @@
         if (VDBG) {
             Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns));
         }
-        if (!canTetherIPv6(ns)) {
+        if (!canTetherIPv6(ns, mLog)) {
             stopIPv6TetheringOnAllInterfaces();
             setUpstreamNetworkState(null);
             return;
@@ -150,9 +154,7 @@
                     null);
         }
 
-        if (DBG) {
-            Log.d(TAG, "setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
-        }
+        mLog.log("setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
     }
 
     private void updateIPv6TetheringInterfaces() {
@@ -206,7 +208,7 @@
         return null;
     }
 
-    private static boolean canTetherIPv6(NetworkState ns) {
+    private static boolean canTetherIPv6(NetworkState ns, SharedLog sharedLog) {
         // Broadly speaking:
         //
         //     [1] does the upstream have an IPv6 default route?
@@ -260,13 +262,11 @@
 
         final boolean outcome = canTether && supportedConfiguration;
 
-        if (VDBG) {
-            if (ns == null) {
-                Log.d(TAG, "No available upstream.");
-            } else {
-                Log.d(TAG, String.format("IPv6 tethering is %s for upstream: %s",
-                        (outcome ? "available" : "not available"), toDebugString(ns)));
-            }
+        if (ns == null) {
+            sharedLog.log("No available upstream.");
+        } else {
+            sharedLog.log(String.format("IPv6 tethering is %s for upstream: %s",
+                    (outcome ? "available" : "not available"), toDebugString(ns)));
         }
 
         return outcome;
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
index c6a7925..adf4af8 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
@@ -28,10 +28,10 @@
 import android.net.ip.RouterAdvertisementDaemon;
 import android.net.ip.RouterAdvertisementDaemon.RaParams;
 import android.net.util.NetdService;
+import android.net.util.SharedLog;
 import android.os.INetworkManagementService;
 import android.os.ServiceSpecificException;
 import android.os.RemoteException;
-import android.util.Log;
 import android.util.Slog;
 
 import java.net.Inet6Address;
@@ -54,6 +54,7 @@
 
     private final String mIfName;
     private final INetworkManagementService mNMService;
+    private final SharedLog mLog;
 
     private NetworkInterface mNetworkInterface;
     private byte[] mHwAddr;
@@ -61,9 +62,11 @@
     private RouterAdvertisementDaemon mRaDaemon;
     private RaParams mLastRaParams;
 
-    public IPv6TetheringInterfaceServices(String ifname, INetworkManagementService nms) {
+    public IPv6TetheringInterfaceServices(
+            String ifname, INetworkManagementService nms, SharedLog log) {
         mIfName = ifname;
         mNMService = nms;
+        mLog = log.forSubComponent(mIfName);
     }
 
     public boolean start() {
@@ -72,12 +75,12 @@
         try {
             mNetworkInterface = NetworkInterface.getByName(mIfName);
         } catch (SocketException e) {
-            Log.e(TAG, "Error looking up NetworkInterfaces for " + mIfName, e);
+            mLog.e("Error looking up NetworkInterfaces: " + e);
             stop();
             return false;
         }
         if (mNetworkInterface == null) {
-            Log.e(TAG, "Failed to find NetworkInterface for " + mIfName);
+            mLog.e("Failed to find NetworkInterface");
             stop();
             return false;
         }
@@ -85,7 +88,7 @@
         try {
             mHwAddr = mNetworkInterface.getHardwareAddress();
         } catch (SocketException e) {
-            Log.e(TAG, "Failed to find hardware address for " + mIfName, e);
+            mLog.e("Failed to find hardware address: " + e);
             stop();
             return false;
         }
@@ -161,11 +164,11 @@
             try {
                 final int removalFailures = mNMService.removeRoutesFromLocalNetwork(toBeRemoved);
                 if (removalFailures > 0) {
-                    Log.e(TAG, String.format("Failed to remove %d IPv6 routes from local table.",
+                    mLog.e(String.format("Failed to remove %d IPv6 routes from local table.",
                             removalFailures));
                 }
             } catch (RemoteException e) {
-                Log.e(TAG, "Failed to remove IPv6 routes from local table: ", e);
+                mLog.e("Failed to remove IPv6 routes from local table: " + e);
             }
         }
 
@@ -195,7 +198,7 @@
                     // error (EEXIST is silently ignored).
                     mNMService.addInterfaceToLocalNetwork(mIfName, toBeAdded);
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Failed to add IPv6 routes to local table: ", e);
+                    mLog.e("Failed to add IPv6 routes to local table: " + e);
                 }
             }
         }
@@ -206,7 +209,7 @@
         final INetd netd = NetdService.getInstance();
         if (netd == null) {
             if (newDnses != null) newDnses.clear();
-            Log.e(TAG, "No netd service instance available; not setting local IPv6 addresses");
+            mLog.e("No netd service instance available; not setting local IPv6 addresses");
             return;
         }
 
@@ -217,7 +220,7 @@
                 try {
                     netd.interfaceDelAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH);
                 } catch (ServiceSpecificException | RemoteException e) {
-                    Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e);
+                    mLog.e("Failed to remove local dns IP " + dnsString + ": " + e);
                 }
             }
         }
@@ -234,7 +237,7 @@
                 try {
                     netd.interfaceAddAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH);
                 } catch (ServiceSpecificException | RemoteException e) {
-                    Log.e(TAG, "Failed to add local dns IP: " + dnsString, e);
+                    mLog.e("Failed to add local dns IP " + dnsString + ": " + e);
                     newDnses.remove(dns);
                 }
             }
@@ -243,7 +246,7 @@
         try {
             netd.tetherApplyDnsInterfaces();
         } catch (ServiceSpecificException | RemoteException e) {
-            Log.e(TAG, "Failed to update local DNS caching server");
+            mLog.e("Failed to update local DNS caching server");
             if (newDnses != null) newDnses.clear();
         }
     }
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 220e751..8f21d99 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
@@ -18,7 +18,7 @@
 
 import android.net.LinkProperties;
 import android.os.Handler;
-import android.util.Log;
+import android.net.util.SharedLog;
 
 /**
  * A wrapper around hardware offload interface.
@@ -29,16 +29,18 @@
     private static final String TAG = OffloadController.class.getSimpleName();
 
     private final Handler mHandler;
+    private final SharedLog mLog;
     private LinkProperties mUpstreamLinkProperties;
 
-    public OffloadController(Handler h) {
+    public OffloadController(Handler h, SharedLog log) {
         mHandler = h;
+        mLog = log.forSubComponent(TAG);
     }
 
     public void start() {
         // TODO: initOffload() and configure callbacks to be handled on our
         // preferred Handler.
-        Log.d(TAG, "tethering offload not supported");
+        mLog.i("tethering offload not supported");
     }
 
     public void stop() {
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
index d3cfd87..4a1d405 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
@@ -22,6 +22,7 @@
 import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.net.NetworkUtils;
+import android.net.util.SharedLog;
 import android.os.INetworkManagementService;
 import android.os.Looper;
 import android.os.Message;
@@ -82,6 +83,7 @@
     private final State mTetheredState;
     private final State mUnavailableState;
 
+    private final SharedLog mLog;
     private final INetworkManagementService mNMService;
     private final INetworkStatsService mStatsService;
     private final IControlsTethering mTetherController;
@@ -93,10 +95,12 @@
     private int mLastError;
     private String mMyUpstreamIfaceName;  // may change over time
 
-    public TetherInterfaceStateMachine(String ifaceName, Looper looper, int interfaceType,
-                    INetworkManagementService nMService, INetworkStatsService statsService,
-                    IControlsTethering tetherController, IPv6TetheringInterfaceServices ipv6Svc) {
+    public TetherInterfaceStateMachine(
+            String ifaceName, Looper looper, int interfaceType, SharedLog log,
+            INetworkManagementService nMService, INetworkStatsService statsService,
+            IControlsTethering tetherController, IPv6TetheringInterfaceServices ipv6Svc) {
         super(ifaceName, looper);
+        mLog = log.forSubComponent(ifaceName);
         mNMService = nMService;
         mStatsService = statsService;
         mTetherController = tetherController;
@@ -162,7 +166,7 @@
                 mNMService.setInterfaceConfig(mIfaceName, ifcg);
             }
         } catch (Exception e) {
-            Log.e(TAG, "Error configuring interface " + mIfaceName, e);
+            mLog.e("Error configuring interface " + e);
             return false;
         }
 
@@ -203,7 +207,7 @@
                             transitionTo(mTetheredState);
                             break;
                         default:
-                            Log.e(TAG, "Invalid tethering interface serving state specified.");
+                            mLog.e("Invalid tethering interface serving state specified.");
                     }
                     break;
                 case CMD_INTERFACE_DOWN:
@@ -232,13 +236,13 @@
             try {
                 mNMService.tetherInterface(mIfaceName);
             } catch (Exception e) {
-                Log.e(TAG, "Error Tethering: " + e.toString());
+                mLog.e("Error Tethering: " + e);
                 mLastError = ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR;
                 return;
             }
 
             if (!mIPv6TetherSvc.start()) {
-                Log.e(TAG, "Failed to start IPv6TetheringInterfaceServices");
+                mLog.e("Failed to start IPv6TetheringInterfaceServices");
                 // TODO: Make this a fatal error once Bluetooth IPv6 is sorted.
                 return;
             }
@@ -255,7 +259,7 @@
                 mNMService.untetherInterface(mIfaceName);
             } catch (Exception e) {
                 mLastError = ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR;
-                Log.e(TAG, "Failed to untether interface: " + e.toString());
+                mLog.e("Failed to untether interface: " + e);
             }
 
             configureIfaceIp(false);
@@ -316,7 +320,7 @@
             maybeLogMessage(this, message.what);
             switch (message.what) {
                 case CMD_TETHER_REQUESTED:
-                    Log.e(TAG, "CMD_TETHER_REQUESTED while in local hotspot mode.");
+                    mLog.e("CMD_TETHER_REQUESTED while in local-only hotspot mode.");
                     break;
                 case CMD_TETHER_CONNECTION_CHANGED:
                     // Ignored in local hotspot state.
@@ -389,7 +393,7 @@
             boolean retValue = true;
             switch (message.what) {
                 case CMD_TETHER_REQUESTED:
-                    Log.e(TAG, "CMD_TETHER_REQUESTED while already tethering.");
+                    mLog.e("CMD_TETHER_REQUESTED while already tethering.");
                     break;
                 case CMD_TETHER_CONNECTION_CHANGED:
                     String newUpstreamIfaceName = (String)(message.obj);
@@ -406,7 +410,7 @@
                             mNMService.startInterfaceForwarding(mIfaceName,
                                     newUpstreamIfaceName);
                         } catch (Exception e) {
-                            Log.e(TAG, "Exception enabling Nat: " + e.toString());
+                            mLog.e("Exception enabling NAT: " + e);
                             cleanupUpstreamInterface(newUpstreamIfaceName);
                             mLastError = ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR;
                             transitionTo(mInitialState);
diff --git a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
index 97a2d5e..be71490 100644
--- a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
@@ -29,6 +29,7 @@
 import android.net.NetworkCapabilities;
 import android.net.NetworkRequest;
 import android.net.NetworkState;
+import android.net.util.SharedLog;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -73,6 +74,7 @@
     private static final int CALLBACK_MOBILE_REQUEST = 3;
 
     private final Context mContext;
+    private final SharedLog mLog;
     private final StateMachine mTarget;
     private final Handler mHandler;
     private final int mWhat;
@@ -84,16 +86,18 @@
     private boolean mDunRequired;
     private Network mCurrentDefault;
 
-    public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) {
+    public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what, SharedLog log) {
         mContext = ctx;
         mTarget = tgt;
         mHandler = mTarget.getHandler();
         mWhat = what;
+        mLog = log.forSubComponent(TAG);
     }
 
     @VisibleForTesting
-    public UpstreamNetworkMonitor(StateMachine tgt, int what, ConnectivityManager cm) {
-        this(null, tgt, what);
+    public UpstreamNetworkMonitor(
+            StateMachine tgt, int what, ConnectivityManager cm, SharedLog log) {
+        this(null, tgt, what, log);
         mCM = cm;
     }
 
@@ -136,7 +140,7 @@
 
     public void registerMobileNetworkRequest() {
         if (mMobileNetworkCallback != null) {
-            Log.e(TAG, "registerMobileNetworkRequest() already registered");
+            mLog.e("registerMobileNetworkRequest() already registered");
             return;
         }
 
@@ -156,7 +160,7 @@
         // TODO: Change the timeout from 0 (no onUnavailable callback) to some
         // moderate callback timeout. This might be useful for updating some UI.
         // Additionally, we log a message to aid in any subsequent debugging.
-        Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest);
+        mLog.i("requesting mobile upstream network: " + mobileUpstreamRequest);
 
         cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback, 0, legacyType, mHandler);
     }
diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
index 4fc6ddd..5339bac 100644
--- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
+++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
@@ -41,8 +41,6 @@
     public static final int LOCKOUT_TIMED = 1;
     public static final int LOCKOUT_PERMANENT = 2;
 
-    private boolean mAlreadyCancelled;
-
     public AuthenticationClient(Context context, long halDeviceId, IBinder token,
             IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId,
             boolean restricted, String owner) {
diff --git a/services/core/java/com/android/server/fingerprint/ClientMonitor.java b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
index 492cd61..1a2e144 100644
--- a/services/core/java/com/android/server/fingerprint/ClientMonitor.java
+++ b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
@@ -44,6 +44,7 @@
     private String mOwner;
     private Context mContext;
     private long mHalDeviceId;
+    protected boolean mAlreadyCancelled;
 
     /**
      * @param context context of FingerprintService
diff --git a/services/core/java/com/android/server/fingerprint/EnrollClient.java b/services/core/java/com/android/server/fingerprint/EnrollClient.java
index e1b78a8..6170894 100644
--- a/services/core/java/com/android/server/fingerprint/EnrollClient.java
+++ b/services/core/java/com/android/server/fingerprint/EnrollClient.java
@@ -100,6 +100,10 @@
 
     @Override
     public int stop(boolean initiatedByClient) {
+        if (mAlreadyCancelled) {
+            Slog.w(TAG, "stopEnroll: already cancelled!");
+            return 0;
+        }
         IBiometricsFingerprint daemon = getFingerprintDaemon();
         if (daemon == null) {
             Slog.w(TAG, "stopEnrollment: no fingerprint HAL!");
@@ -117,6 +121,7 @@
         if (initiatedByClient) {
             onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
         }
+        mAlreadyCancelled = true;
         return 0;
     }
 
diff --git a/services/core/java/com/android/server/fingerprint/EnumerateClient.java b/services/core/java/com/android/server/fingerprint/EnumerateClient.java
index 1b8b89c..12827d0 100644
--- a/services/core/java/com/android/server/fingerprint/EnumerateClient.java
+++ b/services/core/java/com/android/server/fingerprint/EnumerateClient.java
@@ -56,6 +56,10 @@
 
     @Override
     public int stop(boolean initiatedByClient) {
+        if (mAlreadyCancelled) {
+            Slog.w(TAG, "stopEnumerate: already cancelled!");
+            return 0;
+        }
         IBiometricsFingerprint daemon = getFingerprintDaemon();
         if (daemon == null) {
             Slog.w(TAG, "stopEnumeration: no fingerprint HAL!");
@@ -77,6 +81,7 @@
         if (initiatedByClient) {
             onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
         }
+        mAlreadyCancelled = true;
         return 0; // success
     }
 
diff --git a/services/core/java/com/android/server/fingerprint/RemovalClient.java b/services/core/java/com/android/server/fingerprint/RemovalClient.java
index 8646107..ffc8488 100644
--- a/services/core/java/com/android/server/fingerprint/RemovalClient.java
+++ b/services/core/java/com/android/server/fingerprint/RemovalClient.java
@@ -59,6 +59,10 @@
 
     @Override
     public int stop(boolean initiatedByClient) {
+        if (mAlreadyCancelled) {
+            Slog.w(TAG, "stopRemove: already cancelled!");
+            return 0;
+        }
         IBiometricsFingerprint daemon = getFingerprintDaemon();
         if (daemon == null) {
             Slog.w(TAG, "stopRemoval: no fingerprint HAL!");
@@ -75,6 +79,7 @@
             Slog.e(TAG, "stopRemoval failed", e);
             return ERROR_ESRCH;
         }
+        mAlreadyCancelled = true;
         return 0; // success
     }
 
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index e07156e..a94ed60 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -129,10 +129,11 @@
                 brightnessMode = mLastBrightnessMode;
             }
 
-            if ((color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS ||
-                    mBrightnessMode != brightnessMode)) {
+            if (!mInitialized || color != mColor || mode != mMode || onMS != mOnMS ||
+                    offMS != mOffMS || mBrightnessMode != brightnessMode) {
                 if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#"
                         + Integer.toHexString(color) + ": brightnessMode=" + brightnessMode);
+                mInitialized = true;
                 mLastColor = mColor;
                 mColor = color;
                 mMode = mode;
@@ -164,6 +165,7 @@
         private int mLastColor;
         private boolean mVrModeEnabled;
         private boolean mUseLowPersistenceForVR;
+        private boolean mInitialized;
     }
 
     public LightsService(Context context) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index cb1742e..e377d57 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -16,6 +16,7 @@
 
 package com.android.server.notification;
 
+import static android.app.NotificationManager.IMPORTANCE_MIN;
 import static android.app.NotificationManager.IMPORTANCE_NONE;
 import static android.content.pm.PackageManager.FEATURE_LEANBACK;
 import static android.content.pm.PackageManager.FEATURE_TELEVISION;
@@ -90,7 +91,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ParceledListSlice;
-import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.media.AudioManager;
@@ -114,7 +114,6 @@
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.UserHandle;
-import android.os.UserManager;
 import android.os.Vibrator;
 import android.os.VibrationEffect;
 import android.provider.Settings;
@@ -473,19 +472,6 @@
         out.endDocument();
     }
 
-    /** Use this when you actually want to post a notification or toast.
-     *
-     * Unchecked. Not exposed via Binder, but can be called in the course of enqueue*().
-     */
-    private boolean noteNotificationOp(String pkg, int uid) {
-        if (mAppOps.noteOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
-                != AppOpsManager.MODE_ALLOWED) {
-            Slog.v(TAG, "notifications are disabled by AppOps for " + pkg);
-            return false;
-        }
-        return true;
-    }
-
     /** Use this to check if a package can post a notification or toast. */
     private boolean checkNotificationOp(String pkg, int uid) {
         return mAppOps.checkOp(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
@@ -1154,7 +1140,7 @@
         final File systemDir = new File(Environment.getDataDirectory(), "system");
         mPolicyFile = new AtomicFile(new File(systemDir, "notification_policy.xml"));
 
-        syncBlockDb();
+        loadPolicyFile();
 
         // This is a ManagedServices object that keeps track of the listeners.
         mListeners = notificationListeners;
@@ -1267,46 +1253,6 @@
                 .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL, null);
     }
 
-    /**
-     * Make sure the XML config and the the AppOps system agree about blocks.
-     */
-    private void syncBlockDb() {
-        loadPolicyFile();
-
-        // sync bans from ranker into app opps
-        Map<Integer, String> packageBans = mRankingHelper.getPackageBans();
-        for(Entry<Integer, String> ban : packageBans.entrySet()) {
-            final int uid = ban.getKey();
-            final String packageName = ban.getValue();
-            setNotificationsEnabledForPackageImpl(packageName, uid, false);
-        }
-
-        // sync bans from app opps into ranker
-        packageBans.clear();
-        for (UserInfo user : UserManager.get(getContext()).getUsers()) {
-            final int userId = user.getUserHandle().getIdentifier();
-            final PackageManager packageManager = getContext().getPackageManager();
-            List<PackageInfo> packages = packageManager.getInstalledPackagesAsUser(0, userId);
-            final int packageCount = packages.size();
-            for (int p = 0; p < packageCount; p++) {
-                final String packageName = packages.get(p).packageName;
-                try {
-                    final int uid = packageManager.getPackageUidAsUser(packageName, userId);
-                    if (!checkNotificationOp(packageName, uid)) {
-                        packageBans.put(uid, packageName);
-                    }
-                } catch (NameNotFoundException e) {
-                    // forget you
-                }
-            }
-        }
-        for (Entry<Integer, String> ban : packageBans.entrySet()) {
-            mRankingHelper.setImportance(ban.getValue(), ban.getKey(), IMPORTANCE_NONE);
-        }
-
-        savePolicyFile();
-    }
-
     @Override
     public void onBootPhase(int phase) {
         if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
@@ -1328,19 +1274,6 @@
         }
     }
 
-    void setNotificationsEnabledForPackageImpl(String pkg, int uid, boolean enabled) {
-        Slog.v(TAG, (enabled?"en":"dis") + "abling notifications for " + pkg);
-
-        mAppOps.setMode(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg,
-                enabled ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
-
-        // Now, cancel any outstanding notifications that are part of a just-disabled app
-        if (ENABLE_BLOCKED_NOTIFICATIONS && !enabled) {
-            cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
-                    UserHandle.getUserId(uid), REASON_PACKAGE_BANNED, null);
-        }
-    }
-
     private void updateListenerHintsLocked() {
         final int hints = calculateHints();
         if (hints == mListenerHints) return;
@@ -1522,7 +1455,8 @@
                     isPackageSuspendedForUser(pkg, Binder.getCallingUid());
 
             if (ENABLE_BLOCKED_TOASTS && !isSystemToast &&
-                    (!noteNotificationOp(pkg, Binder.getCallingUid()) || isPackageSuspended)) {
+                    (!areNotificationsEnabledForPackage(pkg, Binder.getCallingUid())
+                            || isPackageSuspended)) {
                 Slog.e(TAG, "Suppressing toast from package " + pkg
                         + (isPackageSuspended
                                 ? " due to package suspended by administrator."
@@ -1643,8 +1577,12 @@
         public void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {
             checkCallerIsSystem();
 
-            setNotificationsEnabledForPackageImpl(pkg, uid, enabled);
             mRankingHelper.setEnabled(pkg, uid, enabled);
+            // Now, cancel any outstanding notifications that are part of a just-disabled app
+            if (ENABLE_BLOCKED_NOTIFICATIONS && !enabled) {
+                cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
+                        UserHandle.getUserId(uid), REASON_PACKAGE_BANNED, null);
+            }
             savePolicyFile();
         }
 
@@ -1662,8 +1600,8 @@
         @Override
         public boolean areNotificationsEnabledForPackage(String pkg, int uid) {
             checkCallerIsSystemOrSameApp(pkg);
-            return (mAppOps.checkOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
-                    == AppOpsManager.MODE_ALLOWED) && !isPackageSuspendedForUser(pkg, uid);
+
+            return mRankingHelper.getImportance(pkg, uid) != IMPORTANCE_NONE;
         }
 
         @Override
@@ -3400,8 +3338,7 @@
         }
 
         final boolean isBlocked = r.getImportance() == NotificationManager.IMPORTANCE_NONE
-                || r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE
-                || !noteNotificationOp(pkg, callingUid);
+                || r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE;
         if (isBlocked) {
             Slog.e(TAG, "Suppressing notification from package by user request.");
             usageStats.registerBlocked(r);
@@ -3723,14 +3660,6 @@
                             " intercept=" + record.isIntercepted()
             );
 
-        final int currentUser;
-        final long token = Binder.clearCallingIdentity();
-        try {
-            currentUser = ActivityManager.getCurrentUser();
-        } finally {
-            Binder.restoreCallingIdentity(token);
-        }
-
         // If we're not supposed to beep, vibrate, etc. then don't.
         final String disableEffects = disableNotificationEffects(record);
         if (disableEffects != null) {
@@ -3740,50 +3669,53 @@
         // Remember if this notification already owns the notification channels.
         boolean wasBeep = key != null && key.equals(mSoundNotificationKey);
         boolean wasBuzz = key != null && key.equals(mVibrateNotificationKey);
-
         // These are set inside the conditional if the notification is allowed to make noise.
         boolean hasValidVibrate = false;
         boolean hasValidSound = false;
-        if (disableEffects == null
-                && (record.getUserId() == UserHandle.USER_ALL ||
-                    record.getUserId() == currentUser ||
-                    mUserProfiles.isCurrentProfile(record.getUserId()))
-                && canInterrupt
-                && mSystemReady
-                && mAudioManager != null) {
-            if (DBG) Slog.v(TAG, "Interrupting!");
 
-            Uri soundUri = record.getSound();
-            hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
-            long[] vibration = record.getVibration();
-            // Demote sound to vibration if vibration missing & phone in vibration mode.
-            if (vibration == null
-                    && hasValidSound
-                    && (mAudioManager.getRingerModeInternal()
-                            == AudioManager.RINGER_MODE_VIBRATE)) {
-                vibration = mFallbackVibrationPattern;
-            }
-            hasValidVibrate = vibration != null;
-
-            if (!shouldMuteNotificationLocked(record)) {
+        if (isNotificationForCurrentUser(record)) {
+            // If the notification will appear in the status bar, it should send an accessibility
+            // event
+            if (!record.isUpdate && record.getImportance() > IMPORTANCE_MIN) {
                 sendAccessibilityEvent(notification, record.sbn.getPackageName());
+            }
 
-                if (hasValidSound) {
-                    mSoundNotificationKey = key;
-                    if (mInCall) {
-                        playInCallNotification();
-                        beep = true;
-                    } else {
-                        beep = playSound(record, soundUri);
-                    }
+            if (disableEffects == null
+                    && canInterrupt
+                    && mSystemReady
+                    && mAudioManager != null) {
+                if (DBG) Slog.v(TAG, "Interrupting!");
+                Uri soundUri = record.getSound();
+                hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
+                long[] vibration = record.getVibration();
+                // Demote sound to vibration if vibration missing & phone in vibration mode.
+                if (vibration == null
+                        && hasValidSound
+                        && (mAudioManager.getRingerModeInternal()
+                        == AudioManager.RINGER_MODE_VIBRATE)) {
+                    vibration = mFallbackVibrationPattern;
                 }
+                hasValidVibrate = vibration != null;
 
-                final boolean ringerModeSilent =
-                        mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT;
-                if (!mInCall && hasValidVibrate && !ringerModeSilent) {
-                    mVibrateNotificationKey = key;
+                if (!shouldMuteNotificationLocked(record)) {
+                    if (hasValidSound) {
+                        mSoundNotificationKey = key;
+                        if (mInCall) {
+                            playInCallNotification();
+                            beep = true;
+                        } else {
+                            beep = playSound(record, soundUri);
+                        }
+                    }
 
-                    buzz = playVibration(record, vibration);
+                    final boolean ringerModeSilent =
+                            mAudioManager.getRingerModeInternal()
+                                    == AudioManager.RINGER_MODE_SILENT;
+                    if (!mInCall && hasValidVibrate && !ringerModeSilent) {
+                        mVibrateNotificationKey = key;
+
+                        buzz = playVibration(record, vibration);
+                    }
                 }
             }
         }
@@ -3883,6 +3815,19 @@
         }
     }
 
+    private boolean isNotificationForCurrentUser(NotificationRecord record) {
+        final int currentUser;
+        final long token = Binder.clearCallingIdentity();
+        try {
+            currentUser = ActivityManager.getCurrentUser();
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+        return (record.getUserId() == UserHandle.USER_ALL ||
+                record.getUserId() == currentUser ||
+                mUserProfiles.isCurrentProfile(record.getUserId()));
+    }
+
     private void playInCallNotification() {
         new Thread() {
             @Override
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 55cb2f3..2c0cc95 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -21,8 +21,6 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.util.Preconditions;
 
-import android.annotation.UserIdInt;
-import android.app.ActivityManager;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
@@ -35,8 +33,6 @@
 import android.metrics.LogMaker;
 import android.os.Build;
 import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
 import android.provider.Settings.Secure;
 import android.service.notification.NotificationListenerService.Ranking;
 import android.text.TextUtils;
@@ -189,6 +185,10 @@
                                 safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
                                 safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
                                 safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
+                        r.importance = safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+                        r.priority = safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY);
+                        r.visibility = safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
+                        r.showBadge = safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
 
                         final int innerDepth = parser.getDepth();
                         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -447,7 +447,9 @@
                 boolean isGroupSummary = record.getNotification().isGroupSummary();
                 record.setGlobalSortKey(
                         String.format("intrsv=%c:grnk=0x%04x:gsmry=%c:%s:rnk=0x%04x",
-                        record.isRecentlyIntrusive() ? '0' : '1',
+                        record.isRecentlyIntrusive()
+                                && record.getImportance() > NotificationManager.IMPORTANCE_MIN
+                                ? '0' : '1',
                         groupProxy.getAuthoritativeRank(),
                         isGroupSummary ? '0' : '1',
                         groupSortKeyPortion,
@@ -551,7 +553,7 @@
         }
 
         NotificationChannel existing = r.channels.get(channel.getId());
-        // Keep existing settings, except deleted status and name
+        // Keep most of the existing settings
         if (existing != null && fromTargetApp) {
             if (existing.isDeleted()) {
                 existing.setDeleted(false);
@@ -559,12 +561,13 @@
 
             existing.setName(channel.getName().toString());
             existing.setDescription(channel.getDescription());
+            existing.setBlockableSystem(channel.isBlockableSystem());
 
             MetricsLogger.action(getChannelLog(channel, pkg));
             updateConfig();
             return;
         }
-        if (channel.getImportance() < NotificationManager.IMPORTANCE_MIN
+        if (channel.getImportance() < NotificationManager.IMPORTANCE_NONE
                 || channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
             throw new IllegalArgumentException("Invalid importance level");
         }
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index 6625331..ac7b763 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -77,8 +77,9 @@
     private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
     private static final boolean DEBUG = false;
 
-    private static final int DEFAULT_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE
-            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+    private static final int DEFAULT_FLAGS =
+            PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+                    | PackageManager.MATCH_UNINSTALLED_PACKAGES;
 
     private static final String AUDIO_MIME_TYPE = "audio/mpeg";
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 1b32a93..782325a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4852,9 +4852,17 @@
                 if (filterAppAccessLPr(ps, callingUid, userId)) {
                     return PackageManager.PERMISSION_DENIED;
                 }
+                final boolean instantApp = ps.getInstantApp(userId);
                 final PermissionsState permissionsState = ps.getPermissionsState();
                 if (permissionsState.hasPermission(permName, userId)) {
-                    return PackageManager.PERMISSION_GRANTED;
+                    if (instantApp) {
+                        BasePermission bp = mSettings.mPermissions.get(permName);
+                        if (bp != null && bp.isInstant()) {
+                            return PackageManager.PERMISSION_GRANTED;
+                        }
+                    } else {
+                        return PackageManager.PERMISSION_GRANTED;
+                    }
                 }
                 // Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
                 if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
@@ -4872,6 +4880,7 @@
         final int callingUid = Binder.getCallingUid();
         final int callingUserId = UserHandle.getUserId(callingUid);
         final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
+        final boolean isUidInstantApp = getInstantAppPackageName(uid) != null;
         final int userId = UserHandle.getUserId(uid);
         if (!sUserManager.exists(userId)) {
             return PackageManager.PERMISSION_DENIED;
@@ -4893,7 +4902,14 @@
                 final SettingBase settingBase = (SettingBase) obj;
                 final PermissionsState permissionsState = settingBase.getPermissionsState();
                 if (permissionsState.hasPermission(permName, userId)) {
-                    return PackageManager.PERMISSION_GRANTED;
+                    if (isUidInstantApp) {
+                        BasePermission bp = mSettings.mPermissions.get(permName);
+                        if (bp != null && bp.isInstant()) {
+                            return PackageManager.PERMISSION_GRANTED;
+                        }
+                    } else {
+                        return PackageManager.PERMISSION_GRANTED;
+                    }
                 }
                 // Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
                 if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
@@ -18371,7 +18387,7 @@
 
     private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) {
         if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID
-              || callingUid == Process.SYSTEM_UID) {
+              || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
             return true;
         }
         final int callingUserId = UserHandle.getUserId(callingUid);
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 8b8e3c4..908e517 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -7691,7 +7691,10 @@
             default:
                 return null;
         }
-        if (pattern.length == 1) {
+        if (pattern.length == 0) {
+            // No vibration
+            return null;
+        } else if (pattern.length == 1) {
             // One-shot vibration
             return VibrationEffect.createOneShot(pattern[0], VibrationEffect.DEFAULT_AMPLITUDE);
         } else {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index a8d19e94..ed98d1c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -1940,7 +1940,8 @@
                         && mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
                     nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
                     if (now < nextTimeout) {
-                        if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT) {
+                        if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT
+                                || mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_VR) {
                             mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
                         } else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
                             mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
@@ -3122,10 +3123,6 @@
         if (reason == null) {
             reason = "";
         }
-        if (reason.equals(PowerManager.REBOOT_RECOVERY)
-                || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) {
-            reason = "recovery";
-        }
 
         // If the reason is "quiescent", it means that the boot process should proceed
         // without turning on the screen/lights.
@@ -3134,6 +3131,15 @@
         if (reason.equals(PowerManager.REBOOT_QUIESCENT)) {
             sQuiescent = true;
             reason = "";
+        } else if (reason.endsWith("," + PowerManager.REBOOT_QUIESCENT)) {
+            sQuiescent = true;
+            reason = reason.substring(0,
+                    reason.length() - PowerManager.REBOOT_QUIESCENT.length() - 1);
+        }
+
+        if (reason.equals(PowerManager.REBOOT_RECOVERY)
+                || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) {
+            reason = "recovery";
         }
 
         if (sQuiescent) {
diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java
index 7ed3eac..972623c 100644
--- a/services/core/java/com/android/server/wm/AlertWindowNotification.java
+++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java
@@ -100,7 +100,7 @@
         final String appName = (aInfo != null)
                 ? pm.getApplicationLabel(aInfo).toString() : mPackageName;
 
-        createNotificationChannelIfNeeded(context, appName);
+        createNotificationChannel(context, appName);
 
         final String message = context.getString(R.string.alert_windows_notification_message,
                 appName);
@@ -134,16 +134,14 @@
         return PendingIntent.getActivity(context, mRequestCode, intent, FLAG_CANCEL_CURRENT);
     }
 
-    private void createNotificationChannelIfNeeded(Context context, String appName) {
-        if (mNotificationManager.getNotificationChannel(mNotificationTag) != null) {
-            return;
-        }
+    private void createNotificationChannel(Context context, String appName) {
         final String nameChannel =
                 context.getString(R.string.alert_windows_notification_channel_name, appName);
         final NotificationChannel channel =
                 new NotificationChannel(mNotificationTag, nameChannel, IMPORTANCE_MIN);
         channel.enableLights(false);
         channel.enableVibration(false);
+        channel.setBlockableSystem(true);
         mNotificationManager.createNotificationChannel(channel);
     }
 
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index f0e0e14..37ebfd3 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -17,6 +17,7 @@
 package com.android.server.wm;
 
 import static android.app.ActivityManager.StackId;
+import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
 import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
 import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
@@ -51,6 +52,7 @@
 
 import android.annotation.NonNull;
 import android.app.Activity;
+import android.app.ActivityManager;
 import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.os.Binder;
@@ -913,7 +915,11 @@
         }
         if (mPendingRelaunchCount > 0) {
             mPendingRelaunchCount--;
+        } else {
+            // Update keyguard flags upon finishing relaunch.
+            checkKeyguardFlagsChanged();
         }
+
         updateAllDrawn();
     }
 
@@ -1345,9 +1351,11 @@
                 }
                 mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, token).sendToTarget();
 
-                final TaskStack s = getStack();
-                if (s != null) {
-                    s.onAllWindowsDrawn();
+                // Notify the pinned stack upon all windows drawn. If there was an animation in
+                // progress then this signal will resume that animation.
+                final TaskStack pinnedStack = mDisplayContent.getStackById(PINNED_STACK_ID);
+                if (pinnedStack != null) {
+                    pinnedStack.onAllWindowsDrawn();
                 }
             }
         }
@@ -1501,6 +1509,12 @@
     }
 
     boolean containsDismissKeyguardWindow() {
+        // Window state is transient during relaunch. We are not guaranteed to be frozen during the
+        // entirety of the relaunch.
+        if (isRelaunching()) {
+            return mLastContainsDismissKeyguardWindow;
+        }
+
         for (int i = mChildren.size() - 1; i >= 0; i--) {
             if ((mChildren.get(i).mAttrs.flags & FLAG_DISMISS_KEYGUARD) != 0) {
                 return true;
@@ -1510,11 +1524,19 @@
     }
 
     boolean containsShowWhenLockedWindow() {
+        // When we are relaunching, it is possible for us to be unfrozen before our previous
+        // windows have been added back. Using the cached value ensures that our previous
+        // showWhenLocked preference is honored until relaunching is complete.
+        if (isRelaunching()) {
+            return mLastContainsShowWhenLockedWindow;
+        }
+
         for (int i = mChildren.size() - 1; i >= 0; i--) {
             if ((mChildren.get(i).mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0) {
                 return true;
             }
         }
+
         return false;
     }
 
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index 7f3c89c..410efcd 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -139,8 +139,14 @@
         private final boolean mSkipAnimationStart;
         // True if this animation was canceled by the user, not as a part of a replacing animation
         private boolean mSkipAnimationEnd;
+
+        // True if the animation target is animating from the fullscreen. Only one of
+        // {@link mMoveToFullscreen} or {@link mMoveFromFullscreen} can be true at any time in the
+        // animation.
+        private boolean mMoveFromFullscreen;
         // True if the animation target should be moved to the fullscreen stack at the end of this
-        // animation
+        // animation. Only one of {@link mMoveToFullscreen} or {@link mMoveFromFullscreen} can be
+        // true at any time in the animation.
         private boolean mMoveToFullscreen;
 
         // Whether to schedule PiP mode changes on animation start/end
@@ -151,15 +157,21 @@
         private final int mFrozenTaskWidth;
         private final int mFrozenTaskHeight;
 
+        // Timeout callback to ensure we continue the animation if waiting for resuming or app
+        // windows drawn fails
+        private final Runnable mResumeRunnable = () -> resume();
+
         BoundsAnimator(BoundsAnimationTarget target, Rect from, Rect to,
                 @SchedulePipModeChangedState int schedulePipModeChangedState,
-                boolean moveToFullscreen, boolean replacingExistingAnimation) {
+                boolean moveFromFullscreen, boolean moveToFullscreen,
+                boolean replacingExistingAnimation) {
             super();
             mTarget = target;
             mFrom.set(from);
             mTo.set(to);
             mSkipAnimationStart = replacingExistingAnimation;
             mSchedulePipModeChangedState = schedulePipModeChangedState;
+            mMoveFromFullscreen = moveFromFullscreen;
             mMoveToFullscreen = moveToFullscreen;
             addUpdateListener(this);
             addListener(this);
@@ -177,13 +189,6 @@
             }
         }
 
-        final Runnable mResumeRunnable = new Runnable() {
-                @Override
-                public void run() {
-                    resume();
-                }
-        };
-
         @Override
         public void onAnimationStart(Animator animation) {
             if (DEBUG) Slog.d(TAG, "onAnimationStart: mTarget=" + mTarget
@@ -199,6 +204,12 @@
             if (!mSkipAnimationStart) {
                 mTarget.onAnimationStart(mSchedulePipModeChangedState ==
                         SCHEDULE_PIP_MODE_CHANGED_ON_START);
+
+                // When starting an animation from fullscreen, pause here and wait for the
+                // windows-drawn signal before we start the rest of the transition down into PiP.
+                if (mMoveFromFullscreen) {
+                    pause();
+                }
             }
 
             // Immediately update the task bounds if they have to become larger, but preserve
@@ -213,13 +224,20 @@
                 // correct logic to make this resize seamless.
                 if (mMoveToFullscreen) {
                     pause();
-                    mHandler.postDelayed(mResumeRunnable, WAIT_FOR_DRAW_TIMEOUT_MS);
                 }
             }
         }
 
         @Override
+        public void pause() {
+            if (DEBUG) Slog.d(TAG, "pause: waiting for windows drawn");
+            super.pause();
+            mHandler.postDelayed(mResumeRunnable, WAIT_FOR_DRAW_TIMEOUT_MS);
+        }
+
+        @Override
         public void resume() {
+            if (DEBUG) Slog.d(TAG, "resume:");
             mHandler.removeCallbacks(mResumeRunnable);
             super.resume();
         }
@@ -336,15 +354,15 @@
 
     public void animateBounds(final BoundsAnimationTarget target, Rect from, Rect to,
             int animationDuration, @SchedulePipModeChangedState int schedulePipModeChangedState,
-            boolean moveToFullscreen) {
+            boolean moveFromFullscreen, boolean moveToFullscreen) {
         animateBoundsImpl(target, from, to, animationDuration, schedulePipModeChangedState,
-                moveToFullscreen);
+                moveFromFullscreen, moveToFullscreen);
     }
 
     @VisibleForTesting
     BoundsAnimator animateBoundsImpl(final BoundsAnimationTarget target, Rect from, Rect to,
             int animationDuration, @SchedulePipModeChangedState int schedulePipModeChangedState,
-            boolean moveToFullscreen) {
+            boolean moveFromFullscreen, boolean moveToFullscreen) {
         final BoundsAnimator existing = mRunningAnimations.get(target);
         final boolean replacing = existing != null;
 
@@ -387,7 +405,7 @@
             existing.cancel();
         }
         final BoundsAnimator animator = new BoundsAnimator(target, from, to,
-                schedulePipModeChangedState, moveToFullscreen, replacing);
+                schedulePipModeChangedState, moveFromFullscreen, moveToFullscreen, replacing);
         mRunningAnimations.put(target, animator);
         animator.setFloatValues(0f, 1f);
         animator.setDuration((animationDuration != -1 ? animationDuration
@@ -397,14 +415,19 @@
         return animator;
     }
 
+    public Handler getHandler() {
+        return mHandler;
+    }
+
+    public void onAllWindowsDrawn() {
+        if (DEBUG) Slog.d(TAG, "onAllWindowsDrawn:");
+        mHandler.post(this::resume);
+    }
+
     private void resume() {
         for (int i = 0; i < mRunningAnimations.size(); i++) {
             final BoundsAnimator b = mRunningAnimations.valueAt(i);
             b.resume();
         }
     }
-
-    public void onAllWindowsDrawn() {
-        mHandler.post(this::resume);
-    }
 }
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index b0b93ab..0c628ac 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -83,7 +83,7 @@
      * Animates the pinned stack.
      */
     public void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds,
-            int animationDuration, boolean schedulePipModeChangedOnAnimationEnd) {
+            int animationDuration, boolean fromFullscreen) {
         synchronized (mWindowMap) {
             if (mContainer == null) {
                 throw new IllegalArgumentException("Pinned stack container not found :(");
@@ -98,7 +98,7 @@
                 NO_PIP_MODE_CHANGED_CALLBACKS;
             final boolean toFullscreen = toBounds == null;
             if (toFullscreen) {
-                if (schedulePipModeChangedOnAnimationEnd) {
+                if (fromFullscreen) {
                     throw new IllegalArgumentException("Should not defer scheduling PiP mode"
                             + " change on animation to fullscreen.");
                 }
@@ -113,7 +113,7 @@
                     toBounds = new Rect();
                     mContainer.getDisplayContent().getLogicalDisplayRect(toBounds);
                 }
-            } else if (schedulePipModeChangedOnAnimationEnd) {
+            } else if (fromFullscreen) {
                 schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_END;
             }
 
@@ -122,13 +122,13 @@
             final Rect finalToBounds = toBounds;
             final @SchedulePipModeChangedState int finalSchedulePipModeChangedState =
                 schedulePipModeChangedState;
-            UiThread.getHandler().post(() -> {
+            mService.mBoundsAnimationController.getHandler().post(() -> {
                 if (mContainer == null) {
                     return;
                 }
                 mService.mBoundsAnimationController.animateBounds(mContainer, fromBounds,
                         finalToBounds, animationDuration, finalSchedulePipModeChangedState,
-                        toFullscreen);
+                        fromFullscreen, toFullscreen);
             });
         }
     }
@@ -152,7 +152,7 @@
             if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) != 0) {
                 if (!toBounds.equals(targetBounds)) {
                     animateResizePinnedStack(toBounds, null /* sourceHintBounds */,
-                            -1 /* duration */, false /* schedulePipModeChangedOnAnimationEnd */);
+                            -1 /* duration */, false /* fromFullscreen */);
                 }
                 pinnedStackController.setAspectRatio(
                         pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index d189ff8..eff8ed9 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -1489,7 +1489,7 @@
     }
 
     void onAllWindowsDrawn() {
-        if (!mBoundsAnimating) {
+        if (!mBoundsAnimating && !mBoundsAnimatingRequested) {
             return;
         }
 
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 1d44a205..6f53099 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -185,6 +185,8 @@
             "com.google.android.clockwork.ThermalObserver";
     private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
             "com.google.android.clockwork.connectivity.WearConnectivityService";
+    private static final String WEAR_DISPLAY_SERVICE_CLASS =
+            "com.google.android.clockwork.display.WearDisplayService";
     private static final String WEAR_TIME_SERVICE_CLASS =
             "com.google.android.clockwork.time.WearTimeService";
     private static final String ACCOUNT_SERVICE_CLASS =
@@ -1499,6 +1501,7 @@
 
             if (!disableNonCoreServices) {
                 traceBeginAndSlog("StartWearTimeService");
+                mSystemServiceManager.startService(WEAR_DISPLAY_SERVICE_CLASS);
                 mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
                 traceEnd();
             }
diff --git a/services/net/java/android/net/util/SharedLog.java b/services/net/java/android/net/util/SharedLog.java
new file mode 100644
index 0000000..343d237
--- /dev/null
+++ b/services/net/java/android/net/util/SharedLog.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 android.net.util;
+
+import android.text.TextUtils;
+import android.util.LocalLog;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.StringJoiner;
+
+
+/**
+ * Class to centralize logging functionality for tethering.
+ *
+ * All access to class methods other than dump() must be on the same thread.
+ *
+ * @hide
+ */
+public class SharedLog {
+    private final static int DEFAULT_MAX_RECORDS = 500;
+    private final static String COMPONENT_DELIMITER = ".";
+
+    private enum Category {
+        NONE,
+        ERROR,
+        MARK,
+        WARN,
+    };
+
+    private final LocalLog mLocalLog;
+    // The tag to use for output to the system log. This is not output to the
+    // LocalLog because that would be redundant.
+    private final String mTag;
+    // The component (or subcomponent) of a system that is sharing this log.
+    // This can grow in depth if components call forSubComponent() to obtain
+    // their SharedLog instance. The tag is not included in the component for
+    // brevity.
+    private final String mComponent;
+
+    public SharedLog(String tag) {
+        this(DEFAULT_MAX_RECORDS, tag);
+    }
+
+    public SharedLog(int maxRecords, String tag) {
+        this(new LocalLog(maxRecords), tag, tag);
+    }
+
+    private SharedLog(LocalLog localLog, String tag, String component) {
+        mLocalLog = localLog;
+        mTag = tag;
+        mComponent = component;
+    }
+
+    public SharedLog forSubComponent(String component) {
+        if (!isRootLogInstance()) {
+            component = mComponent + COMPONENT_DELIMITER + component;
+        }
+        return new SharedLog(mLocalLog, mTag, component);
+    }
+
+    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+        mLocalLog.readOnlyLocalLog().dump(fd, writer, args);
+    }
+
+    //////
+    // Methods that both log an entry and emit it to the system log.
+    //////
+
+    public void e(Exception e) {
+        Log.e(mTag, record(Category.ERROR, e.toString()));
+    }
+
+    public void e(String msg) {
+        Log.e(mTag, record(Category.ERROR, msg));
+    }
+
+    public void i(String msg) {
+        Log.i(mTag, record(Category.NONE, msg));
+    }
+
+    public void w(String msg) {
+        Log.w(mTag, record(Category.WARN, msg));
+    }
+
+    //////
+    // Methods that only log an entry (and do NOT emit to the system log).
+    //////
+
+    public void log(String msg) {
+        record(Category.NONE, msg);
+    }
+
+    public void mark(String msg) {
+        record(Category.MARK, msg);
+    }
+
+    private String record(Category category, String msg) {
+        final String entry = logLine(category, msg);
+        mLocalLog.log(entry);
+        return entry;
+    }
+
+    private String logLine(Category category, String msg) {
+        final StringJoiner sj = new StringJoiner(" ");
+        if (!isRootLogInstance()) sj.add("[" + mComponent + "]");
+        if (category != Category.NONE) sj.add(category.toString());
+        return sj.add(msg).toString();
+    }
+
+    // Check whether this SharedLog instance is nominally the top level in
+    // a potential hierarchy of shared logs (the root of a tree),
+    // or is a subcomponent within the hierarchy.
+    private boolean isRootLogInstance() {
+        return TextUtils.isEmpty(mComponent) || mComponent.equals(mTag);
+    }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
new file mode 100644
index 0000000..3007cb1
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.app.NotificationChannel;
+import android.os.Parcel;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationChannelTest extends NotificationTestCase {
+
+    @Test
+    public void testWriteToParcel() {
+        NotificationChannel channel =
+                new NotificationChannel("1", "one", IMPORTANCE_DEFAULT);
+        Parcel parcel = Parcel.obtain();
+        channel.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        NotificationChannel channel1 = NotificationChannel.CREATOR.createFromParcel(parcel);
+        assertEquals(channel, channel1);
+    }
+
+    @Test
+    public void testSystemBlockable() {
+        NotificationChannel channel = new NotificationChannel("a", "ab", IMPORTANCE_DEFAULT);
+        assertEquals(false, channel.isBlockableSystem());
+        channel.setBlockableSystem(true);
+        assertEquals(true, channel.isBlockableSystem());
+    }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index 06b5821..5a72e6b 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -18,6 +18,7 @@
 import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MAX;
 import static android.app.NotificationManager.IMPORTANCE_NONE;
 import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
 
@@ -27,6 +28,7 @@
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -50,15 +52,11 @@
 import android.os.Build;
 import android.os.UserHandle;
 import android.provider.Settings.Secure;
-import android.service.notification.NotificationListenerService;
 import android.service.notification.StatusBarNotification;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.testing.TestableContext;
-import android.testing.TestableSettingsProvider;
 import android.util.ArrayMap;
-import android.util.Slog;
 import android.util.Xml;
 
 import java.io.BufferedInputStream;
@@ -87,10 +85,10 @@
 public class RankingHelperTest extends NotificationTestCase {
     private static final String PKG = "com.android.server.notification";
     private static final int UID = 0;
-    private static final UserHandle USER = UserHandle.getUserHandleForUid(UID);
+    private static final UserHandle USER = UserHandle.of(0);
     private static final String UPDATED_PKG = "updatedPkg";
-    private static final int UID2 = 1111111;
-    private static final UserHandle USER2 = UserHandle.getUserHandleForUid(UID2);
+    private static final int UID2 = 1111;
+    private static final UserHandle USER2 = UserHandle.of(10);
     private static final String TEST_CHANNEL_ID = "test_channel_id";
 
     @Mock NotificationUsageStats mUsageStats;
@@ -199,24 +197,21 @@
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
         serializer.startDocument(null, true);
-        serializer.startTag(null, "ranking");
         mHelper.writeXml(serializer, forBackup);
-        serializer.endTag(null, "ranking");
         serializer.endDocument();
         serializer.flush();
-
         for (String channelId : channelIds) {
             mHelper.permanentlyDeleteNotificationChannel(pkg, uid, channelId);
         }
         return baos;
     }
 
-    private void loadStreamXml(ByteArrayOutputStream stream) throws Exception {
+    private void loadStreamXml(ByteArrayOutputStream stream, boolean forRestore) throws Exception {
         XmlPullParser parser = Xml.newPullParser();
         parser.setInput(new BufferedInputStream(new ByteArrayInputStream(stream.toByteArray())),
                 null);
         parser.nextTag();
-        mHelper.readXml(parser, false);
+        mHelper.readXml(parser, forRestore);
     }
 
     private void compareChannels(NotificationChannel expected, NotificationChannel actual) {
@@ -323,7 +318,7 @@
                 channel2.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
         mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG}, new int[]{UID});
 
-        loadStreamXml(baos);
+        loadStreamXml(baos, false);
 
         assertTrue(mHelper.canShowBadge(PKG, UID));
         assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
@@ -354,6 +349,76 @@
     }
 
     @Test
+    public void testChannelXmlForBackup() throws Exception {
+        NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
+        NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
+        NotificationChannel channel1 =
+                new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+        NotificationChannel channel2 =
+                new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+        channel2.setDescription("descriptions for all");
+        channel2.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+        channel2.enableLights(true);
+        channel2.setBypassDnd(true);
+        channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+        channel2.enableVibration(false);
+        channel2.setGroup(ncg.getId());
+        channel2.setLightColor(Color.BLUE);
+        NotificationChannel channel3 = new NotificationChannel("id3", "NAM3", IMPORTANCE_HIGH);
+        channel3.enableVibration(true);
+
+        mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+        mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+        mHelper.createNotificationChannel(PKG, UID, channel1, true);
+        mHelper.createNotificationChannel(PKG, UID, channel2, false);
+        mHelper.createNotificationChannel(PKG, UID, channel3, false);
+        mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true);
+
+        mHelper.setShowBadge(PKG, UID, true);
+
+        mHelper.setImportance(UPDATED_PKG, UID2, IMPORTANCE_NONE);
+
+        ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel1.getId(),
+                channel2.getId(), channel3.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
+        mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG, UPDATED_PKG},
+                new int[]{UID, UID2});
+
+        mHelper.setShowBadge(UPDATED_PKG, UID2, true);
+
+        loadStreamXml(baos, true);
+
+        assertEquals(IMPORTANCE_NONE, mHelper.getImportance(UPDATED_PKG, UID2));
+        assertTrue(mHelper.canShowBadge(PKG, UID));
+        assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
+        compareChannels(channel2,
+                mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
+        compareChannels(channel3,
+                mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
+
+        List<NotificationChannelGroup> actualGroups =
+                mHelper.getNotificationChannelGroups(PKG, UID, false).getList();
+        boolean foundNcg = false;
+        for (NotificationChannelGroup actual : actualGroups) {
+            if (ncg.getId().equals(actual.getId())) {
+                foundNcg = true;
+                compareGroups(ncg, actual);
+            } else if (ncg2.getId().equals(actual.getId())) {
+                compareGroups(ncg2, actual);
+            }
+        }
+        assertTrue(foundNcg);
+
+        boolean foundChannel2Group = false;
+        for (NotificationChannelGroup actual : actualGroups) {
+            if (channel2.getGroup().equals(actual.getChannels().get(0).getGroup())) {
+                foundChannel2Group = true;
+                break;
+            }
+        }
+        assertTrue(foundChannel2Group);
+    }
+
+    @Test
     public void testChannelXml_backup() throws Exception {
         NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
         NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
@@ -397,7 +462,7 @@
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
                 NotificationChannel.DEFAULT_CHANNEL_ID);
 
-        loadStreamXml(baos);
+        loadStreamXml(baos, false);
 
         final NotificationChannel updated = mHelper.getNotificationChannel(PKG, UID,
                 NotificationChannel.DEFAULT_CHANNEL_ID, false);
@@ -417,7 +482,7 @@
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
                 NotificationChannel.DEFAULT_CHANNEL_ID);
 
-        loadStreamXml(baos);
+        loadStreamXml(baos, false);
 
         assertEquals(NotificationManager.IMPORTANCE_LOW, mHelper.getNotificationChannel(
                 PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false).getImportance());
@@ -465,7 +530,7 @@
         final ApplicationInfo upgraded = new ApplicationInfo();
         upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
         when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
-        loadStreamXml(baos);
+        loadStreamXml(baos, false);
 
         // Default Channel should be gone.
         assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
@@ -483,7 +548,7 @@
         final ApplicationInfo upgraded = new ApplicationInfo();
         upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
         when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
-        loadStreamXml(baos);
+        loadStreamXml(baos, false);
 
         // Default Channel should be gone.
         assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
@@ -497,7 +562,7 @@
         mHelper.createNotificationChannel(PKG, UID,
                 new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true);
 
-        loadStreamXml(baos);
+        loadStreamXml(baos, false);
 
         // Should still have the newly created channel that wasn't in the xml.
         assertTrue(mHelper.getNotificationChannel(PKG, UID, "bananas", false) != null);
@@ -512,14 +577,32 @@
     }
 
     @Test
-    public void testCreateChannel_ImportanceNone() throws Exception {
+    public void testCreateChannel_badImportance() throws Exception {
         try {
             mHelper.createNotificationChannel(PKG, UID,
-                    new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true);
-            fail("Was allowed to create a blocked channel");
+                    new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE - 1), true);
+            fail("Was allowed to create a channel with invalid importance");
         } catch (IllegalArgumentException e) {
             // yay
         }
+        try {
+            mHelper.createNotificationChannel(PKG, UID,
+                    new NotificationChannel("bananas", "bananas", IMPORTANCE_UNSPECIFIED), true);
+            fail("Was allowed to create a channel with invalid importance");
+        } catch (IllegalArgumentException e) {
+            // yay
+        }
+        try {
+            mHelper.createNotificationChannel(PKG, UID,
+                    new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX + 1), true);
+            fail("Was allowed to create a channel with invalid importance");
+        } catch (IllegalArgumentException e) {
+            // yay
+        }
+        mHelper.createNotificationChannel(PKG, UID,
+                new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true);
+        mHelper.createNotificationChannel(PKG, UID,
+                new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX), true);
     }
 
 
@@ -1271,5 +1354,4 @@
         assertFalse(mHelper.badgingEnabled(USER));
         assertTrue(mHelper.badgingEnabled(USER2));
     }
-
 }
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
index 46f10c1..36083bf 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -30,13 +30,15 @@
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
+import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
+import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-
 /**
  * Tests for the {@link AppWindowToken} class.
  *
@@ -184,4 +186,31 @@
         // Can specify orientation if the current orientation candidate is orientation behind.
         assertEquals(SCREEN_ORIENTATION_LANDSCAPE, token.getOrientation(SCREEN_ORIENTATION_BEHIND));
     }
+
+    @Test
+    public void testKeyguardFlagsDuringRelaunch() throws Exception {
+        final WindowTestUtils.TestAppWindowToken token =
+                new WindowTestUtils.TestAppWindowToken(mDisplayContent);
+        final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(
+                TYPE_BASE_APPLICATION);
+        attrs.flags |= FLAG_SHOW_WHEN_LOCKED | FLAG_DISMISS_KEYGUARD;
+        attrs.setTitle("AppWindow");
+        final WindowTestUtils.TestWindowState appWindow = createWindowState(attrs, token);
+
+        // Add window with show when locked flag
+        token.addWindow(appWindow);
+        assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+        // Start relaunching
+        token.startRelaunching();
+        assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+        // Remove window and make sure that we still report back flag
+        token.removeChild(appWindow);
+        assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+        // Finish relaunching and ensure flag is now not reported
+        token.finishRelaunching();
+        assertFalse(token.containsShowWhenLockedWindow() || token.containsDismissKeyguardWindow());
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
index cd7a7c7..ee09f4b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
@@ -152,8 +152,6 @@
             mAwaitingAnimationStart = false;
             mAnimationStarted = true;
             mSchedulePipModeChangedOnStart = schedulePipModeChangedCallback;
-
-            mController.onAllWindowsDrawn();
         }
 
         @Override
@@ -207,6 +205,9 @@
                 throw new IllegalArgumentException("Call restart() to restart an animation");
             }
 
+            boolean fromFullscreen = from.equals(BOUNDS_FULL);
+            boolean toFullscreen = to.equals(BOUNDS_FULL);
+
             mTarget.initialize(from);
 
             // Started, not running
@@ -215,6 +216,15 @@
 
             startImpl(from, to);
 
+            // Ensure that the animator is paused for the all windows drawn signal when animating
+            // to/from fullscreen
+            if (fromFullscreen || toFullscreen) {
+                assertTrue(mAnimator.isPaused());
+                mController.onAllWindowsDrawn();
+            } else {
+                assertTrue(!mAnimator.isPaused());
+            }
+
             // Started and running
             assertTrue(!mTarget.mAwaitingAnimationStart);
             assertTrue(mTarget.mAnimationStarted);
@@ -262,7 +272,7 @@
                             ? SCHEDULE_PIP_MODE_CHANGED_ON_END
                             : NO_PIP_MODE_CHANGED_CALLBACKS;
             mAnimator = mController.animateBoundsImpl(mTarget, from, to, DURATION,
-                    schedulePipModeChangedState, toFullscreen);
+                    schedulePipModeChangedState, fromFullscreen, toFullscreen);
 
             // Original stack bounds, frozen task bounds
             assertEquals(mFrom, mTarget.mStackBounds);
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 32eee84..6618a69 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -115,6 +115,10 @@
                 "mChildAppWindowAbove");
         mChildAppWindowBelow = createCommonWindow(mAppWindow, TYPE_APPLICATION_MEDIA_OVERLAY,
                 "mChildAppWindowBelow");
+
+        // Adding a display will cause freezing the display. Make sure to wait until it's unfrozen
+        // to not run into race conditions with the tests.
+        waitUntilHandlersIdle();
     }
 
     @After
@@ -135,6 +139,9 @@
             mDisplayContent.removeImmediately();
             sWm.mInputMethodTarget = null;
         }
+
+        // Wait until everything is really cleaned up.
+        waitUntilHandlersIdle();
     }
 
     private WindowState createCommonWindow(WindowState parent, int type, String name) {
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index dc0c485..f373785 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -523,6 +523,26 @@
     public static final String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED";
 
     /**
+     * Connection event used to inform {@link InCallService}s when the process of merging a
+     * Connection into a conference has begun.
+     * <p>
+     * Sent via {@link #sendConnectionEvent(String, Bundle)}.  The {@link Bundle} parameter is
+     * expected to be null when this connection event is used.
+     * @hide
+     */
+    public static final String EVENT_MERGE_START = "android.telecom.event.MERGE_START";
+
+    /**
+     * Connection event used to inform {@link InCallService}s when the process of merging a
+     * Connection into a conference has completed.
+     * <p>
+     * Sent via {@link #sendConnectionEvent(String, Bundle)}.  The {@link Bundle} parameter is
+     * expected to be null when this connection event is used.
+     * @hide
+     */
+    public static final String EVENT_MERGE_COMPLETE = "android.telecom.event.MERGE_COMPLETE";
+
+    /**
      * Connection event used to inform {@link InCallService}s when a call has been put on hold by
      * the remote party.
      * <p>
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index 1ffc83f..a9655d8 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -1823,10 +1823,28 @@
      */
     public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
             Connection connection) {
+        addExistingConnection(phoneAccountHandle, connection, null /* conference */);
+    }
+
+    /**
+     * Adds a connection created by the {@link ConnectionService} and informs telecom of the new
+     * connection.
+     *
+     * @param phoneAccountHandle The phone account handle for the connection.
+     * @param connection The connection to add.
+     * @param conference The parent conference of the new connection.
+     * @hide
+     */
+    public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
+            Connection connection, Conference conference) {
 
         String id = addExistingConnectionInternal(phoneAccountHandle, connection);
         if (id != null) {
             List<String> emptyList = new ArrayList<>(0);
+            String conferenceId = null;
+            if (conference != null) {
+                conferenceId = mIdByConference.get(conference);
+            }
 
             ParcelableConnection parcelableConnection = new ParcelableConnection(
                     phoneAccountHandle,
@@ -1847,7 +1865,8 @@
                     connection.getStatusHints(),
                     connection.getDisconnectCause(),
                     emptyList,
-                    connection.getExtras());
+                    connection.getExtras(),
+                    conferenceId);
             mAdapter.addExistingConnection(id, parcelableConnection);
         }
     }
diff --git a/telecomm/java/android/telecom/ParcelableConnection.java b/telecomm/java/android/telecom/ParcelableConnection.java
index e9dba68..434abf5 100644
--- a/telecomm/java/android/telecom/ParcelableConnection.java
+++ b/telecomm/java/android/telecom/ParcelableConnection.java
@@ -51,6 +51,35 @@
     private final DisconnectCause mDisconnectCause;
     private final List<String> mConferenceableConnectionIds;
     private final Bundle mExtras;
+    private String mParentCallId;
+
+    /** @hide */
+    public ParcelableConnection(
+            PhoneAccountHandle phoneAccount,
+            int state,
+            int capabilities,
+            int properties,
+            int supportedAudioRoutes,
+            Uri address,
+            int addressPresentation,
+            String callerDisplayName,
+            int callerDisplayNamePresentation,
+            IVideoProvider videoProvider,
+            int videoState,
+            boolean ringbackRequested,
+            boolean isVoipAudioMode,
+            long connectTimeMillis,
+            StatusHints statusHints,
+            DisconnectCause disconnectCause,
+            List<String> conferenceableConnectionIds,
+            Bundle extras,
+            String parentCallId) {
+        this(phoneAccount, state, capabilities, properties, supportedAudioRoutes, address,
+                addressPresentation, callerDisplayName, callerDisplayNamePresentation,
+                videoProvider, videoState, ringbackRequested, isVoipAudioMode, connectTimeMillis,
+                statusHints, disconnectCause, conferenceableConnectionIds, extras);
+        mParentCallId = parentCallId;
+    }
 
     /** @hide */
     public ParcelableConnection(
@@ -90,6 +119,7 @@
         mDisconnectCause = disconnectCause;
         mConferenceableConnectionIds = conferenceableConnectionIds;
         mExtras = extras;
+        mParentCallId = null;
     }
 
     public PhoneAccountHandle getPhoneAccount() {
@@ -176,6 +206,10 @@
         return mExtras;
     }
 
+    public final String getParentCallId() {
+        return mParentCallId;
+    }
+
     @Override
     public String toString() {
         return new StringBuilder()
@@ -189,6 +223,8 @@
                 .append(Connection.propertiesToString(mConnectionProperties))
                 .append(", extras:")
                 .append(mExtras)
+                .append(", parent:")
+                .append(mParentCallId)
                 .toString();
     }
 
@@ -218,6 +254,7 @@
             Bundle extras = Bundle.setDefusable(source.readBundle(classLoader), true);
             int properties = source.readInt();
             int supportedAudioRoutes = source.readInt();
+            String parentCallId = source.readString();
 
             return new ParcelableConnection(
                     phoneAccount,
@@ -237,7 +274,8 @@
                     statusHints,
                     disconnectCause,
                     conferenceableConnectionIds,
-                    extras);
+                    extras,
+                    parentCallId);
         }
 
         @Override
@@ -274,5 +312,6 @@
         destination.writeBundle(mExtras);
         destination.writeInt(mConnectionProperties);
         destination.writeInt(mSupportedAudioRoutes);
+        destination.writeString(mParentCallId);
     }
 }
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index b4f3d69..9caf9d0 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -113,6 +113,15 @@
         </activity>
 
         <activity
+            android:name="DrawIntoHwBitmapActivity"
+            android:label="Bitmaps/DrawIntoHwBitmap">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.android.test.hwui.TEST" />
+            </intent-filter>
+        </activity>
+
+        <activity
                 android:name="PathOffsetActivity"
                 android:label="Path/Offset">
             <intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java
new file mode 100644
index 0000000..faabdfc
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java
@@ -0,0 +1,65 @@
+/*
+ * 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.test.hwui;
+
+import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
+import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
+import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_NEVER;
+import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_RARELY;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.GraphicBuffer;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.view.DisplayListCanvas;
+import android.view.RenderNode;
+import android.view.Surface;
+import android.view.ThreadedRenderer;
+import android.widget.ImageView;
+
+public class DrawIntoHwBitmapActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ImageView view = new ImageView(this);
+        view.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+        setContentView(view);
+        view.setImageBitmap(createBitmap());
+    }
+
+    Bitmap createBitmap() {
+        RenderNode node = RenderNode.create("HwuiCanvas", null);
+        node.setLeftTopRightBottom(0, 0, 500, 500);
+        node.setClipToBounds(false);
+        DisplayListCanvas canvas = node.start(500, 500);
+        Paint p = new Paint();
+        p.setColor(Color.BLACK);
+        p.setTextSize(20 * getResources().getDisplayMetrics().density);
+        canvas.drawColor(0xFF2196F3);
+        p.setColor(0xFFBBDEFB);
+        canvas.drawRect(0, 0, 500, 100, p);
+        p.setColor(Color.BLACK);
+        canvas.drawText("Hello, World!", 0, 90, p);
+        node.end(canvas);
+        return ThreadedRenderer.createHardwareBitmap(node, 500, 500);
+    }
+}
diff --git a/tests/net/java/android/net/util/SharedLogTest.java b/tests/net/java/android/net/util/SharedLogTest.java
new file mode 100644
index 0000000..7fd7a63
--- /dev/null
+++ b/tests/net/java/android/net/util/SharedLogTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Vector;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SharedLogTest {
+    private static final String TIMESTAMP_PATTERN =
+            "^[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]";
+    private static final String TIMESTAMP = "mm-dd HH:MM:SS.xxx";
+
+    @Test
+    public void testBasicOperation() {
+        final SharedLog logTop = new SharedLog("top");
+        logTop.mark("first post!");
+
+        final SharedLog logLevel2a = logTop.forSubComponent("twoA");
+        final SharedLog logLevel2b = logTop.forSubComponent("twoB");
+        logLevel2b.e("2b or not 2b");
+        logLevel2a.w("second post?");
+
+        final SharedLog logLevel3 = logLevel2a.forSubComponent("three");
+        logTop.log("still logging");
+        logLevel3.log("3 >> 2");
+        logLevel2a.mark("ok: last post");
+
+        final String[] expected = {
+            TIMESTAMP + " - MARK first post!",
+            TIMESTAMP + " - [twoB] ERROR 2b or not 2b",
+            TIMESTAMP + " - [twoA] WARN second post?",
+            TIMESTAMP + " - still logging",
+            TIMESTAMP + " - [twoA.three] 3 >> 2",
+            TIMESTAMP + " - [twoA] MARK ok: last post",
+        };
+        // Verify the logs are all there and in the correct order.
+        verifyLogLines(expected, logTop);
+
+        // In fact, because they all share the same underlying LocalLog,
+        // every subcomponent SharedLog's dump() is identical.
+        verifyLogLines(expected, logLevel2a);
+        verifyLogLines(expected, logLevel2b);
+        verifyLogLines(expected, logLevel3);
+    }
+
+    private static void verifyLogLines(String[] expected, SharedLog log) {
+        final ByteArrayOutputStream ostream = new ByteArrayOutputStream();
+        final PrintWriter pw = new PrintWriter(ostream, true);
+        log.dump(null, pw, null);
+
+        final String dumpOutput = ostream.toString();
+        assertTrue(dumpOutput != null);
+        assertTrue(!"".equals(dumpOutput));
+
+        final String[] lines = dumpOutput.split("\n");
+        assertEquals(expected.length, lines.length);
+
+        for (int i = 0; i < lines.length; i++) {
+            // Fix up the timestamps.
+            lines[i] = lines[i].replaceAll(TIMESTAMP_PATTERN, TIMESTAMP);
+        }
+
+        for (int i = 0; i < expected.length; i++) {
+            assertEquals(expected[i], lines[i]);
+        }
+    }
+}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
index a3f33dc..27e683c 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
@@ -38,6 +38,7 @@
 import android.net.ConnectivityManager;
 import android.net.INetworkStatsService;
 import android.net.InterfaceConfiguration;
+import android.net.util.SharedLog;
 import android.os.INetworkManagementService;
 import android.os.RemoteException;
 import android.os.test.TestLooper;
@@ -63,12 +64,14 @@
     @Mock private IControlsTethering mTetherHelper;
     @Mock private InterfaceConfiguration mInterfaceConfiguration;
     @Mock private IPv6TetheringInterfaceServices mIPv6TetheringInterfaceServices;
+    @Mock private SharedLog mSharedLog;
 
     private final TestLooper mLooper = new TestLooper();
     private TetherInterfaceStateMachine mTestedSm;
 
     private void initStateMachine(int interfaceType) throws Exception {
-        mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), interfaceType,
+        mTestedSm = new TetherInterfaceStateMachine(
+                IFACE_NAME, mLooper.getLooper(), interfaceType, mSharedLog,
                 mNMService, mStatsService, mTetherHelper, mIPv6TetheringInterfaceServices);
         mTestedSm.start();
         // Starting the state machine always puts us in a consistent state and notifies
@@ -90,12 +93,13 @@
 
     @Before public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+        when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog);
     }
 
     @Test
     public void startsOutAvailable() {
         mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(),
-                TETHERING_BLUETOOTH, mNMService, mStatsService, mTetherHelper,
+                TETHERING_BLUETOOTH, mSharedLog, mNMService, mStatsService, mTetherHelper,
                 mIPv6TetheringInterfaceServices);
         mTestedSm.start();
         mLooper.dispatchAll();
diff --git a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
index c72efb0..9bb392a 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
@@ -25,11 +25,13 @@
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.os.Handler;
@@ -40,6 +42,7 @@
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.NetworkRequest;
+import android.net.util.SharedLog;
 
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -69,6 +72,7 @@
 
     @Mock private Context mContext;
     @Mock private IConnectivityManager mCS;
+    @Mock private SharedLog mLog;
 
     private TestStateMachine mSM;
     private TestConnectivityManager mCM;
@@ -78,10 +82,12 @@
         MockitoAnnotations.initMocks(this);
         reset(mContext);
         reset(mCS);
+        reset(mLog);
+        when(mLog.forSubComponent(anyString())).thenReturn(mLog);
 
         mCM = spy(new TestConnectivityManager(mContext, mCS));
         mSM = new TestStateMachine();
-        mUNM = new UpstreamNetworkMonitor(mSM, EVENT_UNM_UPDATE, (ConnectivityManager) mCM);
+        mUNM = new UpstreamNetworkMonitor(mSM, EVENT_UNM_UPDATE, (ConnectivityManager) mCM, mLog);
     }
 
     @After public void tearDown() throws Exception {
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index b460258..bf18949 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -99,6 +99,7 @@
         "link/PrivateAttributeMover.cpp",
         "link/ReferenceLinker.cpp",
         "link/TableMerger.cpp",
+        "link/XmlCompatVersioner.cpp",
         "link/XmlNamespaceRemover.cpp",
         "link/XmlReferenceLinker.cpp",
         "optimize/ResourceDeduper.cpp",
diff --git a/tools/aapt2/Debug.h b/tools/aapt2/Debug.h
index 56e2e95..e2456c7 100644
--- a/tools/aapt2/Debug.h
+++ b/tools/aapt2/Debug.h
@@ -37,6 +37,7 @@
                               const ResourceName& target_style);
   static void DumpHex(const void* data, size_t len);
   static void DumpXml(xml::XmlResource* doc);
+  static std::string ToString(xml::XmlResource* doc);
 };
 
 }  // namespace aapt
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index e45d142..1d2e3a4 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -27,7 +27,7 @@
 static const char* sMajorVersion = "2";
 
 // Update minor version whenever a feature or flag is added.
-static const char* sMinorVersion = "15";
+static const char* sMinorVersion = "16";
 
 int PrintVersion() {
   std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index 493f238..0a74c1a 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -388,13 +388,20 @@
 struct hash<aapt::ResourceName> {
   size_t operator()(const aapt::ResourceName& name) const {
     android::hash_t h = 0;
-    h = android::JenkinsHashMix(h, hash<string>()(name.package));
+    h = android::JenkinsHashMix(h, static_cast<uint32_t>(hash<string>()(name.package)));
     h = android::JenkinsHashMix(h, static_cast<uint32_t>(name.type));
-    h = android::JenkinsHashMix(h, hash<string>()(name.entry));
+    h = android::JenkinsHashMix(h, static_cast<uint32_t>(hash<string>()(name.entry)));
     return static_cast<size_t>(h);
   }
 };
 
+template <>
+struct hash<aapt::ResourceId> {
+  size_t operator()(const aapt::ResourceId& id) const {
+    return id.id;
+  }
+};
+
 }  // namespace std
 
 #endif  // AAPT_RESOURCE_H
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 0cb8c67..34bd2b4 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -333,6 +333,12 @@
   }
 }
 
+Attribute::Attribute()
+    : type_mask(0u),
+      min_int(std::numeric_limits<int32_t>::min()),
+      max_int(std::numeric_limits<int32_t>::max()) {
+}
+
 Attribute::Attribute(bool w, uint32_t t)
     : type_mask(t),
       min_int(std::numeric_limits<int32_t>::min()),
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index c71c738..06f949f 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -18,6 +18,7 @@
 #define AAPT_RESOURCE_VALUES_H
 
 #include <array>
+#include <limits>
 #include <ostream>
 #include <vector>
 
@@ -251,6 +252,7 @@
   int32_t max_int;
   std::vector<Symbol> symbols;
 
+  Attribute();
   explicit Attribute(bool w, uint32_t t = 0u);
 
   bool Equals(const Value* value) const override;
diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp
index e806714..041cb4f 100644
--- a/tools/aapt2/SdkConstants.cpp
+++ b/tools/aapt2/SdkConstants.cpp
@@ -26,9 +26,9 @@
 namespace aapt {
 
 static const char* sDevelopmentSdkCodeName = "O";
-static int sDevelopmentSdkLevel = 26;
+static ApiVersion sDevelopmentSdkLevel = 26;
 
-static const std::vector<std::pair<uint16_t, size_t>> sAttrIdMap = {
+static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = {
     {0x021c, 1},
     {0x021d, 2},
     {0x0269, SDK_CUPCAKE},
@@ -48,26 +48,29 @@
     {0x03f1, SDK_KITKAT},
     {0x03f6, SDK_KITKAT_WATCH},
     {0x04ce, SDK_LOLLIPOP},
+    {0x04d8, SDK_LOLLIPOP_MR1},
+    {0x04f1, SDK_MARSHMALLOW},
+    {0x0527, SDK_NOUGAT},
+    {0x0530, SDK_NOUGAT_MR1},
+    {0x0568, SDK_O},
 };
 
-static bool less_entry_id(const std::pair<uint16_t, size_t>& p,
-                        uint16_t entryId) {
+static bool less_entry_id(const std::pair<uint16_t, ApiVersion>& p, uint16_t entryId) {
   return p.first < entryId;
 }
 
-size_t FindAttributeSdkLevel(const ResourceId& id) {
-  if (id.package_id() != 0x01 && id.type_id() != 0x01) {
+ApiVersion FindAttributeSdkLevel(const ResourceId& id) {
+  if (id.package_id() != 0x01 || id.type_id() != 0x01) {
     return 0;
   }
-  auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(),
-                               id.entry_id(), less_entry_id);
+  auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(), id.entry_id(), less_entry_id);
   if (iter == sAttrIdMap.end()) {
     return SDK_LOLLIPOP_MR1;
   }
   return iter->second;
 }
 
-static const std::unordered_map<std::string, size_t> sAttrMap = {
+static const std::unordered_map<std::string, ApiVersion> sAttrMap = {
     {"marqueeRepeatLimit", 2},
     {"windowNoDisplay", 3},
     {"backgroundDimEnabled", 3},
@@ -729,7 +732,7 @@
     {"windowActivityTransitions", 21},
     {"colorEdgeEffect", 21}};
 
-size_t FindAttributeSdkLevel(const ResourceName& name) {
+ApiVersion FindAttributeSdkLevel(const ResourceName& name) {
   if (name.package != "android" && name.type != ResourceType::kAttr) {
     return 0;
   }
@@ -741,9 +744,8 @@
   return SDK_LOLLIPOP_MR1;
 }
 
-std::pair<StringPiece, int> GetDevelopmentSdkCodeNameAndVersion() {
-  return std::make_pair(StringPiece(sDevelopmentSdkCodeName),
-                        sDevelopmentSdkLevel);
+std::pair<StringPiece, ApiVersion> GetDevelopmentSdkCodeNameAndVersion() {
+  return std::make_pair(StringPiece(sDevelopmentSdkCodeName), sDevelopmentSdkLevel);
 }
 
 }  // namespace aapt
diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h
index c2ee252..e3745e8 100644
--- a/tools/aapt2/SdkConstants.h
+++ b/tools/aapt2/SdkConstants.h
@@ -25,7 +25,9 @@
 
 namespace aapt {
 
-enum : int {
+using ApiVersion = int;
+
+enum : ApiVersion {
   SDK_CUPCAKE = 3,
   SDK_DONUT = 4,
   SDK_ECLAIR = 5,
@@ -49,12 +51,12 @@
   SDK_MARSHMALLOW = 23,
   SDK_NOUGAT = 24,
   SDK_NOUGAT_MR1 = 25,
-  SDK_O = 26,  // STOPSHIP Replace with real version
+  SDK_O = 26,
 };
 
-size_t FindAttributeSdkLevel(const ResourceId& id);
-size_t FindAttributeSdkLevel(const ResourceName& name);
-std::pair<android::StringPiece, int> GetDevelopmentSdkCodeNameAndVersion();
+ApiVersion FindAttributeSdkLevel(const ResourceId& id);
+ApiVersion FindAttributeSdkLevel(const ResourceName& name);
+std::pair<android::StringPiece, ApiVersion> GetDevelopmentSdkCodeNameAndVersion();
 
 }  // namespace aapt
 
diff --git a/tools/aapt2/SdkConstants_test.cpp b/tools/aapt2/SdkConstants_test.cpp
index 716d922..61f4d71 100644
--- a/tools/aapt2/SdkConstants_test.cpp
+++ b/tools/aapt2/SdkConstants_test.cpp
@@ -21,18 +21,11 @@
 namespace aapt {
 
 TEST(SdkConstantsTest, FirstAttributeIsSdk1) {
-  EXPECT_EQ(1u, FindAttributeSdkLevel(ResourceId(0x01010000)));
+  EXPECT_EQ(1, FindAttributeSdkLevel(ResourceId(0x01010000)));
 }
 
-TEST(SdkConstantsTest, AllAttributesAfterLollipopAreLollipopMR1) {
-  EXPECT_EQ(SDK_LOLLIPOP, FindAttributeSdkLevel(ResourceId(0x010103f7)));
-  EXPECT_EQ(SDK_LOLLIPOP, FindAttributeSdkLevel(ResourceId(0x010104ce)));
-
-  EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104cf)));
-  EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104d8)));
-
-  EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104d9)));
-  EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x0101ffff)));
+TEST(SdkConstantsTest, NonFrameworkAttributeIsSdk0) {
+  EXPECT_EQ(0, FindAttributeSdkLevel(ResourceId(0x7f010345)));
 }
 
 }  // namespace aapt
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 5adf04a..e09a3979 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -478,7 +478,8 @@
 
   {
     std::string content;
-    if (!android::base::ReadFileToString(path_data.source.path, &content)) {
+    if (!android::base::ReadFileToString(path_data.source.path, &content,
+                                         true /*follow_symlinks*/)) {
       context->GetDiagnostics()->Error(DiagMessage(path_data.source)
                                        << android::base::SystemErrorCodeToString(errno));
       return false;
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 8accfa8..dd4b2ba 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -50,6 +50,7 @@
 #include "link/ManifestFixer.h"
 #include "link/ReferenceLinker.h"
 #include "link/TableMerger.h"
+#include "link/XmlCompatVersioner.h"
 #include "optimize/ResourceDeduper.h"
 #include "optimize/VersionCollapser.h"
 #include "process/IResourceTableConsumer.h"
@@ -247,25 +248,20 @@
   IAaptContext* context_;
 };
 
-static bool FlattenXml(xml::XmlResource* xml_res, const StringPiece& path,
-                       Maybe<size_t> max_sdk_level, bool keep_raw_values, IArchiveWriter* writer,
-                       IAaptContext* context) {
+static bool FlattenXml(IAaptContext* context, xml::XmlResource* xml_res, const StringPiece& path,
+                       bool keep_raw_values, IArchiveWriter* writer) {
   BigBuffer buffer(1024);
   XmlFlattenerOptions options = {};
   options.keep_raw_values = keep_raw_values;
-  options.max_sdk_level = max_sdk_level;
   XmlFlattener flattener(&buffer, options);
   if (!flattener.Consume(context, xml_res)) {
     return false;
   }
 
   if (context->IsVerbose()) {
-    DiagMessage msg;
-    msg << "writing " << path << " to archive";
-    if (max_sdk_level) {
-      msg << " maxSdkLevel=" << max_sdk_level.value() << " keepRawValues=" << keep_raw_values;
-    }
-    context->GetDiagnostics()->Note(msg);
+    context->GetDiagnostics()->Note(DiagMessage(path) << "writing to archive (keep_raw_values="
+                                                      << (keep_raw_values ? "true" : "false")
+                                                      << ")");
   }
 
   io::BigBufferInputStream input_stream(&buffer);
@@ -311,12 +307,33 @@
   std::unordered_set<std::string> extensions_to_not_compress;
 };
 
+// A sampling of public framework resource IDs.
+struct R {
+  struct attr {
+    enum : uint32_t {
+      paddingLeft = 0x010100d6u,
+      paddingRight = 0x010100d8u,
+      paddingHorizontal = 0x0101053du,
+
+      paddingTop = 0x010100d7u,
+      paddingBottom = 0x010100d9u,
+      paddingVertical = 0x0101053eu,
+
+      layout_marginLeft = 0x010100f7u,
+      layout_marginRight = 0x010100f9u,
+      layout_marginHorizontal = 0x0101053bu,
+
+      layout_marginTop = 0x010100f8u,
+      layout_marginBottom = 0x010100fau,
+      layout_marginVertical = 0x0101053cu,
+    };
+  };
+};
+
 class ResourceFileFlattener {
  public:
   ResourceFileFlattener(const ResourceFileFlattenerOptions& options, IAaptContext* context,
-                        proguard::KeepSet* keep_set)
-      : options_(options), context_(context), keep_set_(keep_set) {
-  }
+                        proguard::KeepSet* keep_set);
 
   bool Flatten(ResourceTable* table, IArchiveWriter* archive_writer);
 
@@ -325,7 +342,7 @@
     ConfigDescription config;
 
     // The entry this file came from.
-    const ResourceEntry* entry;
+    ResourceEntry* entry;
 
     // The file to copy as-is.
     io::IFile* file_to_copy;
@@ -335,19 +352,72 @@
 
     // The destination to write this file to.
     std::string dst_path;
-    bool skip_version = false;
   };
 
   uint32_t GetCompressionFlags(const StringPiece& str);
 
-  bool LinkAndVersionXmlFile(ResourceTable* table, FileOperation* file_op,
-                             std::queue<FileOperation>* out_file_op_queue);
+  std::vector<std::unique_ptr<xml::XmlResource>> LinkAndVersionXmlFile(ResourceTable* table,
+                                                                       FileOperation* file_op);
 
   ResourceFileFlattenerOptions options_;
   IAaptContext* context_;
   proguard::KeepSet* keep_set_;
+  XmlCompatVersioner::Rules rules_;
 };
 
+ResourceFileFlattener::ResourceFileFlattener(const ResourceFileFlattenerOptions& options,
+                                             IAaptContext* context, proguard::KeepSet* keep_set)
+    : options_(options), context_(context), keep_set_(keep_set) {
+  SymbolTable* symm = context_->GetExternalSymbols();
+
+  // Build up the rules for degrading newer attributes to older ones.
+  // NOTE(adamlesinski): These rules are hardcoded right now, but they should be
+  // generated from the attribute definitions themselves (b/62028956).
+  if (const SymbolTable::Symbol* s = symm->FindById(R::attr::paddingHorizontal)) {
+    std::vector<ReplacementAttr> replacements{
+        {"paddingLeft", R::attr::paddingLeft,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+        {"paddingRight", R::attr::paddingRight,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+    };
+    rules_[R::attr::paddingHorizontal] =
+        util::make_unique<DegradeToManyRule>(std::move(replacements));
+  }
+
+  if (const SymbolTable::Symbol* s = symm->FindById(R::attr::paddingVertical)) {
+    std::vector<ReplacementAttr> replacements{
+        {"paddingTop", R::attr::paddingTop,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+        {"paddingBottom", R::attr::paddingBottom,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+    };
+    rules_[R::attr::paddingVertical] =
+        util::make_unique<DegradeToManyRule>(std::move(replacements));
+  }
+
+  if (const SymbolTable::Symbol* s = symm->FindById(R::attr::layout_marginHorizontal)) {
+    std::vector<ReplacementAttr> replacements{
+        {"layout_marginLeft", R::attr::layout_marginLeft,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+        {"layout_marginRight", R::attr::layout_marginRight,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+    };
+    rules_[R::attr::layout_marginHorizontal] =
+        util::make_unique<DegradeToManyRule>(std::move(replacements));
+  }
+
+  if (const SymbolTable::Symbol* s = symm->FindById(R::attr::layout_marginVertical)) {
+    std::vector<ReplacementAttr> replacements{
+        {"layout_marginTop", R::attr::layout_marginTop,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+        {"layout_marginBottom", R::attr::layout_marginBottom,
+         Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+    };
+    rules_[R::attr::layout_marginVertical] =
+        util::make_unique<DegradeToManyRule>(std::move(replacements));
+  }
+}
+
 uint32_t ResourceFileFlattener::GetCompressionFlags(const StringPiece& str) {
   if (options_.do_not_compress_anything) {
     return 0;
@@ -369,8 +439,19 @@
          name == "transitionManager";
 }
 
-bool ResourceFileFlattener::LinkAndVersionXmlFile(ResourceTable* table, FileOperation* file_op,
-                                                  std::queue<FileOperation>* out_file_op_queue) {
+static bool IsVectorElement(const std::string& name) {
+  return name == "vector" || name == "animated-vector";
+}
+
+template <typename T>
+std::vector<T> make_singleton_vec(T&& val) {
+  std::vector<T> vec;
+  vec.emplace_back(std::forward<T>(val));
+  return vec;
+}
+
+std::vector<std::unique_ptr<xml::XmlResource>> ResourceFileFlattener::LinkAndVersionXmlFile(
+    ResourceTable* table, FileOperation* file_op) {
   xml::XmlResource* doc = file_op->xml_to_flatten.get();
   const Source& src = doc->file.source;
 
@@ -380,107 +461,60 @@
 
   XmlReferenceLinker xml_linker;
   if (!xml_linker.Consume(context_, doc)) {
-    return false;
+    return {};
   }
 
   if (options_.update_proguard_spec && !proguard::CollectProguardRules(src, doc, keep_set_)) {
-    return false;
+    return {};
   }
 
   if (options_.no_xml_namespaces) {
     XmlNamespaceRemover namespace_remover;
     if (!namespace_remover.Consume(context_, doc)) {
-      return false;
+      return {};
     }
   }
 
-  if (!options_.no_auto_version) {
-    if (options_.no_version_vectors) {
-      // Skip this if it is a vector or animated-vector.
-      xml::Element* el = xml::FindRootElement(doc);
-      if (el && el->namespace_uri.empty()) {
-        if (el->name == "vector" || el->name == "animated-vector") {
-          // We are NOT going to version this file.
-          file_op->skip_version = true;
-          return true;
-        }
-      }
-    }
-    if (options_.no_version_transitions) {
-      // Skip this if it is a transition resource.
-      xml::Element* el = xml::FindRootElement(doc);
-      if (el && el->namespace_uri.empty()) {
-        if (IsTransitionElement(el->name)) {
-          // We are NOT going to version this file.
-          file_op->skip_version = true;
-          return true;
-        }
-      }
-    }
+  if (options_.no_auto_version) {
+    return make_singleton_vec(std::move(file_op->xml_to_flatten));
+  }
 
-    const ConfigDescription& config = file_op->config;
-
-    // Find the first SDK level used that is higher than this defined config and
-    // not superseded by a lower or equal SDK level resource.
-    const int min_sdk_version = context_->GetMinSdkVersion();
-    for (int sdk_level : xml_linker.sdk_levels()) {
-      if (sdk_level > min_sdk_version && sdk_level > config.sdkVersion) {
-        if (!ShouldGenerateVersionedResource(file_op->entry, config, sdk_level)) {
-          // If we shouldn't generate a versioned resource, stop checking.
-          break;
-        }
-
-        ResourceFile versioned_file_desc = doc->file;
-        versioned_file_desc.config.sdkVersion = (uint16_t)sdk_level;
-
-        FileOperation new_file_op;
-        new_file_op.xml_to_flatten = util::make_unique<xml::XmlResource>(
-            versioned_file_desc, StringPool{}, doc->root->Clone());
-        new_file_op.config = versioned_file_desc.config;
-        new_file_op.entry = file_op->entry;
-        new_file_op.dst_path =
-            ResourceUtils::BuildResourceFileName(versioned_file_desc, context_->GetNameMangler());
-
-        if (context_->IsVerbose()) {
-          context_->GetDiagnostics()->Note(DiagMessage(versioned_file_desc.source)
-                                           << "auto-versioning resource from config '" << config
-                                           << "' -> '" << versioned_file_desc.config << "'");
-        }
-
-        bool added = table->AddFileReferenceAllowMangled(
-            versioned_file_desc.name, versioned_file_desc.config, versioned_file_desc.source,
-            new_file_op.dst_path, nullptr, context_->GetDiagnostics());
-        if (!added) {
-          return false;
-        }
-
-        out_file_op_queue->push(std::move(new_file_op));
-        break;
+  if (options_.no_version_vectors || options_.no_version_transitions) {
+    // Skip this if it is a vector or animated-vector.
+    xml::Element* el = xml::FindRootElement(doc);
+    if (el && el->namespace_uri.empty()) {
+      if ((options_.no_version_vectors && IsVectorElement(el->name)) ||
+          (options_.no_version_transitions && IsTransitionElement(el->name))) {
+        return make_singleton_vec(std::move(file_op->xml_to_flatten));
       }
     }
   }
-  return true;
+
+  const ConfigDescription& config = file_op->config;
+  ResourceEntry* entry = file_op->entry;
+
+  XmlCompatVersioner xml_compat_versioner(&rules_);
+  const util::Range<ApiVersion> api_range{config.sdkVersion,
+                                          FindNextApiVersionForConfig(entry, config)};
+  return xml_compat_versioner.Process(context_, doc, api_range);
 }
 
-/**
- * Do not insert or remove any resources while executing in this function. It
- * will
- * corrupt the iteration order.
- */
 bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archive_writer) {
   bool error = false;
   std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> config_sorted_files;
 
   for (auto& pkg : table->packages) {
     for (auto& type : pkg->types) {
-      // Sort by config and name, so that we get better locality in the zip
-      // file.
+      // Sort by config and name, so that we get better locality in the zip file.
       config_sorted_files.clear();
       std::queue<FileOperation> file_operations;
 
       // Populate the queue with all files in the ResourceTable.
       for (auto& entry : type->entries) {
         for (auto& config_value : entry->values) {
+          // WARNING! Do not insert or remove any resources while executing in this scope. It will
+          // corrupt the iteration order.
+
           FileReference* file_ref = ValueCast<FileReference>(config_value->value.get());
           if (!file_ref) {
             continue;
@@ -497,6 +531,7 @@
           file_op.entry = entry.get();
           file_op.dst_path = *file_ref->path;
           file_op.config = config_value->config;
+          file_op.file_to_copy = file;
 
           const StringPiece src_path = file->GetSource().path;
           if (type->type != ResourceType::kRaw &&
@@ -518,68 +553,51 @@
             file_op.xml_to_flatten->file.config = config_value->config;
             file_op.xml_to_flatten->file.source = file_ref->GetSource();
             file_op.xml_to_flatten->file.name = ResourceName(pkg->name, type->type, entry->name);
-
-            // Enqueue the XML files to be processed.
-            file_operations.push(std::move(file_op));
-          } else {
-            file_op.file_to_copy = file;
-
-            // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
-            // else we end up copying the string in the std::make_pair() method,
-            // then creating a StringPiece from the copy, which would cause us
-            // to end up referencing garbage in the map.
-            const StringPiece entry_name(entry->name);
-            config_sorted_files[std::make_pair(config_value->config, entry_name)] =
-                std::move(file_op);
           }
+
+          // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
+          // else we end up copying the string in the std::make_pair() method,
+          // then creating a StringPiece from the copy, which would cause us
+          // to end up referencing garbage in the map.
+          const StringPiece entry_name(entry->name);
+          config_sorted_files[std::make_pair(config_value->config, entry_name)] =
+              std::move(file_op);
         }
       }
 
-      // Now process the XML queue
-      for (; !file_operations.empty(); file_operations.pop()) {
-        FileOperation& file_op = file_operations.front();
-
-        if (!LinkAndVersionXmlFile(table, &file_op, &file_operations)) {
-          error = true;
-          continue;
-        }
-
-        // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
-        // we end up copying the string in the std::make_pair() method, then
-        // creating a StringPiece from the copy, which would cause us to end up
-        // referencing garbage in the map.
-        const StringPiece entry_name(file_op.entry->name);
-        config_sorted_files[std::make_pair(file_op.config, entry_name)] = std::move(file_op);
-      }
-
-      if (error) {
-        return false;
-      }
-
       // Now flatten the sorted values.
       for (auto& map_entry : config_sorted_files) {
         const ConfigDescription& config = map_entry.first.first;
-        const FileOperation& file_op = map_entry.second;
+        FileOperation& file_op = map_entry.second;
 
         if (file_op.xml_to_flatten) {
-          Maybe<size_t> max_sdk_level;
-          if (!options_.no_auto_version && !file_op.skip_version) {
-            max_sdk_level = std::max<size_t>(std::max<size_t>(config.sdkVersion, 1u),
-                                             context_->GetMinSdkVersion());
-          }
+          std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+              LinkAndVersionXmlFile(table, &file_op);
+          for (std::unique_ptr<xml::XmlResource>& doc : versioned_docs) {
+            std::string dst_path = file_op.dst_path;
+            if (doc->file.config != file_op.config) {
+              // Only add the new versioned configurations.
+              if (context_->IsVerbose()) {
+                context_->GetDiagnostics()->Note(DiagMessage(doc->file.source)
+                                                 << "auto-versioning resource from config '"
+                                                 << config << "' -> '" << doc->file.config << "'");
+              }
 
-          bool result = FlattenXml(file_op.xml_to_flatten.get(), file_op.dst_path, max_sdk_level,
-                                   options_.keep_raw_values, archive_writer, context_);
-          if (!result) {
-            error = true;
+              dst_path =
+                  ResourceUtils::BuildResourceFileName(doc->file, context_->GetNameMangler());
+              bool result = table->AddFileReferenceAllowMangled(doc->file.name, doc->file.config,
+                                                                doc->file.source, dst_path, nullptr,
+                                                                context_->GetDiagnostics());
+              if (!result) {
+                return false;
+              }
+            }
+            error |= !FlattenXml(context_, doc.get(), dst_path, options_.keep_raw_values,
+                                 archive_writer);
           }
         } else {
-          bool result =
-              io::CopyFileToArchive(context_, file_op.file_to_copy, file_op.dst_path,
-                                    GetCompressionFlags(file_op.dst_path), archive_writer);
-          if (!result) {
-            error = true;
-          }
+          error |= !io::CopyFileToArchive(context_, file_op.file_to_copy, file_op.dst_path,
+                                          GetCompressionFlags(file_op.dst_path), archive_writer);
         }
       }
     }
@@ -614,7 +632,7 @@
 static bool LoadStableIdMap(IDiagnostics* diag, const std::string& path,
                             std::unordered_map<ResourceName, ResourceId>* out_id_map) {
   std::string content;
-  if (!android::base::ReadFileToString(path, &content)) {
+  if (!android::base::ReadFileToString(path, &content, true /*follow_symlinks*/)) {
     diag->Error(DiagMessage(path) << "failed reading stable ID file");
     return false;
   }
@@ -1358,8 +1376,7 @@
   bool WriteApk(IArchiveWriter* writer, proguard::KeepSet* keep_set, xml::XmlResource* manifest,
                 ResourceTable* table) {
     const bool keep_raw_values = context_->GetPackageType() == PackageType::kStaticLib;
-    bool result =
-        FlattenXml(manifest, "AndroidManifest.xml", {}, keep_raw_values, writer, context_);
+    bool result = FlattenXml(context_, manifest, "AndroidManifest.xml", keep_raw_values, writer);
     if (!result) {
       return false;
     }
diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp
index 14d4260..8741b7b 100644
--- a/tools/aapt2/cmd/Util.cpp
+++ b/tools/aapt2/cmd/Util.cpp
@@ -131,7 +131,7 @@
 }
 
 static xml::AaptAttribute CreateAttributeWithId(const ResourceId& id) {
-  return xml::AaptAttribute{id, Attribute(true)};
+  return xml::AaptAttribute(Attribute(), id);
 }
 
 std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info,
diff --git a/tools/aapt2/flatten/XmlFlattener.cpp b/tools/aapt2/flatten/XmlFlattener.cpp
index e98d2d7..0711749 100644
--- a/tools/aapt2/flatten/XmlFlattener.cpp
+++ b/tools/aapt2/flatten/XmlFlattener.cpp
@@ -194,16 +194,9 @@
 
     // Filter the attributes.
     for (xml::Attribute& attr : node->attributes) {
-      if (options_.max_sdk_level && attr.compiled_attribute && attr.compiled_attribute.value().id) {
-        size_t sdk_level = FindAttributeSdkLevel(attr.compiled_attribute.value().id.value());
-        if (sdk_level > options_.max_sdk_level.value()) {
-          continue;
-        }
+      if (attr.namespace_uri != xml::kSchemaTools) {
+        filtered_attrs_.push_back(&attr);
       }
-      if (attr.namespace_uri == xml::kSchemaTools) {
-        continue;
-      }
-      filtered_attrs_.push_back(&attr);
     }
 
     if (filtered_attrs_.empty()) {
diff --git a/tools/aapt2/flatten/XmlFlattener.h b/tools/aapt2/flatten/XmlFlattener.h
index f5129fd..87557f2 100644
--- a/tools/aapt2/flatten/XmlFlattener.h
+++ b/tools/aapt2/flatten/XmlFlattener.h
@@ -30,11 +30,6 @@
    * Keep attribute raw string values along with typed values.
    */
   bool keep_raw_values = false;
-
-  /**
-   * If set, the max SDK level of attribute to flatten. All others are ignored.
-   */
-  Maybe<size_t> max_sdk_level;
 };
 
 class XmlFlattener : public IXmlResourceConsumer {
diff --git a/tools/aapt2/flatten/XmlFlattener_test.cpp b/tools/aapt2/flatten/XmlFlattener_test.cpp
index cfa89bb..f1e903f 100644
--- a/tools/aapt2/flatten/XmlFlattener_test.cpp
+++ b/tools/aapt2/flatten/XmlFlattener_test.cpp
@@ -149,31 +149,6 @@
   ASSERT_EQ(android::ResXMLTree::END_DOCUMENT, tree.next());
 }
 
-TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripSdk21) {
-  std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF(
-            <View xmlns:android="http://schemas.android.com/apk/res/android"
-                android:paddingStart="1dp"
-                android:colorAccent="#ffffff"/>)EOF");
-
-  XmlReferenceLinker linker;
-  ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
-  ASSERT_TRUE(linker.sdk_levels().count(17) == 1);
-  ASSERT_TRUE(linker.sdk_levels().count(21) == 1);
-
-  android::ResXMLTree tree;
-  XmlFlattenerOptions options;
-  options.max_sdk_level = 17;
-  ASSERT_TRUE(Flatten(doc.get(), &tree, options));
-
-  while (tree.next() != android::ResXMLTree::START_TAG) {
-    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-  }
-
-  ASSERT_EQ(1u, tree.getAttributeCount());
-  EXPECT_EQ(uint32_t(0x010103b3), tree.getAttributeNameResID(0));
-}
-
 TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripOnlyTools) {
   std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF(
             <View xmlns:tools="http://schemas.android.com/tools"
@@ -234,13 +209,11 @@
   }
 
   const StringPiece16 kPackage = u"package";
-  EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()),
-            0);
+  EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()), 0);
 }
 
 TEST_F(XmlFlattenerTest, EmptyStringValueInAttributeIsNotNull) {
-  std::unique_ptr<xml::XmlResource> doc =
-      test::BuildXmlDom("<View package=\"\"/>");
+  std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom("<View package=\"\"/>");
 
   android::ResXMLTree tree;
   ASSERT_TRUE(Flatten(doc.get(), &tree));
@@ -251,8 +224,7 @@
   }
 
   const StringPiece16 kPackage = u"package";
-  ssize_t idx =
-      tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
+  ssize_t idx = tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
   ASSERT_GE(idx, 0);
 
   size_t len;
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/Android.mk b/tools/aapt2/integration-tests/AutoVersionTest/Android.mk
new file mode 100644
index 0000000..012728f
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/Android.mk
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_PACKAGE_NAME := AaptAutoVersionTest
+LOCAL_MODULE_TAGS := tests
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml b/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml
new file mode 100644
index 0000000..e66d709
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.aapt.autoversiontest">
+
+    <uses-sdk android:minSdkVersion="7" />
+</manifest>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml
new file mode 100644
index 0000000..bfc5445
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml
@@ -0,0 +1,19 @@
+<?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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+    android:paddingVertical="24dp" />
+ 
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml
new file mode 100644
index 0000000..091a8ce
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+    android:autoStart="true"
+    android:expandableListViewWhiteStyle="@empty"
+    android:screenSize="large"
+    android:subtitle="Hello"
+    android:resizeMode="none"
+    android:largestWidthLimitDp="999"
+    android:uiOptions="none"
+    android:parentActivityName="Hello"
+    android:paddingStart="999dp"
+    android:requiredForAllUsers="true"
+    android:category="Hello"
+    android:isGame="true"
+    android:colorPrimary="#ffffff"
+    android:revisionCode="999"
+    android:autoVerify="true"
+    android:use32bitAbi="true"
+    android:shortcutId="@+id/id" />
+
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml
new file mode 100644
index 0000000..339337a
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml
@@ -0,0 +1,47 @@
+<?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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+    class="foo">
+    <View
+        android:paddingHorizontal="24dp" />
+    <View
+        android:paddingHorizontal="24dp"
+        android:paddingStart="16dp"
+        android:paddingEnd="16dp" />
+    <View
+        android:paddingHorizontal="24dp"
+        android:paddingLeft="16dp"
+        android:paddingRight="16dp" />
+    <View
+        android:paddingVertical="24dp" />
+    <View
+        android:paddingVertical="24dp"
+        android:paddingTop="16dp"
+        android:paddingBottom="16dp" />
+    <View
+        android:layout_marginHorizontal="24dp" />
+    <View
+        android:layout_marginHorizontal="24dp"
+        android:layout_marginStart="16dp"
+        android:layout_marginEnd="16dp" />
+    <View
+        android:layout_marginVertical="24dp" />
+    <View
+        android:layout_marginVertical="24dp"
+        android:layout_marginTop="16dp"
+        android:layout_marginBottom="16dp" />
+</View>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml
new file mode 100644
index 0000000..8025ce1
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml
@@ -0,0 +1,19 @@
+<?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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+    android:paddingHorizontal="24dp" />
+ 
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml
new file mode 100644
index 0000000..ff13faa
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+
+<resources>
+    <style name="Style2">
+        <!-- API 7 -->
+        <item name="android:autoStart">false</item>
+
+        <!-- API 17 -->
+        <item name="android:paddingStart">0dp</item>
+
+        <!-- API 21 -->
+        <item name="android:colorPrimary">#00ff00</item>
+    </style>
+</resources>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml
new file mode 100644
index 0000000..c4f09846
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml
@@ -0,0 +1,84 @@
+<?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.
+-->
+
+<resources>
+    <style name="Style1">
+        <!-- API 7 -->
+        <item name="android:autoStart">true</item>
+
+        <!-- API 8 -->
+        <item name="android:expandableListViewWhiteStyle">@null</item>
+
+        <!-- API 9 -->
+        <item name="android:screenSize">large</item>
+
+        <!-- API 11 -->
+        <item name="android:subtitle">Hello</item>
+
+        <!-- API 12 -->
+        <item name="android:resizeMode">none</item>
+
+        <!-- API 13 -->
+        <item name="android:largestWidthLimitDp">999</item>
+
+        <!-- API 14 -->
+        <item name="android:uiOptions">none</item>
+
+        <!-- API 16 -->
+        <item name="android:parentActivityName">Hello</item>
+
+        <!-- API 17 -->
+        <item name="android:paddingStart">999dp</item>
+
+        <!-- API 18 -->
+        <item name="android:requiredForAllUsers">true</item>
+
+        <!-- API 19 -->
+        <item name="android:category">Hello</item>
+
+        <!-- API 20 -->
+        <item name="android:isGame">true</item>
+
+        <!-- API 21 -->
+        <item name="android:colorPrimary">#ffffff</item>
+
+        <!-- API 22 -->
+        <item name="android:revisionCode">999</item>
+
+        <!-- API 23 -->
+        <item name="android:autoVerify">true</item>
+
+        <!-- API 24 -->
+        <item name="android:use32bitAbi">true</item>
+
+        <!-- API 25 -->
+        <item name="android:shortcutId">@+id/id</item>
+
+        <!-- API 26 -->
+        <item name="android:paddingHorizontal">999dp</item>
+    </style>
+
+    <style name="Style2">
+        <!-- API 7 -->
+        <item name="android:autoStart">true</item>
+
+        <!-- API 17 -->
+        <item name="android:paddingStart">999dp</item>
+
+        <!-- API 21 -->
+        <item name="android:colorPrimary">#ffffff</item>
+    </style>
+</resources>
diff --git a/tools/aapt2/integration-tests/SymlinkTest/Android.mk b/tools/aapt2/integration-tests/SymlinkTest/Android.mk
new file mode 100644
index 0000000..902fc65
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/Android.mk
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_PACKAGE_NAME := AaptSymlinkTest
+LOCAL_MODULE_TAGS := tests
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml b/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml
new file mode 100644
index 0000000..abbfa53
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.aapt.symlinktest" />
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png b/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png
new file mode 120000
index 0000000..a7e8e2f
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png
@@ -0,0 +1 @@
+../../targets/white_3x3.9.png
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml b/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml
new file mode 120000
index 0000000..29c30e1
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml
@@ -0,0 +1 @@
+../../targets/layout.xml
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml b/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml
new file mode 120000
index 0000000..554bb71
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml
@@ -0,0 +1 @@
+../../targets/values.xml
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml b/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml
new file mode 100644
index 0000000..e5835ed
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml
@@ -0,0 +1,19 @@
+<?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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml b/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml
new file mode 100644
index 0000000..5b02843
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml
@@ -0,0 +1,19 @@
+<?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.
+-->
+
+<resources>
+    <bool name="foo">true</bool>
+</resources>
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png b/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png
new file mode 100644
index 0000000..1a3731b
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png
Binary files differ
diff --git a/tools/aapt2/link/AutoVersioner.cpp b/tools/aapt2/link/AutoVersioner.cpp
index 77471ea..f80c6e9 100644
--- a/tools/aapt2/link/AutoVersioner.cpp
+++ b/tools/aapt2/link/AutoVersioner.cpp
@@ -27,13 +27,15 @@
 
 namespace aapt {
 
-bool ShouldGenerateVersionedResource(const ResourceEntry* entry,
-                                     const ConfigDescription& config,
-                                     const int sdk_version_to_generate) {
-  // We assume the caller is trying to generate a version greater than the
-  // current configuration.
+bool ShouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+                                     const ApiVersion sdk_version_to_generate) {
+  // We assume the caller is trying to generate a version greater than the current configuration.
   CHECK(sdk_version_to_generate > config.sdkVersion);
+  return sdk_version_to_generate < FindNextApiVersionForConfig(entry, config);
+}
 
+ApiVersion FindNextApiVersionForConfig(const ResourceEntry* entry,
+                                       const ConfigDescription& config) {
   const auto end_iter = entry->values.end();
   auto iter = entry->values.begin();
   for (; iter != end_iter; ++iter) {
@@ -46,26 +48,23 @@
   CHECK(iter != entry->values.end());
   ++iter;
 
-  // The next configuration either only varies in sdkVersion, or it is
-  // completely different
-  // and therefore incompatible. If it is incompatible, we must generate the
-  // versioned resource.
+  // The next configuration either only varies in sdkVersion, or it is completely different
+  // and therefore incompatible. If it is incompatible, we must generate the versioned resource.
 
-  // NOTE: The ordering of configurations takes sdkVersion as higher precedence
-  // than other
+  // NOTE: The ordering of configurations takes sdkVersion as higher precedence than other
   // qualifiers, so we need to iterate through the entire list to be sure there
   // are no higher sdk level versions of this resource.
   ConfigDescription temp_config(config);
   for (; iter != end_iter; ++iter) {
     temp_config.sdkVersion = (*iter)->config.sdkVersion;
     if (temp_config == (*iter)->config) {
-      // The two configs are the same, check the sdk version.
-      return sdk_version_to_generate < (*iter)->config.sdkVersion;
+      // The two configs are the same, return the sdkVersion.
+      return (*iter)->config.sdkVersion;
     }
   }
 
-  // No match was found, so we should generate the versioned resource.
-  return true;
+  // Didn't find another config with a different sdk version, so return the highest possible value.
+  return std::numeric_limits<ApiVersion>::max();
 }
 
 bool AutoVersioner::Consume(IAaptContext* context, ResourceTable* table) {
@@ -86,7 +85,7 @@
           }
 
           if (Style* style = ValueCast<Style>(config_value->value.get())) {
-            Maybe<size_t> min_sdk_stripped;
+            Maybe<ApiVersion> min_sdk_stripped;
             std::vector<Style::Entry> stripped;
 
             auto iter = style->entries.begin();
@@ -95,17 +94,14 @@
 
               // Find the SDK level that is higher than the configuration
               // allows.
-              const size_t sdk_level =
-                  FindAttributeSdkLevel(iter->key.id.value());
-              if (sdk_level >
-                  std::max<size_t>(config_value->config.sdkVersion, 1)) {
+              const ApiVersion sdk_level = FindAttributeSdkLevel(iter->key.id.value());
+              if (sdk_level > std::max<ApiVersion>(config_value->config.sdkVersion, 1)) {
                 // Record that we are about to strip this.
                 stripped.emplace_back(std::move(*iter));
 
                 // We use the smallest SDK level to generate the new style.
                 if (min_sdk_stripped) {
-                  min_sdk_stripped =
-                      std::min(min_sdk_stripped.value(), sdk_level);
+                  min_sdk_stripped = std::min(min_sdk_stripped.value(), sdk_level);
                 } else {
                   min_sdk_stripped = sdk_level;
                 }
@@ -126,10 +122,9 @@
                                                   min_sdk_stripped.value())) {
                 // Let's create a new Style for this versioned resource.
                 ConfigDescription new_config(config_value->config);
-                new_config.sdkVersion = min_sdk_stripped.value();
+                new_config.sdkVersion = static_cast<uint16_t>(min_sdk_stripped.value());
 
-                std::unique_ptr<Style> new_style(
-                    style->Clone(&table->string_pool));
+                std::unique_ptr<Style> new_style(style->Clone(&table->string_pool));
                 new_style->SetComment(style->GetComment());
                 new_style->SetSource(style->GetSource());
 
@@ -140,8 +135,7 @@
                     std::make_move_iterator(stripped.end()));
 
                 // Insert the new Resource into the correct place.
-                entry->FindOrCreateValue(new_config, {})->value =
-                    std::move(new_style);
+                entry->FindOrCreateValue(new_config, {})->value = std::move(new_style);
               }
             }
           }
diff --git a/tools/aapt2/link/Linkers.h b/tools/aapt2/link/Linkers.h
index d00fa73..5527f90 100644
--- a/tools/aapt2/link/Linkers.h
+++ b/tools/aapt2/link/Linkers.h
@@ -23,6 +23,7 @@
 #include "android-base/macros.h"
 
 #include "Resource.h"
+#include "SdkConstants.h"
 #include "process/IResourceTableConsumer.h"
 #include "xml/XmlDom.h"
 
@@ -44,9 +45,12 @@
  * Determines whether a versioned resource should be created. If a versioned
  * resource already exists, it takes precedence.
  */
-bool ShouldGenerateVersionedResource(const ResourceEntry* entry,
-                                     const ConfigDescription& config,
-                                     const int sdk_version_to_generate);
+bool ShouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+                                     const ApiVersion sdk_version_to_generate);
+
+// Finds the next largest ApiVersion of the config which is identical to the given config except
+// for sdkVersion.
+ApiVersion FindNextApiVersionForConfig(const ResourceEntry* entry, const ConfigDescription& config);
 
 class AutoVersioner : public IResourceTableConsumer {
  public:
@@ -105,11 +109,10 @@
 
 class ProductFilter : public IResourceTableConsumer {
  public:
-  using ResourceConfigValueIter =
-      std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
+  using ResourceConfigValueIter = std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
 
-  explicit ProductFilter(std::unordered_set<std::string> products)
-      : products_(products) {}
+  explicit ProductFilter(std::unordered_set<std::string> products) : products_(products) {
+  }
 
   ResourceConfigValueIter SelectProductToKeep(
       const ResourceNameRef& name, const ResourceConfigValueIter begin,
@@ -118,19 +121,9 @@
   bool Consume(IAaptContext* context, ResourceTable* table) override;
 
  private:
-  std::unordered_set<std::string> products_;
-
   DISALLOW_COPY_AND_ASSIGN(ProductFilter);
-};
 
-class XmlAutoVersioner : public IXmlResourceConsumer {
- public:
-  XmlAutoVersioner() = default;
-
-  bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(XmlAutoVersioner);
+  std::unordered_set<std::string> products_;
 };
 
 /**
@@ -143,8 +136,7 @@
  */
 class XmlNamespaceRemover : public IXmlResourceConsumer {
  public:
-  explicit XmlNamespaceRemover(bool keep_uris = false)
-      : keep_uris_(keep_uris){};
+  explicit XmlNamespaceRemover(bool keep_uris = false) : keep_uris_(keep_uris){};
 
   bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
 
@@ -165,17 +157,8 @@
 
   bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
 
-  /**
-   * Once the XmlResource has been consumed, this returns the various SDK levels
-   * in which
-   * framework attributes used within the XML document were defined.
-   */
-  inline const std::set<int>& sdk_levels() const { return sdk_levels_found_; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(XmlReferenceLinker);
-
-  std::set<int> sdk_levels_found_;
 };
 
 }  // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index 833ae69..18498e3 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -274,7 +274,7 @@
     if (out_error) *out_error = "is not an attribute";
     return {};
   }
-  return xml::AaptAttribute{symbol->id, *symbol->attribute};
+  return xml::AaptAttribute(*symbol->attribute, symbol->id);
 }
 
 void ReferenceLinker::WriteResourceName(DiagMessage* out_msg,
diff --git a/tools/aapt2/link/XmlCompatVersioner.cpp b/tools/aapt2/link/XmlCompatVersioner.cpp
new file mode 100644
index 0000000..f1f4e3b
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner.cpp
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "link/XmlCompatVersioner.h"
+
+#include <algorithm>
+
+#include "util/Util.h"
+
+namespace aapt {
+
+static xml::Attribute CopyAttr(const xml::Attribute& src, StringPool* out_string_pool) {
+  xml::Attribute dst{src.namespace_uri, src.name, src.value, src.compiled_attribute};
+  if (src.compiled_value != nullptr) {
+    dst.compiled_value.reset(src.compiled_value->Clone(out_string_pool));
+  }
+  return dst;
+}
+
+// Returns false if the attribute is not copied because an existing attribute takes precedence
+// (came from a rule).
+static bool CopyAttribute(const xml::Attribute& src_attr, bool generated, xml::Element* dst_el,
+                          StringPool* out_string_pool) {
+  xml::Attribute* dst_attr = dst_el->FindAttribute(src_attr.namespace_uri, src_attr.name);
+  if (dst_attr != nullptr) {
+    if (generated) {
+      // Generated attributes always take precedence.
+      dst_attr->value = src_attr.value;
+      dst_attr->compiled_attribute = src_attr.compiled_attribute;
+      if (src_attr.compiled_value != nullptr) {
+        dst_attr->compiled_value.reset(src_attr.compiled_value->Clone(out_string_pool));
+      }
+      return true;
+    }
+    return false;
+  }
+  dst_el->attributes.push_back(CopyAttr(src_attr, out_string_pool));
+  return true;
+}
+
+void XmlCompatVersioner::ProcessRule(const xml::Element& src_el, const xml::Attribute& src_attr,
+                                     const ApiVersion& src_attr_version, const IDegradeRule* rule,
+                                     const util::Range<ApiVersion>& api_range, bool generated,
+                                     xml::Element* dst_el,
+                                     std::set<ApiVersion>* out_apis_referenced,
+                                     StringPool* out_string_pool) {
+  if (src_attr_version <= api_range.start) {
+    // The API is compatible, so don't check the rule and just copy.
+    if (!CopyAttribute(src_attr, generated, dst_el, out_string_pool)) {
+      // TODO(adamlesinski): Log a warning that an attribute was overridden?
+    }
+    return;
+  }
+
+  if (api_range.start >= SDK_LOLLIPOP_MR1) {
+    // Since LOLLIPOP MR1, the framework can handle silently ignoring unknown public attributes,
+    // so we don't need to erase/version them.
+    // Copy.
+    if (!CopyAttribute(src_attr, generated, dst_el, out_string_pool)) {
+      // TODO(adamlesinski): Log a warning that an attribute was overridden?
+    }
+  } else {
+    // We are going to erase this attribute from this XML resource version, but check if
+    // we even need to move it anywhere. A developer may have effectively overwritten it with
+    // a similarly versioned XML resource.
+    if (src_attr_version < api_range.end) {
+      // There is room for another versioned XML resource between this XML resource and the next
+      // versioned XML resource defined by the developer.
+      out_apis_referenced->insert(std::min<ApiVersion>(src_attr_version, SDK_LOLLIPOP_MR1));
+    }
+  }
+
+  if (rule != nullptr) {
+    for (const DegradeResult& result : rule->Degrade(src_el, src_attr, out_string_pool)) {
+      const ResourceId attr_resid = result.attr.compiled_attribute.value().id.value();
+      const ApiVersion attr_version = FindAttributeSdkLevel(attr_resid);
+
+      auto iter = rules_->find(attr_resid);
+      ProcessRule(src_el, result.attr, attr_version,
+                  iter != rules_->end() ? iter->second.get() : nullptr, api_range,
+                  true /*generated*/, dst_el, out_apis_referenced, out_string_pool);
+    }
+  }
+}
+
+XmlCompatVersioner::XmlCompatVersioner(const Rules* rules) : rules_(rules) {
+}
+
+std::unique_ptr<xml::XmlResource> XmlCompatVersioner::ProcessDoc(
+    ApiVersion target_api, ApiVersion max_api, xml::XmlResource* doc,
+    std::set<ApiVersion>* out_apis_referenced) {
+  const util::Range<ApiVersion> api_range{target_api, max_api};
+
+  std::unique_ptr<xml::XmlResource> cloned_doc = util::make_unique<xml::XmlResource>(doc->file);
+  cloned_doc->file.config.sdkVersion = static_cast<uint16_t>(target_api);
+
+  cloned_doc->root = doc->root->Clone([&](const xml::Element& el, xml::Element* out_el) {
+    for (const auto& attr : el.attributes) {
+      if (!attr.compiled_attribute) {
+        // Just copy if this isn't a compiled attribute.
+        out_el->attributes.push_back(CopyAttr(attr, &cloned_doc->string_pool));
+        continue;
+      }
+
+      const ResourceId attr_resid = attr.compiled_attribute.value().id.value();
+      const ApiVersion attr_version = FindAttributeSdkLevel(attr_resid);
+
+      auto rule = rules_->find(attr_resid);
+      ProcessRule(el, attr, attr_version, rule != rules_->end() ? rule->second.get() : nullptr,
+                  api_range, false /*generated*/, out_el, out_apis_referenced,
+                  &cloned_doc->string_pool);
+    }
+  });
+  return cloned_doc;
+}
+
+std::vector<std::unique_ptr<xml::XmlResource>> XmlCompatVersioner::Process(
+    IAaptContext* context, xml::XmlResource* doc, util::Range<ApiVersion> api_range) {
+  // Adjust the API range so that it falls after this document and after minSdkVersion.
+  api_range.start = std::max(api_range.start, context->GetMinSdkVersion());
+  api_range.start = std::max(api_range.start, static_cast<ApiVersion>(doc->file.config.sdkVersion));
+
+  std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs;
+  std::set<ApiVersion> apis_referenced;
+  versioned_docs.push_back(ProcessDoc(api_range.start, api_range.end, doc, &apis_referenced));
+
+  // Adjust the sdkVersion of the first XML document back to its original (this only really
+  // makes a difference if the sdk version was below the minSdk to start).
+  versioned_docs.back()->file.config.sdkVersion = doc->file.config.sdkVersion;
+
+  // Iterate from smallest to largest API version.
+  for (ApiVersion api : apis_referenced) {
+    std::set<ApiVersion> dummy;
+    versioned_docs.push_back(ProcessDoc(api, api_range.end, doc, &dummy));
+  }
+  return versioned_docs;
+}
+
+DegradeToManyRule::DegradeToManyRule(std::vector<ReplacementAttr> attrs)
+    : attrs_(std::move(attrs)) {
+}
+
+static inline std::unique_ptr<Item> CloneIfNotNull(const std::unique_ptr<Item>& src,
+                                                   StringPool* out_string_pool) {
+  if (src == nullptr) {
+    return {};
+  }
+  return std::unique_ptr<Item>(src->Clone(out_string_pool));
+}
+
+std::vector<DegradeResult> DegradeToManyRule::Degrade(const xml::Element& src_el,
+                                                      const xml::Attribute& src_attr,
+                                                      StringPool* out_string_pool) const {
+  std::vector<DegradeResult> result;
+  result.reserve(attrs_.size());
+  for (const ReplacementAttr& attr : attrs_) {
+    result.push_back(
+        DegradeResult{xml::Attribute{xml::kSchemaAndroid, attr.name, src_attr.value,
+                                     xml::AaptAttribute{attr.attr, attr.id},
+                                     CloneIfNotNull(src_attr.compiled_value, out_string_pool)},
+                      FindAttributeSdkLevel(attr.id)});
+  }
+  return result;
+}
+
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlCompatVersioner.h b/tools/aapt2/link/XmlCompatVersioner.h
new file mode 100644
index 0000000..099e23c
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT_LINKER_XMLCOMPATVERSIONER_H
+#define AAPT_LINKER_XMLCOMPATVERSIONER_H
+
+#include <set>
+#include <unordered_map>
+#include <vector>
+
+#include "android-base/macros.h"
+
+#include "Resource.h"
+#include "SdkConstants.h"
+#include "process/IResourceTableConsumer.h"
+#include "util/Util.h"
+#include "xml/XmlDom.h"
+
+namespace aapt {
+
+class IDegradeRule;
+
+struct DegradeResult {
+  xml::Attribute attr;
+  ApiVersion attr_api_version;
+};
+
+class IDegradeRule {
+ public:
+  IDegradeRule() = default;
+  virtual ~IDegradeRule() = default;
+
+  virtual std::vector<DegradeResult> Degrade(const xml::Element& src_el,
+                                             const xml::Attribute& src_attr,
+                                             StringPool* out_string_pool) const = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(IDegradeRule);
+};
+
+class XmlCompatVersioner {
+ public:
+  using Rules = std::unordered_map<ResourceId, std::unique_ptr<IDegradeRule>>;
+
+  XmlCompatVersioner(const Rules* rules);
+
+  std::vector<std::unique_ptr<xml::XmlResource>> Process(IAaptContext* context,
+                                                         xml::XmlResource* doc,
+                                                         util::Range<ApiVersion> api_range);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(XmlCompatVersioner);
+
+  std::unique_ptr<xml::XmlResource> ProcessDoc(ApiVersion target_api, ApiVersion max_api,
+                                               xml::XmlResource* doc,
+                                               std::set<ApiVersion>* out_apis_referenced);
+  void ProcessRule(const xml::Element& src_el, const xml::Attribute& src_attr,
+                   const ApiVersion& src_attr_version, const IDegradeRule* rule,
+                   const util::Range<ApiVersion>& api_range, bool generated, xml::Element* dst_el,
+                   std::set<ApiVersion>* out_apis_referenced, StringPool* out_string_pool);
+
+  const Rules* rules_;
+};
+
+struct ReplacementAttr {
+  std::string name;
+  ResourceId id;
+  Attribute attr;
+};
+
+class DegradeToManyRule : public IDegradeRule {
+ public:
+  DegradeToManyRule(std::vector<ReplacementAttr> attrs);
+  virtual ~DegradeToManyRule() = default;
+
+  std::vector<DegradeResult> Degrade(const xml::Element& src_el, const xml::Attribute& src_attr,
+                                     StringPool* out_string_pool) const override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DegradeToManyRule);
+
+  std::vector<ReplacementAttr> attrs_;
+};
+
+}  // namespace aapt
+
+#endif  // AAPT_LINKER_XMLCOMPATVERSIONER_H
diff --git a/tools/aapt2/link/XmlCompatVersioner_test.cpp b/tools/aapt2/link/XmlCompatVersioner_test.cpp
new file mode 100644
index 0000000..ce6605c
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner_test.cpp
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "link/XmlCompatVersioner.h"
+
+#include "Linkers.h"
+#include "test/Test.h"
+
+namespace aapt {
+
+constexpr auto TYPE_DIMENSION = android::ResTable_map::TYPE_DIMENSION;
+constexpr auto TYPE_STRING = android::ResTable_map::TYPE_STRING;
+
+struct R {
+  struct attr {
+    enum : uint32_t {
+      paddingLeft = 0x010100d6u,         // (API 1)
+      paddingRight = 0x010100d8u,        // (API 1)
+      progressBarPadding = 0x01010319u,  // (API 11)
+      paddingStart = 0x010103b3u,        // (API 17)
+      paddingHorizontal = 0x0101053du,   // (API 26)
+    };
+  };
+};
+
+class XmlCompatVersionerTest : public ::testing::Test {
+ public:
+  void SetUp() override {
+    context_ =
+        test::ContextBuilder()
+            .SetCompilationPackage("com.app")
+            .SetPackageId(0x7f)
+            .SetPackageType(PackageType::kApp)
+            .SetMinSdkVersion(SDK_GINGERBREAD)
+            .AddSymbolSource(
+                test::StaticSymbolSourceBuilder()
+                    .AddPublicSymbol("android:attr/paddingLeft", R::attr::paddingLeft,
+                                     util::make_unique<Attribute>(false, TYPE_DIMENSION))
+                    .AddPublicSymbol("android:attr/paddingRight", R::attr::paddingRight,
+                                     util::make_unique<Attribute>(false, TYPE_DIMENSION))
+                    .AddPublicSymbol("android:attr/progressBarPadding", R::attr::progressBarPadding,
+                                     util::make_unique<Attribute>(false, TYPE_DIMENSION))
+                    .AddPublicSymbol("android:attr/paddingStart", R::attr::paddingStart,
+                                     util::make_unique<Attribute>(false, TYPE_DIMENSION))
+                    .AddPublicSymbol("android:attr/paddingHorizontal", R::attr::paddingHorizontal,
+                                     util::make_unique<Attribute>(false, TYPE_DIMENSION))
+                    .AddSymbol("com.app:attr/foo", ResourceId(0x7f010000),
+                               util::make_unique<Attribute>(false, TYPE_STRING))
+                    .Build())
+            .Build();
+  }
+
+ protected:
+  std::unique_ptr<IAaptContext> context_;
+};
+
+TEST_F(XmlCompatVersionerTest, NoRulesOnlyStripsAndCopies) {
+  auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+      <View xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:paddingHorizontal="24dp"
+          app:foo="16dp"
+          foo="bar"/>)EOF");
+
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+  XmlCompatVersioner::Rules rules;
+  const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+  XmlCompatVersioner versioner(&rules);
+  std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+      versioner.Process(context_.get(), doc.get(), api_range);
+  ASSERT_EQ(2u, versioned_docs.size());
+
+  xml::Element* el;
+
+  // Source XML file's sdkVersion == 0, so the first one must also have the same sdkVersion.
+  EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[0].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(2u, el->attributes.size());
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+  EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+  EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+  EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[1].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(3u, el->attributes.size());
+  EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+  EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+  EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+}
+
+TEST_F(XmlCompatVersionerTest, SingleRule) {
+  auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+      <View xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:paddingHorizontal="24dp"
+          app:foo="16dp"
+          foo="bar"/>)EOF");
+
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+  XmlCompatVersioner::Rules rules;
+  rules[R::attr::paddingHorizontal] =
+      util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+          {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+           ReplacementAttr{"paddingRight", R::attr::paddingRight,
+                           Attribute(false, TYPE_DIMENSION)}}));
+
+  const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+  XmlCompatVersioner versioner(&rules);
+  std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+      versioner.Process(context_.get(), doc.get(), api_range);
+  ASSERT_EQ(2u, versioned_docs.size());
+
+  xml::Element* el;
+
+  EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[0].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(4u, el->attributes.size());
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+  EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+  EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+  xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[1].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(5u, el->attributes.size());
+  EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+  EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+  EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+}
+
+TEST_F(XmlCompatVersionerTest, ChainedRule) {
+  auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+      <View xmlns:android="http://schemas.android.com/apk/res/android"
+          android:paddingHorizontal="24dp" />)EOF");
+
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+  XmlCompatVersioner::Rules rules;
+  rules[R::attr::progressBarPadding] =
+      util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+          {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+           ReplacementAttr{"paddingRight", R::attr::paddingRight,
+                           Attribute(false, TYPE_DIMENSION)}}));
+  rules[R::attr::paddingHorizontal] =
+      util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>({ReplacementAttr{
+          "progressBarPadding", R::attr::progressBarPadding, Attribute(false, TYPE_DIMENSION)}}));
+
+  const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+  XmlCompatVersioner versioner(&rules);
+  std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+      versioner.Process(context_.get(), doc.get(), api_range);
+  ASSERT_EQ(3u, versioned_docs.size());
+
+  xml::Element* el;
+
+  EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[0].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(2u, el->attributes.size());
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+
+  xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  EXPECT_EQ(static_cast<uint16_t>(SDK_HONEYCOMB), versioned_docs[1]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[1].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(1u, el->attributes.size());
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingLeft"));
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingRight"));
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "progressBarPadding");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[2]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[2].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(2u, el->attributes.size());
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingLeft"));
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingRight"));
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "progressBarPadding");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(attr->compiled_attribute);
+}
+
+TEST_F(XmlCompatVersionerTest, DegradeRuleOverridesExistingAttribute) {
+  auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+      <View xmlns:android="http://schemas.android.com/apk/res/android"
+          android:paddingHorizontal="24dp"
+          android:paddingLeft="16dp"
+          android:paddingRight="16dp"/>)EOF");
+
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+  Item* padding_horizontal_value = xml::FindRootElement(doc.get())
+                                       ->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal")
+                                       ->compiled_value.get();
+  ASSERT_NE(nullptr, padding_horizontal_value);
+
+  XmlCompatVersioner::Rules rules;
+  rules[R::attr::paddingHorizontal] =
+      util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+          {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+           ReplacementAttr{"paddingRight", R::attr::paddingRight,
+                           Attribute(false, TYPE_DIMENSION)}}));
+
+  const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+  XmlCompatVersioner versioner(&rules);
+  std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+      versioner.Process(context_.get(), doc.get(), api_range);
+  ASSERT_EQ(2u, versioned_docs.size());
+
+  xml::Element* el;
+
+  EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[0].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(2u, el->attributes.size());
+  EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+
+  xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+  el = xml::FindRootElement(versioned_docs[1].get());
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(3u, el->attributes.size());
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+  ASSERT_TRUE(attr->compiled_attribute);
+
+  attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_NE(nullptr, attr->compiled_value);
+  ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+  ASSERT_TRUE(attr->compiled_attribute);
+}
+
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlReferenceLinker.cpp b/tools/aapt2/link/XmlReferenceLinker.cpp
index 94bdccd..721fc26 100644
--- a/tools/aapt2/link/XmlReferenceLinker.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker.cpp
@@ -72,13 +72,13 @@
   using xml::PackageAwareVisitor::Visit;
 
   XmlVisitor(const Source& source, const CallSite& callsite, IAaptContext* context,
-             SymbolTable* symbols, std::set<int>* sdk_levels_found)
+             SymbolTable* symbols)
       : source_(source),
         callsite_(callsite),
         context_(context),
         symbols_(symbols),
-        sdk_levels_found_(sdk_levels_found),
-        reference_visitor_(callsite, context, symbols, this) {}
+        reference_visitor_(callsite, context, symbols, this) {
+  }
 
   void Visit(xml::Element* el) override {
     // The default Attribute allows everything except enums or flags.
@@ -118,22 +118,12 @@
           continue;
         }
 
-        // Find this compiled attribute's SDK level.
-        const xml::AaptAttribute& aapt_attr = attr.compiled_attribute.value();
-        if (aapt_attr.id) {
-          // Record all SDK levels from which the attributes were defined.
-          const size_t sdk_level = FindAttributeSdkLevel(aapt_attr.id.value());
-          if (sdk_level > 1) {
-            sdk_levels_found_->insert(sdk_level);
-          }
-        }
-        attribute = &aapt_attr.attribute;
+        attribute = &attr.compiled_attribute.value().attribute;
       }
 
       attr.compiled_value = ResourceUtils::TryParseItemForAttribute(attr.value, attribute);
       if (attr.compiled_value) {
-        // With a compiledValue, we must resolve the reference and assign it an
-        // ID.
+        // With a compiledValue, we must resolve the reference and assign it an ID.
         attr.compiled_value->SetSource(source);
         attr.compiled_value->Accept(&reference_visitor_);
       } else if ((attribute->type_mask & android::ResTable_map::TYPE_STRING) == 0) {
@@ -164,7 +154,6 @@
   IAaptContext* context_;
   SymbolTable* symbols_;
 
-  std::set<int>* sdk_levels_found_;
   ReferenceVisitor reference_visitor_;
   bool error_ = false;
 };
@@ -172,10 +161,8 @@
 }  // namespace
 
 bool XmlReferenceLinker::Consume(IAaptContext* context, xml::XmlResource* resource) {
-  sdk_levels_found_.clear();
   const CallSite callsite = {resource->file.name};
-  XmlVisitor visitor(resource->file.source, callsite, context, context->GetExternalSymbols(),
-                     &sdk_levels_found_);
+  XmlVisitor visitor(resource->file.source, callsite, context, context->GetExternalSymbols());
   if (resource->root) {
     resource->root->Accept(&visitor);
     return !visitor.HasError();
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index 66ecc15..de81e73 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -160,16 +160,6 @@
   ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
 }
 
-TEST_F(XmlReferenceLinkerTest, SdkLevelsAreRecorded) {
-  std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
-        <View xmlns:android="http://schemas.android.com/apk/res/android"
-              android:colorAccent="#ffffff" />)EOF");
-
-  XmlReferenceLinker linker;
-  ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
-  EXPECT_TRUE(linker.sdk_levels().count(21) == 1);
-}
-
 TEST_F(XmlReferenceLinkerTest, LinkMangledAttributes) {
   std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
             <View xmlns:support="http://schemas.android.com/apk/res/com.android.support"
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 1a648bf..882a85b 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -237,14 +237,12 @@
   }
 
   // We found a resource.
-  std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>();
-  s->id = id;
+  std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>(id);
 
   // Check to see if it is an attribute.
   for (size_t i = 0; i < (size_t)count; i++) {
     if (entry[i].map.name.ident == android::ResTable_map::ATTR_TYPE) {
-      s->attribute = std::make_shared<Attribute>(false);
-      s->attribute->type_mask = entry[i].map.value.data;
+      s->attribute = std::make_shared<Attribute>(false, entry[i].map.value.data);
       break;
     }
   }
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index bd252d2..4a2181e 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -53,16 +53,12 @@
 class SymbolTable {
  public:
   struct Symbol {
-    Symbol() : Symbol(Maybe<ResourceId>{}) {}
+    Symbol() = default;
 
-    explicit Symbol(const Maybe<ResourceId>& i) : Symbol(i, nullptr) {}
-
-    Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr)
-        : Symbol(i, attr, false) {}
-
-    Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr,
-           bool pub)
-        : id(i), attribute(attr), is_public(pub) {}
+    explicit Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr = {},
+                    bool pub = false)
+        : id(i), attribute(attr), is_public(pub) {
+    }
 
     Symbol(const Symbol&) = default;
     Symbol(Symbol&&) = default;
diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md
index e92565f..ac09b59 100644
--- a/tools/aapt2/readme.md
+++ b/tools/aapt2/readme.md
@@ -1,5 +1,15 @@
 # Android Asset Packaging Tool 2.0 (AAPT2) release notes
 
+## Version 2.17
+### `aapt2 compile ...`
+- Fixed an issue where symlinks would not be followed when compiling PNGs. (bug 62144459)
+
+## Version 2.16
+### `aapt2 link ...`
+- Versioning of XML files is more intelligent, using a small set of rules to degrade
+  specific newer attributes to backwards compatible versions of them.
+  Ex: `android:paddingHorizontal` degrades to `android:paddingLeft` and `android:paddingRight`.
+
 ## Version 2.15
 ### `aapt2 compile ...`
 - Add `--no-crunch` option to avoid processing PNGs during the compile phase. Note that this
diff --git a/tools/aapt2/util/Files.cpp b/tools/aapt2/util/Files.cpp
index d10351b..1bf2594 100644
--- a/tools/aapt2/util/Files.cpp
+++ b/tools/aapt2/util/Files.cpp
@@ -181,12 +181,13 @@
   return std::move(filemap);
 }
 
-bool AppendArgsFromFile(const StringPiece& path,
-                        std::vector<std::string>* out_arglist,
+bool AppendArgsFromFile(const StringPiece& path, std::vector<std::string>* out_arglist,
                         std::string* out_error) {
   std::string contents;
-  if (!android::base::ReadFileToString(path.to_string(), &contents)) {
-    if (out_error) *out_error = "failed to read argument-list file";
+  if (!android::base::ReadFileToString(path.to_string(), &contents, true /*follow_symlinks*/)) {
+    if (out_error) {
+      *out_error = "failed to read argument-list file";
+    }
     return false;
   }
 
diff --git a/tools/aapt2/util/Util.h b/tools/aapt2/util/Util.h
index 30b9af6..386f74b 100644
--- a/tools/aapt2/util/Util.h
+++ b/tools/aapt2/util/Util.h
@@ -44,6 +44,12 @@
 namespace aapt {
 namespace util {
 
+template <typename T>
+struct Range {
+  T start;
+  T end;
+};
+
 std::vector<std::string> Split(const android::StringPiece& str, char sep);
 std::vector<std::string> SplitAndLowercase(const android::StringPiece& str, char sep);
 
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 98f5f1d..885ab3e 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -356,17 +356,16 @@
   return util::make_unique<XmlResource>(ResourceFile{}, std::move(string_pool), std::move(root));
 }
 
-std::unique_ptr<Node> Namespace::Clone() {
+std::unique_ptr<Node> Namespace::Clone(const ElementCloneFunc& el_cloner) {
   auto ns = util::make_unique<Namespace>();
   ns->comment = comment;
   ns->line_number = line_number;
   ns->column_number = column_number;
   ns->namespace_prefix = namespace_prefix;
   ns->namespace_uri = namespace_uri;
-
   ns->children.reserve(children.size());
   for (const std::unique_ptr<xml::Node>& child : children) {
-    ns->AppendChild(child->Clone());
+    ns->AppendChild(child->Clone(el_cloner));
   }
   return std::move(ns);
 }
@@ -412,6 +411,15 @@
   return nullptr;
 }
 
+const Attribute* Element::FindAttribute(const StringPiece& ns, const StringPiece& name) const {
+  for (const auto& attr : attributes) {
+    if (ns == attr.namespace_uri && name == attr.name) {
+      return &attr;
+    }
+  }
+  return nullptr;
+}
+
 Element* Element::FindChild(const StringPiece& ns, const StringPiece& name) {
   return FindChildWithAttribute(ns, name, {}, {}, {});
 }
@@ -464,29 +472,23 @@
   return elements;
 }
 
-std::unique_ptr<Node> Element::Clone() {
+std::unique_ptr<Node> Element::Clone(const ElementCloneFunc& el_cloner) {
   auto el = util::make_unique<Element>();
   el->comment = comment;
   el->line_number = line_number;
   el->column_number = column_number;
   el->name = name;
   el->namespace_uri = namespace_uri;
-
   el->attributes.reserve(attributes.size());
-  for (xml::Attribute& attr : attributes) {
-    // Don't copy compiled values or attributes.
-    el->attributes.push_back(
-        xml::Attribute{attr.namespace_uri, attr.name, attr.value});
-  }
-
+  el_cloner(*this, el.get());
   el->children.reserve(children.size());
   for (const std::unique_ptr<xml::Node>& child : children) {
-    el->AppendChild(child->Clone());
+    el->AppendChild(child->Clone(el_cloner));
   }
   return std::move(el);
 }
 
-std::unique_ptr<Node> Text::Clone() {
+std::unique_ptr<Node> Text::Clone(const ElementCloneFunc&) {
   auto t = util::make_unique<Text>();
   t->comment = comment;
   t->line_number = line_number;
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index 6950c30..2dc99d6 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -35,6 +35,8 @@
 
 class RawVisitor;
 
+class Element;
+
 /**
  * Base class for all XML nodes.
  */
@@ -51,7 +53,11 @@
   void AppendChild(std::unique_ptr<Node> child);
   void InsertChild(size_t index, std::unique_ptr<Node> child);
   virtual void Accept(RawVisitor* visitor) = 0;
-  virtual std::unique_ptr<Node> Clone() = 0;
+
+  using ElementCloneFunc = std::function<void(const Element&, Element*)>;
+
+  // Clones the Node subtree, using the given function to decide how to clone an Element.
+  virtual std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) = 0;
 };
 
 /**
@@ -72,12 +78,16 @@
   std::string namespace_prefix;
   std::string namespace_uri;
 
-  std::unique_ptr<Node> Clone() override;
+  std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
 };
 
 struct AaptAttribute {
-  Maybe<ResourceId> id;
+  explicit AaptAttribute(const ::aapt::Attribute& attr, const Maybe<ResourceId>& resid = {})
+      : attribute(attr), id(resid) {
+  }
+
   aapt::Attribute attribute;
+  Maybe<ResourceId> id;
 };
 
 /**
@@ -102,6 +112,8 @@
   std::vector<Attribute> attributes;
 
   Attribute* FindAttribute(const android::StringPiece& ns, const android::StringPiece& name);
+  const Attribute* FindAttribute(const android::StringPiece& ns,
+                                 const android::StringPiece& name) const;
   xml::Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name);
   xml::Element* FindChildWithAttribute(const android::StringPiece& ns,
                                        const android::StringPiece& name,
@@ -109,7 +121,7 @@
                                        const android::StringPiece& attr_name,
                                        const android::StringPiece& attr_value);
   std::vector<xml::Element*> GetChildElements();
-  std::unique_ptr<Node> Clone() override;
+  std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
 };
 
 /**
@@ -119,7 +131,7 @@
  public:
   std::string text;
 
-  std::unique_ptr<Node> Clone() override;
+  std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
 };
 
 /**
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 25d61af..cfc1fd2 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -383,6 +383,21 @@
     @SystemApi
     public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
     /**
+     * The interface used for the softap.
+     *
+     * @hide
+     */
+    public static final String EXTRA_WIFI_AP_INTERFACE_NAME = "wifi_ap_interface_name";
+    /**
+     * The intended ip mode for this softap.
+     * @see #IFACE_IP_MODE_TETHERED
+     * @see #IFACE_IP_MODE_LOCAL_ONLY
+     *
+     * @hide
+     */
+    public static final String EXTRA_WIFI_AP_MODE = "wifi_ap_mode";
+
+    /**
      * Wi-Fi AP is currently being disabled. The state will change to
      * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully.
      *