Merge "Added compatibility WAL flags for Global.Settings"
diff --git a/Android.bp b/Android.bp
index 948b0a0..015e59f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -99,6 +99,7 @@
         "core/java/android/app/backup/IRestoreSession.aidl",
         "core/java/android/app/backup/ISelectBackupTransportCallback.aidl",
         "core/java/android/app/slice/ISliceManager.aidl",
+        "core/java/android/app/slice/ISliceListener.aidl",
         "core/java/android/app/timezone/ICallback.aidl",
         "core/java/android/app/timezone/IRulesManager.aidl",
         "core/java/android/app/usage/ICacheQuotaService.aidl",
@@ -677,35 +678,23 @@
         "-Werror",
         "-Wno-unused-parameter",
     ],
+
+    srcs: [
+        "core/proto/**/*.proto",
+        "libs/incident/**/*.proto",
+        "tools/streaming_proto/stream.proto",
+    ],
+
     target: {
         host: {
             proto: {
                 type: "full",
             },
-            srcs: [
-                "core/proto/**/*.proto",
-                "libs/incident/**/*.proto",
-                "tools/streaming_proto/stream.proto",
-            ],
         },
         android: {
             proto: {
                 type: "lite",
             },
-            // We only build the protos that are optimized for the lite
-            // runtime, as well as the only protos that are actually
-            // needed by the device.
-            srcs: [
-                "core/proto/android/os/cpufreq.proto",
-                "core/proto/android/os/cpuinfo.proto",
-                "core/proto/android/os/kernelwake.proto",
-                "core/proto/android/os/pagetypeinfo.proto",
-                "core/proto/android/os/procrank.proto",
-                "core/proto/android/os/system_properties.proto",
-                "core/proto/android/service/graphicsstats.proto",
-                "libs/incident/proto/android/privacy.proto",
-                "tools/streaming_proto/stream.proto",
-            ],
             shared: {
                 enabled: false,
             },
diff --git a/Android.mk b/Android.mk
index ec5fb84..d4a1dcf 100644
--- a/Android.mk
+++ b/Android.mk
@@ -97,6 +97,7 @@
 	frameworks/base/core/java/android/app/admin/SystemUpdatePolicy.aidl \
 	frameworks/base/core/java/android/app/admin/PasswordMetrics.aidl \
 	frameworks/base/core/java/android/app/slice/ISliceManager.aidl \
+	frameworks/base/core/java/android/app/slice/ISliceListener.aidl \
 	frameworks/base/core/java/android/print/PrintDocumentInfo.aidl \
 	frameworks/base/core/java/android/print/PageRange.aidl \
 	frameworks/base/core/java/android/print/PrintAttributes.aidl \
@@ -1008,7 +1009,7 @@
 # ====  java proto device library (for test only)  ==============================
 include $(CLEAR_VARS)
 LOCAL_MODULE := platformprotosnano
-LOCAL_MODULE_TAGS := tests optional
+LOCAL_MODULE_TAGS := tests
 LOCAL_PROTOC_OPTIMIZE_TYPE := nano
 LOCAL_PROTOC_FLAGS := \
     -Iexternal/protobuf/src
@@ -1020,6 +1021,17 @@
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
 
+# ====  java proto device library (for test only)  ==============================
+include $(CLEAR_VARS)
+LOCAL_MODULE := platformprotoslite
+LOCAL_MODULE_TAGS := tests
+LOCAL_PROTOC_OPTIMIZE_TYPE := lite
+LOCAL_PROTOC_FLAGS := \
+    -Iexternal/protobuf/src
+LOCAL_SRC_FILES := \
+    $(call all-proto-files-under, core/proto)
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
 # Include subdirectory makefiles
 # ============================================================
 
diff --git a/api/current.txt b/api/current.txt
index e97670a..66a577c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7028,6 +7028,7 @@
     field public static final java.lang.String HINT_NO_TINT = "no_tint";
     field public static final java.lang.String HINT_PARTIAL = "partial";
     field public static final java.lang.String HINT_SELECTED = "selected";
+    field public static final java.lang.String HINT_SUMMARY = "summary";
     field public static final java.lang.String HINT_TITLE = "title";
     field public static final java.lang.String SUBTYPE_COLOR = "color";
     field public static final java.lang.String SUBTYPE_MESSAGE = "message";
@@ -25919,12 +25920,12 @@
   }
 
   public final class IpSecManager {
+    method public android.net.IpSecManager.SecurityParameterIndex allocateSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException;
+    method public android.net.IpSecManager.SecurityParameterIndex allocateSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
     method public void applyTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
     method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket(int) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
     method public android.net.IpSecManager.UdpEncapsulationSocket openUdpEncapsulationSocket() throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
     method public void removeTransportModeTransform(java.io.FileDescriptor, android.net.IpSecTransform) throws java.io.IOException;
-    method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress) throws android.net.IpSecManager.ResourceUnavailableException;
-    method public android.net.IpSecManager.SecurityParameterIndex reserveSecurityParameterIndex(int, java.net.InetAddress, int) throws android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
   }
 
   public static final class IpSecManager.ResourceUnavailableException extends android.util.AndroidException {
@@ -47067,6 +47068,7 @@
     method public int getScaledEdgeSlop();
     method public int getScaledFadingEdgeLength();
     method public float getScaledHorizontalScrollFactor();
+    method public int getScaledHoverSlop();
     method public int getScaledMaximumDrawingCacheSize();
     method public int getScaledMaximumFlingVelocity();
     method public int getScaledMinimumFlingVelocity();
@@ -49586,6 +49588,44 @@
     method public void proceed();
   }
 
+  public class TracingConfig {
+    ctor public TracingConfig(int);
+    ctor public TracingConfig(int, java.lang.String, int);
+    method public java.lang.String getCustomCategoryPattern();
+    method public int getPresetCategories();
+    method public int getTracingMode();
+    field public static final int CATEGORIES_FRAME_VIEWER = 4; // 0x4
+    field public static final int CATEGORIES_INPUT_LATENCY = 1; // 0x1
+    field public static final int CATEGORIES_JAVASCRIPT_AND_RENDERING = 3; // 0x3
+    field public static final int CATEGORIES_NONE = -1; // 0xffffffff
+    field public static final int CATEGORIES_RENDERING = 2; // 0x2
+    field public static final int CATEGORIES_WEB_DEVELOPER = 0; // 0x0
+    field public static final int RECORD_CONTINUOUSLY = 1; // 0x1
+    field public static final int RECORD_TO_CONSOLE = 3; // 0x3
+    field public static final int RECORD_UNTIL_FULL = 0; // 0x0
+    field public static final int RECORD_UNTIL_FULL_LARGE_BUFFER = 2; // 0x2
+  }
+
+  public abstract class TracingController {
+    ctor public TracingController();
+    method public static android.webkit.TracingController getInstance();
+    method public abstract boolean isTracing();
+    method public abstract boolean start(android.webkit.TracingConfig);
+    method public abstract boolean stop();
+    method public abstract boolean stopAndFlush(android.webkit.TracingController.TracingOutputStream, android.os.Handler);
+  }
+
+  public static abstract interface TracingController.TracingOutputStream {
+    method public abstract void complete();
+    method public abstract void write(byte[]);
+  }
+
+  public class TracingFileOutputStream implements android.webkit.TracingController.TracingOutputStream {
+    ctor public TracingFileOutputStream(java.lang.String) throws java.io.FileNotFoundException;
+    method public void complete();
+    method public void write(byte[]);
+  }
+
   public final class URLUtil {
     ctor public URLUtil();
     method public static java.lang.String composeSearchUrl(java.lang.String, java.lang.String, java.lang.String);
diff --git a/api/system-current.txt b/api/system-current.txt
index eb0b133..30e4cbc 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4637,6 +4637,7 @@
     method public abstract android.webkit.ServiceWorkerController getServiceWorkerController();
     method public abstract android.webkit.WebViewFactoryProvider.Statics getStatics();
     method public abstract android.webkit.TokenBindingService getTokenBindingService();
+    method public abstract android.webkit.TracingController getTracingController();
     method public abstract android.webkit.WebIconDatabase getWebIconDatabase();
     method public abstract android.webkit.WebStorage getWebStorage();
     method public abstract android.webkit.WebViewDatabase getWebViewDatabase(android.content.Context);
diff --git a/cmds/incident_helper/Android.bp b/cmds/incident_helper/Android.bp
index fc0bdcc..d7b6d69 100644
--- a/cmds/incident_helper/Android.bp
+++ b/cmds/incident_helper/Android.bp
@@ -50,12 +50,15 @@
         "testdata/*",
     ],
 
-    shared_libs: [
-        "libprotobuf-cpp-full",
-    ],
-
     static_libs: [
         "libgmock",
         "libplatformprotos"
     ],
+
+    shared_libs: [
+        "libprotobuf-cpp-full"
+    ],
+    proto: {
+        type: "full",
+    },
 }
diff --git a/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp b/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp
index a41ed6e..23393da0 100644
--- a/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp
+++ b/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp
@@ -53,10 +53,16 @@
                 SystemPropertiesProto::_FIELD_COUNT);
     Message sysProp(&sysPropTable);
 
-    Table aaudioT(SystemPropertiesProto::Aaudio::_FIELD_NAMES,
+    Table aacDrcTable(SystemPropertiesProto::AacDrc::_FIELD_NAMES,
+            SystemPropertiesProto::AacDrc::_FIELD_IDS,
+            SystemPropertiesProto::AacDrc::_FIELD_COUNT);
+    Message aacDrc(&aacDrcTable);
+    sysProp.addSubMessage(SystemPropertiesProto::AAC_DRC, &aacDrc);
+
+    Table aaudioTable(SystemPropertiesProto::Aaudio::_FIELD_NAMES,
             SystemPropertiesProto::Aaudio::_FIELD_IDS,
             SystemPropertiesProto::Aaudio::_FIELD_COUNT);
-    Message aaudio(&aaudioT);
+    Message aaudio(&aaudioTable);
     sysProp.addSubMessage(SystemPropertiesProto::AAUDIO, &aaudio);
 
     Table cameraTable(SystemPropertiesProto::Camera::_FIELD_NAMES,
@@ -142,8 +148,13 @@
                    SystemPropertiesProto::Ro::Product::_FIELD_IDS,
                    SystemPropertiesProto::Ro::Product::_FIELD_COUNT);
     Message product(&productTable);
-    ro.addSubMessage(SystemPropertiesProto::Ro::PRODUCT, &product);
 
+    Table vendorTable(SystemPropertiesProto::Ro::Product::Vendor::_FIELD_NAMES,
+            SystemPropertiesProto::Ro::Product::Vendor::_FIELD_IDS,
+            SystemPropertiesProto::Ro::Product::Vendor::_FIELD_COUNT);
+    Message vendor(&vendorTable);
+    product.addSubMessage(SystemPropertiesProto::Ro::Product::VENDOR, &vendor);
+    ro.addSubMessage(SystemPropertiesProto::Ro::PRODUCT, &product);
     sysProp.addSubMessage(SystemPropertiesProto::RO, &ro);
 
     Table sysTable(SystemPropertiesProto::Sys::_FIELD_NAMES,
diff --git a/cmds/incident_helper/testdata/system_properties.txt b/cmds/incident_helper/testdata/system_properties.txt
index 51a2dfd..bf7d4ad 100644
--- a/cmds/incident_helper/testdata/system_properties.txt
+++ b/cmds/incident_helper/testdata/system_properties.txt
@@ -1,3 +1,4 @@
+[aac_drc_cut]: [123]
 [aaudio.hw_burst_min_usec]: [2000]
 [aaudio.mmap_exclusive_policy]: [2]
 [dalvik.vm.appimageformat]: [lz4]
@@ -10,4 +11,6 @@
 [ro.bootimage.build.fingerprint]: [google/marlin/marlin:P/MASTER/jinyithu10301320:eng/dev-keys]
 [ro.hardware]: [marlin]
 [ro.hardware.power]: [marlin-profile]
+[ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi]
+[ro.product.vendor.brand]: [google]
 [ro.wifi.channels]: []
diff --git a/cmds/incident_helper/tests/CpuFreqParser_test.cpp b/cmds/incident_helper/tests/CpuFreqParser_test.cpp
index 1c2f9e5..82deee4 100644
--- a/cmds/incident_helper/tests/CpuFreqParser_test.cpp
+++ b/cmds/incident_helper/tests/CpuFreqParser_test.cpp
@@ -21,7 +21,7 @@
 #include <android-base/file.h>
 #include <android-base/test_utils.h>
 #include <gmock/gmock.h>
-#include <google/protobuf/message.h>
+#include <google/protobuf/message_lite.h>
 #include <gtest/gtest.h>
 #include <string.h>
 #include <fcntl.h>
@@ -42,13 +42,6 @@
         ASSERT_TRUE(tf.fd != -1);
     }
 
-    string getSerializedString(::google::protobuf::Message& message) {
-        string expectedStr;
-        message.SerializeToFileDescriptor(tf.fd);
-        ReadFileToString(tf.path, &expectedStr);
-        return expectedStr;
-    }
-
 protected:
     TemporaryFile tf;
 
@@ -125,6 +118,6 @@
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
 }
diff --git a/cmds/incident_helper/tests/CpuInfoParser_test.cpp b/cmds/incident_helper/tests/CpuInfoParser_test.cpp
index bbc14bc..8dce53e 100644
--- a/cmds/incident_helper/tests/CpuInfoParser_test.cpp
+++ b/cmds/incident_helper/tests/CpuInfoParser_test.cpp
@@ -21,7 +21,7 @@
 #include <android-base/file.h>
 #include <android-base/test_utils.h>
 #include <gmock/gmock.h>
-#include <google/protobuf/message.h>
+#include <google/protobuf/message_lite.h>
 #include <gtest/gtest.h>
 #include <string.h>
 #include <fcntl.h>
@@ -42,13 +42,6 @@
         ASSERT_TRUE(tf.fd != -1);
     }
 
-    string getSerializedString(::google::protobuf::Message& message) {
-        string expectedStr;
-        message.SerializeToFileDescriptor(tf.fd);
-        ReadFileToString(tf.path, &expectedStr);
-        return expectedStr;
-    }
-
 protected:
     TemporaryFile tf;
 
@@ -153,6 +146,6 @@
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
 }
diff --git a/cmds/incident_helper/tests/KernelWakesParser_test.cpp b/cmds/incident_helper/tests/KernelWakesParser_test.cpp
index a8fa6208..a98c62b 100644
--- a/cmds/incident_helper/tests/KernelWakesParser_test.cpp
+++ b/cmds/incident_helper/tests/KernelWakesParser_test.cpp
@@ -21,7 +21,7 @@
 #include <android-base/file.h>
 #include <android-base/test_utils.h>
 #include <gmock/gmock.h>
-#include <google/protobuf/message.h>
+#include <google/protobuf/message_lite.h>
 #include <gtest/gtest.h>
 #include <string.h>
 #include <fcntl.h>
@@ -42,13 +42,6 @@
         ASSERT_TRUE(tf.fd != -1);
     }
 
-    string getSerializedString(::google::protobuf::Message& message) {
-        string expectedStr;
-        message.SerializeToFileDescriptor(tf.fd);
-        ReadFileToString(tf.path, &expectedStr);
-        return expectedStr;
-    }
-
 protected:
     TemporaryFile tf;
 
@@ -76,7 +69,7 @@
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
 }
 
@@ -114,6 +107,6 @@
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
 }
diff --git a/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp b/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp
index de64e70..a9e6e816 100644
--- a/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp
+++ b/cmds/incident_helper/tests/PageTypeInfoParser_test.cpp
@@ -21,7 +21,7 @@
 #include <android-base/file.h>
 #include <android-base/test_utils.h>
 #include <gmock/gmock.h>
-#include <google/protobuf/message.h>
+#include <google/protobuf/message_lite.h>
 #include <gtest/gtest.h>
 #include <string.h>
 #include <fcntl.h>
@@ -42,13 +42,6 @@
         ASSERT_TRUE(tf.fd != -1);
     }
 
-    string getSerializedString(::google::protobuf::Message& message) {
-        string expectedStr;
-        message.SerializeToFileDescriptor(tf.fd);
-        ReadFileToString(tf.path, &expectedStr);
-        return expectedStr;
-    }
-
 protected:
     TemporaryFile tf;
 
@@ -108,6 +101,6 @@
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
-}
\ No newline at end of file
+}
diff --git a/cmds/incident_helper/tests/ProcrankParser_test.cpp b/cmds/incident_helper/tests/ProcrankParser_test.cpp
index e86647a..76b25d7 100644
--- a/cmds/incident_helper/tests/ProcrankParser_test.cpp
+++ b/cmds/incident_helper/tests/ProcrankParser_test.cpp
@@ -21,7 +21,7 @@
 #include <android-base/file.h>
 #include <android-base/test_utils.h>
 #include <gmock/gmock.h>
-#include <google/protobuf/message.h>
+#include <google/protobuf/message_lite.h>
 #include <gtest/gtest.h>
 #include <string.h>
 #include <fcntl.h>
@@ -42,13 +42,6 @@
         ASSERT_TRUE(tf.fd != -1);
     }
 
-    string getSerializedString(::google::protobuf::Message& message) {
-        string expectedStr;
-        message.SerializeToFileDescriptor(tf.fd);
-        ReadFileToString(tf.path, &expectedStr);
-        return expectedStr;
-    }
-
 protected:
     TemporaryFile tf;
 
@@ -104,7 +97,7 @@
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
 }
 
@@ -142,6 +135,6 @@
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
 }
diff --git a/cmds/incident_helper/tests/SystemPropertiesParser_test.cpp b/cmds/incident_helper/tests/SystemPropertiesParser_test.cpp
index 98838e9..ef28c51 100644
--- a/cmds/incident_helper/tests/SystemPropertiesParser_test.cpp
+++ b/cmds/incident_helper/tests/SystemPropertiesParser_test.cpp
@@ -21,7 +21,7 @@
 #include <android-base/file.h>
 #include <android-base/test_utils.h>
 #include <gmock/gmock.h>
-#include <google/protobuf/message.h>
+#include <google/protobuf/message_lite.h>
 #include <gtest/gtest.h>
 #include <string.h>
 #include <fcntl.h>
@@ -42,13 +42,6 @@
         ASSERT_TRUE(tf.fd != -1);
     }
 
-    string getSerializedString(::google::protobuf::Message& message) {
-        string expectedStr;
-        message.SerializeToFileDescriptor(tf.fd);
-        ReadFileToString(tf.path, &expectedStr);
-        return expectedStr;
-    }
-
 protected:
     TemporaryFile tf;
 
@@ -61,44 +54,39 @@
     SystemPropertiesParser parser;
     SystemPropertiesProto expected;
 
-    SystemPropertiesProto::Aaudio* aaudio = expected.mutable_aaudio();
-    aaudio->set_hw_burst_min_usec(2000);
-    aaudio->set_mmap_exclusive_policy(2);
-
-    SystemPropertiesProto::DalvikVm* dalvikVm = expected.mutable_dalvik_vm();
-    dalvikVm->set_appimageformat("lz4");
-
+    expected.mutable_aac_drc()->set_cut(123);
+    expected.mutable_aaudio()->set_hw_burst_min_usec(2000);
+    expected.mutable_aaudio()->set_mmap_exclusive_policy(2);
+    expected.mutable_dalvik_vm()->set_appimageformat("lz4");
     expected.set_drm_64bit_enabled(false);
-
-    SystemPropertiesProto::InitSvc* initSvc = expected.mutable_init_svc();
-    initSvc->set_adbd(SystemPropertiesProto_InitSvc_Status_STATUS_RUNNING);
-    initSvc->set_lmkd(SystemPropertiesProto_InitSvc_Status_STATUS_STOPPED);
-
+    expected.mutable_init_svc()->set_adbd(
+        SystemPropertiesProto_InitSvc_Status_STATUS_RUNNING);
+    expected.mutable_init_svc()->set_lmkd(
+        SystemPropertiesProto_InitSvc_Status_STATUS_STOPPED);
     expected.set_media_mediadrmservice_enable(true);
 
     SystemPropertiesProto::Ro* ro = expected.mutable_ro();
-
-    SystemPropertiesProto::Ro::Boot* boot = ro->mutable_boot();
-    boot->add_boottime("1BLL:85");
-    boot->add_boottime("1BLE:898");
-    boot->add_boottime("2BLL:0");
-    boot->add_boottime("2BLE:862");
-    boot->add_boottime("SW:6739");
-    boot->add_boottime("KL:340");
-
-    SystemPropertiesProto::Ro::BootImage* bootimage = ro->mutable_bootimage();
-    bootimage->set_build_date_utc(1509394807LL);
-    bootimage->set_build_fingerprint("google/marlin/marlin:P/MASTER/jinyithu10301320:eng/dev-keys");
-
-    SystemPropertiesProto::Ro::Hardware* hardware = ro->mutable_hardware();
-    hardware->set_value("marlin");
-    hardware->set_power("marlin-profile");
+    ro->mutable_boot()->add_boottime("1BLL:85");
+    ro->mutable_boot()->add_boottime("1BLE:898");
+    ro->mutable_boot()->add_boottime("2BLL:0");
+    ro->mutable_boot()->add_boottime("2BLE:862");
+    ro->mutable_boot()->add_boottime("SW:6739");
+    ro->mutable_boot()->add_boottime("KL:340");
+    ro->mutable_bootimage()->set_build_date_utc(1509394807LL);
+    ro->mutable_bootimage()->set_build_fingerprint(
+        "google/marlin/marlin:P/MASTER/jinyithu10301320:eng/dev-keys");
+    ro->mutable_hardware()->set_value("marlin");
+    ro->mutable_hardware()->set_power("marlin-profile");
+    ro->mutable_product()->add_cpu_abilist("arm64-v8a");
+    ro->mutable_product()->add_cpu_abilist("armeabi-v7a");
+    ro->mutable_product()->add_cpu_abilist("armeabi");
+    ro->mutable_product()->mutable_vendor()->set_brand("google");
 
     int fd = open(testFile.c_str(), O_RDONLY);
     ASSERT_TRUE(fd != -1);
 
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
-    EXPECT_EQ(GetCapturedStdout(), getSerializedString(expected));
+    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
     close(fd);
 }
diff --git a/cmds/input/src/com/android/commands/input/Input.java b/cmds/input/src/com/android/commands/input/Input.java
index 9ee11f8..d3ec320 100644
--- a/cmds/input/src/com/android/commands/input/Input.java
+++ b/cmds/input/src/com/android/commands/input/Input.java
@@ -88,8 +88,8 @@
                     final boolean longpress = "--longpress".equals(args[index + 1]);
                     final int start = longpress ? index + 2 : index + 1;
                     inputSource = getSource(inputSource, InputDevice.SOURCE_KEYBOARD);
-                    if (length > start) {
-                        for (int i = start; i < length; i++) {
+                    if (args.length > start) {
+                        for (int i = start; i < args.length; i++) {
                             int keyCode = KeyEvent.keyCodeFromString(args[i]);
                             if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
                                 keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[i]);
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index 5fcb8a1..a5eae15 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -31,5 +31,11 @@
         type: "full",
         export_proto_headers: true,
     },
+
+    export_shared_lib_headers: [
+        "libplatformprotos",
+    ]
+
 }
 
+
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index ef7d31b..addba8c 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -19,7 +19,7 @@
     ../../core/java/android/os/IStatsManager.aidl \
     src/stats_log.proto \
     src/statsd_config.proto \
-    src/atoms_copy.proto \
+    src/atoms.proto \
     src/anomaly/AnomalyMonitor.cpp \
     src/anomaly/AnomalyTracker.cpp \
     src/condition/CombinationConditionTracker.cpp \
@@ -51,8 +51,6 @@
     src/metrics/MetricsManager.cpp \
     src/metrics/metrics_manager_util.cpp \
     src/packages/UidMap.cpp \
-    src/storage/DropboxReader.cpp \
-    src/storage/DropboxWriter.cpp \
     src/storage/StorageManager.cpp \
     src/StatsLogProcessor.cpp \
     src/StatsService.cpp \
@@ -67,6 +65,9 @@
 statsd_common_aidl_includes := \
     $(LOCAL_PATH)/../../core/java
 
+statsd_common_static_libraries := \
+    libplatformprotos
+
 statsd_common_shared_libraries := \
     libbase \
     libbinder \
@@ -76,7 +77,6 @@
     libselinux \
     libutils \
     libservices \
-    libandroidfw \
     libprotoutil \
     libstatslog \
     libhardware \
@@ -121,6 +121,8 @@
 LOCAL_AIDL_INCLUDES := $(statsd_common_aidl_includes)
 LOCAL_C_INCLUDES += $(statsd_common_c_includes)
 
+LOCAL_STATIC_LIBRARIES := $(statsd_common_static_libraries)
+
 LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
     libgtest_prod
 
@@ -174,17 +176,22 @@
     tests/guardrail/StatsdStats_test.cpp
 
 LOCAL_STATIC_LIBRARIES := \
+    $(statsd_common_static_libraries) \
     libgmock
 
 LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries)
 
 LOCAL_PROTOC_OPTIMIZE_TYPE := lite
 
+include $(BUILD_NATIVE_TEST)
+
+
 statsd_common_src:=
 statsd_common_aidl_includes:=
 statsd_common_c_includes:=
+statsd_common_static_libraries:=
+statsd_common_shared_libraries:=
 
-include $(BUILD_NATIVE_TEST)
 
 ##############################
 
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index d8f0fac..4dd2539 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -23,7 +23,6 @@
 #include "config/ConfigManager.h"
 #include "guardrail/MemoryLeakTrackUtil.h"
 #include "guardrail/StatsdStats.h"
-#include "storage/DropboxReader.h"
 #include "storage/StorageManager.h"
 
 #include <android-base/file.h>
@@ -201,11 +200,6 @@
             return cmd_config(in, out, err, args);
         }
 
-        // adb shell cmd stats print-stats-log
-        if (!args[0].compare(String8("print-stats-log")) && args.size() > 1) {
-            return cmd_print_stats_log(out, args);
-        }
-
         if (!args[0].compare(String8("print-uid-map"))) {
             return cmd_print_uid_map(out);
         }
@@ -503,15 +497,6 @@
     return NO_ERROR;
 }
 
-status_t StatsService::cmd_print_stats_log(FILE* out, const Vector<String8>& args) {
-    long msec = 0;
-
-    if (args.size() > 2) {
-        msec = strtol(args[2].string(), NULL, 10);
-    }
-    return DropboxReader::readStatsLogs(out, args[1].string(), msec);
-}
-
 status_t StatsService::cmd_print_uid_map(FILE* out) {
     mUidMap->printUidMap(out);
     return NO_ERROR;
diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
index e8b4083..4777dcd 100644
--- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
@@ -317,7 +317,7 @@
     for (const auto& kv : matchedAlarms) {
         declareAnomaly(timestampNs /* TODO: , kv.first */);
         mAlarms.erase(kv.first);
-        firedAlarms.erase(kv.second); // No one else can also own it, so we're done with it.
+        firedAlarms.erase(kv.second);  // No one else can also own it, so we're done with it.
     }
 }
 
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index c81fc1d..716fee6 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -21,6 +21,8 @@
 option java_package = "com.android.os";
 option java_outer_classname = "AtomsProto";
 
+import "frameworks/base/core/proto/android/app/activitymanager.proto";
+
 /**
  * The master atom class. This message defines all of the available
  * raw stats log events from the Android system, also known as "atoms."
@@ -168,7 +170,7 @@
 
     // The state.
     // TODO: Use the real (mapped) process states.
-    optional int32 state = 2;
+    optional android.app.ProcessState state = 2;
 }
 
 /**
@@ -1072,4 +1074,4 @@
     optional uint64 controller_rx_time_ms = 9;
     // product of current(mA), voltage(V) and time(ms)
     optional uint64 energy_used = 10;
-}
\ No newline at end of file
+}
diff --git a/cmds/statsd/src/atoms_copy.proto b/cmds/statsd/src/atoms_copy.proto
deleted file mode 100644
index 72bb38a..0000000
--- a/cmds/statsd/src/atoms_copy.proto
+++ /dev/null
@@ -1,1077 +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.
- */
-
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-
-
-// TODO: Not the right package and class name
-package android.os.statsd;
-option java_package = "com.android.os";
-option java_outer_classname = "AtomsProto";
-
-/**
- * The master atom class. This message defines all of the available
- * raw stats log events from the Android system, also known as "atoms."
- *
- * This field contains a single oneof with all of the available messages.
- * The stats-log-api-gen tool runs as part of the Android build and
- * generates the android.util.StatsLog class, which contains the constants
- * and methods that Android uses to log.
- *
- * This Atom class is not actually built into the Android system.
- * Instead, statsd on Android constructs these messages synthetically,
- * in the format defined here and in stats_log.proto.
- */
-message Atom {
-    // Pushed atoms start at 2.
-    oneof pushed {
-        // For StatsLog reasons, 1 is illegal and will not work. Must start at 2.
-        BleScanStateChanged ble_scan_state_changed = 2;
-        BleUnoptimizedScanStateChanged ble_unoptimized_scan_state_changed = 3;
-        BleScanResultReceived ble_scan_result_received = 4;
-        SensorStateChanged sensor_state_changed = 5;
-        GpsScanStateChanged gps_scan_state_changed = 6; // TODO: untested
-        SyncStateChanged sync_state_changed = 7;
-        ScheduledJobStateChanged scheduled_job_state_changed = 8;
-        ScreenBrightnessChanged screen_brightness_changed = 9;
-        WakelockStateChanged wakelock_state_changed = 10;
-        LongPartialWakelockStateChanged long_partial_wakelock_state_changed = 11;
-        MobileRadioPowerStateChanged mobile_radio_power_state_changed = 12;
-        WifiRadioPowerStateChanged wifi_radio_power_state_changed = 13;
-        // TODO: 14-19 are blank, but need not be
-        BatterySaverModeStateChanged battery_saver_mode_state_changed = 20;
-        DeviceIdleModeStateChanged device_idle_mode_state_changed = 21;
-        DeviceIdlingModeStateChanged device_idling_mode_state_changed = 22;
-        AudioStateChanged audio_state_changed = 23;
-        MediaCodecActivityChanged media_codec_activity_changed = 24;
-        CameraStateChanged camera_state_changed = 25;
-        FlashlightStateChanged flashlight_state_changed = 26;
-        UidProcessStateChanged uid_process_state_changed = 27;
-        ProcessLifeCycleStateChanged process_life_cycle_state_changed = 28;
-        ScreenStateChanged screen_state_changed = 29;
-        BatteryLevelChanged battery_level_changed = 30;
-        ChargingStateChanged charging_state_changed = 31;
-        PluggedStateChanged plugged_state_changed = 32;
-        DeviceTemperatureReported device_temperature_reported = 33;
-        DeviceOnStatusChanged device_on_status_changed = 34;
-        WakeupAlarmOccurred wakeup_alarm_occurred = 35;
-        KernelWakeupReported kernel_wakeup_reported = 36;
-        WifiLockStateChanged wifi_lock_state_changed = 37;
-        WifiSignalStrengthChanged wifi_signal_strength_changed = 38;
-        WifiScanStateChanged wifi_scan_state_changed = 39;
-        PhoneSignalStrengthChanged phone_signal_strength_changed = 40;
-        SettingChanged setting_changed = 41;
-        ActivityForegroundStateChanged activity_foreground_state_changed = 42;
-        IsolatedUidChanged isolated_uid_changed = 43;
-        PacketWakeupOccurred packet_wakeup_occurred = 44;
-        DropboxErrorChanged dropbox_error_changed = 45;
-        // TODO: Reorder the numbering so that the most frequent occur events occur in the first 15.
-    }
-
-    // Pulled events will start at field 1000.
-    oneof pulled {
-        WifiBytesTransferred wifi_bytes_transferred = 1000;
-        WifiBytesTransferredByFgBg wifi_bytes_transferred_by_fg_bg = 1001;
-        MobileBytesTransferred mobile_bytes_transferred = 1002;
-        MobileBytesTransferredByFgBg mobile_bytes_transferred_by_fg_bg = 1003;
-        KernelWakelockPulled kernel_wakelock_pulled = 1004;
-        PowerStatePlatformSleepStatePulled power_state_platform_sleep_state_pulled = 1005;
-        PowerStateVoterPulled power_state_voter_pulled = 1006;
-        PowerStateSubsystemSleepStatePulled power_state_subsystem_sleep_state_pulled = 1007;
-        CpuTimePerFreqPulled cpu_time_per_freq_pulled = 1008;
-        CpuTimePerUidPulled cpu_time_per_uid_pulled = 1009;
-        CpuTimePerUidFreqPulled cpu_time_per_uid_freq_pulled = 1010;
-        WifiActivityEnergyInfoPulled wifi_activity_energy_info_pulled = 1011;
-        ModemActivityInfoPulled modem_activity_info_pulled = 1012;
-    }
-}
-
-/**
- * A WorkSource represents the chained attribution of applications that
- * resulted in a particular bit of work being done.
- */
-message WorkSource {
-    // The uid for a given element in the attribution chain.
-    repeated int32 uid = 1;
-    // The (optional) string tag for an element in the attribution chain. If the
-    // element has no tag, it is encoded as an empty string.
-    repeated string tag = 2;
-}
-
-/*
- * *****************************************************************************
- * Below are all of the individual atoms that are logged by Android via statsd.
- *
- * RULES:
- *   - The field ids for each atom must start at 1, and count upwards by 1.
- *     Skipping field ids is not allowed.
- *   - These form an API, so renaming, renumbering or removing fields is
- *     not allowed between android releases.  (This is not currently enforced,
- *     but there will be a tool to enforce this restriction).
- *   - The types must be built-in protocol buffer types, namely, no sub-messages
- *     are allowed (yet).  The bytes type is also not allowed.
- *   - The CamelCase name of the message type should match the
- *     underscore_separated name as defined in Atom.
- *   - If an atom represents work that can be attributed to an app, there can
- *     be exactly one WorkSource field. It must be field number 1.
- *   - A field that is a uid should be a string field, tagged with the [xxx]
- *     annotation. The generated code on android will be represented by UIDs,
- *     and those UIDs will be translated in xxx to those strings.
- *
- * CONVENTIONS:
- *   - Events are past tense. e.g. ScreenStateChanged, not ScreenStateChange.
- *   - If there is a UID, it goes first. Think in an object-oriented fashion.
- * *****************************************************************************
- */
-
-/**
- * Logs when the screen state changes.
- *
- * Logged from:
- *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
- */
-message ScreenStateChanged {
-    // TODO: Use the real screen state.
-    enum State {
-        STATE_UNKNOWN = 0;
-        STATE_OFF = 1;
-        STATE_ON = 2;
-        STATE_DOZE = 3;
-        STATE_DOZE_SUSPEND = 4;
-        STATE_VR = 5;
-        STATE_ON_SUSPEND = 6;
-    }
-    // New screen state.
-    optional State display_state = 1;
-}
-
-/**
- * Logs that the state of a process state, as per the activity manager, has changed.
- *
- * Logged from:
- *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
- */
-message UidProcessStateChanged {
-    optional int32 uid = 1; // TODO: should be a string tagged w/ uid annotation
-
-    // The state.
-    // TODO: Use the real (mapped) process states.
-    optional int32 state = 2;
-}
-
-/**
- * Logs that a process started, finished, crashed, or ANRed.
- *
- * Logged from:
- *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
- */
-message ProcessLifeCycleStateChanged {
-    // TODO: Use the real (mapped) process states.
-    optional int32 uid = 1; // TODO: should be a string tagged w/ uid annotation
-
-    // TODO: What is this?
-    optional string name = 2;
-
-    // What lifecycle state the process changed to.
-    // This enum is specific to atoms.proto.
-    enum Event {
-        PROCESS_FINISHED = 0;
-        PROCESS_STARTED = 1;
-        PROCESS_CRASHED = 2;
-        PROCESS_ANRED = 3;
-    }
-    optional Event event = 3;
-}
-
-/**
- * Logs when the ble scan state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message BleScanStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs when an unoptimized ble scan state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-// TODO: Consider changing to tracking per-scanner-id (log from AppScanStats).
-message BleUnoptimizedScanStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs reporting of a ble scan finding results.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-// TODO: Consider changing to tracking per-scanner-id (log from AppScanStats).
-message BleScanResultReceived {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    // Number of ble scan results returned.
-    optional int32 num_of_results = 2;
-}
-
-/**
- * Logs when a sensor state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message SensorStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    // TODO: Is there a way to get the actual name of the sensor?
-    // The id (int) of the sensor.
-    optional int32 sensor_id = 2;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 3;
-}
-
-
-/**
- * Logs when GPS state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message GpsScanStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-
-/**
- * Logs when a sync manager sync state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message SyncStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    // Name of the sync (as named in the app)
-    optional string name = 2;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 3;
-}
-
-/**
- * Logs when a job scheduler job state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message ScheduledJobStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    // Name of the job (as named in the app)
-    optional string name = 2;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 3;
-
-    // TODO: Consider adding the stopReason (int)
-}
-
-/**
- * Logs when the audio state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message AudioStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs when the video codec state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message MediaCodecActivityChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs when the flashlight state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message FlashlightStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs when the camera state changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message CameraStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs that the state of a wakelock (per app and per wakelock name) has changed.
- *
- * Logged from:
- *   TODO
- */
-message WakelockStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    // Type of wakelock.
-    enum Type {
-        PARTIAL = 0;
-        FULL = 1;
-        WINDOW = 2;
-    }
-    optional Type type = 2;
-
-    // The wakelock tag (Called tag in the Java API, sometimes name elsewhere).
-    optional string tag = 3;
-
-    enum State {
-        RELEASE = 0;
-        ACQUIRE = 1;
-        CHANGE_RELEASE = 2;
-        CHANGE_ACQUIRE = 3;
-    }
-    optional State state = 4;
-}
-
-/**
- * Logs when a partial wakelock is considered 'long' (over 1 min).
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message LongPartialWakelockStateChanged {
-    // TODO: Add attribution instead of uid?
-    optional int32 uid = 1;
-
-    // The wakelock tag (Called tag in the Java API, sometimes name elsewhere).
-    optional string tag = 2;
-
-    // TODO: I have no idea what this is.
-    optional string history_tag = 3;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 4;
-}
-
-/**
- * Logs Battery Saver state change.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message BatterySaverModeStateChanged {
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 1;
-}
-
-/**
- * Logs Doze mode state change.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message DeviceIdleModeStateChanged {
-    // TODO: Use the enum matching BatteryStats.DEVICE_IDLE_MODE_.
-    enum State {
-        DEVICE_IDLE_MODE_OFF = 0;
-        DEVICE_IDLE_MODE_LIGHT = 1;
-        DEVICE_IDLE_MODE_DEEP = 2;
-    }
-    optional State state = 1;
-}
-
-
-/**
- * Logs state change of Doze mode including maintenance windows.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message DeviceIdlingModeStateChanged {
-    // TODO: Use the enum matching BatteryStats.DEVICE_IDLE_MODE_.
-    enum State {
-        DEVICE_IDLE_MODE_OFF = 0;
-        DEVICE_IDLE_MODE_LIGHT = 1;
-        DEVICE_IDLE_MODE_DEEP = 2;
-    }
-    optional State state = 1;
-}
-
-/**
- * Logs screen brightness level.
- *
- * Logged from:
- *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
- */
-message ScreenBrightnessChanged {
-    // Screen brightness level. Should be in [-1, 255] according to PowerManager.java.
-    optional int32 level = 1;
-}
-
-/**
- * Logs battery level (percent full, from 0 to 100).
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message BatteryLevelChanged {
-    // Battery level. Should be in [0, 100].
-    optional int32 battery_level = 1;
-}
-
-/**
- * Logs change in charging status of the device.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message ChargingStateChanged {
-    // TODO: Link directly to BatteryManager.java's constants (via a proto).
-    enum State {
-        BATTERY_STATUS_UNKNOWN = 1;
-        BATTERY_STATUS_CHARGING = 2;
-        BATTERY_STATUS_DISCHARGING = 3;
-        BATTERY_STATUS_NOT_CHARGING = 4;
-        BATTERY_STATUS_FULL = 5;
-    }
-    optional State charging_state = 1;
-}
-
-/**
- * Logs whether the device is plugged in, and what power source it is using.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message PluggedStateChanged {
-    // TODO: Link directly to BatteryManager.java's constants (via a proto).
-    enum State {
-        // Note that NONE is not in BatteryManager.java's constants.
-        BATTERY_PLUGGED_NONE = 0;
-        // Power source is an AC charger.
-        BATTERY_PLUGGED_AC = 1;
-        // Power source is a USB port.
-        BATTERY_PLUGGED_USB = 2;
-        // Power source is wireless.
-        BATTERY_PLUGGED_WIRELESS = 4;
-    }
-    optional State plugged_state = 1;
-}
-
-/**
- * Logs the temperature of the device, in tenths of a degree Celsius.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message DeviceTemperatureReported {
-    // Temperature in tenths of a degree C.
-    optional int32 temperature = 1;
-}
-
-// TODO: Define this more precisely.
-// TODO: Log the ON state somewhere. It isn't currently logged anywhere.
-/**
- * Logs when the device turns off or on.
- *
- * Logged from:
- *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
- */
-message DeviceOnStatusChanged {
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 1;
-}
-
-/**
- * Logs when an app's wakeup alarm fires.
- *
- * Logged from:
- *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
- */
-message WakeupAlarmOccurred {
-    // TODO: Add attribution instead of uid?
-    optional int32 uid = 1;
-
-    // Name of the wakeup alarm.
-    optional string tag = 2;
-}
-
-/**
- * Logs when an an app causes the mobile radio to change state.
- * Changing from LOW to MEDIUM or HIGH can be considered the app waking the mobile radio.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message MobileRadioPowerStateChanged {
-    // TODO: Add attribution instead of uid?
-    optional int32 uid = 1;
-
-    // TODO: Reference telephony/java/android/telephony/DataConnectionRealTimeInfo.java states.
-    enum PowerState {
-        DC_POWER_STATE_LOW = 1;
-        DC_POWER_STATE_MEDIUM = 2;
-        DC_POWER_STATE_HIGH = 3;
-    }
-    optional PowerState power_state = 2;
-}
-
-/**
- * Logs when an an app causes the wifi radio to change state.
- * Changing from LOW to MEDIUM or HIGH can be considered the app waking the wifi radio.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message WifiRadioPowerStateChanged {
-    // TODO: Add attribution instead of uid?
-    optional int32 uid = 1;
-
-    // TODO: Reference telephony/java/android/telephony/DataConnectionRealTimeInfo.java states.
-    enum PowerState {
-        DC_POWER_STATE_LOW = 1;
-        DC_POWER_STATE_MEDIUM = 2;
-        DC_POWER_STATE_HIGH = 3;
-    }
-    optional PowerState power_state = 2;
-}
-
-/**
- * Logs kernel wakeup reasons and aborts.
- *
- * Logged from:
- *   frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
- */
-message KernelWakeupReported {
-    // Name of the kernel wakeup reason (or abort).
-    optional string wakeup_reason_name = 1;
-
-    // Duration (in microseconds) for the wake-up interrupt to be serviced.
-    optional int64 duration_usec = 2;
-}
-
-/**
- * Logs wifi locks held by an app.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message WifiLockStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs wifi signal strength changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message WifiSignalStrengthChanged {
-    // TODO: Reference the actual telephony/java/android/telephony/SignalStrength.java states.
-    enum SignalStrength {
-        SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
-        SIGNAL_STRENGTH_POOR = 1;
-        SIGNAL_STRENGTH_MODERATE = 2;
-        SIGNAL_STRENGTH_GOOD = 3;
-        SIGNAL_STRENGTH_GREAT = 4;
-    }
-    optional SignalStrength signal_strength = 1;
-}
-
-/**
- * Logs wifi scans performed by an app.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message WifiScanStateChanged {
-    // TODO: Add attribution instead of uid.
-    optional int32 uid = 1;
-
-    enum State {
-        OFF = 0;
-        ON = 1;
-    }
-    optional State state = 2;
-}
-
-/**
- * Logs phone signal strength changes.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message PhoneSignalStrengthChanged {
-    // TODO: Reference the actual telephony/java/android/telephony/SignalStrength.java states.
-    enum SignalStrength {
-        SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
-        SIGNAL_STRENGTH_POOR = 1;
-        SIGNAL_STRENGTH_MODERATE = 2;
-        SIGNAL_STRENGTH_GOOD = 3;
-        SIGNAL_STRENGTH_GREAT = 4;
-    }
-    optional SignalStrength signal_strength = 1;
-}
-
-/**
- * Logs that a setting was updated.
- * Logged from:
- *   frameworks/base/core/java/android/provider/Settings.java
- * The tag and is_default allow resetting of settings to default values based on the specified
- * tag. See Settings#putString(ContentResolver, String, String, String, boolean) for more details.
- */
-message SettingChanged {
-    // The name of the setting.
-    optional string setting = 1;
-
-    // The change being imposed on this setting. May represent a number, eg "3".
-    optional string value = 2;
-
-    // The new value of this setting. For most settings, this is same as value. For some settings,
-    // value is +X or -X where X represents an element in a set. For example, if the previous value
-    // is A,B,C and value is -B, then new_value is A,C and prev_value is A,B,C.
-    // The +/- feature is currently only used for location_providers_allowed.
-    optional string new_value = 3;
-
-    // The previous value of this setting.
-    optional string prev_value = 4;
-
-    // The tag used with the is_default for resetting sets of settings. This is generally null.
-    optional string tag = 5;
-
-    // 1 indicates that this setting with tag should be resettable.
-    optional int32 is_default = 6;
-
-    // The user ID associated. Defined in android/os/UserHandle.java
-    optional int32 user = 7;
-}
-
-/**
- * Logs activity going to foreground or background
- *
- * Logged from:
-  *   frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java
- */
-message ActivityForegroundStateChanged {
-    enum Activity {
-        MOVE_TO_BACKGROUND = 0;
-        MOVE_TO_FOREGROUND = 1;
-    }
-    optional int32 uid = 1;
-    optional string pkg_name = 2;
-    optional string class_name = 3;
-    optional Activity activity = 4;
-}
-
-/**
- * Logs when an error is written to dropbox.
- * Logged from:
- *      frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
- */
-message DropboxErrorChanged {
-    // The uid if available. -1 means not available.
-    optional int32 uid = 1;
-
-    // Tag used when recording this error to dropbox. Contains data_ or system_ prefix.
-    optional string tag = 2;
-
-    // The name of the process.
-    optional string process_name = 3;
-
-    // The pid if available. -1 means not available.
-    optional int32 pid = 4;
-
-    // 1 indicates is instant app. -1 indicates Not applicable.
-    optional int32 is_instant_app = 5;
-
-    // The activity name if available.
-    optional string activity_name = 6;
-
-    // 1 indicates in foreground. -1 indicates not available.
-    optional int32 is_foreground = 7;
-}
-
-/**
- * Pulls bytes transferred via wifi (Sum of foreground and background usage).
- *
- * Pulled from:
- *   StatsCompanionService (using BatteryStats to get which interfaces are wifi)
- */
-message WifiBytesTransferred {
-    optional int32 uid = 1;
-
-    optional int64 rx_bytes = 2;
-
-    optional int64 rx_packets = 3;
-
-    optional int64 tx_bytes = 4;
-
-    optional int64 tx_packets = 5;
-}
-
-/**
- * Pulls bytes transferred via wifi (separated by foreground and background usage).
- *
- * Pulled from:
- *   StatsCompanionService (using BatteryStats to get which interfaces are wifi)
- */
-message WifiBytesTransferredByFgBg {
-    optional int32 uid = 1;
-
-    // 1 denotes foreground and 0 denotes background. This is called Set in NetworkStats.
-    optional int32 is_foreground = 2;
-
-    optional int64 rx_bytes = 3;
-
-    optional int64 rx_packets = 4;
-
-    optional int64 tx_bytes = 5;
-
-    optional int64 tx_packets = 6;
-}
-
-/**
- * Pulls bytes transferred via mobile networks (Sum of foreground and background usage).
- *
- * Pulled from:
- *   StatsCompanionService (using BatteryStats to get which interfaces are mobile data)
- */
-message MobileBytesTransferred {
-    optional int32 uid = 1;
-
-    optional int64 rx_bytes = 2;
-
-    optional int64 rx_packets = 3;
-
-    optional int64 tx_bytes = 4;
-
-    optional int64 tx_packets = 5;
-}
-
-/**
- * Pulls bytes transferred via mobile networks (separated by foreground and background usage).
- *
- * Pulled from:
- *   StatsCompanionService (using BatteryStats to get which interfaces are mobile data)
- */
-message MobileBytesTransferredByFgBg {
-    optional int32 uid = 1;
-
-    // 1 denotes foreground and 0 denotes background. This is called Set in NetworkStats.
-    optional int32 is_foreground = 2;
-
-    optional int64 rx_bytes = 3;
-
-    optional int64 rx_packets = 4;
-
-    optional int64 tx_bytes = 5;
-
-    optional int64 tx_packets = 6;
-}
-
-/**
- * Pulls the kernel wakelock durations. This atom is adapted from
- * android/internal/os/KernelWakelockStats.java
- *
- * Pulled from:
- *   StatsCompanionService using KernelWakelockReader.
- */
-message KernelWakelockPulled {
-    optional string name = 1;
-
-    optional int32 count = 2;
-
-    optional int32 version = 3;
-
-    optional int64 time = 4;
-}
-
-/**
- * Pulls PowerStatePlatformSleepState.
- *
- * Definition here:
- *   hardware/interfaces/power/1.0/types.hal
- */
-message PowerStatePlatformSleepStatePulled {
-    optional string name = 1;
-    optional uint64 residency_in_msec_since_boot = 2;
-    optional uint64 total_transitions = 3;
-    optional bool supported_only_in_suspend = 4;
-}
-
-/**
- * Pulls PowerStateVoter.
- *
- * Definition here:
- *   hardware/interfaces/power/1.0/types.hal
- */
-message PowerStateVoterPulled {
-    optional string power_state_platform_sleep_state_name = 1;
-    optional string power_state_voter_name = 2;
-    optional uint64 total_time_in_msec_voted_for_since_boot = 3;
-    optional uint64 total_number_of_times_voted_since_boot = 4;
-}
-
-/**
- * Pulls PowerStateSubsystemSleepState.
- *
- * Definition here:
- *   hardware/interfaces/power/1.1/types.hal
- */
-message PowerStateSubsystemSleepStatePulled {
-    optional string power_state_subsystem_name = 1;
-    optional string power_state_subsystem_sleep_state_name = 2;
-    optional uint64 residency_in_msec_since_boot = 3;
-    optional uint64 total_transitions = 4;
-    optional uint64 last_entry_timestamp_ms = 5;
-    optional bool supported_only_in_suspend = 6;
-}
-
-/**
- * Logs creation or removal of an isolated uid. Isolated uid's are temporary uid's to sandbox risky
- * behavior in its own uid. However, the metrics of these isolated uid's almost always should be
- * attributed back to the parent (host) uid. One example is Chrome.
- *
- * Logged from:
- *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
- */
-message IsolatedUidChanged {
-    // The host UID. Generally, we should attribute metrics from the isolated uid to the host uid.
-    optional int32 parent_uid = 1;
-
-    optional int32 isolated_uid = 2;
-
-    // 1 denotes we're creating an isolated uid and 0 denotes removal. We expect an isolated uid to
-    // be removed before if it's used for another parent uid.
-    optional int32 is_create = 3;
-}
-
-/**
- * Pulls Cpu time per frequency.
- * Note: this should be pulled for gauge metric only, without condition.
- * The puller keeps internal state of last values. It should not be pulled by
- * different metrics.
- * The pulled data is delta of cpu time from last pull, calculated as
- * following:
- * if current time is larger than last value, take delta between the two.
- * if current time is smaller than last value, there must be a cpu
- * hotplug event, and the current time is taken as delta.
- */
-message CpuTimePerFreqPulled {
-    optional uint32 cluster = 1;
-    optional uint32 freq_index = 2;
-    optional uint64 time = 3;
-}
-
-/**
- * Pulls Cpu Time Per Uid.
- * Note that isolated process uid time should be attributed to host uids.
- */
-message CpuTimePerUidPulled {
-    optional uint64 uid = 1;
-    optional uint64 user_time_ms = 2;
-    optional uint64 sys_time_ms = 3;
-}
-
-/**
- * Pulls Cpu Time Per Uid per frequency.
- * Note that isolated process uid time should be attributed to host uids.
- * For each uid, we order the time by descending frequencies.
- */
-message CpuTimePerUidFreqPulled {
-    optional uint64 uid = 1;
-    optional uint64 freq_idx = 2;
-    optional uint64 time_ms = 3;
-}
-
-/*
- * Logs the reception of an incoming network packet causing the main system to wake up for
- * processing that packet. These events are notified by the kernel via Netlink NFLOG to Netd
- * and processed by WakeupController.cpp.
- */
-message PacketWakeupOccurred {
-    // The uid owning the socket into which the packet was delivered, or -1 if the packet was
-    // delivered nowhere.
-    optional int32 uid = 1;
-    // The interface name on which the packet was received.
-    optional string iface = 2;
-    // The ethertype value of the packet.
-    optional int32 ethertype = 3;
-    // String representation of the destination MAC address of the packet.
-    optional string destination_hardware_address = 4;
-    // String representation of the source address of the packet if this was an IP packet.
-    optional string source_ip = 5;
-    // String representation of the destination address of the packet if this was an IP packet.
-    optional string destination_ip = 6;
-    // The value of the protocol field if this was an IPv4 packet or the value of the Next Header
-    // field if this was an IPv6 packet. The range of possible values is the same for both IP
-    // families.
-    optional int32 ip_next_header = 7;
-    // The source port if this was a TCP or UDP packet.
-    optional int32 source_port = 8;
-    // The destination port if this was a TCP or UDP packet.
-    optional int32 destination_port = 9;
-}
-
-/**
- * Pulls Wifi Controller Activity Energy Info
- */
-message WifiActivityEnergyInfoPulled {
-    // timestamp(wall clock) of record creation
-    optional uint64 timestamp_ms = 1;
-    // stack reported state
-    // TODO: replace this with proto enum
-    optional int32 stack_state = 2;
-    // tx time in ms
-    optional uint64 controller_tx_time_ms = 3;
-    // rx time in ms
-    optional uint64 controller_rx_time_ms = 4;
-    // idle time in ms
-    optional uint64 controller_idle_time_ms = 5;
-    // product of current(mA), voltage(V) and time(ms)
-    optional uint64 controller_energy_used = 6;
-}
-
-/**
- * Pulls Modem Activity Energy Info
- */
-message ModemActivityInfoPulled {
-    // timestamp(wall clock) of record creation
-    optional uint64 timestamp_ms = 1;
-    // sleep time in ms.
-    optional uint64 sleep_time_ms = 2;
-    // idle time in ms
-    optional uint64 controller_idle_time_ms = 3;
-    /**
-     * Tx power index
-     * index 0 = tx_power < 0dBm
-     * index 1 = 0dBm < tx_power < 5dBm
-     * index 2 = 5dBm < tx_power < 15dBm
-     * index 3 = 15dBm < tx_power < 20dBm
-     * index 4 = tx_power > 20dBm
-     */
-    // tx time in ms at power level 0
-    optional uint64 controller_tx_time_pl0_ms = 4;
-    // tx time in ms at power level 1
-    optional uint64 controller_tx_time_pl1_ms = 5;
-    // tx time in ms at power level 2
-    optional uint64 controller_tx_time_pl2_ms = 6;
-    // tx time in ms at power level 3
-    optional uint64 controller_tx_time_pl3_ms = 7;
-    // tx time in ms at power level 4
-    optional uint64 controller_tx_time_pl4_ms = 8;
-    // rx time in ms at power level 5
-    optional uint64 controller_rx_time_ms = 9;
-    // product of current(mA), voltage(V) and time(ms)
-    optional uint64 energy_used = 10;
-}
\ No newline at end of file
diff --git a/cmds/statsd/src/config/ConfigManager.cpp b/cmds/statsd/src/config/ConfigManager.cpp
index e52b273..164f88f 100644
--- a/cmds/statsd/src/config/ConfigManager.cpp
+++ b/cmds/statsd/src/config/ConfigManager.cpp
@@ -29,6 +29,12 @@
 namespace os {
 namespace statsd {
 
+using std::map;
+using std::pair;
+using std::set;
+using std::string;
+using std::vector;
+
 #define STATS_SERVICE_DIR "/data/misc/stats-service"
 
 using android::base::StringPrintf;
@@ -41,8 +47,14 @@
 }
 
 void ConfigManager::Startup() {
-    StorageManager::readConfigFromDisk(mConfigs);
-
+    map<ConfigKey, StatsdConfig> configsFromDisk;
+    StorageManager::readConfigFromDisk(configsFromDisk);
+    // TODO(b/70667694): Make the configs from disk be used. And remove the fake config,
+    // and tests shouldn't call this Startup(), maybe call StartupForTest() so we don't read
+    // configs from disk for tests.
+    // for (const auto& pair : configsFromDisk) {
+    //    UpdateConfig(pair.first, pair.second);
+    //}
     // this should be called from StatsService when it receives a statsd_config
     UpdateConfig(ConfigKey(1000, "fake"), build_fake_config());
 }
@@ -52,9 +64,8 @@
 }
 
 void ConfigManager::UpdateConfig(const ConfigKey& key, const StatsdConfig& config) {
-    // Add to map
-    mConfigs[key] = config;
-    // Why doesn't this work? mConfigs.insert({key, config});
+    // Add to set
+    mConfigs.insert(key);
 
     // Save to disk
     update_saved_configs(key, config);
@@ -74,7 +85,7 @@
 }
 
 void ConfigManager::RemoveConfig(const ConfigKey& key) {
-    unordered_map<ConfigKey, StatsdConfig>::iterator it = mConfigs.find(key);
+    auto it = mConfigs.find(key);
     if (it != mConfigs.end()) {
         // Remove from map
         mConfigs.erase(it);
@@ -100,9 +111,9 @@
 
     for (auto it = mConfigs.begin(); it != mConfigs.end();) {
         // Remove from map
-        if (it->first.GetUid() == uid) {
-            removed.push_back(it->first);
-            mConfigReceivers.erase(it->first);
+        if (it->GetUid() == uid) {
+            removed.push_back(*it);
+            mConfigReceivers.erase(*it);
             it = mConfigs.erase(it);
         } else {
             it++;
@@ -123,10 +134,10 @@
 
     for (auto it = mConfigs.begin(); it != mConfigs.end();) {
         // Remove from map
-        removed.push_back(it->first);
-        auto receiverIt = mConfigReceivers.find(it->first);
+        removed.push_back(*it);
+        auto receiverIt = mConfigReceivers.find(*it);
         if (receiverIt != mConfigReceivers.end()) {
-            mConfigReceivers.erase(it->first);
+            mConfigReceivers.erase(*it);
         }
         it = mConfigs.erase(it);
     }
@@ -143,7 +154,7 @@
 vector<ConfigKey> ConfigManager::GetAllConfigKeys() const {
     vector<ConfigKey> ret;
     for (auto it = mConfigs.cbegin(); it != mConfigs.cend(); ++it) {
-        ret.push_back(it->first);
+        ret.push_back(*it);
     }
     return ret;
 }
@@ -160,15 +171,13 @@
 void ConfigManager::Dump(FILE* out) {
     fprintf(out, "CONFIGURATIONS (%d)\n", (int)mConfigs.size());
     fprintf(out, "     uid name\n");
-    for (unordered_map<ConfigKey, StatsdConfig>::const_iterator it = mConfigs.begin();
-         it != mConfigs.end(); it++) {
-        fprintf(out, "  %6d %s\n", it->first.GetUid(), it->first.GetName().c_str());
-        auto receiverIt = mConfigReceivers.find(it->first);
+    for (const auto& key : mConfigs) {
+        fprintf(out, "  %6d %s\n", key.GetUid(), key.GetName().c_str());
+        auto receiverIt = mConfigReceivers.find(key);
         if (receiverIt != mConfigReceivers.end()) {
             fprintf(out, "    -> received by %s, %s\n", receiverIt->second.first.c_str(),
                     receiverIt->second.second.c_str());
         }
-        // TODO: Print the contents of the config too.
     }
 }
 
@@ -227,7 +236,8 @@
     metric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
 
     // Anomaly threshold for screen-on count.
-    Alert* alert = config.add_alert();
+    // TODO(b/70627390): Uncomment once the bug is fixed.
+    /*Alert* alert = config.add_alert();
     alert->set_name("ALERT_1");
     alert->set_metric_name("METRIC_1");
     alert->set_number_of_buckets(6);
@@ -235,7 +245,7 @@
     alert->set_refractory_period_secs(30);
     Alert::IncidentdDetails* details = alert->mutable_incidentd_details();
     details->add_section(12);
-    details->add_section(13);
+    details->add_section(13);*/
 
     // Count process state changes, slice by uid.
     metric = config.add_count_metric();
@@ -246,6 +256,8 @@
     keyMatcher->set_key(UID_PROCESS_STATE_UID_KEY);
 
     // Anomaly threshold for background count.
+    // TODO(b/70627390): Uncomment once the bug is fixed.
+    /*
     alert = config.add_alert();
     alert->set_name("ALERT_2");
     alert->set_metric_name("METRIC_2");
@@ -254,7 +266,7 @@
     alert->set_refractory_period_secs(20);
     details = alert->mutable_incidentd_details();
     details->add_section(14);
-    details->add_section(15);
+    details->add_section(15);*/
 
     // Count process state changes, slice by uid, while SCREEN_IS_OFF
     metric = config.add_count_metric();
@@ -326,6 +338,8 @@
     durationMetric->set_what("SCREEN_IS_ON");
 
     // Anomaly threshold for background count.
+    // TODO(b/70627390): Uncomment once the bug is fixed.
+    /*
     alert = config.add_alert();
     alert->set_name("ALERT_8");
     alert->set_metric_name("METRIC_8");
@@ -333,7 +347,7 @@
     alert->set_trigger_if_sum_gt(2000000000); // 2 seconds
     alert->set_refractory_period_secs(120);
     details = alert->mutable_incidentd_details();
-    details->add_section(-1);
+    details->add_section(-1);*/
 
     // Value metric to count KERNEL_WAKELOCK when screen turned on
     ValueMetric* valueMetric = config.add_value_metric();
diff --git a/cmds/statsd/src/config/ConfigManager.h b/cmds/statsd/src/config/ConfigManager.h
index 90ea6c0..ea42a35 100644
--- a/cmds/statsd/src/config/ConfigManager.h
+++ b/cmds/statsd/src/config/ConfigManager.h
@@ -19,8 +19,9 @@
 #include "config/ConfigKey.h"
 #include "config/ConfigListener.h"
 
+#include <map>
+#include <set>
 #include <string>
-#include <unordered_map>
 
 #include <stdio.h>
 
@@ -28,13 +29,7 @@
 namespace os {
 namespace statsd {
 
-using android::RefBase;
-using std::string;
-using std::unordered_map;
-using std::vector;
-using std::pair;
-
-// Util function to Hard code a test metric for counting screen on events.
+// Util function to build a hard coded config with test metrics.
 StatsdConfig build_fake_config();
 
 /**
@@ -43,7 +38,7 @@
  * TODO: Store the configs persistently too.
  * TODO: Dump method for debugging.
  */
-class ConfigManager : public virtual RefBase {
+class ConfigManager : public virtual android::RefBase {
 public:
     ConfigManager();
     virtual ~ConfigManager();
@@ -68,17 +63,17 @@
     /**
      * Sets the broadcast receiver for a configuration key.
      */
-    void SetConfigReceiver(const ConfigKey& key, const string& pkg, const string& cls);
+    void SetConfigReceiver(const ConfigKey& key, const std::string& pkg, const std::string& cls);
 
     /**
      * Returns the package name and class name representing the broadcast receiver for this config.
      */
-    const pair<string, string> GetConfigReceiver(const ConfigKey& key) const;
+    const std::pair<std::string, std::string> GetConfigReceiver(const ConfigKey& key) const;
 
     /**
      * Returns all config keys registered.
      */
-    vector<ConfigKey> GetAllConfigKeys() const;
+    std::vector<ConfigKey> GetAllConfigKeys() const;
 
     /**
      * Erase any broadcast receiver associated with this config key.
@@ -121,18 +116,18 @@
     /**
      * The Configs that have been set. Each config should
      */
-    unordered_map<ConfigKey, StatsdConfig> mConfigs;
+    std::set<ConfigKey> mConfigs;
 
     /**
      * Each config key can be subscribed by up to one receiver, specified as the package name and
      * class name.
      */
-    unordered_map<ConfigKey, pair<string, string>> mConfigReceivers;
+    std::map<ConfigKey, std::pair<std::string, std::string>> mConfigReceivers;
 
     /**
      * The ConfigListeners that will be told about changes.
      */
-    vector<sp<ConfigListener>> mListeners;
+    std::vector<sp<ConfigListener>> mListeners;
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index b02b9da..bf277f0 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -310,7 +310,7 @@
         for (const auto& stats : alertStats) {
             auto output = configStats.add_alert_stats();
             output->set_name(stats.first);
-            output->set_declared_times(stats.second);
+            output->set_alerted_times(stats.second);
             VLOG("alert %s declared %d times", stats.first.c_str(), stats.second);
         }
     }
diff --git a/cmds/statsd/src/logd/LogEvent.h b/cmds/statsd/src/logd/LogEvent.h
index 7e8a96b..176e16e 100644
--- a/cmds/statsd/src/logd/LogEvent.h
+++ b/cmds/statsd/src/logd/LogEvent.h
@@ -105,6 +105,11 @@
      */
     void init();
 
+    /**
+     * Set timestamp if the original timestamp is missing.
+     */
+    void setTimestampNs(uint64_t timestampNs) {mTimestampNs = timestampNs;}
+
 private:
     /**
      * Don't copy, it's slower. If we really need this we can add it but let's try to
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp
index fc12013..7b865c2 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp
@@ -66,7 +66,7 @@
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard,
                                          const uint64_t startTimeNs)
-    : MetricProducer(key, startTimeNs, conditionIndex, wizard), mMetric(metric) {
+    : MetricProducer(metric.name(), key, startTimeNs, conditionIndex, wizard) {
     // TODO: evaluate initial conditions. and set mConditionMet.
     if (metric.has_bucket() && metric.bucket().has_bucket_size_millis()) {
         mBucketSizeNs = metric.bucket().bucket_size_millis() * 1000 * 1000;
@@ -92,18 +92,18 @@
 }
 
 void CountMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
-    VLOG("Metric %s onSlicedConditionMayChange", mMetric.name().c_str());
+    VLOG("Metric %s onSlicedConditionMayChange", mName.c_str());
 }
 
 void CountMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
                                              ProtoOutputStream* protoOutput) {
     flushIfNeededLocked(dumpTimeNs);
 
-    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mMetric.name());
+    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mName);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_REPORT_NANOS, (long long)mStartTimeNs);
     long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_COUNT_METRICS);
 
-    VLOG("metric %s dump report now...", mMetric.name().c_str());
+    VLOG("metric %s dump report now...", mName.c_str());
 
     for (const auto& counter : mPastBuckets) {
         const HashableDimensionKey& hashableKey = counter.first;
@@ -160,7 +160,7 @@
 
 void CountMetricProducer::onConditionChangedLocked(const bool conditionMet,
                                                    const uint64_t eventTime) {
-    VLOG("Metric %s onConditionChanged", mMetric.name().c_str());
+    VLOG("Metric %s onConditionChanged", mName.c_str());
     mCondition = conditionMet;
 }
 
@@ -172,11 +172,10 @@
     // 1. Report the tuple count if the tuple count > soft limit
     if (mCurrentSlicedCounter->size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
         size_t newTupleCount = mCurrentSlicedCounter->size() + 1;
-        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetric.name(),
-                                                           newTupleCount);
+        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mName, newTupleCount);
         // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
         if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
-            ALOGE("CountMetric %s dropping data for dimension key %s", mMetric.name().c_str(),
+            ALOGE("CountMetric %s dropping data for dimension key %s", mName.c_str(),
                   newKey.c_str());
             return true;
         }
@@ -188,7 +187,7 @@
 void CountMetricProducer::onMatchedLogEventInternalLocked(
         const size_t matcherIndex, const HashableDimensionKey& eventKey,
         const map<string, HashableDimensionKey>& conditionKey, bool condition,
-        const LogEvent& event, bool scheduledPull) {
+        const LogEvent& event) {
     uint64_t eventTimeNs = event.GetTimestampNs();
 
     flushIfNeededLocked(eventTimeNs);
@@ -218,7 +217,7 @@
                                          mCurrentSlicedCounter->find(eventKey)->second);
     }
 
-    VLOG("metric %s %s->%lld", mMetric.name().c_str(), eventKey.c_str(),
+    VLOG("metric %s %s->%lld", mName.c_str(), eventKey.c_str(),
          (long long)(*mCurrentSlicedCounter)[eventKey]);
 }
 
@@ -237,7 +236,7 @@
         info.mCount = counter.second;
         auto& bucketList = mPastBuckets[counter.first];
         bucketList.push_back(info);
-        VLOG("metric %s, dump key value: %s -> %lld", mMetric.name().c_str(), counter.first.c_str(),
+        VLOG("metric %s, dump key value: %s -> %lld", mName.c_str(), counter.first.c_str(),
              (long long)counter.second);
     }
 
@@ -250,7 +249,7 @@
     uint64_t numBucketsForward = (eventTimeNs - mCurrentBucketStartTimeNs) / mBucketSizeNs;
     mCurrentBucketStartTimeNs = mCurrentBucketStartTimeNs + numBucketsForward * mBucketSizeNs;
     mCurrentBucketNum += numBucketsForward;
-    VLOG("metric %s: new bucket start time: %lld", mMetric.name().c_str(),
+    VLOG("metric %s: new bucket start time: %lld", mName.c_str(),
          (long long)mCurrentBucketStartTimeNs);
 }
 
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h
index 21bd9d6..59995d2 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.h
+++ b/cmds/statsd/src/metrics/CountMetricProducer.h
@@ -58,7 +58,7 @@
     void onMatchedLogEventInternalLocked(
             const size_t matcherIndex, const HashableDimensionKey& eventKey,
             const std::map<std::string, HashableDimensionKey>& conditionKey, bool condition,
-            const LogEvent& event, bool scheduledPull) override;
+            const LogEvent& event) override;
 
 private:
     void onDumpReportLocked(const uint64_t dumpTimeNs,
@@ -76,8 +76,6 @@
     // Util function to flush the old packet.
     void flushIfNeededLocked(const uint64_t& newEventTime);
 
-    const CountMetric mMetric;
-
     // TODO: Add a lock to mPastBuckets.
     std::unordered_map<HashableDimensionKey, std::vector<CountBucket>> mPastBuckets;
 
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
index 9920f65..6afbe45 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
@@ -68,8 +68,8 @@
                                                const sp<ConditionWizard>& wizard,
                                                const vector<KeyMatcher>& internalDimension,
                                                const uint64_t startTimeNs)
-    : MetricProducer(key, startTimeNs, conditionIndex, wizard),
-      mMetric(metric),
+    : MetricProducer(metric.name(), key, startTimeNs, conditionIndex, wizard),
+      mAggregationType(metric.aggregation_type()),
       mStartIndex(startIndex),
       mStopIndex(stopIndex),
       mStopAllIndex(stopAllIndex),
@@ -114,20 +114,20 @@
 
 unique_ptr<DurationTracker> DurationMetricProducer::createDurationTracker(
         const HashableDimensionKey& eventKey) const {
-    switch (mMetric.aggregation_type()) {
+    switch (mAggregationType) {
         case DurationMetric_AggregationType_SUM:
             return make_unique<OringDurationTracker>(
-                    mConfigKey, mMetric.name(), eventKey, mWizard, mConditionTrackerIndex, mNested,
+                    mConfigKey, mName, eventKey, mWizard, mConditionTrackerIndex, mNested,
                     mCurrentBucketStartTimeNs, mBucketSizeNs, mAnomalyTrackers);
         case DurationMetric_AggregationType_MAX_SPARSE:
             return make_unique<MaxDurationTracker>(
-                    mConfigKey, mMetric.name(), eventKey, mWizard, mConditionTrackerIndex, mNested,
+                    mConfigKey, mName, eventKey, mWizard, mConditionTrackerIndex, mNested,
                     mCurrentBucketStartTimeNs, mBucketSizeNs, mAnomalyTrackers);
     }
 }
 
 void DurationMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
-    VLOG("Metric %s onSlicedConditionMayChange", mMetric.name().c_str());
+    VLOG("Metric %s onSlicedConditionMayChange", mName.c_str());
     flushIfNeededLocked(eventTime);
     // Now for each of the on-going event, check if the condition has changed for them.
     for (auto& pair : mCurrentSlicedDuration) {
@@ -137,7 +137,7 @@
 
 void DurationMetricProducer::onConditionChangedLocked(const bool conditionMet,
                                                       const uint64_t eventTime) {
-    VLOG("Metric %s onConditionChanged", mMetric.name().c_str());
+    VLOG("Metric %s onConditionChanged", mName.c_str());
     mCondition = conditionMet;
     flushIfNeededLocked(eventTime);
     // TODO: need to populate the condition change time from the event which triggers the condition
@@ -151,11 +151,11 @@
                                                 ProtoOutputStream* protoOutput) {
     flushIfNeededLocked(dumpTimeNs);
 
-    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mMetric.name());
+    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mName);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_REPORT_NANOS, (long long)mStartTimeNs);
     long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_DURATION_METRICS);
 
-    VLOG("metric %s dump report now...", mMetric.name().c_str());
+    VLOG("metric %s dump report now...", mName.c_str());
 
     for (const auto& pair : mPastBuckets) {
         const HashableDimensionKey& hashableKey = pair.first;
@@ -236,11 +236,10 @@
     // 1. Report the tuple count if the tuple count > soft limit
     if (mCurrentSlicedDuration.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
         size_t newTupleCount = mCurrentSlicedDuration.size() + 1;
-        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetric.name(),
-                                                           newTupleCount);
+        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mName, newTupleCount);
         // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
         if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
-            ALOGE("DurationMetric %s dropping data for dimension key %s", mMetric.name().c_str(),
+            ALOGE("DurationMetric %s dropping data for dimension key %s", mName.c_str(),
                   newKey.c_str());
             return true;
         }
@@ -251,7 +250,7 @@
 void DurationMetricProducer::onMatchedLogEventInternalLocked(
         const size_t matcherIndex, const HashableDimensionKey& eventKey,
         const map<string, HashableDimensionKey>& conditionKeys, bool condition,
-        const LogEvent& event, bool scheduledPull) {
+        const LogEvent& event) {
     flushIfNeededLocked(event.GetTimestampNs());
 
     if (matcherIndex == mStopAllIndex) {
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h
index e509af4..e7aca7f 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.h
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.h
@@ -57,7 +57,7 @@
     void onMatchedLogEventInternalLocked(
             const size_t matcherIndex, const HashableDimensionKey& eventKey,
             const std::map<std::string, HashableDimensionKey>& conditionKeys, bool condition,
-            const LogEvent& event, bool scheduledPull) override;
+            const LogEvent& event) override;
 
 private:
     void onDumpReportLocked(const uint64_t dumpTimeNs,
@@ -75,7 +75,7 @@
     // Util function to flush the old packet.
     void flushIfNeededLocked(const uint64_t& eventTime);
 
-    const DurationMetric mMetric;
+    const DurationMetric_AggregationType mAggregationType;
 
     // Index of the SimpleAtomMatcher which defines the start.
     const size_t mStartIndex;
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp
index 217aff0..4752997 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp
@@ -55,7 +55,7 @@
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard,
                                          const uint64_t startTimeNs)
-    : MetricProducer(key, startTimeNs, conditionIndex, wizard), mMetric(metric) {
+    : MetricProducer(metric.name(), key, startTimeNs, conditionIndex, wizard) {
     if (metric.links().size() > 0) {
         mConditionLinks.insert(mConditionLinks.begin(), metric.links().begin(),
                                metric.links().end());
@@ -98,12 +98,12 @@
 
 void EventMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
                                              ProtoOutputStream* protoOutput) {
-    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mMetric.name());
+    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mName);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_REPORT_NANOS, (long long)mStartTimeNs);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_END_REPORT_NANOS, (long long)dumpTimeNs);
 
     size_t bufferSize = mProto->size();
-    VLOG("metric %s dump report now... proto size: %zu ", mMetric.name().c_str(), bufferSize);
+    VLOG("metric %s dump report now... proto size: %zu ", mName.c_str(), bufferSize);
     std::unique_ptr<std::vector<uint8_t>> buffer = serializeProtoLocked(*mProto);
 
     protoOutput->write(FIELD_TYPE_MESSAGE | FIELD_ID_EVENT_METRICS,
@@ -115,14 +115,14 @@
 
 void EventMetricProducer::onConditionChangedLocked(const bool conditionMet,
                                                    const uint64_t eventTime) {
-    VLOG("Metric %s onConditionChanged", mMetric.name().c_str());
+    VLOG("Metric %s onConditionChanged", mName.c_str());
     mCondition = conditionMet;
 }
 
 void EventMetricProducer::onMatchedLogEventInternalLocked(
         const size_t matcherIndex, const HashableDimensionKey& eventKey,
         const std::map<std::string, HashableDimensionKey>& conditionKey, bool condition,
-        const LogEvent& event, bool scheduledPull) {
+        const LogEvent& event) {
     if (!condition) {
         return;
     }
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h
index 75ccf47..d720ead 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.h
+++ b/cmds/statsd/src/metrics/EventMetricProducer.h
@@ -53,7 +53,7 @@
     void onMatchedLogEventInternalLocked(
             const size_t matcherIndex, const HashableDimensionKey& eventKey,
             const std::map<std::string, HashableDimensionKey>& conditionKey, bool condition,
-            const LogEvent& event, bool scheduledPull) override;
+            const LogEvent& event) override;
 
     void onDumpReportLocked(const uint64_t dumpTimeNs,
                             android::util::ProtoOutputStream* protoOutput) override;
@@ -67,8 +67,6 @@
     // Internal function to calculate the current used bytes.
     size_t byteSizeLocked() const override;
 
-    const EventMetric mMetric;
-
     // Maps to a EventMetricDataWrapper. Storing atom events in ProtoOutputStream
     // is more space efficient than storing LogEvent.
     std::unique_ptr<android::util::ProtoOutputStream> mProto;
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index 55d84e0..ae9b86f 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -67,8 +67,8 @@
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard, const int pullTagId,
                                          const int64_t startTimeNs)
-    : MetricProducer(key, startTimeNs, conditionIndex, wizard),
-      mMetric(metric),
+    : MetricProducer(metric.name(), key, startTimeNs, conditionIndex, wizard),
+      mGaugeField(metric.gauge_field()),
       mPullTagId(pullTagId) {
     if (metric.has_bucket() && metric.bucket().has_bucket_size_millis()) {
         mBucketSizeNs = metric.bucket().bucket_size_millis() * 1000 * 1000;
@@ -104,11 +104,11 @@
 
 void GaugeMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
                                              ProtoOutputStream* protoOutput) {
-    VLOG("gauge metric %s dump report now...", mMetric.name().c_str());
+    VLOG("gauge metric %s dump report now...", mName.c_str());
 
     flushIfNeededLocked(dumpTimeNs);
 
-    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mMetric.name());
+    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mName);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_REPORT_NANOS, (long long)mStartTimeNs);
     long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_GAUGE_METRICS);
 
@@ -166,7 +166,7 @@
 
 void GaugeMetricProducer::onConditionChangedLocked(const bool conditionMet,
                                                    const uint64_t eventTime) {
-    VLOG("Metric %s onConditionChanged", mMetric.name().c_str());
+    VLOG("Metric %s onConditionChanged", mName.c_str());
     flushIfNeededLocked(eventTime);
     mCondition = conditionMet;
 
@@ -187,18 +187,18 @@
         return;
     }
     for (const auto& data : allData) {
-        onMatchedLogEventLocked(0, *data, false /*scheduledPull*/);
+        onMatchedLogEventLocked(0, *data);
     }
     flushIfNeededLocked(eventTime);
 }
 
 void GaugeMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
-    VLOG("Metric %s onSlicedConditionMayChange", mMetric.name().c_str());
+    VLOG("Metric %s onSlicedConditionMayChange", mName.c_str());
 }
 
 int64_t GaugeMetricProducer::getGauge(const LogEvent& event) {
     status_t err = NO_ERROR;
-    int64_t val = event.GetLong(mMetric.gauge_field(), &err);
+    int64_t val = event.GetLong(mGaugeField, &err);
     if (err == NO_ERROR) {
         return val;
     } else {
@@ -211,7 +211,7 @@
     std::lock_guard<std::mutex> lock(mMutex);
 
     for (const auto& data : allData) {
-        onMatchedLogEventLocked(0, *data, true /*scheduledPull*/);
+        onMatchedLogEventLocked(0, *data);
     }
 }
 
@@ -222,11 +222,10 @@
     // 1. Report the tuple count if the tuple count > soft limit
     if (mCurrentSlicedBucket->size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
         size_t newTupleCount = mCurrentSlicedBucket->size() + 1;
-        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetric.name(),
-                                                           newTupleCount);
+        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mName, newTupleCount);
         // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
         if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
-            ALOGE("GaugeMetric %s dropping data for dimension key %s", mMetric.name().c_str(),
+            ALOGE("GaugeMetric %s dropping data for dimension key %s", mName.c_str(),
                   newKey.c_str());
             return true;
         }
@@ -238,7 +237,7 @@
 void GaugeMetricProducer::onMatchedLogEventInternalLocked(
         const size_t matcherIndex, const HashableDimensionKey& eventKey,
         const map<string, HashableDimensionKey>& conditionKey, bool condition,
-        const LogEvent& event, bool scheduledPull) {
+        const LogEvent& event) {
     if (condition == false) {
         return;
     }
@@ -289,8 +288,8 @@
         info.mGauge = slice.second;
         auto& bucketList = mPastBuckets[slice.first];
         bucketList.push_back(info);
-        VLOG("gauge metric %s, dump key value: %s -> %lld", mMetric.name().c_str(),
-             slice.first.c_str(), (long long)slice.second);
+        VLOG("gauge metric %s, dump key value: %s -> %lld", mName.c_str(), slice.first.c_str(),
+             (long long)slice.second);
     }
 
     // Reset counters
@@ -304,7 +303,7 @@
     int64_t numBucketsForward = (eventTimeNs - mCurrentBucketStartTimeNs) / mBucketSizeNs;
     mCurrentBucketStartTimeNs = mCurrentBucketStartTimeNs + numBucketsForward * mBucketSizeNs;
     mCurrentBucketNum += numBucketsForward;
-    VLOG("metric %s: new bucket start time: %lld", mMetric.name().c_str(),
+    VLOG("metric %s: new bucket start time: %lld", mName.c_str(),
          (long long)mCurrentBucketStartTimeNs);
 }
 
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index e4bda02..6e6f2bb 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -66,7 +66,7 @@
     void onMatchedLogEventInternalLocked(
             const size_t matcherIndex, const HashableDimensionKey& eventKey,
             const std::map<std::string, HashableDimensionKey>& conditionKey, bool condition,
-            const LogEvent& event, bool scheduledPull) override;
+            const LogEvent& event) override;
 
 private:
     void onDumpReportLocked(const uint64_t dumpTimeNs,
@@ -87,7 +87,7 @@
     // The default bucket size for gauge metric is 1 second.
     static const uint64_t kDefaultGaugemBucketSizeNs = 1000 * 1000 * 1000;
 
-    const GaugeMetric mMetric;
+    const int32_t mGaugeField;
 
     StatsPullerManager mStatsPullerManager;
     // tagId for pulled data. -1 if this is not pulled
diff --git a/cmds/statsd/src/metrics/MetricProducer.cpp b/cmds/statsd/src/metrics/MetricProducer.cpp
index 5a0a7c7f..f38f3df 100644
--- a/cmds/statsd/src/metrics/MetricProducer.cpp
+++ b/cmds/statsd/src/metrics/MetricProducer.cpp
@@ -21,8 +21,7 @@
 
 using std::map;
 
-void MetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event,
-                                             bool scheduledPull) {
+void MetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event) {
     uint64_t eventTimeNs = event.GetTimestampNs();
     // this is old event, maybe statsd restarted?
     if (eventTimeNs < mStartTimeNs) {
@@ -60,8 +59,7 @@
         condition = mCondition;
     }
 
-    onMatchedLogEventInternalLocked(matcherIndex, eventKey, conditionKeys, condition, event,
-                                    scheduledPull);
+    onMatchedLogEventInternalLocked(matcherIndex, eventKey, conditionKeys, condition, event);
 }
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h
index ef2ef29..d4a2195 100644
--- a/cmds/statsd/src/metrics/MetricProducer.h
+++ b/cmds/statsd/src/metrics/MetricProducer.h
@@ -38,9 +38,10 @@
 // be a no-op.
 class MetricProducer : public virtual PackageInfoListener {
 public:
-    MetricProducer(const ConfigKey& key, const int64_t startTimeNs, const int conditionIndex,
-                   const sp<ConditionWizard>& wizard)
-        : mConfigKey(key),
+    MetricProducer(const std::string& name, const ConfigKey& key, const int64_t startTimeNs,
+                   const int conditionIndex, const sp<ConditionWizard>& wizard)
+        : mName(name),
+          mConfigKey(key),
           mStartTimeNs(startTimeNs),
           mCurrentBucketStartTimeNs(startTimeNs),
           mCurrentBucketNum(0),
@@ -54,9 +55,9 @@
     virtual ~MetricProducer(){};
 
     // Consume the parsed stats log entry that already matched the "what" of the metric.
-    void onMatchedLogEvent(const size_t matcherIndex, const LogEvent& event, bool scheduledPull) {
+    void onMatchedLogEvent(const size_t matcherIndex, const LogEvent& event) {
         std::lock_guard<std::mutex> lock(mMutex);
-        onMatchedLogEventLocked(matcherIndex, event, scheduledPull);
+        onMatchedLogEventLocked(matcherIndex, event);
     }
 
     void onConditionChanged(const bool condition, const uint64_t eventTime) {
@@ -108,6 +109,8 @@
                                     android::util::ProtoOutputStream* protoOutput) = 0;
     virtual size_t byteSizeLocked() const = 0;
 
+    const std::string mName;
+
     const ConfigKey mConfigKey;
 
     // The start time for the current in memory metrics data.
@@ -155,11 +158,10 @@
     virtual void onMatchedLogEventInternalLocked(
             const size_t matcherIndex, const HashableDimensionKey& eventKey,
             const std::map<std::string, HashableDimensionKey>& conditionKey, bool condition,
-            const LogEvent& event, bool scheduledPull) = 0;
+            const LogEvent& event) = 0;
 
     // Consume the parsed stats log entry that already matched the "what" of the metric.
-    void onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event,
-                                 bool scheduledPull);
+    void onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event);
 
     mutable std::mutex mMutex;
 };
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp
index 0510fff..3d0e20c 100644
--- a/cmds/statsd/src/metrics/MetricsManager.cpp
+++ b/cmds/statsd/src/metrics/MetricsManager.cpp
@@ -50,11 +50,6 @@
                              mAllMetricProducers, mAllAnomalyTrackers, mConditionToMetricMap,
                              mTrackerToMetricMap, mTrackerToConditionMap);
 
-    // TODO: add alert size.
-    // no matter whether this config is valid, log it in the stats.
-    StatsdStats::getInstance().noteConfigReceived(key, mAllMetricProducers.size(),
-                                                  mAllConditionTrackers.size(),
-                                                  mAllAtomMatchers.size(), 0, mConfigValid);
     // Guardrail. Reject the config if it's too big.
     if (mAllMetricProducers.size() > StatsdStats::kMaxMetricCountPerConfig ||
         mAllConditionTrackers.size() > StatsdStats::kMaxConditionCountPerConfig ||
@@ -62,6 +57,12 @@
         ALOGE("This config is too big! Reject!");
         mConfigValid = false;
     }
+
+    // TODO: add alert size.
+    // no matter whether this config is valid, log it in the stats.
+    StatsdStats::getInstance().noteConfigReceived(key, mAllMetricProducers.size(),
+                                                  mAllConditionTrackers.size(),
+                                                  mAllAtomMatchers.size(), 0, mConfigValid);
 }
 
 MetricsManager::~MetricsManager() {
@@ -162,8 +163,7 @@
                 auto& metricList = pair->second;
                 for (const int metricIndex : metricList) {
                     // pushed metrics are never scheduled pulls
-                    mAllMetricProducers[metricIndex]->onMatchedLogEvent(i, event,
-                                                                        false /* schedulePull */);
+                    mAllMetricProducers[metricIndex]->onMatchedLogEvent(i, event);
                 }
             }
         }
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 721d02c..9400a1c 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -73,13 +73,13 @@
                                          const sp<ConditionWizard>& wizard, const int pullTagId,
                                          const uint64_t startTimeNs,
                                          shared_ptr<StatsPullerManager> statsPullerManager)
-    : MetricProducer(key, startTimeNs, conditionIndex, wizard),
-      mMetric(metric),
+    : MetricProducer(metric.name(), key, startTimeNs, conditionIndex, wizard),
+      mValueField(metric.value_field()),
       mStatsPullerManager(statsPullerManager),
       mPullTagId(pullTagId) {
     // TODO: valuemetric for pushed events may need unlimited bucket length
     if (metric.has_bucket() && metric.bucket().has_bucket_size_millis()) {
-        mBucketSizeNs = mMetric.bucket().bucket_size_millis() * 1000 * 1000;
+        mBucketSizeNs = metric.bucket().bucket_size_millis() * 1000 * 1000;
     } else {
         mBucketSizeNs = kDefaultBucketSizeMillis * 1000 * 1000;
     }
@@ -118,14 +118,14 @@
 }
 
 void ValueMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) {
-    VLOG("Metric %s onSlicedConditionMayChange", mMetric.name().c_str());
+    VLOG("Metric %s onSlicedConditionMayChange", mName.c_str());
 }
 
 void ValueMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
                                              ProtoOutputStream* protoOutput) {
-    VLOG("metric %s dump report now...", mMetric.name().c_str());
+    VLOG("metric %s dump report now...", mName.c_str());
     flushIfNeededLocked(dumpTimeNs);
-    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mMetric.name());
+    protoOutput->write(FIELD_TYPE_STRING | FIELD_ID_NAME, mName);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_REPORT_NANOS, (long long)mStartTimeNs);
     long long protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_VALUE_METRICS);
 
@@ -175,7 +175,7 @@
     protoOutput->end(protoToken);
     protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_END_REPORT_NANOS, (long long)dumpTimeNs);
 
-    VLOG("metric %s dump report now...", mMetric.name().c_str());
+    VLOG("metric %s dump report now...", mName.c_str());
     mPastBuckets.clear();
     mStartTimeNs = mCurrentBucketStartTimeNs;
     // TODO: Clear mDimensionKeyMap once the report is dumped.
@@ -184,10 +184,17 @@
 void ValueMetricProducer::onConditionChangedLocked(const bool condition, const uint64_t eventTime) {
     mCondition = condition;
 
+    if (eventTime < mCurrentBucketStartTimeNs) {
+        VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTime,
+             (long long)mCurrentBucketStartTimeNs);
+        return;
+    }
+
+    flushIfNeededLocked(eventTime);
+
     if (mPullTagId != -1) {
         if (mCondition == true) {
-            mStatsPullerManager->RegisterReceiver(mPullTagId, this,
-                                                  mMetric.bucket().bucket_size_millis());
+            mStatsPullerManager->RegisterReceiver(mPullTagId, this, mBucketSizeNs / 1000 / 1000);
         } else if (mCondition == false) {
             mStatsPullerManager->UnRegisterReceiver(mPullTagId, this);
         }
@@ -198,9 +205,8 @@
                 return;
             }
             for (const auto& data : allData) {
-                onMatchedLogEventLocked(0, *data, false);
+                onMatchedLogEventLocked(0, *data);
             }
-            flushIfNeededLocked(eventTime);
         }
         return;
     }
@@ -209,19 +215,26 @@
 void ValueMetricProducer::onDataPulled(const std::vector<std::shared_ptr<LogEvent>>& allData) {
     std::lock_guard<std::mutex> lock(mMutex);
 
-    if (mCondition == true || !mMetric.has_condition()) {
+    if (mCondition == true || mConditionTrackerIndex < 0) {
         if (allData.size() == 0) {
             return;
         }
-        uint64_t eventTime = allData.at(0)->GetTimestampNs();
-        // alarm is not accurate and might drift.
-        if (eventTime > mCurrentBucketStartTimeNs + mBucketSizeNs * 3 / 2) {
-            flushIfNeededLocked(eventTime);
-        }
+        // For scheduled pulled data, the effective event time is snap to the nearest
+        // bucket boundary to make bucket finalize.
+        uint64_t realEventTime = allData.at(0)->GetTimestampNs();
+        uint64_t eventTime = mStartTimeNs + ((realEventTime - mStartTimeNs)/mBucketSizeNs) * mBucketSizeNs;
+
+        mCondition = false;
         for (const auto& data : allData) {
-            onMatchedLogEventLocked(0, *data, true);
+            data->setTimestampNs(eventTime-1);
+            onMatchedLogEventLocked(0, *data);
         }
-        flushIfNeededLocked(eventTime);
+
+        mCondition = true;
+        for (const auto& data : allData) {
+            data->setTimestampNs(eventTime);
+            onMatchedLogEventLocked(0, *data);
+        }
     }
 }
 
@@ -233,11 +246,10 @@
     }
     if (mCurrentSlicedBucket.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) {
         size_t newTupleCount = mCurrentSlicedBucket.size() + 1;
-        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetric.name(),
-                                                           newTupleCount);
+        StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mName, newTupleCount);
         // 2. Don't add more tuples, we are above the allowed threshold. Drop the data.
         if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) {
-            ALOGE("ValueMetric %s dropping data for dimension key %s", mMetric.name().c_str(),
+            ALOGE("ValueMetric %s dropping data for dimension key %s", mName.c_str(),
                   newKey.c_str());
             return true;
         }
@@ -249,7 +261,7 @@
 void ValueMetricProducer::onMatchedLogEventInternalLocked(
         const size_t matcherIndex, const HashableDimensionKey& eventKey,
         const map<string, HashableDimensionKey>& conditionKey, bool condition,
-        const LogEvent& event, bool scheduledPull) {
+        const LogEvent& event) {
     uint64_t eventTimeNs = event.GetTimestampNs();
     if (eventTimeNs < mCurrentBucketStartTimeNs) {
         VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
@@ -257,6 +269,8 @@
         return;
     }
 
+    flushIfNeededLocked(eventTimeNs);
+
     if (hitGuardRailLocked(eventKey)) {
         return;
     }
@@ -264,42 +278,27 @@
 
     long value = get_value(event);
 
-    if (mPullTagId != -1) {
-        if (scheduledPull) {
-            // scheduled pull always sets beginning of current bucket and end
-            // of next bucket
-            if (interval.raw.size() > 0) {
-                interval.raw.back().second = value;
-            } else {
-                interval.raw.push_back(make_pair(value, value));
-            }
-            Interval& nextInterval = mNextSlicedBucket[eventKey];
-            if (nextInterval.raw.size() == 0) {
-                nextInterval.raw.push_back(make_pair(value, 0));
-            } else {
-                nextInterval.raw.front().first = value;
-            }
+    if (mPullTagId != -1) { // for pulled events
+        if (mCondition == true) {
+            interval.start = value;
+            interval.startUpdated = true;
         } else {
-            if (mCondition == true) {
-                interval.raw.push_back(make_pair(value, 0));
+            if (interval.startUpdated) {
+                interval.sum += (value - interval.start);
+                interval.startUpdated = false;
             } else {
-                if (interval.raw.size() != 0) {
-                    interval.raw.back().second = value;
-                } else {
-                    interval.tainted = true;
-                    VLOG("Data on condition true missing!");
-                }
+                VLOG("No start for matching end %ld", value);
+                interval.tainted += 1;
             }
         }
-    } else {
-        flushIfNeededLocked(eventTimeNs);
-        interval.raw.push_back(make_pair(value, 0));
+    } else {    // for pushed events
+        interval.sum += value;
     }
 }
 
 long ValueMetricProducer::get_value(const LogEvent& event) {
     status_t err = NO_ERROR;
-    long val = event.GetLong(mMetric.value_field(), &err);
+    long val = event.GetLong(mValueField, &err);
     if (err == NO_ERROR) {
         return val;
     } else {
@@ -323,27 +322,16 @@
 
     int tainted = 0;
     for (const auto& slice : mCurrentSlicedBucket) {
-        long value = 0;
-        if (mPullTagId != -1) {
-            for (const auto& pair : slice.second.raw) {
-                value += (pair.second - pair.first);
-            }
-        } else {
-            for (const auto& pair : slice.second.raw) {
-                value += pair.first;
-            }
-        }
         tainted += slice.second.tainted;
-        info.mValue = value;
-        VLOG(" %s, %ld, %d", slice.first.c_str(), value, tainted);
+        info.mValue = slice.second.sum;
         // it will auto create new vector of ValuebucketInfo if the key is not found.
         auto& bucketList = mPastBuckets[slice.first];
         bucketList.push_back(info);
     }
+    VLOG("%d tainted pairs in the bucket", tainted);
 
     // Reset counters
-    mCurrentSlicedBucket.swap(mNextSlicedBucket);
-    mNextSlicedBucket.clear();
+    mCurrentSlicedBucket.clear();
 
     int64_t numBucketsForward = (eventTimeNs - mCurrentBucketStartTimeNs) / mBucketSizeNs;
     mCurrentBucketStartTimeNs = mCurrentBucketStartTimeNs + numBucketsForward * mBucketSizeNs;
@@ -352,7 +340,7 @@
     if (numBucketsForward > 1) {
         VLOG("Skipping forward %lld buckets", (long long)numBucketsForward);
     }
-    VLOG("metric %s: new bucket start time: %lld", mMetric.name().c_str(),
+    VLOG("metric %s: new bucket start time: %lld", mName.c_str(),
          (long long)mCurrentBucketStartTimeNs);
 }
 
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index 8d60ff6..62e5d52 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -56,7 +56,7 @@
     void onMatchedLogEventInternalLocked(
             const size_t matcherIndex, const HashableDimensionKey& eventKey,
             const std::map<std::string, HashableDimensionKey>& conditionKey, bool condition,
-            const LogEvent& event, bool scheduledPull) override;
+            const LogEvent& event) override;
 
 private:
     void onDumpReportLocked(const uint64_t dumpTimeNs,
@@ -74,7 +74,7 @@
     // Util function to flush the old packet.
     void flushIfNeededLocked(const uint64_t& eventTime);
 
-    const ValueMetric mMetric;
+    const int32_t mValueField;
 
     std::shared_ptr<StatsPullerManager> mStatsPullerManager;
 
@@ -89,14 +89,19 @@
 
     // internal state of a bucket.
     typedef struct {
-        std::vector<std::pair<long, long>> raw;
-        bool tainted;
+        // Pulled data always come in pair of <start, end>. This holds the value
+        // for start. The diff (end - start) is added to sum.
+        long start;
+        // Whether the start data point is updated
+        bool startUpdated;
+        // If end data point comes before the start, record this pair as tainted
+        // and the value is not added to the running sum.
+        int tainted;
+        // Running sum of known pairs in this bucket
+        long sum;
     } Interval;
 
     std::unordered_map<HashableDimensionKey, Interval> mCurrentSlicedBucket;
-    // If condition is true and pulling on schedule, the previous bucket value needs to be carried
-    // over to the next bucket.
-    std::unordered_map<HashableDimensionKey, Interval> mNextSlicedBucket;
 
     // Save the past buckets and we can clear when the StatsLogReport is dumped.
     // TODO: Add a lock to mPastBuckets.
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index f8b91fe..20d9d5c 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -22,7 +22,7 @@
 option java_package = "com.android.os";
 option java_outer_classname = "StatsLog";
 
-import "frameworks/base/cmds/statsd/src/atoms_copy.proto";
+import "frameworks/base/cmds/statsd/src/atoms.proto";
 
 message KeyValuePair {
   optional int32 key = 1;
@@ -195,7 +195,7 @@
 
     message AlertStats {
         optional string name = 1;
-        optional int32 declared_times = 2;
+        optional int32 alerted_times = 2;
     }
 
     message ConfigStats {
diff --git a/cmds/statsd/src/stats_util.cpp b/cmds/statsd/src/stats_util.cpp
index fcce2ff..bfa3254 100644
--- a/cmds/statsd/src/stats_util.cpp
+++ b/cmds/statsd/src/stats_util.cpp
@@ -15,119 +15,11 @@
  */
 
 #include "stats_util.h"
-#include <log/log_event_list.h>
 
 namespace android {
 namespace os {
 namespace statsd {
 
-static inline uint32_t get4LE(const char* src) {
-    return src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24);
-}
-
-int getTagId(log_msg msg) {
-    return get4LE(msg.msg());
-}
-
-EventMetricData parse(log_msg msg) {
-    // dump all statsd logs to dropbox for now.
-    // TODO: Add filtering, aggregation, etc.
-    EventMetricData eventMetricData;
-
-    // set tag.
-    int tag = getTagId(msg);
-    // TODO: Replace the following line when we can serialize on the fly.
-    // eventMetricData.set_tag(tag);
-
-    // set timestamp of the event.
-    eventMetricData.set_timestamp_nanos(msg.entry_v1.sec * NS_PER_SEC + msg.entry_v1.nsec);
-
-    // start iterating k,v pairs.
-    android_log_context context =
-            create_android_log_parser(const_cast<log_msg*>(&msg)->msg() + sizeof(uint32_t),
-                                      const_cast<log_msg*>(&msg)->len() - sizeof(uint32_t));
-    android_log_list_element elem;
-
-    if (context) {
-        memset(&elem, 0, sizeof(elem));
-        size_t index = 0;
-        int32_t key = -1;
-
-        do {
-            elem = android_log_read_next(context);
-            switch ((int)elem.type) {
-                case EVENT_TYPE_INT:
-                    if (index % 2 == 0) {
-                        key = elem.data.int32;
-                    } else {
-                        // TODO: Fix the following lines when we can serialize on the fly.
-                        /*
-                        int32_t val = elem.data.int32;
-                        KeyValuePair* keyValuePair = eventMetricData.add_key_value_pair();
-                        keyValuePair->set_key(key);
-                        keyValuePair->set_value_int(val);
-                        */
-                    }
-                    index++;
-                    break;
-                case EVENT_TYPE_FLOAT:
-                    if (index % 2 == 1) {
-                        // TODO: Fix the following lines when we can serialize on the fly.
-                        /*
-                        float val = elem.data.float32;
-                        KeyValuePair* keyValuePair = eventMetricData.add_key_value_pair();
-                        keyValuePair->set_key(key);
-                        keyValuePair->set_value_float(val);
-                        */
-                    }
-                    index++;
-                    break;
-                case EVENT_TYPE_STRING:
-                    if (index % 2 == 1) {
-                        // TODO: Fix the following lines when we can serialize on the fly.
-                        /*
-                        char* val = elem.data.string;
-                        KeyValuePair* keyValuePair = eventMetricData.add_key_value_pair();
-                        keyValuePair->set_key(key);
-                        keyValuePair->set_value_str(val);
-                        */
-                    }
-                    index++;
-                    break;
-                case EVENT_TYPE_LONG:
-                    if (index % 2 == 1) {
-                        // TODO: Fix the following lines when we can serialize on the fly.
-                        /*
-                        int64_t val = elem.data.int64;
-                        KeyValuePair* keyValuePair = eventMetricData.add_key_value_pair();
-                        keyValuePair->set_key(key);
-                        keyValuePair->set_value_int(val);
-                        */
-                    }
-                    index++;
-                    break;
-                case EVENT_TYPE_LIST:
-                    break;
-                case EVENT_TYPE_LIST_STOP:
-                    break;
-                case EVENT_TYPE_UNKNOWN:
-                    break;
-                default:
-                    elem.complete = true;
-                    break;
-            }
-
-            if (elem.complete) {
-                break;
-            }
-        } while ((elem.type != EVENT_TYPE_UNKNOWN) && !elem.complete);
-
-        android_log_destroy(&context);
-    }
-
-    return eventMetricData;
-}
-
 // There is no existing hash function for the dimension key ("repeated KeyValuePair").
 // Temporarily use a string concatenation as the hashable key.
 // TODO: Find a better hash function for std::vector<KeyValuePair>.
diff --git a/cmds/statsd/src/stats_util.h b/cmds/statsd/src/stats_util.h
index b7d8f97..594561d 100644
--- a/cmds/statsd/src/stats_util.h
+++ b/cmds/statsd/src/stats_util.h
@@ -16,11 +16,7 @@
 
 #pragma once
 
-#include "logd/LogReader.h"
-#include "storage/DropboxWriter.h"
-
-#include <log/logprint.h>
-#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
+#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
 
 #include <unordered_map>
 
@@ -29,7 +25,6 @@
 namespace statsd {
 
 #define DEFAULT_DIMENSION_KEY ""
-#define MATCHER_NOT_FOUND -2
 
 typedef std::string HashableDimensionKey;
 
@@ -37,10 +32,6 @@
 
 typedef std::unordered_map<HashableDimensionKey, int64_t> DimToValMap;
 
-EventMetricData parse(log_msg msg);
-
-int getTagId(log_msg msg);
-
 std::string getHashableKey(std::vector<KeyValuePair> key);
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/storage/DropboxReader.cpp b/cmds/statsd/src/storage/DropboxReader.cpp
deleted file mode 100644
index c561959..0000000
--- a/cmds/statsd/src/storage/DropboxReader.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <android-base/file.h>
-#include <android/os/DropBoxManager.h>
-#include <androidfw/ZipUtils.h>
-
-#include "storage/DropboxReader.h"
-
-using android::base::unique_fd;
-using android::binder::Status;
-using android::os::DropBoxManager;
-using android::sp;
-using android::String16;
-using android::ZipUtils;
-using std::vector;
-
-namespace android {
-namespace os {
-namespace statsd {
-
-status_t DropboxReader::readStatsLogs(FILE* out, const string& tag, long msec) {
-    sp<DropBoxManager> dropbox = new DropBoxManager();
-    StatsLogReport logReport;
-
-    long timestamp = msec;
-    // instead of while(true), put a hard limit 1000. Dropbox won't have more than 1000 files.
-    for (int i = 0; i < 1000; i++) {
-        DropBoxManager::Entry entry;
-        Status status = dropbox->getNextEntry(String16(tag.c_str()), timestamp, &entry);
-        if (!status.isOk()) {
-            ALOGD("No more entries, or failed to read. We can't tell unfortunately.");
-            return android::OK;
-        }
-
-        const unique_fd& fd = entry.getFd();
-
-        // use this timestamp for next query.
-        timestamp = entry.getTimestamp();
-
-        if (entry.getFlags() & DropBoxManager::IS_GZIPPED) {
-            if (!parseFromGzipFile(fd, logReport)) {
-                // Failed to parse from the file. Continue to fetch the next entry.
-                continue;
-            }
-        } else {
-            if (!parseFromFile(fd, logReport)) {
-                // Failed to parse from the file. Continue to fetch the next entry.
-                continue;
-            }
-        }
-
-        printLog(out, logReport);
-    }
-    return android::OK;
-}
-
-bool DropboxReader::parseFromGzipFile(const unique_fd& fd, StatsLogReport& logReport) {
-    FILE* file = fdopen(fd, "r");
-    bool result = false;
-    bool scanResult;
-    int method;
-    long compressedLen;
-    long uncompressedLen;
-    unsigned long crc32;
-    scanResult = ZipUtils::examineGzip(file, &method, &uncompressedLen, &compressedLen, &crc32);
-    if (scanResult && method == kCompressDeflated) {
-        vector<uint8_t> buf(uncompressedLen);
-        if (ZipUtils::inflateToBuffer(file, &buf[0], uncompressedLen, compressedLen)) {
-            if (logReport.ParseFromArray(&buf[0], uncompressedLen)) {
-                result = true;
-            }
-        }
-    } else {
-        ALOGE("This isn't a valid deflated gzip file");
-    }
-    fclose(file);
-    return result;
-}
-
-// parse a non zipped file.
-bool DropboxReader::parseFromFile(const unique_fd& fd, StatsLogReport& logReport) {
-    string content;
-    if (!android::base::ReadFdToString(fd, &content)) {
-        ALOGE("Failed to read file");
-        return false;
-    }
-    if (!logReport.ParseFromString(content)) {
-        ALOGE("failed to parse log entry from data");
-        return false;
-    }
-    return true;
-}
-
-void DropboxReader::printLog(FILE* out, const StatsLogReport& logReport) {
-    fprintf(out, "start_time_ns=%lld, end_time_ns=%lld, ", logReport.start_report_nanos(),
-            logReport.end_report_nanos());
-    for (int i = 0; i < logReport.event_metrics().data_size(); i++) {
-        EventMetricData eventMetricData = logReport.event_metrics().data(i);
-        // TODO: Pretty-print the proto.
-        // fprintf(out, "EventMetricData=%s", eventMetricData.SerializeAsString().c_str());
-    }
-    fprintf(out, "\n");
-}
-
-}  // namespace statsd
-}  // namespace os
-}  // namespace android
diff --git a/cmds/statsd/src/storage/DropboxReader.h b/cmds/statsd/src/storage/DropboxReader.h
deleted file mode 100644
index a5a28d9..0000000
--- a/cmds/statsd/src/storage/DropboxReader.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef DROPBOX_READER_H
-#define DROPBOX_READER_H
-
-#include <frameworks/base/cmds/statsd/src/stats_log.pb.h>
-
-#include <stdint.h>
-#include <stdio.h>
-
-using android::base::unique_fd;
-using android::status_t;
-using std::string;
-
-namespace android {
-namespace os {
-namespace statsd {
-
-class DropboxReader {
-public:
-    // msec is the start timestamp.
-    static status_t readStatsLogs(FILE* out, const string& tag, long msec);
-
-private:
-    static bool parseFromFile(const unique_fd& fd, StatsLogReport& logReport);
-    static bool parseFromGzipFile(const unique_fd& fd, StatsLogReport& logReport);
-    static void printLog(FILE* out, const StatsLogReport& logReport);
-    enum {
-        kCompressStored = 0,    // no compression
-        kCompressDeflated = 8,  // standard deflate
-    };
-};
-
-}  // namespace statsd
-}  // namespace os
-}  // namespace android
-
-#endif  // DROPBOX_READER_H
diff --git a/cmds/statsd/src/storage/DropboxWriter.cpp b/cmds/statsd/src/storage/DropboxWriter.cpp
deleted file mode 100644
index e59bdbd..0000000
--- a/cmds/statsd/src/storage/DropboxWriter.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <android/os/DropBoxManager.h>
-
-#include "storage/DropboxWriter.h"
-
-using android::binder::Status;
-using android::os::DropBoxManager;
-using android::sp;
-using android::String16;
-using std::vector;
-
-namespace android {
-namespace os {
-namespace statsd {
-
-DropboxWriter::DropboxWriter(const string& tag) : mTag(tag), mLogReport(), mBufferSize(0) {
-}
-
-void DropboxWriter::addEventMetricData(const EventMetricData& eventMetricData) {
-    flushIfNecessary(eventMetricData);
-    EventMetricData* newEntry = mLogReport.mutable_event_metrics()->add_data();
-    newEntry->CopyFrom(eventMetricData);
-    mBufferSize += eventMetricData.ByteSize();
-}
-
-void DropboxWriter::flushIfNecessary(const EventMetricData& eventMetricData) {
-    if (eventMetricData.ByteSize() + mBufferSize > kMaxSerializedBytes) {
-        flush();
-    }
-}
-
-void DropboxWriter::flush() {
-    // now we get an exact byte size of the output
-    const int numBytes = mLogReport.ByteSize();
-    vector<uint8_t> buffer(numBytes);
-    sp<DropBoxManager> dropbox = new DropBoxManager();
-    mLogReport.SerializeToArray(&buffer[0], numBytes);
-    Status status = dropbox->addData(String16(mTag.c_str()), &buffer[0], numBytes, 0 /* no flag */);
-    if (!status.isOk()) {
-        ALOGE("failed to write to dropbox");
-        // TODO: What to do if flush fails??
-    }
-    mLogReport.Clear();
-    mBufferSize = 0;
-}
-
-}  // namespace statsd
-}  // namespace os
-}  // namespace android
diff --git a/cmds/statsd/src/storage/DropboxWriter.h b/cmds/statsd/src/storage/DropboxWriter.h
deleted file mode 100644
index d72f103..0000000
--- a/cmds/statsd/src/storage/DropboxWriter.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef DROPBOX_WRITER_H
-#define DROPBOX_WRITER_H
-
-#include <utils/RefBase.h>
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
-
-using std::string;
-
-namespace android {
-namespace os {
-namespace statsd {
-
-class DropboxWriter : public virtual RefBase {
-public:
-    /* tag will be part of the file name, and used as the key to build the file index inside
-       DropBoxManagerService.
-     */
-    DropboxWriter(const string& tag);
-
-    void addEventMetricData(const EventMetricData& eventMetricData);
-
-    /* Request a flush to dropbox. */
-    void flush();
-
-private:
-    /* Max *serialized* size of the logs kept in memory before flushing to dropbox.
-       Proto lite does not implement the SpaceUsed() function which gives the in memory byte size.
-       So we cap memory usage by limiting the serialized size. Note that protobuf's in memory size
-       is higher than its serialized size. DropboxManager will compress the file when the data is
-       larger than 4KB. So the final file size is less than this number.
-     */
-    static const size_t kMaxSerializedBytes = 16 * 1024;
-
-    const string mTag;
-
-    /* Data that was captured for a single metric over a given interval of time. */
-    StatsLogReport mLogReport;
-
-    /* Current *serialized* size of the logs kept in memory.
-       To save computation, we will not calculate the size of the StatsLogReport every time when a
-       new entry is added, which would recursively call ByteSize() on every log entry. Instead, we
-       keep the sum of all individual stats log entry sizes. The size of a proto is approximately
-       the sum of the size of all member protos.
-     */
-    size_t mBufferSize = 0;
-
-    /* Check if the buffer size exceeds the max buffer size when the new entry is added, and flush
-       the logs to dropbox if true. */
-    void flushIfNecessary(const EventMetricData& eventMetricData);
-};
-
-}  // namespace statsd
-}  // namespace os
-}  // namespace android
-
-#endif  // DROPBOX_WRITER_H
diff --git a/cmds/statsd/src/storage/StorageManager.cpp b/cmds/statsd/src/storage/StorageManager.cpp
index 3a4dfda..9919abf 100644
--- a/cmds/statsd/src/storage/StorageManager.cpp
+++ b/cmds/statsd/src/storage/StorageManager.cpp
@@ -23,13 +23,14 @@
 #include <android-base/file.h>
 #include <dirent.h>
 
-using android::util::FIELD_COUNT_REPEATED;
-using android::util::FIELD_TYPE_MESSAGE;
-
 namespace android {
 namespace os {
 namespace statsd {
 
+using android::util::FIELD_COUNT_REPEATED;
+using android::util::FIELD_TYPE_MESSAGE;
+using std::map;
+
 #define STATS_SERVICE_DIR "/data/misc/stats-service"
 
 // for ConfigMetricsReportList
@@ -170,7 +171,7 @@
     }
 }
 
-void StorageManager::readConfigFromDisk(unordered_map<ConfigKey, StatsdConfig>& configsMap) {
+void StorageManager::readConfigFromDisk(map<ConfigKey, StatsdConfig>& configsMap) {
     unique_ptr<DIR, decltype(&closedir)> dir(opendir(STATS_SERVICE_DIR), closedir);
     if (dir == NULL) {
         VLOG("no default config on disk");
diff --git a/cmds/statsd/src/storage/StorageManager.h b/cmds/statsd/src/storage/StorageManager.h
index 4c9abe5..caf5b8b 100644
--- a/cmds/statsd/src/storage/StorageManager.h
+++ b/cmds/statsd/src/storage/StorageManager.h
@@ -66,7 +66,7 @@
     /**
      * Call to load the saved configs from disk.
      */
-    static void readConfigFromDisk(unordered_map<ConfigKey, StatsdConfig>& configsMap);
+    static void readConfigFromDisk(std::map<ConfigKey, StatsdConfig>& configsMap);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
index 9fed4f8..312de1b 100644
--- a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
+++ b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
@@ -163,9 +163,9 @@
     EXPECT_EQ(2, configReport.alert_stats_size());
     bool alert1first = !configReport.alert_stats(0).name().compare("alert1");
     EXPECT_EQ("alert1", configReport.alert_stats(alert1first ? 0 : 1).name());
-    EXPECT_EQ(2, configReport.alert_stats(alert1first ? 0 : 1).declared_times());
+    EXPECT_EQ(2, configReport.alert_stats(alert1first ? 0 : 1).alerted_times());
     EXPECT_EQ("alert2", configReport.alert_stats(alert1first ? 1 : 0).name());
-    EXPECT_EQ(1, configReport.alert_stats(alert1first ? 1 : 0).declared_times());
+    EXPECT_EQ(1, configReport.alert_stats(alert1first ? 1 : 0).alerted_times());
 
     EXPECT_EQ(1, configReport.condition_stats_size());
     EXPECT_EQ("condition1", configReport.condition_stats(0).name());
@@ -201,7 +201,7 @@
 
     EXPECT_EQ(1, configReport2.alert_stats_size());
     EXPECT_EQ("alert99", configReport2.alert_stats(0).name());
-    EXPECT_EQ(1, configReport2.alert_stats(0).declared_times());
+    EXPECT_EQ(1, configReport2.alert_stats(0).alerted_times());
 }
 
 TEST(StatsdStatsTest, TestAtomLog) {
diff --git a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
index d973ba1..51eabd5 100644
--- a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
@@ -54,8 +54,8 @@
                                       bucketStartTimeNs);
 
     // 2 events in bucket 1.
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1, false);
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event2, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
 
     // Flushes at event #2.
     countProducer.flushIfNeededLocked(bucketStartTimeNs + 2);
@@ -74,7 +74,7 @@
 
     // 1 matched event happens in bucket 2.
     LogEvent event3(tagId, bucketStartTimeNs + bucketSizeNs + 2);
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event3, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event3);
     countProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1);
     EXPECT_EQ(1UL, countProducer.mPastBuckets.size());
     EXPECT_TRUE(countProducer.mPastBuckets.find(DEFAULT_DIMENSION_KEY) !=
@@ -111,12 +111,12 @@
     CountMetricProducer countProducer(kConfigKey, metric, 1, wizard, bucketStartTimeNs);
 
     countProducer.onConditionChanged(true, bucketStartTimeNs);
-    countProducer.onMatchedLogEvent(1 /*matcher index*/, event1, false /*pulled*/);
+    countProducer.onMatchedLogEvent(1 /*matcher index*/, event1);
     EXPECT_EQ(0UL, countProducer.mPastBuckets.size());
 
     countProducer.onConditionChanged(false /*new condition*/, bucketStartTimeNs + 2);
     // Upon this match event, the matched event1 is flushed.
-    countProducer.onMatchedLogEvent(1 /*matcher index*/, event2, false /*pulled*/);
+    countProducer.onMatchedLogEvent(1 /*matcher index*/, event2);
     EXPECT_EQ(0UL, countProducer.mPastBuckets.size());
 
     countProducer.flushIfNeededLocked(bucketStartTimeNs + bucketSizeNs + 1);
@@ -166,11 +166,11 @@
     CountMetricProducer countProducer(kConfigKey, metric, 1 /*condition tracker index*/, wizard,
                                       bucketStartTimeNs);
 
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
     countProducer.flushIfNeededLocked(bucketStartTimeNs + 1);
     EXPECT_EQ(0UL, countProducer.mPastBuckets.size());
 
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event2, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
     countProducer.flushIfNeededLocked(bucketStartTimeNs + bucketSizeNs + 1);
     EXPECT_EQ(1UL, countProducer.mPastBuckets.size());
     EXPECT_TRUE(countProducer.mPastBuckets.find(DEFAULT_DIMENSION_KEY) !=
@@ -217,29 +217,29 @@
     LogEvent event7(tagId, bucketStartTimeNs + 3 * bucketSizeNs + 3 + NS_PER_SEC);
 
     // Two events in bucket #0.
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1, false);
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event2, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
 
     EXPECT_EQ(1UL, countProducer.mCurrentSlicedCounter->size());
     EXPECT_EQ(2L, countProducer.mCurrentSlicedCounter->begin()->second);
     EXPECT_EQ(anomalyTracker->getLastAlarmTimestampNs(), -1LL);
 
     // One event in bucket #2. No alarm as bucket #0 is trashed out.
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event3, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event3);
     EXPECT_EQ(1UL, countProducer.mCurrentSlicedCounter->size());
     EXPECT_EQ(1L, countProducer.mCurrentSlicedCounter->begin()->second);
     EXPECT_EQ(anomalyTracker->getLastAlarmTimestampNs(), -1LL);
 
     // Two events in bucket #3.
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event4, false);
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event5, false);
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event6, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event4);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event5);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event6);
     EXPECT_EQ(1UL, countProducer.mCurrentSlicedCounter->size());
     EXPECT_EQ(3L, countProducer.mCurrentSlicedCounter->begin()->second);
     // Anomaly at event 6 is within refractory period. The alarm is at event 5 timestamp not event 6
     EXPECT_EQ(anomalyTracker->getLastAlarmTimestampNs(), (long long)event5.GetTimestampNs());
 
-    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event7, false);
+    countProducer.onMatchedLogEvent(1 /*log matcher index*/, event7);
     EXPECT_EQ(1UL, countProducer.mCurrentSlicedCounter->size());
     EXPECT_EQ(4L, countProducer.mCurrentSlicedCounter->begin()->second);
     EXPECT_EQ(anomalyTracker->getLastAlarmTimestampNs(), (long long)event7.GetTimestampNs());
diff --git a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
index 3158c27..58a4ac6 100644
--- a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
@@ -56,8 +56,8 @@
             kConfigKey, metric, -1 /*no condition*/, 1 /* start index */, 2 /* stop index */,
             3 /* stop_all index */, false /*nesting*/, wizard, {}, bucketStartTimeNs);
 
-    durationProducer.onMatchedLogEvent(1 /* start index*/, event1, false /* scheduledPull */);
-    durationProducer.onMatchedLogEvent(2 /* stop index*/, event2, false /* scheduledPull */);
+    durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
+    durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
     durationProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1);
     EXPECT_EQ(1UL, durationProducer.mPastBuckets.size());
     EXPECT_TRUE(durationProducer.mPastBuckets.find(DEFAULT_DIMENSION_KEY) !=
@@ -94,14 +94,14 @@
     EXPECT_FALSE(durationProducer.mCondition);
     EXPECT_FALSE(durationProducer.isConditionSliced());
 
-    durationProducer.onMatchedLogEvent(1 /* start index*/, event1, false /* scheduledPull */);
-    durationProducer.onMatchedLogEvent(2 /* stop index*/, event2, false /* scheduledPull */);
+    durationProducer.onMatchedLogEvent(1 /* start index*/, event1);
+    durationProducer.onMatchedLogEvent(2 /* stop index*/, event2);
     durationProducer.flushIfNeededLocked(bucketStartTimeNs + bucketSizeNs + 1);
     EXPECT_EQ(0UL, durationProducer.mPastBuckets.size());
 
-    durationProducer.onMatchedLogEvent(1 /* start index*/, event3, false /* scheduledPull */);
+    durationProducer.onMatchedLogEvent(1 /* start index*/, event3);
     durationProducer.onConditionChanged(true /* condition */, bucketStartTimeNs + bucketSizeNs + 2);
-    durationProducer.onMatchedLogEvent(2 /* stop index*/, event4, false /* scheduledPull */);
+    durationProducer.onMatchedLogEvent(2 /* stop index*/, event4);
     durationProducer.flushIfNeededLocked(bucketStartTimeNs + 2 * bucketSizeNs + 1);
     EXPECT_EQ(1UL, durationProducer.mPastBuckets.size());
     EXPECT_TRUE(durationProducer.mPastBuckets.find(DEFAULT_DIMENSION_KEY) !=
diff --git a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
index f3302fd..e4fc67f 100644
--- a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
@@ -50,8 +50,8 @@
     EventMetricProducer eventProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
                                       bucketStartTimeNs);
 
-    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1, false /*pulled*/);
-    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2, false /*pulled*/);
+    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1);
+    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2);
 
     // TODO: get the report and check the content after the ProtoOutputStream change is done.
     // eventProducer.onDumpReport();
@@ -74,11 +74,11 @@
     EventMetricProducer eventProducer(kConfigKey, metric, 1, wizard, bucketStartTimeNs);
 
     eventProducer.onConditionChanged(true /*condition*/, bucketStartTimeNs);
-    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1, false /*pulled*/);
+    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1);
 
     eventProducer.onConditionChanged(false /*condition*/, bucketStartTimeNs + 2);
 
-    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2, false /*pulled*/);
+    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2);
 
     // TODO: get the report and check the content after the ProtoOutputStream change is done.
     // eventProducer.onDumpReport();
@@ -115,8 +115,8 @@
 
     EventMetricProducer eventProducer(kConfigKey, metric, 1, wizard, bucketStartTimeNs);
 
-    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1, false /*pulled*/);
-    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2, false /*pulled*/);
+    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1);
+    eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2);
 
     // TODO: get the report and check the content after the ProtoOutputStream change is done.
     // eventProducer.onDumpReport();
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index d320697..146a19d 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -35,23 +35,23 @@
 namespace statsd {
 
 const ConfigKey kConfigKey(0, "test");
+const int tagId = 1;
+const string metricName = "test_metric";
+const int64_t bucketStartTimeNs = 10000000000;
+const int64_t bucketSizeNs = 60 * 1000 * 1000 * 1000LL;
+const int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
+const int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
+const int64_t bucket4StartTimeNs = bucketStartTimeNs + 3 * bucketSizeNs;
+
 /*
  * Tests pulled atoms with no conditions
  */
 TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
-    int64_t bucketStartTimeNs = 10000000000;
-    int64_t bucketSizeNs = 60 * 1000 * 1000 * 1000LL;
-
-    int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
-    int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
-
     ValueMetric metric;
-    metric.set_name("1");
+    metric.set_name(metricName);
     metric.mutable_bucket()->set_bucket_size_millis(bucketSizeNs / 1000000);
     metric.set_value_field(2);
 
-    int tagId = 1;
-
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
     // TODO: pending refactor of StatsPullerManager
     // For now we still need this so that it doesn't do real pulling.
@@ -65,8 +65,8 @@
 
     vector<shared_ptr<LogEvent>> allData;
     allData.clear();
-    shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 1);
-    event->write(1);
+    shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
+    event->write(tagId);
     event->write(11);
     event->init();
     allData.push_back(event);
@@ -75,76 +75,60 @@
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(1UL, curInterval.raw.size());
-    // value is 11, 11
-    EXPECT_EQ(11, curInterval.raw.front().first);
-    EXPECT_EQ(11, curInterval.raw.front().second);
-    ValueMetricProducer::Interval nextInterval = valueProducer.mNextSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(1UL, nextInterval.raw.size());
-    // value is 11, 0
-    EXPECT_EQ(11, nextInterval.raw.front().first);
-    EXPECT_EQ(0, nextInterval.raw.front().second);
-    EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
+    // startUpdated:true tainted:0 sum:0 start:11
+    EXPECT_EQ(true, curInterval.startUpdated);
+    EXPECT_EQ(0, curInterval.tainted);
+    EXPECT_EQ(0, curInterval.sum);
+    EXPECT_EQ(11, curInterval.start);
+    EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+    EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second.back().mValue);
 
     allData.clear();
-    event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
-    event->write(1);
-    event->write(22);
+    event = make_shared<LogEvent>(tagId, bucket3StartTimeNs + 1);
+    event->write(tagId);
+    event->write(23);
     event->init();
     allData.push_back(event);
     valueProducer.onDataPulled(allData);
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(1UL, curInterval.raw.size());
-    // value is 22, 0
-    EXPECT_EQ(22, curInterval.raw.front().first);
-    EXPECT_EQ(0, curInterval.raw.front().second);
-    EXPECT_EQ(0UL, valueProducer.mNextSlicedBucket.size());
+    // tartUpdated:false tainted:0 sum:12
+    EXPECT_EQ(true, curInterval.startUpdated);
+    EXPECT_EQ(0, curInterval.tainted);
+    EXPECT_EQ(0, curInterval.sum);
     EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
-    EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
-    EXPECT_EQ(11, valueProducer.mPastBuckets.begin()->second.back().mValue);
+    EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
+    EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
 
     allData.clear();
-    event = make_shared<LogEvent>(tagId, bucket3StartTimeNs + 1);
-    event->write(1);
-    event->write(33);
+    event = make_shared<LogEvent>(tagId, bucket4StartTimeNs + 1);
+    event->write(tagId);
+    event->write(36);
     event->init();
     allData.push_back(event);
     valueProducer.onDataPulled(allData);
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    EXPECT_EQ(1UL, curInterval.raw.size());
-    // value is 33, 0
-    EXPECT_EQ(33, curInterval.raw.front().first);
-    EXPECT_EQ(0, curInterval.raw.front().second);
-    EXPECT_EQ(0UL, valueProducer.mNextSlicedBucket.size());
+    // startUpdated:false tainted:0 sum:12
+    EXPECT_EQ(true, curInterval.startUpdated);
+    EXPECT_EQ(0, curInterval.tainted);
+    EXPECT_EQ(0, curInterval.sum);
     EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
-    EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
-    EXPECT_EQ(11, valueProducer.mPastBuckets.begin()->second.back().mValue);
+    EXPECT_EQ(3UL, valueProducer.mPastBuckets.begin()->second.size());
+    EXPECT_EQ(13, valueProducer.mPastBuckets.begin()->second.back().mValue);
 }
 
 /*
  * Test pulled event with non sliced condition.
  */
 TEST(ValueMetricProducerTest, TestEventsWithNonSlicedCondition) {
-    int64_t bucketStartTimeNs = 10000000000;
-    int64_t bucketSizeNs = 60 * 1000 * 1000 * 1000LL;
-
-    int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
-    int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
-
     ValueMetric metric;
-    metric.set_name("1");
+    metric.set_name(metricName);
     metric.mutable_bucket()->set_bucket_size_millis(bucketSizeNs / 1000000);
     metric.set_value_field(2);
     metric.set_condition("SCREEN_ON");
 
-    int tagId = 1;
-
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
     shared_ptr<MockStatsPullerManager> pullerManager =
             make_shared<StrictMock<MockStatsPullerManager>>();
@@ -153,28 +137,18 @@
 
     EXPECT_CALL(*pullerManager, Pull(tagId, _))
             .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-                int64_t bucketStartTimeNs = 10000000000;
-                int64_t bucketSizeNs = 60 * 1000 * 1000 * 1000LL;
-
-                int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
-                int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
                 data->clear();
                 shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
-                event->write(1);
+                event->write(tagId);
                 event->write(100);
                 event->init();
                 data->push_back(event);
                 return true;
             }))
             .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-                int64_t bucketStartTimeNs = 10000000000;
-                int64_t bucketSizeNs = 60 * 1000 * 1000 * 1000LL;
-
-                int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
-                int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
                 data->clear();
                 shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 10);
-                event->write(1);
+                event->write(tagId);
                 event->write(120);
                 event->init();
                 data->push_back(event);
@@ -184,17 +158,16 @@
     ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
                                       pullerManager);
 
-    valueProducer.onConditionChanged(true, bucketStartTimeNs + 10);
+    valueProducer.onConditionChanged(true, bucketStartTimeNs + 8);
 
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(1UL, curInterval.raw.size());
-    // value is 100, 0
-    EXPECT_EQ(100, curInterval.raw.front().first);
-    EXPECT_EQ(0, curInterval.raw.front().second);
-    EXPECT_EQ(0UL, valueProducer.mNextSlicedBucket.size());
+    // startUpdated:false tainted:0 sum:0 start:100
+    EXPECT_EQ(100, curInterval.start);
+    EXPECT_EQ(true, curInterval.startUpdated);
+    EXPECT_EQ(0, curInterval.tainted);
+    EXPECT_EQ(0, curInterval.sum);
     EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
 
     vector<shared_ptr<LogEvent>> allData;
@@ -209,11 +182,8 @@
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(1UL, curInterval.raw.size());
-    // value is 110, 0
-    EXPECT_EQ(110, curInterval.raw.front().first);
-    EXPECT_EQ(0, curInterval.raw.front().second);
+    // startUpdated:false tainted:0 sum:0 start:110
+    EXPECT_EQ(110, curInterval.start);
     EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
     EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
     EXPECT_EQ(10, valueProducer.mPastBuckets.begin()->second.back().mValue);
@@ -223,27 +193,17 @@
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(1UL, curInterval.raw.size());
-    // value is 110, 120
-    EXPECT_EQ(110, curInterval.raw.front().first);
-    EXPECT_EQ(120, curInterval.raw.front().second);
+    // startUpdated:false tainted:0 sum:0 start:110
+    EXPECT_EQ(10, curInterval.sum);
+    EXPECT_EQ(false, curInterval.startUpdated);
 }
 
 TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition) {
-    int64_t bucketStartTimeNs = 10000000000;
-    int64_t bucketSizeNs = 60 * 1000 * 1000 * 1000LL;
-
-    int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
-    int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
-
     ValueMetric metric;
-    metric.set_name("1");
+    metric.set_name(metricName);
     metric.mutable_bucket()->set_bucket_size_millis(bucketSizeNs / 1000000);
     metric.set_value_field(2);
 
-    int tagId = 1;
-
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
     shared_ptr<MockStatsPullerManager> pullerManager =
             make_shared<StrictMock<MockStatsPullerManager>>();
@@ -255,32 +215,22 @@
     event1->write(1);
     event1->write(10);
     event1->init();
-    shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+    shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
     event2->write(1);
     event2->write(20);
     event2->init();
-    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event1, false);
+    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event1);
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(1UL, curInterval.raw.size());
-    // value is 10, 0
-    EXPECT_EQ(10, curInterval.raw.front().first);
-    EXPECT_EQ(0, curInterval.raw.front().second);
-    EXPECT_EQ(0UL, valueProducer.mNextSlicedBucket.size());
+    EXPECT_EQ(10, curInterval.sum);
 
-    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2, false);
+    valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
 
     // has one slice
     EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
     curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
-    // has one raw pair
-    EXPECT_EQ(2UL, curInterval.raw.size());
-    // value is 10, 20
-    EXPECT_EQ(10, curInterval.raw.front().first);
-    EXPECT_EQ(20, curInterval.raw.back().first);
-    EXPECT_EQ(0UL, valueProducer.mNextSlicedBucket.size());
+    EXPECT_EQ(30, curInterval.sum);
 
     valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
     EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
diff --git a/cmds/statsd/tools/dogfood/Android.mk b/cmds/statsd/tools/dogfood/Android.mk
index 1bd5f30..6b0531d 100644
--- a/cmds/statsd/tools/dogfood/Android.mk
+++ b/cmds/statsd/tools/dogfood/Android.mk
@@ -16,19 +16,19 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SRC_FILES += ../../src/stats_log.proto \
-                   ../../src/atoms_copy.proto
-
-LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/../../src/
-
-LOCAL_PROTOC_OPTIMIZE_TYPE := lite-static
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
 LOCAL_PACKAGE_NAME := StatsdDogfood
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES += ../../src/stats_log.proto \
+                   ../../src/atoms.proto
+LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/../../src/
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_STATIC_JAVA_LIBRARIES := platformprotoslite
+
+LOCAL_PROTOC_OPTIMIZE_TYPE := lite
 LOCAL_CERTIFICATE := platform
 LOCAL_PRIVILEGED_MODULE := true
 LOCAL_DEX_PREOPT := false
-include $(BUILD_PACKAGE)
\ No newline at end of file
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
diff --git a/cmds/statsd/tools/loadtest/Android.mk b/cmds/statsd/tools/loadtest/Android.mk
index f3f0a7c..0a0fd66 100644
--- a/cmds/statsd/tools/loadtest/Android.mk
+++ b/cmds/statsd/tools/loadtest/Android.mk
@@ -16,20 +16,20 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SRC_FILES += ../../src/stats_log.proto \
-                   ../../src/atoms_copy.proto \
-                   ../../src/statsd_config.proto
-
-LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/../../src/
-
-LOCAL_PROTOC_OPTIMIZE_TYPE := lite-static
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
 LOCAL_PACKAGE_NAME := StatsdLoadtest
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES += ../../src/stats_log.proto \
+                   ../../src/atoms.proto \
+                   ../../src/statsd_config.proto
+LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/../../src/
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_STATIC_JAVA_LIBRARIES := platformprotoslite
+
+LOCAL_PROTOC_OPTIMIZE_TYPE := lite
 LOCAL_CERTIFICATE := platform
 LOCAL_PRIVILEGED_MODULE := true
 LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
+
 include $(BUILD_PACKAGE)
diff --git a/config/compiled-classes-phone b/config/compiled-classes-phone
deleted file mode 100644
index afa802c..0000000
--- a/config/compiled-classes-phone
+++ /dev/null
@@ -1,8500 +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.
-#
-#
-#
-# Compiled-classes filter file for phones.
-#
-# Using a compiled-classes file filters non-mentioned classes from being compiled into
-# the boot.oat file(s), reducing the size of the boot image. This is a tradeoff, as classes
-# that have not been compiled must be run with the interpreter or through JIT.
-#
-# This file has been derived for mainline phone (and tablet) usage in concern with the
-# preloaded-classes file, but is not used by default. To use this file, add a copy statement
-# to your device.mk, e.g.,
-#
-#   PRODUCT_COPY_FILES += \
-#     frameworks/base/config/compiled-classes-phone:system/etc/compiled-classes
-#
-android.R$styleable
-android.accessibilityservice.AccessibilityServiceInfo
-android.accessibilityservice.AccessibilityServiceInfo$1
-android.accessibilityservice.IAccessibilityServiceClient
-android.accessibilityservice.IAccessibilityServiceConnection
-android.accessibilityservice.IAccessibilityServiceConnection$Stub
-android.accounts.AbstractAccountAuthenticator
-android.accounts.AbstractAccountAuthenticator$Transport
-android.accounts.Account
-android.accounts.Account$1
-android.accounts.AccountAndUser
-android.accounts.AccountAuthenticatorResponse
-android.accounts.AccountAuthenticatorResponse$1
-android.accounts.AccountManager
-android.accounts.AccountManager$1
-android.accounts.AccountManager$11
-android.accounts.AccountManager$19
-android.accounts.AccountManager$3
-android.accounts.AccountManager$4
-android.accounts.AccountManager$AmsTask
-android.accounts.AccountManager$AmsTask$1
-android.accounts.AccountManager$AmsTask$Response
-android.accounts.AccountManager$BaseFutureTask
-android.accounts.AccountManager$BaseFutureTask$1
-android.accounts.AccountManager$BaseFutureTask$Response
-android.accounts.AccountManager$Future2Task
-android.accounts.AccountManager$Future2Task$1
-android.accounts.AccountManagerCallback
-android.accounts.AccountManagerFuture
-android.accounts.AccountManagerInternal
-android.accounts.AccountManagerInternal$OnAppPermissionChangeListener
-android.accounts.AccountsException
-android.accounts.AuthenticatorDescription
-android.accounts.AuthenticatorDescription$1
-android.accounts.AuthenticatorException
-android.accounts.IAccountAuthenticator
-android.accounts.IAccountAuthenticator$Stub
-android.accounts.IAccountAuthenticator$Stub$Proxy
-android.accounts.IAccountAuthenticatorResponse
-android.accounts.IAccountAuthenticatorResponse$Stub
-android.accounts.IAccountAuthenticatorResponse$Stub$Proxy
-android.accounts.IAccountManager
-android.accounts.IAccountManager$Stub
-android.accounts.IAccountManager$Stub$Proxy
-android.accounts.IAccountManagerResponse
-android.accounts.IAccountManagerResponse$Stub
-android.accounts.IAccountManagerResponse$Stub$Proxy
-android.accounts.OnAccountsUpdateListener
-android.accounts.OperationCanceledException
-android.animation.AnimationHandler
-android.animation.AnimationHandler$1
-android.animation.AnimationHandler$AnimationFrameCallback
-android.animation.AnimationHandler$AnimationFrameCallbackProvider
-android.animation.AnimationHandler$MyFrameCallbackProvider
-android.animation.Animator
-android.animation.Animator$AnimatorConstantState
-android.animation.Animator$AnimatorListener
-android.animation.Animator$AnimatorPauseListener
-android.animation.AnimatorInflater
-android.animation.AnimatorInflater$PathDataEvaluator
-android.animation.AnimatorListenerAdapter
-android.animation.AnimatorSet
-android.animation.AnimatorSet$1
-android.animation.AnimatorSet$2
-android.animation.AnimatorSet$3
-android.animation.AnimatorSet$AnimationEvent
-android.animation.AnimatorSet$Builder
-android.animation.AnimatorSet$Node
-android.animation.AnimatorSet$SeekState
-android.animation.ArgbEvaluator
-android.animation.FloatArrayEvaluator
-android.animation.FloatEvaluator
-android.animation.FloatKeyframeSet
-android.animation.IntEvaluator
-android.animation.IntKeyframeSet
-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
-android.animation.Keyframes$IntKeyframes
-android.animation.LayoutTransition
-android.animation.LayoutTransition$1
-android.animation.LayoutTransition$2
-android.animation.LayoutTransition$3
-android.animation.LayoutTransition$4
-android.animation.LayoutTransition$5
-android.animation.LayoutTransition$CleanupCallback
-android.animation.LayoutTransition$TransitionListener
-android.animation.ObjectAnimator
-android.animation.PathKeyframes
-android.animation.PathKeyframes$1
-android.animation.PathKeyframes$2
-android.animation.PathKeyframes$FloatKeyframesBase
-android.animation.PathKeyframes$IntKeyframesBase
-android.animation.PathKeyframes$SimpleKeyframes
-android.animation.PropertyValuesHolder
-android.animation.PropertyValuesHolder$1
-android.animation.PropertyValuesHolder$FloatPropertyValuesHolder
-android.animation.PropertyValuesHolder$IntPropertyValuesHolder
-android.animation.PropertyValuesHolder$PropertyValues
-android.animation.PropertyValuesHolder$PropertyValues$DataSource
-android.animation.RectEvaluator
-android.animation.RevealAnimator
-android.animation.StateListAnimator
-android.animation.StateListAnimator$1
-android.animation.StateListAnimator$StateListAnimatorConstantState
-android.animation.StateListAnimator$Tuple
-android.animation.TimeAnimator
-android.animation.TimeAnimator$TimeListener
-android.animation.TimeInterpolator
-android.animation.TypeEvaluator
-android.animation.ValueAnimator
-android.animation.ValueAnimator$AnimatorUpdateListener
-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.Activity
-android.app.Activity$HostCallbacks
-android.app.ActivityManager
-android.app.ActivityManager$1
-android.app.ActivityManager$AppTask
-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
-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$StackInfo
-android.app.ActivityManager$StackInfo$1
-android.app.ActivityManager$TaskDescription
-android.app.ActivityManager$TaskDescription$1
-android.app.ActivityManager$TaskSnapshot
-android.app.ActivityManager$TaskSnapshot$1
-android.app.ActivityManager$TaskThumbnail
-android.app.ActivityManager$TaskThumbnailInfo
-android.app.ActivityManager$TaskThumbnailInfo$1
-android.app.ActivityManager$UidObserver
-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$ActivityClientRecord
-android.app.ActivityThread$ActivityConfigChangeData
-android.app.ActivityThread$AppBindData
-android.app.ActivityThread$ApplicationThread
-android.app.ActivityThread$BindServiceData
-android.app.ActivityThread$ContextCleanupInfo
-android.app.ActivityThread$CreateServiceData
-android.app.ActivityThread$DropBoxReporter
-android.app.ActivityThread$EventLoggingReporter
-android.app.ActivityThread$GcIdler
-android.app.ActivityThread$H
-android.app.ActivityThread$Idler
-android.app.ActivityThread$NewIntentData
-android.app.ActivityThread$Profiler
-android.app.ActivityThread$ProviderClientRecord
-android.app.ActivityThread$ProviderKey
-android.app.ActivityThread$ProviderRefCount
-android.app.ActivityThread$ReceiverData
-android.app.ActivityThread$RequestAssistContextExtras
-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$AlarmClockInfo
-android.app.AlarmManager$ListenerWrapper
-android.app.AlarmManager$OnAlarmListener
-android.app.AlertDialog
-android.app.AlertDialog$Builder
-android.app.AppGlobals
-android.app.AppOpsManager
-android.app.AppOpsManager$1
-android.app.AppOpsManager$OnOpChangedInternalListener
-android.app.AppOpsManager$OnOpChangedListener
-android.app.AppOpsManager$OpEntry
-android.app.AppOpsManager$OpEntry$1
-android.app.AppOpsManager$PackageOps
-android.app.AppOpsManager$PackageOps$1
-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
-android.app.ApplicationPackageManager$OnPermissionsChangeListenerDelegate
-android.app.ApplicationPackageManager$ResourceName
-android.app.AutomaticZenRule
-android.app.BackStackRecord
-android.app.BackStackRecord$Op
-android.app.BroadcastOptions
-android.app.ContentProviderHolder
-android.app.ContentProviderHolder$1
-android.app.ContextImpl
-android.app.ContextImpl$ApplicationContentResolver
-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.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.FragmentContainer
-android.app.FragmentController
-android.app.FragmentHostCallback
-android.app.FragmentManager
-android.app.FragmentManager$BackStackEntry
-android.app.FragmentManager$FragmentLifecycleCallbacks
-android.app.FragmentManager$OnBackStackChangedListener
-android.app.FragmentManagerImpl
-android.app.FragmentManagerImpl$1
-android.app.FragmentManagerImpl$AnimateOnHWLayerIfNeededListener
-android.app.FragmentManagerImpl$OpGenerator
-android.app.FragmentManagerState
-android.app.FragmentManagerState$1
-android.app.FragmentState
-android.app.FragmentState$1
-android.app.FragmentTransaction
-android.app.FragmentTransition
-android.app.FragmentTransition$FragmentContainerTransition
-android.app.IActivityContainer
-android.app.IActivityContainer$Stub
-android.app.IActivityContainerCallback
-android.app.IActivityController
-android.app.IActivityManager
-android.app.IActivityManager$Stub
-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
-android.app.IAppTask
-android.app.IAppTask$Stub
-android.app.IAppTask$Stub$Proxy
-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
-android.app.INotificationManager$Stub
-android.app.INotificationManager$Stub$Proxy
-android.app.IProcessObserver
-android.app.IProcessObserver$Stub
-android.app.IProcessObserver$Stub$Proxy
-android.app.ISearchManager
-android.app.ISearchManager$Stub
-android.app.ISearchManager$Stub$Proxy
-android.app.IServiceConnection
-android.app.IServiceConnection$Stub
-android.app.IServiceConnection$Stub$Proxy
-android.app.IStopUserCallback
-android.app.ITaskStackListener
-android.app.ITaskStackListener$Stub
-android.app.ITaskStackListener$Stub$Proxy
-android.app.ITransientNotification
-android.app.ITransientNotification$Stub
-android.app.ITransientNotification$Stub$Proxy
-android.app.IUiAutomationConnection
-android.app.IUiAutomationConnection$Stub
-android.app.IUiModeManager
-android.app.IUiModeManager$Stub
-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
-android.app.IWallpaperManager
-android.app.IWallpaperManager$Stub
-android.app.IWallpaperManager$Stub$Proxy
-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
-android.app.IntentService$ServiceHandler
-android.app.JobSchedulerImpl
-android.app.KeyguardManager
-android.app.ListActivity
-android.app.ListFragment
-android.app.ListFragment$1
-android.app.ListFragment$2
-android.app.LoadedApk
-android.app.LoadedApk$ReceiverDispatcher
-android.app.LoadedApk$ReceiverDispatcher$Args
-android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
-android.app.LoadedApk$ServiceDispatcher
-android.app.LoadedApk$ServiceDispatcher$ConnectionInfo
-android.app.LoadedApk$ServiceDispatcher$DeathMonitor
-android.app.LoadedApk$ServiceDispatcher$InnerConnection
-android.app.LoadedApk$ServiceDispatcher$RunConnection
-android.app.LoadedApk$WarningContextClassLoader
-android.app.LoaderManager
-android.app.LoaderManager$LoaderCallbacks
-android.app.LoaderManagerImpl
-android.app.LoaderManagerImpl$LoaderInfo
-android.app.NativeActivity
-android.app.Notification
-android.app.Notification$1
-android.app.Notification$Action
-android.app.Notification$Action$1
-android.app.Notification$Action$Builder
-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$Extender
-android.app.Notification$InboxStyle
-android.app.Notification$MediaStyle
-android.app.Notification$MessagingStyle
-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.PictureInPictureParams
-android.app.PictureInPictureParams$1
-android.app.PictureInPictureParams$Builder
-android.app.ProfilerInfo
-android.app.ProgressDialog
-android.app.QueuedWork
-android.app.QueuedWork$QueuedWorkHandler
-android.app.ReceiverRestrictedContext
-android.app.RemoteAction
-android.app.RemoteAction$1
-android.app.RemoteInput
-android.app.RemoteInput$1
-android.app.ResourcesManager
-android.app.ResourcesManager$1
-android.app.ResourcesManager$ActivityResources
-android.app.ResultInfo
-android.app.ResultInfo$1
-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
-android.app.SharedPreferencesImpl$EditorImpl
-android.app.SharedPreferencesImpl$EditorImpl$1
-android.app.SharedPreferencesImpl$EditorImpl$2
-android.app.SharedPreferencesImpl$EditorImpl$3
-android.app.SharedPreferencesImpl$MemoryCommitResult
-android.app.StatusBarManager
-android.app.SynchronousUserSwitchObserver
-android.app.SystemServiceRegistry
-android.app.SystemServiceRegistry$1
-android.app.SystemServiceRegistry$10
-android.app.SystemServiceRegistry$11
-android.app.SystemServiceRegistry$12
-android.app.SystemServiceRegistry$13
-android.app.SystemServiceRegistry$14
-android.app.SystemServiceRegistry$15
-android.app.SystemServiceRegistry$16
-android.app.SystemServiceRegistry$17
-android.app.SystemServiceRegistry$18
-android.app.SystemServiceRegistry$19
-android.app.SystemServiceRegistry$2
-android.app.SystemServiceRegistry$20
-android.app.SystemServiceRegistry$21
-android.app.SystemServiceRegistry$22
-android.app.SystemServiceRegistry$23
-android.app.SystemServiceRegistry$24
-android.app.SystemServiceRegistry$25
-android.app.SystemServiceRegistry$26
-android.app.SystemServiceRegistry$27
-android.app.SystemServiceRegistry$28
-android.app.SystemServiceRegistry$29
-android.app.SystemServiceRegistry$3
-android.app.SystemServiceRegistry$30
-android.app.SystemServiceRegistry$31
-android.app.SystemServiceRegistry$32
-android.app.SystemServiceRegistry$33
-android.app.SystemServiceRegistry$34
-android.app.SystemServiceRegistry$35
-android.app.SystemServiceRegistry$36
-android.app.SystemServiceRegistry$37
-android.app.SystemServiceRegistry$38
-android.app.SystemServiceRegistry$39
-android.app.SystemServiceRegistry$4
-android.app.SystemServiceRegistry$40
-android.app.SystemServiceRegistry$41
-android.app.SystemServiceRegistry$42
-android.app.SystemServiceRegistry$43
-android.app.SystemServiceRegistry$44
-android.app.SystemServiceRegistry$45
-android.app.SystemServiceRegistry$46
-android.app.SystemServiceRegistry$47
-android.app.SystemServiceRegistry$48
-android.app.SystemServiceRegistry$49
-android.app.SystemServiceRegistry$5
-android.app.SystemServiceRegistry$50
-android.app.SystemServiceRegistry$51
-android.app.SystemServiceRegistry$52
-android.app.SystemServiceRegistry$53
-android.app.SystemServiceRegistry$54
-android.app.SystemServiceRegistry$55
-android.app.SystemServiceRegistry$56
-android.app.SystemServiceRegistry$57
-android.app.SystemServiceRegistry$58
-android.app.SystemServiceRegistry$59
-android.app.SystemServiceRegistry$6
-android.app.SystemServiceRegistry$60
-android.app.SystemServiceRegistry$61
-android.app.SystemServiceRegistry$62
-android.app.SystemServiceRegistry$63
-android.app.SystemServiceRegistry$64
-android.app.SystemServiceRegistry$65
-android.app.SystemServiceRegistry$66
-android.app.SystemServiceRegistry$67
-android.app.SystemServiceRegistry$68
-android.app.SystemServiceRegistry$69
-android.app.SystemServiceRegistry$7
-android.app.SystemServiceRegistry$70
-android.app.SystemServiceRegistry$71
-android.app.SystemServiceRegistry$72
-android.app.SystemServiceRegistry$73
-android.app.SystemServiceRegistry$74
-android.app.SystemServiceRegistry$75
-android.app.SystemServiceRegistry$76
-android.app.SystemServiceRegistry$77
-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.TaskStackListener
-android.app.TimePickerDialog$OnTimeSetListener
-android.app.UiModeManager
-android.app.UserSwitchObserver
-android.app.Vr2dDisplayProperties
-android.app.VrManager
-android.app.WaitResult
-android.app.WallpaperInfo
-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
-android.app.admin.IDevicePolicyManager
-android.app.admin.IDevicePolicyManager$Stub
-android.app.admin.IDevicePolicyManager$Stub$Proxy
-android.app.admin.PasswordMetrics
-android.app.admin.PasswordMetrics$1
-android.app.admin.SecurityLog
-android.app.admin.SecurityLog$SecurityEvent
-android.app.admin.SecurityLog$SecurityEvent$1
-android.app.admin.SystemUpdateInfo
-android.app.admin.SystemUpdateInfo$1
-android.app.admin.SystemUpdatePolicy
-android.app.admin.SystemUpdatePolicy$1
-android.app.assist.AssistContent
-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
-android.app.assist.AssistStructure$ViewNode
-android.app.assist.AssistStructure$ViewNodeBuilder
-android.app.assist.AssistStructure$ViewNodeText
-android.app.assist.AssistStructure$ViewStackEntry
-android.app.assist.AssistStructure$WindowNode
-android.app.backup.BackupAgent
-android.app.backup.BackupAgentHelper
-android.app.backup.BackupDataInput
-android.app.backup.BackupDataInput$EntityHeader
-android.app.backup.BackupDataOutput
-android.app.backup.BackupHelper
-android.app.backup.BackupHelperDispatcher
-android.app.backup.BackupHelperDispatcher$Header
-android.app.backup.BackupManager
-android.app.backup.BackupTransport
-android.app.backup.BackupTransport$TransportImpl
-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.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.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.IJobService$Stub$Proxy
-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.job.JobWorkItem
-android.app.trust.IStrongAuthTracker
-android.app.trust.IStrongAuthTracker$Stub
-android.app.trust.IStrongAuthTracker$Stub$Proxy
-android.app.trust.ITrustListener
-android.app.trust.ITrustListener$Stub
-android.app.trust.ITrustListener$Stub$Proxy
-android.app.trust.ITrustManager
-android.app.trust.ITrustManager$Stub
-android.app.trust.ITrustManager$Stub$Proxy
-android.app.trust.TrustManager
-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
-android.app.usage.IUsageStatsManager$Stub
-android.app.usage.IUsageStatsManager$Stub$Proxy
-android.app.usage.NetworkStatsManager
-android.app.usage.StorageStats
-android.app.usage.StorageStatsManager
-android.app.usage.TimeSparseArray
-android.app.usage.UsageEvents
-android.app.usage.UsageEvents$1
-android.app.usage.UsageEvents$Event
-android.app.usage.UsageStats
-android.app.usage.UsageStats$1
-android.app.usage.UsageStatsManager
-android.app.usage.UsageStatsManagerInternal
-android.app.usage.UsageStatsManagerInternal$AppIdleStateChangeListener
-android.appwidget.AppWidgetHost
-android.appwidget.AppWidgetHost$Callbacks
-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.BluetoothAdapter
-android.bluetooth.BluetoothAdapter$1
-android.bluetooth.BluetoothAdapter$BluetoothStateChangeCallback
-android.bluetooth.BluetoothCodecConfig
-android.bluetooth.BluetoothCodecConfig$1
-android.bluetooth.BluetoothCodecStatus
-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
-android.bluetooth.BluetoothHeadset
-android.bluetooth.BluetoothHeadset$1
-android.bluetooth.BluetoothHeadset$2
-android.bluetooth.BluetoothHeadset$3
-android.bluetooth.BluetoothHealthAppConfiguration
-android.bluetooth.BluetoothHidHost
-android.bluetooth.BluetoothHidHost$1
-android.bluetooth.BluetoothHidHost$2
-android.bluetooth.BluetoothInputStream
-android.bluetooth.BluetoothManager
-android.bluetooth.BluetoothMap
-android.bluetooth.BluetoothMap$1
-android.bluetooth.BluetoothMap$2
-android.bluetooth.BluetoothOutputStream
-android.bluetooth.BluetoothPan
-android.bluetooth.BluetoothPan$1
-android.bluetooth.BluetoothPan$2
-android.bluetooth.BluetoothPbap
-android.bluetooth.BluetoothPbap$1
-android.bluetooth.BluetoothPbap$2
-android.bluetooth.BluetoothPbap$ServiceListener
-android.bluetooth.BluetoothProfile
-android.bluetooth.BluetoothProfile$ServiceListener
-android.bluetooth.BluetoothServerSocket
-android.bluetooth.BluetoothSocket
-android.bluetooth.BluetoothSocket$SocketState
-android.bluetooth.BluetoothUuid
-android.bluetooth.IBluetooth
-android.bluetooth.IBluetooth$Stub
-android.bluetooth.IBluetooth$Stub$Proxy
-android.bluetooth.IBluetoothA2dp
-android.bluetooth.IBluetoothA2dp$Stub
-android.bluetooth.IBluetoothA2dp$Stub$Proxy
-android.bluetooth.IBluetoothCallback
-android.bluetooth.IBluetoothCallback$Stub
-android.bluetooth.IBluetoothCallback$Stub$Proxy
-android.bluetooth.IBluetoothGatt
-android.bluetooth.IBluetoothGatt$Stub
-android.bluetooth.IBluetoothGatt$Stub$Proxy
-android.bluetooth.IBluetoothGattCallback
-android.bluetooth.IBluetoothGattServerCallback
-android.bluetooth.IBluetoothHeadset
-android.bluetooth.IBluetoothHeadset$Stub
-android.bluetooth.IBluetoothHeadset$Stub$Proxy
-android.bluetooth.IBluetoothHeadsetPhone
-android.bluetooth.IBluetoothHeadsetPhone$Stub
-android.bluetooth.IBluetoothHeadsetPhone$Stub$Proxy
-android.bluetooth.IBluetoothHealth
-android.bluetooth.IBluetoothHealth$Stub
-android.bluetooth.IBluetoothHealthCallback
-android.bluetooth.IBluetoothHidHost
-android.bluetooth.IBluetoothHidHost$Stub
-android.bluetooth.IBluetoothHidHost$Stub$Proxy
-android.bluetooth.IBluetoothManager
-android.bluetooth.IBluetoothManager$Stub
-android.bluetooth.IBluetoothManager$Stub$Proxy
-android.bluetooth.IBluetoothManagerCallback
-android.bluetooth.IBluetoothManagerCallback$Stub
-android.bluetooth.IBluetoothManagerCallback$Stub$Proxy
-android.bluetooth.IBluetoothMap
-android.bluetooth.IBluetoothMap$Stub
-android.bluetooth.IBluetoothMap$Stub$Proxy
-android.bluetooth.IBluetoothPan
-android.bluetooth.IBluetoothPan$Stub
-android.bluetooth.IBluetoothPan$Stub$Proxy
-android.bluetooth.IBluetoothPbap
-android.bluetooth.IBluetoothPbap$Stub
-android.bluetooth.IBluetoothPbap$Stub$Proxy
-android.bluetooth.IBluetoothProfileServiceConnection
-android.bluetooth.IBluetoothProfileServiceConnection$Stub
-android.bluetooth.IBluetoothProfileServiceConnection$Stub$Proxy
-android.bluetooth.IBluetoothSap
-android.bluetooth.IBluetoothSap$Stub
-android.bluetooth.IBluetoothStateChangeCallback
-android.bluetooth.IBluetoothStateChangeCallback$Stub
-android.bluetooth.IBluetoothStateChangeCallback$Stub$Proxy
-android.bluetooth.OobData
-android.bluetooth.UidTraffic
-android.bluetooth.UidTraffic$1
-android.bluetooth.le.AdvertiseData
-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.BluetoothLeUtils
-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
-android.bluetooth.le.ScanFilter$Builder
-android.bluetooth.le.ScanRecord
-android.bluetooth.le.ScanResult
-android.bluetooth.le.ScanResult$1
-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
-android.content.ActivityNotFoundException
-android.content.AsyncQueryHandler
-android.content.AsyncQueryHandler$WorkerArgs
-android.content.AsyncQueryHandler$WorkerHandler
-android.content.AsyncTaskLoader
-android.content.AsyncTaskLoader$LoadTask
-android.content.BroadcastReceiver
-android.content.BroadcastReceiver$PendingResult
-android.content.BroadcastReceiver$PendingResult$1
-android.content.ClipData
-android.content.ClipData$1
-android.content.ClipData$Item
-android.content.ClipDescription
-android.content.ClipDescription$1
-android.content.ClipboardManager
-android.content.ClipboardManager$1
-android.content.ClipboardManager$2
-android.content.ClipboardManager$OnPrimaryClipChangedListener
-android.content.ComponentCallbacks
-android.content.ComponentCallbacks2
-android.content.ComponentName
-android.content.ComponentName$1
-android.content.ContentProvider
-android.content.ContentProvider$PipeDataWriter
-android.content.ContentProvider$Transport
-android.content.ContentProviderClient
-android.content.ContentProviderClient$CursorWrapperInner
-android.content.ContentProviderNative
-android.content.ContentProviderOperation
-android.content.ContentProviderOperation$1
-android.content.ContentProviderOperation$Builder
-android.content.ContentProviderProxy
-android.content.ContentProviderResult
-android.content.ContentProviderResult$1
-android.content.ContentQueryMap
-android.content.ContentResolver
-android.content.ContentResolver$1
-android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$ParcelFileDescriptorInner
-android.content.ContentUris
-android.content.ContentValues
-android.content.ContentValues$1
-android.content.Context
-android.content.ContextWrapper
-android.content.CursorLoader
-android.content.DialogInterface
-android.content.DialogInterface$OnCancelListener
-android.content.DialogInterface$OnClickListener
-android.content.DialogInterface$OnDismissListener
-android.content.DialogInterface$OnKeyListener
-android.content.DialogInterface$OnMultiChoiceClickListener
-android.content.DialogInterface$OnShowListener
-android.content.IClipboard
-android.content.IClipboard$Stub
-android.content.IClipboard$Stub$Proxy
-android.content.IContentProvider
-android.content.IContentService
-android.content.IContentService$Stub
-android.content.IContentService$Stub$Proxy
-android.content.IIntentReceiver
-android.content.IIntentReceiver$Stub
-android.content.IIntentReceiver$Stub$Proxy
-android.content.IIntentSender
-android.content.IIntentSender$Stub
-android.content.IIntentSender$Stub$Proxy
-android.content.IOnPrimaryClipChangedListener
-android.content.IOnPrimaryClipChangedListener$Stub
-android.content.IRestrictionsManager
-android.content.IRestrictionsManager$Stub
-android.content.IRestrictionsManager$Stub$Proxy
-android.content.ISyncAdapter
-android.content.ISyncAdapter$Stub
-android.content.ISyncAdapter$Stub$Proxy
-android.content.ISyncContext
-android.content.ISyncContext$Stub
-android.content.ISyncContext$Stub$Proxy
-android.content.ISyncStatusObserver
-android.content.ISyncStatusObserver$Stub
-android.content.ISyncStatusObserver$Stub$Proxy
-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.OperationApplicationException
-android.content.PeriodicSync
-android.content.PeriodicSync$1
-android.content.ReceiverCallNotAllowedException
-android.content.RestrictionEntry
-android.content.RestrictionEntry$1
-android.content.RestrictionsManager
-android.content.SearchRecentSuggestionsProvider
-android.content.SearchRecentSuggestionsProvider$DatabaseHelper
-android.content.ServiceConnection
-android.content.SharedPreferences
-android.content.SharedPreferences$Editor
-android.content.SharedPreferences$OnSharedPreferenceChangeListener
-android.content.SyncAdapterType
-android.content.SyncAdapterType$1
-android.content.SyncAdaptersCache
-android.content.SyncAdaptersCache$MySerializer
-android.content.SyncContext
-android.content.SyncInfo
-android.content.SyncInfo$1
-android.content.SyncRequest
-android.content.SyncRequest$1
-android.content.SyncRequest$Builder
-android.content.SyncResult
-android.content.SyncResult$1
-android.content.SyncStats
-android.content.SyncStats$1
-android.content.SyncStatusInfo
-android.content.SyncStatusInfo$1
-android.content.SyncStatusObserver
-android.content.UndoManager
-android.content.UndoManager$UndoState
-android.content.UndoOperation
-android.content.UndoOwner
-android.content.UriMatcher
-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.FallbackCategoryProvider
-android.content.pm.FeatureGroupInfo
-android.content.pm.FeatureGroupInfo$1
-android.content.pm.FeatureInfo
-android.content.pm.FeatureInfo$1
-android.content.pm.ILauncherApps
-android.content.pm.ILauncherApps$Stub
-android.content.pm.ILauncherApps$Stub$Proxy
-android.content.pm.IOnAppsChangedListener
-android.content.pm.IOnAppsChangedListener$Stub
-android.content.pm.IOnAppsChangedListener$Stub$Proxy
-android.content.pm.IOnPermissionsChangeListener
-android.content.pm.IOnPermissionsChangeListener$Stub
-android.content.pm.IOnPermissionsChangeListener$Stub$Proxy
-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
-android.content.pm.IPackageInstallerCallback
-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
-android.content.pm.IPackageMoveObserver
-android.content.pm.IPackageMoveObserver$Stub
-android.content.pm.IPackageMoveObserver$Stub$Proxy
-android.content.pm.IPackageStatsObserver
-android.content.pm.IPackageStatsObserver$Stub
-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.LauncherActivityInfo
-android.content.pm.LauncherApps
-android.content.pm.LauncherApps$1
-android.content.pm.LauncherApps$Callback
-android.content.pm.LauncherApps$CallbackMessageHandler
-android.content.pm.LauncherApps$CallbackMessageHandler$CallbackInfo
-android.content.pm.LauncherApps$ShortcutQuery
-android.content.pm.PackageCleanItem
-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
-android.content.pm.PackageManager$NameNotFoundException
-android.content.pm.PackageManager$OnPermissionsChangedListener
-android.content.pm.PackageManagerInternal
-android.content.pm.PackageManagerInternal$ExternalSourcesPolicy
-android.content.pm.PackageManagerInternal$PackagesProvider
-android.content.pm.PackageManagerInternal$SyncAdapterPackagesProvider
-android.content.pm.PackageParser
-android.content.pm.PackageParser$Activity
-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
-android.content.pm.PackageParser$Package
-android.content.pm.PackageParser$Package$1
-android.content.pm.PackageParser$PackageLite
-android.content.pm.PackageParser$PackageParserException
-android.content.pm.PackageParser$ParseComponentArgs
-android.content.pm.PackageParser$ParsePackageItemArgs
-android.content.pm.PackageParser$Permission
-android.content.pm.PackageParser$Permission$1
-android.content.pm.PackageParser$PermissionGroup
-android.content.pm.PackageParser$PermissionGroup$1
-android.content.pm.PackageParser$Provider
-android.content.pm.PackageParser$Provider$1
-android.content.pm.PackageParser$ProviderIntentInfo
-android.content.pm.PackageParser$Service
-android.content.pm.PackageParser$Service$1
-android.content.pm.PackageParser$ServiceIntentInfo
-android.content.pm.PackageParser$SplitNameComparator
-android.content.pm.PackageParser$SplitPermissionInfo
-android.content.pm.PackageStats
-android.content.pm.PackageUserState
-android.content.pm.ParceledListSlice
-android.content.pm.ParceledListSlice$1
-android.content.pm.PathPermission
-android.content.pm.PathPermission$1
-android.content.pm.PermissionGroupInfo
-android.content.pm.PermissionGroupInfo$1
-android.content.pm.PermissionInfo
-android.content.pm.PermissionInfo$1
-android.content.pm.ProviderInfo
-android.content.pm.ProviderInfo$1
-android.content.pm.RegisteredServicesCache
-android.content.pm.RegisteredServicesCache$1
-android.content.pm.RegisteredServicesCache$2
-android.content.pm.RegisteredServicesCache$3
-android.content.pm.RegisteredServicesCache$ServiceInfo
-android.content.pm.RegisteredServicesCache$UserServices
-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
-android.content.pm.SharedLibraryInfo$1
-android.content.pm.ShortcutInfo
-android.content.pm.ShortcutInfo$1
-android.content.pm.ShortcutInfo$Builder
-android.content.pm.ShortcutManager
-android.content.pm.ShortcutServiceInternal
-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
-android.content.pm.VerifierInfo
-android.content.pm.VersionedPackage
-android.content.pm.VersionedPackage$1
-android.content.pm.XmlSerializerAndParser
-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
-android.content.res.AssetManager
-android.content.res.AssetManager$AssetInputStream
-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
-android.content.res.ComplexColor
-android.content.res.Configuration
-android.content.res.Configuration$1
-android.content.res.ConfigurationBoundResourceCache
-android.content.res.ConstantState
-android.content.res.DrawableCache
-android.content.res.GradientColor
-android.content.res.ObbInfo
-android.content.res.ObbInfo$1
-android.content.res.ObbScanner
-android.content.res.Resources
-android.content.res.Resources$NotFoundException
-android.content.res.Resources$Theme
-android.content.res.Resources$ThemeKey
-android.content.res.ResourcesImpl
-android.content.res.ResourcesImpl$ThemeImpl
-android.content.res.ResourcesKey
-android.content.res.StringBlock
-android.content.res.StringBlock$StyleIDs
-android.content.res.ThemedResourceCache
-android.content.res.TypedArray
-android.content.res.XmlBlock
-android.content.res.XmlBlock$Parser
-android.content.res.XmlResourceParser
-android.database.AbstractCursor
-android.database.AbstractCursor$SelfContentObserver
-android.database.AbstractWindowedCursor
-android.database.BulkCursorDescriptor
-android.database.BulkCursorDescriptor$1
-android.database.BulkCursorNative
-android.database.BulkCursorProxy
-android.database.BulkCursorToCursorAdaptor
-android.database.CharArrayBuffer
-android.database.ContentObservable
-android.database.ContentObserver
-android.database.ContentObserver$NotificationRunnable
-android.database.ContentObserver$Transport
-android.database.CrossProcessCursor
-android.database.CrossProcessCursorWrapper
-android.database.Cursor
-android.database.CursorIndexOutOfBoundsException
-android.database.CursorToBulkCursorAdaptor
-android.database.CursorToBulkCursorAdaptor$ContentObserverProxy
-android.database.CursorWindow
-android.database.CursorWindow$1
-android.database.CursorWrapper
-android.database.DataSetObservable
-android.database.DataSetObserver
-android.database.DatabaseErrorHandler
-android.database.DatabaseUtils
-android.database.DatabaseUtils$InsertHelper
-android.database.DefaultDatabaseErrorHandler
-android.database.IBulkCursor
-android.database.IContentObserver
-android.database.IContentObserver$Stub
-android.database.IContentObserver$Stub$Proxy
-android.database.MatrixCursor
-android.database.MatrixCursor$RowBuilder
-android.database.MergeCursor
-android.database.MergeCursor$1
-android.database.Observable
-android.database.SQLException
-android.database.StaleDataException
-android.database.sqlite.DatabaseObjectNotClosedException
-android.database.sqlite.SQLiteAbortException
-android.database.sqlite.SQLiteCantOpenDatabaseException
-android.database.sqlite.SQLiteClosable
-android.database.sqlite.SQLiteConnection
-android.database.sqlite.SQLiteConnection$Operation
-android.database.sqlite.SQLiteConnection$OperationLog
-android.database.sqlite.SQLiteConnection$PreparedStatement
-android.database.sqlite.SQLiteConnection$PreparedStatementCache
-android.database.sqlite.SQLiteConnectionPool
-android.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus
-android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter
-android.database.sqlite.SQLiteConstraintException
-android.database.sqlite.SQLiteCursor
-android.database.sqlite.SQLiteCursorDriver
-android.database.sqlite.SQLiteCustomFunction
-android.database.sqlite.SQLiteDatabase
-android.database.sqlite.SQLiteDatabase$1
-android.database.sqlite.SQLiteDatabase$2
-android.database.sqlite.SQLiteDatabase$CursorFactory
-android.database.sqlite.SQLiteDatabase$CustomFunction
-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.SQLiteDiskIOException
-android.database.sqlite.SQLiteDoneException
-android.database.sqlite.SQLiteException
-android.database.sqlite.SQLiteFullException
-android.database.sqlite.SQLiteGlobal
-android.database.sqlite.SQLiteOpenHelper
-android.database.sqlite.SQLiteProgram
-android.database.sqlite.SQLiteQuery
-android.database.sqlite.SQLiteQueryBuilder
-android.database.sqlite.SQLiteReadOnlyDatabaseException
-android.database.sqlite.SQLiteSession
-android.database.sqlite.SQLiteSession$Transaction
-android.database.sqlite.SQLiteStatement
-android.database.sqlite.SQLiteStatementInfo
-android.database.sqlite.SQLiteTransactionListener
-android.database.sqlite.SqliteWrapper
-android.ddm.DdmHandleAppName
-android.ddm.DdmHandleExit
-android.ddm.DdmHandleHeap
-android.ddm.DdmHandleHello
-android.ddm.DdmHandleNativeHeap
-android.ddm.DdmHandleProfiling
-android.ddm.DdmHandleThread
-android.ddm.DdmHandleViewDebug
-android.ddm.DdmRegister
-android.drm.DrmManagerClient$OnErrorListener
-android.drm.DrmManagerClient$OnEventListener
-android.drm.DrmManagerClient$OnInfoListener
-android.drm.DrmOutputStream
-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
-android.graphics.Bitmap$CompressFormat
-android.graphics.Bitmap$Config
-android.graphics.BitmapFactory
-android.graphics.BitmapFactory$Options
-android.graphics.BitmapRegionDecoder
-android.graphics.BitmapShader
-android.graphics.BlurMaskFilter
-android.graphics.BlurMaskFilter$Blur
-android.graphics.Camera
-android.graphics.Canvas
-android.graphics.Canvas$EdgeType
-android.graphics.Canvas$NoImagePreloadHolder
-android.graphics.CanvasProperty
-android.graphics.Color
-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
-android.graphics.DashPathEffect
-android.graphics.DiscretePathEffect
-android.graphics.DrawFilter
-android.graphics.EmbossMaskFilter
-android.graphics.FontFamily
-android.graphics.FontListParser
-android.graphics.GraphicBuffer
-android.graphics.GraphicBuffer$1
-android.graphics.ImageFormat
-android.graphics.Insets
-android.graphics.Interpolator
-android.graphics.Interpolator$Result
-android.graphics.LightingColorFilter
-android.graphics.LinearGradient
-android.graphics.MaskFilter
-android.graphics.Matrix
-android.graphics.Matrix$1
-android.graphics.Matrix$NoImagePreloadHolder
-android.graphics.Matrix$ScaleToFit
-android.graphics.Movie
-android.graphics.NinePatch
-android.graphics.NinePatch$InsetStruct
-android.graphics.Outline
-android.graphics.Paint
-android.graphics.Paint$Align
-android.graphics.Paint$Cap
-android.graphics.Paint$FontMetrics
-android.graphics.Paint$FontMetricsInt
-android.graphics.Paint$Join
-android.graphics.Paint$NoImagePreloadHolder
-android.graphics.Paint$Style
-android.graphics.PaintFlagsDrawFilter
-android.graphics.Path
-android.graphics.Path$Direction
-android.graphics.Path$FillType
-android.graphics.Path$Op
-android.graphics.PathDashPathEffect
-android.graphics.PathEffect
-android.graphics.PathMeasure
-android.graphics.Picture
-android.graphics.Picture$RecordingCanvas
-android.graphics.PixelFormat
-android.graphics.Point
-android.graphics.Point$1
-android.graphics.PointF
-android.graphics.PointF$1
-android.graphics.PorterDuff
-android.graphics.PorterDuff$Mode
-android.graphics.PorterDuffColorFilter
-android.graphics.PorterDuffXfermode
-android.graphics.RadialGradient
-android.graphics.Rect
-android.graphics.Rect$1
-android.graphics.Rect$UnflattenHelper
-android.graphics.RectF
-android.graphics.RectF$1
-android.graphics.Region
-android.graphics.Region$1
-android.graphics.Region$Op
-android.graphics.RegionIterator
-android.graphics.Shader
-android.graphics.Shader$TileMode
-android.graphics.SumPathEffect
-android.graphics.SurfaceTexture
-android.graphics.SurfaceTexture$1
-android.graphics.SurfaceTexture$OnFrameAvailableListener
-android.graphics.SweepGradient
-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.Animatable2$AnimationCallback
-android.graphics.drawable.AnimatedStateListDrawable
-android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState
-android.graphics.drawable.AnimatedStateListDrawable$AnimatedVectorDrawableTransition
-android.graphics.drawable.AnimatedStateListDrawable$AnimationDrawableTransition
-android.graphics.drawable.AnimatedStateListDrawable$FrameInterpolator
-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
-android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT
-android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorUI
-android.graphics.drawable.AnimationDrawable
-android.graphics.drawable.AnimationDrawable$AnimationState
-android.graphics.drawable.BitmapDrawable
-android.graphics.drawable.BitmapDrawable$BitmapState
-android.graphics.drawable.ClipDrawable
-android.graphics.drawable.ClipDrawable$ClipState
-android.graphics.drawable.ColorDrawable
-android.graphics.drawable.ColorDrawable$ColorState
-android.graphics.drawable.Drawable
-android.graphics.drawable.Drawable$Callback
-android.graphics.drawable.Drawable$ConstantState
-android.graphics.drawable.DrawableContainer
-android.graphics.drawable.DrawableContainer$1
-android.graphics.drawable.DrawableContainer$BlockInvalidateCallback
-android.graphics.drawable.DrawableContainer$DrawableContainerState
-android.graphics.drawable.DrawableInflater
-android.graphics.drawable.DrawableWrapper
-android.graphics.drawable.DrawableWrapper$DrawableWrapperState
-android.graphics.drawable.GradientDrawable
-android.graphics.drawable.GradientDrawable$GradientState
-android.graphics.drawable.GradientDrawable$Orientation
-android.graphics.drawable.Icon
-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.NinePatchDrawable
-android.graphics.drawable.NinePatchDrawable$NinePatchState
-android.graphics.drawable.PaintDrawable
-android.graphics.drawable.PictureDrawable
-android.graphics.drawable.RippleBackground
-android.graphics.drawable.RippleBackground$1
-android.graphics.drawable.RippleBackground$BackgroundProperty
-android.graphics.drawable.RippleComponent
-android.graphics.drawable.RippleComponent$RenderNodeAnimatorSet
-android.graphics.drawable.RippleDrawable
-android.graphics.drawable.RippleDrawable$RippleState
-android.graphics.drawable.RippleForeground
-android.graphics.drawable.RippleForeground$1
-android.graphics.drawable.RippleForeground$2
-android.graphics.drawable.RippleForeground$3
-android.graphics.drawable.RippleForeground$4
-android.graphics.drawable.RippleForeground$LogDecelerateInterpolator
-android.graphics.drawable.RotateDrawable
-android.graphics.drawable.RotateDrawable$RotateState
-android.graphics.drawable.ScaleDrawable
-android.graphics.drawable.ScaleDrawable$ScaleState
-android.graphics.drawable.ShapeDrawable
-android.graphics.drawable.ShapeDrawable$ShaderFactory
-android.graphics.drawable.ShapeDrawable$ShapeState
-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$VClipPath
-android.graphics.drawable.VectorDrawable$VFullPath
-android.graphics.drawable.VectorDrawable$VFullPath$1
-android.graphics.drawable.VectorDrawable$VFullPath$10
-android.graphics.drawable.VectorDrawable$VFullPath$2
-android.graphics.drawable.VectorDrawable$VFullPath$3
-android.graphics.drawable.VectorDrawable$VFullPath$4
-android.graphics.drawable.VectorDrawable$VFullPath$5
-android.graphics.drawable.VectorDrawable$VFullPath$6
-android.graphics.drawable.VectorDrawable$VFullPath$7
-android.graphics.drawable.VectorDrawable$VFullPath$8
-android.graphics.drawable.VectorDrawable$VFullPath$9
-android.graphics.drawable.VectorDrawable$VGroup
-android.graphics.drawable.VectorDrawable$VGroup$1
-android.graphics.drawable.VectorDrawable$VGroup$2
-android.graphics.drawable.VectorDrawable$VGroup$3
-android.graphics.drawable.VectorDrawable$VGroup$4
-android.graphics.drawable.VectorDrawable$VGroup$5
-android.graphics.drawable.VectorDrawable$VGroup$6
-android.graphics.drawable.VectorDrawable$VGroup$7
-android.graphics.drawable.VectorDrawable$VGroup$8
-android.graphics.drawable.VectorDrawable$VGroup$9
-android.graphics.drawable.VectorDrawable$VObject
-android.graphics.drawable.VectorDrawable$VPath
-android.graphics.drawable.VectorDrawable$VPath$1
-android.graphics.drawable.VectorDrawable$VectorDrawableState
-android.graphics.drawable.VectorDrawable$VectorDrawableState$1
-android.graphics.drawable.shapes.OvalShape
-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$CameraInfo
-android.hardware.Camera$ErrorCallback
-android.hardware.Camera$Face
-android.hardware.CameraStatus
-android.hardware.CameraStatus$1
-android.hardware.ConsumerIrManager
-android.hardware.GeomagneticField
-android.hardware.GeomagneticField$LegendreTable
-android.hardware.HardwareBuffer
-android.hardware.HardwareBuffer$1
-android.hardware.ICameraService
-android.hardware.ICameraService$Stub
-android.hardware.ICameraService$Stub$Proxy
-android.hardware.ICameraServiceListener
-android.hardware.ICameraServiceListener$Stub
-android.hardware.ICameraServiceProxy
-android.hardware.ICameraServiceProxy$Stub
-android.hardware.IConsumerIrService
-android.hardware.IConsumerIrService$Stub
-android.hardware.ISerialManager
-android.hardware.ISerialManager$Stub
-android.hardware.Sensor
-android.hardware.SensorAdditionalInfo
-android.hardware.SensorEvent
-android.hardware.SensorEventListener
-android.hardware.SensorManager
-android.hardware.SerialManager
-android.hardware.SerialPort
-android.hardware.SystemSensorManager
-android.hardware.SystemSensorManager$BaseEventQueue
-android.hardware.SystemSensorManager$SensorEventQueue
-android.hardware.SystemSensorManager$TriggerEventQueue
-android.hardware.TriggerEvent
-android.hardware.TriggerEventListener
-android.hardware.camera2.CameraAccessException
-android.hardware.camera2.CameraCaptureSession
-android.hardware.camera2.CameraCaptureSession$CaptureCallback
-android.hardware.camera2.CameraCaptureSession$StateCallback
-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.CameraDevice
-android.hardware.camera2.CameraDevice$StateCallback
-android.hardware.camera2.CameraManager
-android.hardware.camera2.CameraManager$AvailabilityCallback
-android.hardware.camera2.CameraManager$CameraManagerGlobal
-android.hardware.camera2.CameraManager$CameraManagerGlobal$1
-android.hardware.camera2.CameraManager$CameraManagerGlobal$2
-android.hardware.camera2.CameraManager$CameraManagerGlobal$3
-android.hardware.camera2.CameraManager$CameraManagerGlobal$4
-android.hardware.camera2.CameraManager$TorchCallback
-android.hardware.camera2.CameraMetadata
-android.hardware.camera2.CaptureFailure
-android.hardware.camera2.CaptureRequest
-android.hardware.camera2.CaptureRequest$1
-android.hardware.camera2.CaptureRequest$2
-android.hardware.camera2.CaptureRequest$Builder
-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.ICameraDeviceCallbacks
-android.hardware.camera2.ICameraDeviceCallbacks$Stub
-android.hardware.camera2.ICameraDeviceUser
-android.hardware.camera2.ICameraDeviceUser$Stub
-android.hardware.camera2.ICameraDeviceUser$Stub$Proxy
-android.hardware.camera2.TotalCaptureResult
-android.hardware.camera2.dispatch.ArgumentReplacingDispatcher
-android.hardware.camera2.dispatch.BroadcastDispatcher
-android.hardware.camera2.dispatch.Dispatchable
-android.hardware.camera2.dispatch.DuckTypingDispatcher
-android.hardware.camera2.dispatch.HandlerDispatcher
-android.hardware.camera2.dispatch.HandlerDispatcher$1
-android.hardware.camera2.dispatch.InvokeDispatcher
-android.hardware.camera2.dispatch.MethodNameInvoker
-android.hardware.camera2.impl.CallbackProxies$DeviceCaptureCallbackProxy
-android.hardware.camera2.impl.CallbackProxies$SessionStateCallbackProxy
-android.hardware.camera2.impl.CameraCaptureSessionCore
-android.hardware.camera2.impl.CameraCaptureSessionImpl
-android.hardware.camera2.impl.CameraCaptureSessionImpl$1
-android.hardware.camera2.impl.CameraCaptureSessionImpl$2
-android.hardware.camera2.impl.CameraCaptureSessionImpl$AbortDrainListener
-android.hardware.camera2.impl.CameraCaptureSessionImpl$IdleDrainListener
-android.hardware.camera2.impl.CameraCaptureSessionImpl$SequenceDrainListener
-android.hardware.camera2.impl.CameraDeviceImpl
-android.hardware.camera2.impl.CameraDeviceImpl$1
-android.hardware.camera2.impl.CameraDeviceImpl$10
-android.hardware.camera2.impl.CameraDeviceImpl$2
-android.hardware.camera2.impl.CameraDeviceImpl$3
-android.hardware.camera2.impl.CameraDeviceImpl$4
-android.hardware.camera2.impl.CameraDeviceImpl$5
-android.hardware.camera2.impl.CameraDeviceImpl$6
-android.hardware.camera2.impl.CameraDeviceImpl$7
-android.hardware.camera2.impl.CameraDeviceImpl$9
-android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks
-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$CaptureCallback
-android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallbackHolder
-android.hardware.camera2.impl.CameraDeviceImpl$FrameNumberTracker
-android.hardware.camera2.impl.CameraDeviceImpl$RequestLastFrameNumbersHolder
-android.hardware.camera2.impl.CameraDeviceImpl$StateCallbackKK
-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.CaptureResultExtras
-android.hardware.camera2.impl.CaptureResultExtras$1
-android.hardware.camera2.impl.GetCommand
-android.hardware.camera2.impl.ICameraDeviceUserWrapper
-android.hardware.camera2.impl.SetCommand
-android.hardware.camera2.legacy.LegacyCameraDevice
-android.hardware.camera2.legacy.LegacyExceptionUtils
-android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException
-android.hardware.camera2.legacy.PerfMeasurement
-android.hardware.camera2.marshal.MarshalHelpers
-android.hardware.camera2.marshal.MarshalQueryable
-android.hardware.camera2.marshal.MarshalRegistry
-android.hardware.camera2.marshal.MarshalRegistry$MarshalToken
-android.hardware.camera2.marshal.Marshaler
-android.hardware.camera2.marshal.impl.MarshalQueryableArray
-android.hardware.camera2.marshal.impl.MarshalQueryableArray$MarshalerArray
-android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern
-android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern$MarshalerBlackLevelPattern
-android.hardware.camera2.marshal.impl.MarshalQueryableBoolean
-android.hardware.camera2.marshal.impl.MarshalQueryableBoolean$MarshalerBoolean
-android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform
-android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform$MarshalerColorSpaceTransform
-android.hardware.camera2.marshal.impl.MarshalQueryableEnum
-android.hardware.camera2.marshal.impl.MarshalQueryableHighSpeedVideoConfiguration
-android.hardware.camera2.marshal.impl.MarshalQueryableHighSpeedVideoConfiguration$MarshalerHighSpeedVideoConfiguration
-android.hardware.camera2.marshal.impl.MarshalQueryableMeteringRectangle
-android.hardware.camera2.marshal.impl.MarshalQueryableMeteringRectangle$MarshalerMeteringRectangle
-android.hardware.camera2.marshal.impl.MarshalQueryableNativeByteToInteger
-android.hardware.camera2.marshal.impl.MarshalQueryableNativeByteToInteger$MarshalerNativeByteToInteger
-android.hardware.camera2.marshal.impl.MarshalQueryablePair
-android.hardware.camera2.marshal.impl.MarshalQueryablePair$MarshalerPair
-android.hardware.camera2.marshal.impl.MarshalQueryableParcelable
-android.hardware.camera2.marshal.impl.MarshalQueryablePrimitive
-android.hardware.camera2.marshal.impl.MarshalQueryablePrimitive$MarshalerPrimitive
-android.hardware.camera2.marshal.impl.MarshalQueryableRange
-android.hardware.camera2.marshal.impl.MarshalQueryableRange$MarshalerRange
-android.hardware.camera2.marshal.impl.MarshalQueryableRect
-android.hardware.camera2.marshal.impl.MarshalQueryableRect$MarshalerRect
-android.hardware.camera2.marshal.impl.MarshalQueryableReprocessFormatsMap
-android.hardware.camera2.marshal.impl.MarshalQueryableReprocessFormatsMap$MarshalerReprocessFormatsMap
-android.hardware.camera2.marshal.impl.MarshalQueryableRggbChannelVector
-android.hardware.camera2.marshal.impl.MarshalQueryableRggbChannelVector$MarshalerRggbChannelVector
-android.hardware.camera2.marshal.impl.MarshalQueryableSize
-android.hardware.camera2.marshal.impl.MarshalQueryableSize$MarshalerSize
-android.hardware.camera2.marshal.impl.MarshalQueryableSizeF
-android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration
-android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration$MarshalerStreamConfiguration
-android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration
-android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration$MarshalerStreamConfigurationDuration
-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.InputConfiguration
-android.hardware.camera2.params.LensShadingMap
-android.hardware.camera2.params.MeteringRectangle
-android.hardware.camera2.params.OutputConfiguration
-android.hardware.camera2.params.OutputConfiguration$1
-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.HashCodeHelpers
-android.hardware.camera2.utils.SubmitInfo
-android.hardware.camera2.utils.SubmitInfo$1
-android.hardware.camera2.utils.SurfaceUtils
-android.hardware.camera2.utils.TaskDrainer
-android.hardware.camera2.utils.TaskDrainer$1
-android.hardware.camera2.utils.TaskDrainer$DrainListener
-android.hardware.camera2.utils.TaskSingleDrainer
-android.hardware.camera2.utils.TypeReference
-android.hardware.camera2.utils.TypeReference$SpecializedBaseTypeReference
-android.hardware.camera2.utils.TypeReference$SpecializedTypeReference
-android.hardware.display.DisplayManager
-android.hardware.display.DisplayManager$DisplayListener
-android.hardware.display.DisplayManagerGlobal
-android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate
-android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback
-android.hardware.display.DisplayManagerInternal
-android.hardware.display.DisplayManagerInternal$DisplayPowerCallbacks
-android.hardware.display.DisplayManagerInternal$DisplayPowerRequest
-android.hardware.display.DisplayManagerInternal$DisplayTransactionListener
-android.hardware.display.DisplayViewport
-android.hardware.display.IDisplayManager
-android.hardware.display.IDisplayManager$Stub
-android.hardware.display.IDisplayManager$Stub$Proxy
-android.hardware.display.IDisplayManagerCallback
-android.hardware.display.IDisplayManagerCallback$Stub
-android.hardware.display.IDisplayManagerCallback$Stub$Proxy
-android.hardware.display.IVirtualDisplayCallback
-android.hardware.display.WifiDisplay
-android.hardware.display.WifiDisplay$1
-android.hardware.display.WifiDisplaySessionInfo
-android.hardware.display.WifiDisplaySessionInfo$1
-android.hardware.display.WifiDisplayStatus
-android.hardware.display.WifiDisplayStatus$1
-android.hardware.fingerprint.Fingerprint
-android.hardware.fingerprint.Fingerprint$1
-android.hardware.fingerprint.FingerprintManager
-android.hardware.fingerprint.FingerprintManager$1
-android.hardware.fingerprint.FingerprintManager$2
-android.hardware.fingerprint.FingerprintManager$AuthenticationCallback
-android.hardware.fingerprint.FingerprintManager$AuthenticationResult
-android.hardware.fingerprint.FingerprintManager$LockoutResetCallback
-android.hardware.fingerprint.FingerprintManager$MyHandler
-android.hardware.fingerprint.IFingerprintClientActiveCallback
-android.hardware.fingerprint.IFingerprintService
-android.hardware.fingerprint.IFingerprintService$Stub
-android.hardware.fingerprint.IFingerprintService$Stub$Proxy
-android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback
-android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback$Stub
-android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback$Stub$Proxy
-android.hardware.fingerprint.IFingerprintServiceReceiver
-android.hardware.fingerprint.IFingerprintServiceReceiver$Stub
-android.hardware.hdmi.HdmiControlManager
-android.hardware.hdmi.HdmiPlaybackClient$DisplayStatusCallback
-android.hardware.input.IInputDevicesChangedListener
-android.hardware.input.IInputDevicesChangedListener$Stub
-android.hardware.input.IInputDevicesChangedListener$Stub$Proxy
-android.hardware.input.IInputManager
-android.hardware.input.IInputManager$Stub
-android.hardware.input.IInputManager$Stub$Proxy
-android.hardware.input.ITabletModeChangedListener
-android.hardware.input.InputDeviceIdentifier
-android.hardware.input.InputDeviceIdentifier$1
-android.hardware.input.InputManager
-android.hardware.input.InputManager$InputDeviceListener
-android.hardware.input.InputManager$InputDeviceListenerDelegate
-android.hardware.input.InputManager$InputDevicesChangedListener
-android.hardware.input.InputManager$OnTabletModeChangedListener
-android.hardware.input.InputManagerInternal
-android.hardware.input.KeyboardLayout
-android.hardware.input.KeyboardLayout$1
-android.hardware.input.TouchCalibration
-android.hardware.input.TouchCalibration$1
-android.hardware.location.ActivityRecognitionHardware
-android.hardware.location.ContextHubInfo
-android.hardware.location.ContextHubInfo$1
-android.hardware.location.ContextHubManager
-android.hardware.location.ContextHubManager$1
-android.hardware.location.ContextHubManager$Callback
-android.hardware.location.ContextHubManager$ICallback
-android.hardware.location.ContextHubMessage
-android.hardware.location.ContextHubMessage$1
-android.hardware.location.GeofenceHardware
-android.hardware.location.GeofenceHardware$GeofenceHardwareMonitorCallbackWrapper
-android.hardware.location.GeofenceHardwareCallback
-android.hardware.location.GeofenceHardwareImpl
-android.hardware.location.GeofenceHardwareImpl$1
-android.hardware.location.GeofenceHardwareImpl$2
-android.hardware.location.GeofenceHardwareImpl$3
-android.hardware.location.GeofenceHardwareImpl$Reaper
-android.hardware.location.GeofenceHardwareMonitorCallback
-android.hardware.location.GeofenceHardwareService
-android.hardware.location.GeofenceHardwareService$1
-android.hardware.location.IActivityRecognitionHardware
-android.hardware.location.IActivityRecognitionHardware$Stub
-android.hardware.location.IActivityRecognitionHardwareClient
-android.hardware.location.IActivityRecognitionHardwareClient$Stub
-android.hardware.location.IActivityRecognitionHardwareClient$Stub$Proxy
-android.hardware.location.IActivityRecognitionHardwareWatcher
-android.hardware.location.IContextHubCallback
-android.hardware.location.IContextHubCallback$Stub
-android.hardware.location.IContextHubCallback$Stub$Proxy
-android.hardware.location.IContextHubService
-android.hardware.location.IContextHubService$Stub
-android.hardware.location.IContextHubService$Stub$Proxy
-android.hardware.location.IFusedLocationHardware
-android.hardware.location.IGeofenceHardware
-android.hardware.location.IGeofenceHardware$Stub
-android.hardware.location.IGeofenceHardware$Stub$Proxy
-android.hardware.location.IGeofenceHardwareMonitorCallback
-android.hardware.location.IGeofenceHardwareMonitorCallback$Stub
-android.hardware.location.IGeofenceHardwareMonitorCallback$Stub$Proxy
-android.hardware.location.MemoryRegion
-android.hardware.location.MemoryRegion$1
-android.hardware.location.NanoApp
-android.hardware.location.NanoAppFilter
-android.hardware.location.NanoAppFilter$1
-android.hardware.location.NanoAppInstanceInfo
-android.hardware.location.NanoAppInstanceInfo$1
-android.hardware.radio.RadioManager
-android.hardware.radio.RadioManager$AmBandConfig
-android.hardware.radio.RadioManager$AmBandConfig$1
-android.hardware.radio.RadioManager$AmBandDescriptor
-android.hardware.radio.RadioManager$AmBandDescriptor$1
-android.hardware.radio.RadioManager$BandConfig
-android.hardware.radio.RadioManager$BandConfig$1
-android.hardware.radio.RadioManager$BandDescriptor
-android.hardware.radio.RadioManager$BandDescriptor$1
-android.hardware.radio.RadioManager$FmBandConfig
-android.hardware.radio.RadioManager$FmBandConfig$1
-android.hardware.radio.RadioManager$FmBandDescriptor
-android.hardware.radio.RadioManager$FmBandDescriptor$1
-android.hardware.radio.RadioManager$ModuleProperties
-android.hardware.radio.RadioManager$ModuleProperties$1
-android.hardware.radio.RadioManager$ProgramInfo
-android.hardware.radio.RadioManager$ProgramInfo$1
-android.hardware.radio.RadioMetadata
-android.hardware.radio.RadioMetadata$1
-android.hardware.radio.RadioModule
-android.hardware.radio.RadioTuner
-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
-android.hardware.soundtrigger.KeyphraseMetadata
-android.hardware.soundtrigger.SoundTrigger
-android.hardware.soundtrigger.SoundTrigger$ConfidenceLevel
-android.hardware.soundtrigger.SoundTrigger$ConfidenceLevel$1
-android.hardware.soundtrigger.SoundTrigger$GenericRecognitionEvent
-android.hardware.soundtrigger.SoundTrigger$GenericRecognitionEvent$1
-android.hardware.soundtrigger.SoundTrigger$GenericSoundModel
-android.hardware.soundtrigger.SoundTrigger$Keyphrase
-android.hardware.soundtrigger.SoundTrigger$Keyphrase$1
-android.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionEvent
-android.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionEvent$1
-android.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionExtra
-android.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionExtra$1
-android.hardware.soundtrigger.SoundTrigger$KeyphraseSoundModel
-android.hardware.soundtrigger.SoundTrigger$KeyphraseSoundModel$1
-android.hardware.soundtrigger.SoundTrigger$ModuleProperties
-android.hardware.soundtrigger.SoundTrigger$ModuleProperties$1
-android.hardware.soundtrigger.SoundTrigger$RecognitionConfig
-android.hardware.soundtrigger.SoundTrigger$RecognitionConfig$1
-android.hardware.soundtrigger.SoundTrigger$RecognitionEvent
-android.hardware.soundtrigger.SoundTrigger$RecognitionEvent$1
-android.hardware.soundtrigger.SoundTrigger$SoundModel
-android.hardware.soundtrigger.SoundTrigger$SoundModelEvent
-android.hardware.soundtrigger.SoundTrigger$SoundModelEvent$1
-android.hardware.soundtrigger.SoundTrigger$StatusListener
-android.hardware.soundtrigger.SoundTriggerModule
-android.hardware.usb.IUsbManager
-android.hardware.usb.IUsbManager$Stub
-android.hardware.usb.IUsbManager$Stub$Proxy
-android.hardware.usb.UsbAccessory
-android.hardware.usb.UsbDevice
-android.hardware.usb.UsbDeviceConnection
-android.hardware.usb.UsbManager
-android.hardware.usb.UsbPort
-android.hardware.usb.UsbPort$1
-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.CalendarUtil
-android.icu.impl.CalendarUtil$CalendarPreferences
-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
-android.icu.impl.CurrencyData
-android.icu.impl.CurrencyData$CurrencyDisplayInfo
-android.icu.impl.CurrencyData$CurrencyDisplayInfoProvider
-android.icu.impl.CurrencyData$CurrencySpacingInfo
-android.icu.impl.CurrencyData$CurrencySpacingInfo$SpacingPattern
-android.icu.impl.CurrencyData$CurrencySpacingInfo$SpacingType
-android.icu.impl.DateNumberFormat
-android.icu.impl.DontCareFieldPosition
-android.icu.impl.Grego
-android.icu.impl.ICUBinary
-android.icu.impl.ICUBinary$Authenticate
-android.icu.impl.ICUBinary$DatPackageReader
-android.icu.impl.ICUBinary$DatPackageReader$IsAcceptable
-android.icu.impl.ICUBinary$DataFile
-android.icu.impl.ICUBinary$PackageDataFile
-android.icu.impl.ICUCache
-android.icu.impl.ICUConfig
-android.icu.impl.ICUCurrencyDisplayInfoProvider
-android.icu.impl.ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo
-android.icu.impl.ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$SpacingInfoSink
-android.icu.impl.ICUCurrencyMetaInfo
-android.icu.impl.ICUCurrencyMetaInfo$Collector
-android.icu.impl.ICUCurrencyMetaInfo$CurrencyCollector
-android.icu.impl.ICUCurrencyMetaInfo$UniqueList
-android.icu.impl.ICUData
-android.icu.impl.ICUDebug
-android.icu.impl.ICULangDataTables
-android.icu.impl.ICULocaleService
-android.icu.impl.ICULocaleService$ICUResourceBundleFactory
-android.icu.impl.ICULocaleService$LocaleKey
-android.icu.impl.ICULocaleService$LocaleKeyFactory
-android.icu.impl.ICUNotifier
-android.icu.impl.ICURWLock
-android.icu.impl.ICURegionDataTables
-android.icu.impl.ICUResourceBundle
-android.icu.impl.ICUResourceBundle$1
-android.icu.impl.ICUResourceBundle$2
-android.icu.impl.ICUResourceBundle$3
-android.icu.impl.ICUResourceBundle$3$1
-android.icu.impl.ICUResourceBundle$4
-android.icu.impl.ICUResourceBundle$AvailEntry
-android.icu.impl.ICUResourceBundle$Loader
-android.icu.impl.ICUResourceBundle$OpenType
-android.icu.impl.ICUResourceBundle$WholeBundle
-android.icu.impl.ICUResourceBundleImpl
-android.icu.impl.ICUResourceBundleImpl$ResourceArray
-android.icu.impl.ICUResourceBundleImpl$ResourceBinary
-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
-android.icu.impl.ICUResourceBundleReader$Array
-android.icu.impl.ICUResourceBundleReader$Array16
-android.icu.impl.ICUResourceBundleReader$Array32
-android.icu.impl.ICUResourceBundleReader$Container
-android.icu.impl.ICUResourceBundleReader$IsAcceptable
-android.icu.impl.ICUResourceBundleReader$ReaderCache
-android.icu.impl.ICUResourceBundleReader$ReaderCacheKey
-android.icu.impl.ICUResourceBundleReader$ReaderValue
-android.icu.impl.ICUResourceBundleReader$ResourceCache
-android.icu.impl.ICUResourceBundleReader$ResourceCache$Level
-android.icu.impl.ICUResourceBundleReader$Table
-android.icu.impl.ICUResourceBundleReader$Table16
-android.icu.impl.ICUResourceBundleReader$Table1632
-android.icu.impl.ICUResourceTableAccess
-android.icu.impl.ICUService
-android.icu.impl.ICUService$CacheEntry
-android.icu.impl.ICUService$Factory
-android.icu.impl.ICUService$Key
-android.icu.impl.IDNA2003
-android.icu.impl.JavaTimeZone
-android.icu.impl.LocaleDisplayNamesImpl
-android.icu.impl.LocaleDisplayNamesImpl$Cache
-android.icu.impl.LocaleDisplayNamesImpl$CapitalizationContextUsage
-android.icu.impl.LocaleDisplayNamesImpl$DataTable
-android.icu.impl.LocaleDisplayNamesImpl$DataTables
-android.icu.impl.LocaleDisplayNamesImpl$ICUDataTable
-android.icu.impl.LocaleDisplayNamesImpl$ICUDataTables
-android.icu.impl.LocaleDisplayNamesImpl$LangDataTables
-android.icu.impl.LocaleDisplayNamesImpl$RegionDataTables
-android.icu.impl.LocaleIDParser
-android.icu.impl.LocaleIDs
-android.icu.impl.Norm2AllModes
-android.icu.impl.Norm2AllModes$1
-android.icu.impl.Norm2AllModes$ComposeNormalizer2
-android.icu.impl.Norm2AllModes$DecomposeNormalizer2
-android.icu.impl.Norm2AllModes$FCDNormalizer2
-android.icu.impl.Norm2AllModes$NFCSingleton
-android.icu.impl.Norm2AllModes$NFKCSingleton
-android.icu.impl.Norm2AllModes$NoopNormalizer2
-android.icu.impl.Norm2AllModes$Norm2AllModesSingleton
-android.icu.impl.Norm2AllModes$Normalizer2WithImpl
-android.icu.impl.Normalizer2Impl
-android.icu.impl.Normalizer2Impl$1
-android.icu.impl.Normalizer2Impl$IsAcceptable
-android.icu.impl.Normalizer2Impl$ReorderingBuffer
-android.icu.impl.OlsonTimeZone
-android.icu.impl.Pair
-android.icu.impl.PatternProps
-android.icu.impl.PatternTokenizer
-android.icu.impl.PluralRulesLoader
-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
-android.icu.impl.Trie
-android.icu.impl.Trie$DataManipulate
-android.icu.impl.Trie$DefaultGetFoldingOffset
-android.icu.impl.Trie2
-android.icu.impl.Trie2$1
-android.icu.impl.Trie2$Range
-android.icu.impl.Trie2$Trie2Iterator
-android.icu.impl.Trie2$UTrie2Header
-android.icu.impl.Trie2$ValueMapper
-android.icu.impl.Trie2$ValueWidth
-android.icu.impl.Trie2_16
-android.icu.impl.Trie2_32
-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
-android.icu.impl.UCharacterProperty$11
-android.icu.impl.UCharacterProperty$12
-android.icu.impl.UCharacterProperty$13
-android.icu.impl.UCharacterProperty$14
-android.icu.impl.UCharacterProperty$15
-android.icu.impl.UCharacterProperty$16
-android.icu.impl.UCharacterProperty$17
-android.icu.impl.UCharacterProperty$18
-android.icu.impl.UCharacterProperty$19
-android.icu.impl.UCharacterProperty$2
-android.icu.impl.UCharacterProperty$20
-android.icu.impl.UCharacterProperty$21
-android.icu.impl.UCharacterProperty$22
-android.icu.impl.UCharacterProperty$23
-android.icu.impl.UCharacterProperty$3
-android.icu.impl.UCharacterProperty$4
-android.icu.impl.UCharacterProperty$5
-android.icu.impl.UCharacterProperty$6
-android.icu.impl.UCharacterProperty$7
-android.icu.impl.UCharacterProperty$8
-android.icu.impl.UCharacterProperty$9
-android.icu.impl.UCharacterProperty$BiDiIntProperty
-android.icu.impl.UCharacterProperty$BinaryProperty
-android.icu.impl.UCharacterProperty$CaseBinaryProperty
-android.icu.impl.UCharacterProperty$CombiningClassIntProperty
-android.icu.impl.UCharacterProperty$IntProperty
-android.icu.impl.UCharacterProperty$IsAcceptable
-android.icu.impl.UCharacterProperty$NormInertBinaryProperty
-android.icu.impl.UCharacterProperty$NormQuickCheckIntProperty
-android.icu.impl.UPropertyAliases
-android.icu.impl.UPropertyAliases$IsAcceptable
-android.icu.impl.URLHandler$URLVisitor
-android.icu.impl.UResource$Array
-android.icu.impl.UResource$Key
-android.icu.impl.UResource$Sink
-android.icu.impl.UResource$Table
-android.icu.impl.UResource$Value
-android.icu.impl.USerializedSet
-android.icu.impl.Utility
-android.icu.impl.ZoneMeta
-android.icu.impl.ZoneMeta$CustomTimeZoneCache
-android.icu.impl.ZoneMeta$SystemTimeZoneCache
-android.icu.impl.coll.Collation
-android.icu.impl.coll.CollationCompare
-android.icu.impl.coll.CollationData
-android.icu.impl.coll.CollationDataReader
-android.icu.impl.coll.CollationDataReader$IsAcceptable
-android.icu.impl.coll.CollationFCD
-android.icu.impl.coll.CollationFastLatin
-android.icu.impl.coll.CollationIterator
-android.icu.impl.coll.CollationIterator$CEBuffer
-android.icu.impl.coll.CollationKeys
-android.icu.impl.coll.CollationKeys$LevelCallback
-android.icu.impl.coll.CollationKeys$SortKeyByteSink
-android.icu.impl.coll.CollationLoader
-android.icu.impl.coll.CollationRoot
-android.icu.impl.coll.CollationSettings
-android.icu.impl.coll.CollationTailoring
-android.icu.impl.coll.ContractionsAndExpansions
-android.icu.impl.coll.FCDUTF16CollationIterator
-android.icu.impl.coll.SharedObject
-android.icu.impl.coll.SharedObject$Reference
-android.icu.impl.coll.UTF16CollationIterator
-android.icu.impl.locale.AsciiUtil
-android.icu.impl.locale.BaseLocale
-android.icu.impl.locale.BaseLocale$Cache
-android.icu.impl.locale.BaseLocale$Key
-android.icu.impl.locale.LocaleObjectCache
-android.icu.impl.locale.LocaleObjectCache$CacheEntry
-android.icu.impl.locale.LocaleSyntaxException
-android.icu.lang.UCharacter
-android.icu.lang.UCharacterEnums$ECharacterCategory
-android.icu.lang.UCharacterEnums$ECharacterDirection
-android.icu.lang.UScript
-android.icu.lang.UScript$ScriptUsage
-android.icu.math.BigDecimal
-android.icu.math.MathContext
-android.icu.text.AlphabeticIndex
-android.icu.text.AlphabeticIndex$1
-android.icu.text.AlphabeticIndex$Bucket
-android.icu.text.AlphabeticIndex$Bucket$LabelType
-android.icu.text.AlphabeticIndex$BucketList
-android.icu.text.AlphabeticIndex$ImmutableIndex
-android.icu.text.Bidi
-android.icu.text.Bidi$ImpTabPair
-android.icu.text.BreakIterator
-android.icu.text.BreakIterator$BreakIteratorCache
-android.icu.text.BreakIterator$BreakIteratorServiceShim
-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
-android.icu.text.CollatorServiceShim
-android.icu.text.CollatorServiceShim$CService
-android.icu.text.CollatorServiceShim$CService$1CollatorFactory
-android.icu.text.CurrencyDisplayNames
-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
-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.DateIntervalFormat
-android.icu.text.DateIntervalFormat$BestMatchInfo
-android.icu.text.DateIntervalFormat$SkeletonAndItsBestMatch
-android.icu.text.DateIntervalInfo
-android.icu.text.DateIntervalInfo$DateIntervalSink
-android.icu.text.DateIntervalInfo$PatternInfo
-android.icu.text.DateTimePatternGenerator
-android.icu.text.DateTimePatternGenerator$AppendItemFormatsSink
-android.icu.text.DateTimePatternGenerator$AppendItemNamesSink
-android.icu.text.DateTimePatternGenerator$AvailableFormatsSink
-android.icu.text.DateTimePatternGenerator$DTPGflags
-android.icu.text.DateTimePatternGenerator$DateTimeMatcher
-android.icu.text.DateTimePatternGenerator$DayPeriodAllowedHoursSink
-android.icu.text.DateTimePatternGenerator$DistanceInfo
-android.icu.text.DateTimePatternGenerator$FormatParser
-android.icu.text.DateTimePatternGenerator$PatternInfo
-android.icu.text.DateTimePatternGenerator$PatternWithMatcher
-android.icu.text.DateTimePatternGenerator$PatternWithSkeletonFlag
-android.icu.text.DateTimePatternGenerator$SkeletonFields
-android.icu.text.DateTimePatternGenerator$VariableField
-android.icu.text.DecimalFormat
-android.icu.text.DecimalFormat$Unit
-android.icu.text.DecimalFormatSymbols
-android.icu.text.DecimalFormatSymbols$1
-android.icu.text.DecimalFormatSymbols$CacheData
-android.icu.text.DecimalFormatSymbols$DecFmtDataSink
-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$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
-android.icu.text.Normalizer$ModeImpl
-android.icu.text.Normalizer$NFCMode
-android.icu.text.Normalizer$NFCModeImpl
-android.icu.text.Normalizer$NFDMode
-android.icu.text.Normalizer$NFKCMode
-android.icu.text.Normalizer$NFKDMode
-android.icu.text.Normalizer$NFKDModeImpl
-android.icu.text.Normalizer$NONEMode
-android.icu.text.Normalizer$QuickCheckResult
-android.icu.text.Normalizer2
-android.icu.text.NumberFormat
-android.icu.text.NumberFormat$Field
-android.icu.text.NumberFormat$NumberFormatShim
-android.icu.text.NumberFormatServiceShim
-android.icu.text.NumberFormatServiceShim$NFService
-android.icu.text.NumberFormatServiceShim$NFService$1RBNumberFormatFactory
-android.icu.text.NumberingSystem
-android.icu.text.NumberingSystem$1
-android.icu.text.NumberingSystem$2
-android.icu.text.NumberingSystem$LocaleLookupData
-android.icu.text.PluralRanges
-android.icu.text.PluralRanges$Matrix
-android.icu.text.PluralRules
-android.icu.text.PluralRules$1
-android.icu.text.PluralRules$AndConstraint
-android.icu.text.PluralRules$BinaryConstraint
-android.icu.text.PluralRules$Constraint
-android.icu.text.PluralRules$Factory
-android.icu.text.PluralRules$FixedDecimal
-android.icu.text.PluralRules$FixedDecimalRange
-android.icu.text.PluralRules$FixedDecimalSamples
-android.icu.text.PluralRules$Operand
-android.icu.text.PluralRules$PluralType
-android.icu.text.PluralRules$RangeConstraint
-android.icu.text.PluralRules$Rule
-android.icu.text.PluralRules$RuleList
-android.icu.text.PluralRules$SampleType
-android.icu.text.PluralRules$SimpleTokenizer
-android.icu.text.QuantityFormatter
-android.icu.text.RBBIDataWrapper
-android.icu.text.RBBIDataWrapper$IsAcceptable
-android.icu.text.RBBIDataWrapper$RBBIDataHeader
-android.icu.text.RBBIDataWrapper$TrieFoldingFunc
-android.icu.text.RawCollationKey
-android.icu.text.RelativeDateTimeFormatter
-android.icu.text.RelativeDateTimeFormatter$AbsoluteUnit
-android.icu.text.RelativeDateTimeFormatter$Cache
-android.icu.text.RelativeDateTimeFormatter$Cache$1
-android.icu.text.RelativeDateTimeFormatter$Direction
-android.icu.text.RelativeDateTimeFormatter$Loader
-android.icu.text.RelativeDateTimeFormatter$RelDateTimeDataSink
-android.icu.text.RelativeDateTimeFormatter$RelDateTimeDataSink$DateTimeUnit
-android.icu.text.RelativeDateTimeFormatter$RelativeDateTimeFormatterData
-android.icu.text.RelativeDateTimeFormatter$RelativeUnit
-android.icu.text.RelativeDateTimeFormatter$Style
-android.icu.text.Replaceable
-android.icu.text.ReplaceableString
-android.icu.text.RuleBasedBreakIterator
-android.icu.text.RuleBasedBreakIterator$LookAheadResults
-android.icu.text.RuleBasedCollator
-android.icu.text.RuleBasedCollator$CollationBuffer
-android.icu.text.RuleBasedCollator$CollationKeyByteSink
-android.icu.text.RuleBasedCollator$FCDUTF16NFDIterator
-android.icu.text.RuleBasedCollator$NFDIterator
-android.icu.text.RuleBasedCollator$UTF16NFDIterator
-android.icu.text.SimpleDateFormat
-android.icu.text.SimpleDateFormat$PatternItem
-android.icu.text.StringPrep
-android.icu.text.StringPrepParseException
-android.icu.text.TimeZoneNames$NameType
-android.icu.text.UCharacterIterator
-android.icu.text.UFieldPosition
-android.icu.text.UFormat
-android.icu.text.UForwardCharacterIterator
-android.icu.text.UTF16
-android.icu.text.UTF16$StringComparator
-android.icu.text.UnhandledBreakEngine
-android.icu.text.UnicodeFilter
-android.icu.text.UnicodeMatcher
-android.icu.text.UnicodeSet
-android.icu.text.UnicodeSet$Filter
-android.icu.text.UnicodeSet$GeneralCategoryMaskFilter
-android.icu.text.UnicodeSet$IntPropertyFilter
-android.icu.text.UnicodeSet$UnicodeSetIterator2
-android.icu.util.BasicTimeZone
-android.icu.util.ByteArrayWrapper
-android.icu.util.BytesTrie
-android.icu.util.BytesTrie$Result
-android.icu.util.Calendar
-android.icu.util.Calendar$CalType
-android.icu.util.Calendar$FormatConfiguration
-android.icu.util.Calendar$PatternData
-android.icu.util.Calendar$WeekData
-android.icu.util.Calendar$WeekDataCache
-android.icu.util.CharsTrie
-android.icu.util.CharsTrie$Entry
-android.icu.util.CharsTrie$Iterator
-android.icu.util.Currency
-android.icu.util.Currency$1
-android.icu.util.Currency$CurrencyUsage
-android.icu.util.Currency$EquivalenceRelation
-android.icu.util.CurrencyAmount
-android.icu.util.Freezable
-android.icu.util.GregorianCalendar
-android.icu.util.ICUException
-android.icu.util.ICUUncheckedIOException
-android.icu.util.LocaleData
-android.icu.util.Measure
-android.icu.util.MeasureUnit
-android.icu.util.MeasureUnit$1
-android.icu.util.MeasureUnit$2
-android.icu.util.MeasureUnit$3
-android.icu.util.MeasureUnit$Factory
-android.icu.util.Output
-android.icu.util.SimpleTimeZone
-android.icu.util.TimeUnit
-android.icu.util.TimeZone
-android.icu.util.TimeZone$ConstantZone
-android.icu.util.ULocale
-android.icu.util.ULocale$1
-android.icu.util.ULocale$2
-android.icu.util.ULocale$Category
-android.icu.util.ULocale$JDKLocaleHelper
-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.inputmethodservice.AbstractInputMethodService
-android.inputmethodservice.AbstractInputMethodService$AbstractInputMethodImpl
-android.inputmethodservice.AbstractInputMethodService$AbstractInputMethodSessionImpl
-android.inputmethodservice.IInputMethodSessionWrapper
-android.inputmethodservice.IInputMethodSessionWrapper$ImeInputEventReceiver
-android.inputmethodservice.IInputMethodWrapper
-android.inputmethodservice.IInputMethodWrapper$InputMethodSessionCallbackWrapper
-android.inputmethodservice.InputMethodService
-android.inputmethodservice.InputMethodService$1
-android.inputmethodservice.InputMethodService$2
-android.inputmethodservice.InputMethodService$InputMethodImpl
-android.inputmethodservice.InputMethodService$InputMethodSessionImpl
-android.inputmethodservice.InputMethodService$Insets
-android.inputmethodservice.InputMethodService$SettingsObserver
-android.inputmethodservice.SoftInputWindow
-android.location.Address
-android.location.Address$1
-android.location.BatchedLocationCallbackTransport
-android.location.BatchedLocationCallbackTransport$CallbackTransport
-android.location.Country
-android.location.Country$1
-android.location.CountryDetector
-android.location.CountryDetector$ListenerTransport
-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
-android.location.Geofence
-android.location.GnssMeasurementCallbackTransport
-android.location.GnssMeasurementCallbackTransport$ListenerTransport
-android.location.GnssNavigationMessageCallbackTransport
-android.location.GnssNavigationMessageCallbackTransport$ListenerTransport
-android.location.GnssStatus
-android.location.GnssStatus$Callback
-android.location.GpsSatellite
-android.location.GpsStatus
-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
-android.location.ICountryListener
-android.location.ICountryListener$Stub
-android.location.ICountryListener$Stub$Proxy
-android.location.IFusedProvider
-android.location.IFusedProvider$Stub
-android.location.IGeocodeProvider
-android.location.IGeocodeProvider$Stub
-android.location.IGeocodeProvider$Stub$Proxy
-android.location.IGeofenceProvider
-android.location.IGeofenceProvider$Stub
-android.location.IGeofenceProvider$Stub$Proxy
-android.location.IGnssMeasurementsListener
-android.location.IGnssMeasurementsListener$Stub
-android.location.IGnssNavigationMessageListener
-android.location.IGnssNavigationMessageListener$Stub
-android.location.IGnssStatusListener
-android.location.IGnssStatusListener$Stub
-android.location.IGnssStatusListener$Stub$Proxy
-android.location.IGnssStatusProvider
-android.location.IGnssStatusProvider$Stub
-android.location.IGpsGeofenceHardware
-android.location.IGpsGeofenceHardware$Stub
-android.location.ILocationListener
-android.location.ILocationListener$Stub
-android.location.ILocationListener$Stub$Proxy
-android.location.ILocationManager
-android.location.ILocationManager$Stub
-android.location.ILocationManager$Stub$Proxy
-android.location.INetInitiatedListener
-android.location.INetInitiatedListener$Stub
-android.location.LocalListenerHelper
-android.location.Location
-android.location.Location$1
-android.location.Location$2
-android.location.Location$BearingDistanceCache
-android.location.LocationListener
-android.location.LocationManager
-android.location.LocationManager$GnssStatusListenerTransport
-android.location.LocationManager$GnssStatusListenerTransport$1
-android.location.LocationManager$GnssStatusListenerTransport$GnssHandler
-android.location.LocationManager$ListenerTransport
-android.location.LocationManager$ListenerTransport$1
-android.location.LocationManager$ListenerTransport$2
-android.location.LocationProvider
-android.location.LocationRequest
-android.location.LocationRequest$1
-android.media.AudioAttributes
-android.media.AudioAttributes$1
-android.media.AudioAttributes$Builder
-android.media.AudioDeviceCallback
-android.media.AudioDeviceInfo
-android.media.AudioDevicePort
-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
-android.media.AudioGain
-android.media.AudioGainConfig
-android.media.AudioHandle
-android.media.AudioManager
-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
-android.media.AudioManager$OnAudioFocusChangeListener
-android.media.AudioManager$OnAudioPortUpdateListener
-android.media.AudioManager$ServiceEventHandlerDelegate
-android.media.AudioManager$ServiceEventHandlerDelegate$1
-android.media.AudioManagerInternal
-android.media.AudioManagerInternal$RingerModeDelegate
-android.media.AudioMixPort
-android.media.AudioMixPortConfig
-android.media.AudioPatch
-android.media.AudioPlaybackConfiguration
-android.media.AudioPlaybackConfiguration$1
-android.media.AudioPlaybackConfiguration$IPlayerShell
-android.media.AudioPlaybackConfiguration$PlayerDeathMonitor
-android.media.AudioPort
-android.media.AudioPortConfig
-android.media.AudioPortEventHandler
-android.media.AudioPortEventHandler$1
-android.media.AudioRecord
-android.media.AudioRoutesInfo
-android.media.AudioRoutesInfo$1
-android.media.AudioRouting
-android.media.AudioSystem
-android.media.AudioSystem$AudioRecordingCallback
-android.media.AudioSystem$DynamicPolicyCallback
-android.media.AudioSystem$ErrorCallback
-android.media.AudioTimestamp
-android.media.AudioTrack
-android.media.BufferingParams
-android.media.BufferingParams$1
-android.media.CamcorderProfile
-android.media.CameraProfile
-android.media.DecoderCapabilities
-android.media.DeniedByServerException
-android.media.EncoderCapabilities
-android.media.ExifInterface
-android.media.ExifInterface$ByteOrderedDataInputStream
-android.media.ExifInterface$ExifAttribute
-android.media.ExifInterface$ExifTag
-android.media.IAudioFocusDispatcher
-android.media.IAudioFocusDispatcher$Stub
-android.media.IAudioFocusDispatcher$Stub$Proxy
-android.media.IAudioRoutesObserver
-android.media.IAudioRoutesObserver$Stub
-android.media.IAudioRoutesObserver$Stub$Proxy
-android.media.IAudioService
-android.media.IAudioService$Stub
-android.media.IAudioService$Stub$Proxy
-android.media.IMediaHTTPConnection
-android.media.IMediaHTTPConnection$Stub
-android.media.IMediaHTTPService
-android.media.IMediaHTTPService$Stub
-android.media.IMediaResourceMonitor
-android.media.IMediaResourceMonitor$Stub
-android.media.IMediaRouterClient
-android.media.IMediaRouterClient$Stub
-android.media.IMediaRouterClient$Stub$Proxy
-android.media.IMediaRouterService
-android.media.IMediaRouterService$Stub
-android.media.IMediaRouterService$Stub$Proxy
-android.media.IPlaybackConfigDispatcher
-android.media.IPlaybackConfigDispatcher$Stub
-android.media.IPlayer
-android.media.IPlayer$Stub
-android.media.IPlayer$Stub$Proxy
-android.media.IRecordingConfigDispatcher
-android.media.IRecordingConfigDispatcher$Stub
-android.media.IRemoteVolumeController
-android.media.IRemoteVolumeController$Stub
-android.media.IRemoteVolumeController$Stub$Proxy
-android.media.IRemoteVolumeObserver
-android.media.IRemoteVolumeObserver$Stub
-android.media.IRingtonePlayer
-android.media.IRingtonePlayer$Stub
-android.media.IRingtonePlayer$Stub$Proxy
-android.media.IVolumeController
-android.media.IVolumeController$Stub
-android.media.IVolumeController$Stub$Proxy
-android.media.Image
-android.media.Image$Plane
-android.media.ImageReader
-android.media.ImageReader$ListenerHandler
-android.media.ImageReader$OnImageAvailableListener
-android.media.ImageReader$SurfaceImage
-android.media.ImageReader$SurfaceImage$SurfacePlane
-android.media.ImageUtils
-android.media.ImageWriter
-android.media.ImageWriter$ListenerHandler
-android.media.ImageWriter$OnImageReleasedListener
-android.media.ImageWriter$WriterSurfaceImage
-android.media.ImageWriter$WriterSurfaceImage$SurfacePlane
-android.media.JetPlayer
-android.media.MediaCodec
-android.media.MediaCodec$BufferInfo
-android.media.MediaCodec$BufferMap
-android.media.MediaCodec$BufferMap$CodecBuffer
-android.media.MediaCodec$CodecException
-android.media.MediaCodec$CryptoException
-android.media.MediaCodec$CryptoInfo
-android.media.MediaCodec$CryptoInfo$Pattern
-android.media.MediaCodec$EventHandler
-android.media.MediaCodec$PersistentSurface
-android.media.MediaCodecInfo
-android.media.MediaCodecInfo$AudioCapabilities
-android.media.MediaCodecInfo$CodecCapabilities
-android.media.MediaCodecInfo$CodecProfileLevel
-android.media.MediaCodecInfo$EncoderCapabilities
-android.media.MediaCodecInfo$Feature
-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$EventHandler
-android.media.MediaDrm$KeyRequest
-android.media.MediaDrm$MediaDrmStateException
-android.media.MediaDrm$OnEventListener
-android.media.MediaDrm$ProvisionRequest
-android.media.MediaDrmException
-android.media.MediaExtractor
-android.media.MediaFile
-android.media.MediaFile$MediaFileType
-android.media.MediaFormat
-android.media.MediaHTTPConnection
-android.media.MediaHTTPService
-android.media.MediaMetadata
-android.media.MediaMetadata$1
-android.media.MediaMetadata$Builder
-android.media.MediaMetadataRetriever
-android.media.MediaMuxer
-android.media.MediaPlayer
-android.media.MediaPlayer$1
-android.media.MediaPlayer$2
-android.media.MediaPlayer$4
-android.media.MediaPlayer$4$1
-android.media.MediaPlayer$EventHandler
-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$TimeProvider
-android.media.MediaPlayer$TimeProvider$EventHandler
-android.media.MediaPlayer$TrackInfo
-android.media.MediaPlayer$TrackInfo$1
-android.media.MediaRecorder
-android.media.MediaRecorder$EventHandler
-android.media.MediaRecorder$OnErrorListener
-android.media.MediaRouter
-android.media.MediaRouter$Callback
-android.media.MediaRouter$CallbackInfo
-android.media.MediaRouter$RouteCategory
-android.media.MediaRouter$RouteGroup
-android.media.MediaRouter$RouteInfo
-android.media.MediaRouter$RouteInfo$1
-android.media.MediaRouter$SimpleCallback
-android.media.MediaRouter$Static
-android.media.MediaRouter$Static$1
-android.media.MediaRouter$Static$Client
-android.media.MediaRouter$Static$Client$1
-android.media.MediaRouter$VolumeCallback
-android.media.MediaRouter$VolumeChangeReceiver
-android.media.MediaRouter$WifiDisplayStatusChangedReceiver
-android.media.MediaRouterClientState
-android.media.MediaRouterClientState$1
-android.media.MediaRouterClientState$RouteInfo
-android.media.MediaRouterClientState$RouteInfo$1
-android.media.MediaScanner
-android.media.MediaScannerConnection
-android.media.MediaScannerConnection$OnScanCompletedListener
-android.media.MediaSync
-android.media.MediaTimeProvider
-android.media.MediaTimeProvider$OnMediaTimeListener
-android.media.MiniThumbFile
-android.media.NotProvisionedException
-android.media.PlaybackParams
-android.media.PlaybackParams$1
-android.media.PlayerBase
-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.RemoteDisplay
-android.media.ResampleInputStream
-android.media.SoundPool
-android.media.SoundPool$Builder
-android.media.SoundPool$EventHandler
-android.media.SoundPool$OnLoadCompleteListener
-android.media.SubtitleController
-android.media.SubtitleController$1
-android.media.SubtitleController$2
-android.media.SubtitleController$Anchor
-android.media.SubtitleController$Listener
-android.media.SubtitleTrack
-android.media.SyncParams
-android.media.ThumbnailUtils
-android.media.ThumbnailUtils$SizedThumbnailBitmap
-android.media.ToneGenerator
-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.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.LoudnessEnhancer
-android.media.audiofx.Virtualizer
-android.media.audiofx.Visualizer
-android.media.audiopolicy.AudioMix
-android.media.audiopolicy.AudioMixingRule
-android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
-android.media.audiopolicy.AudioPolicyConfig
-android.media.audiopolicy.IAudioPolicyCallback
-android.media.audiopolicy.IAudioPolicyCallback$Stub
-android.media.browse.MediaBrowser
-android.media.browse.MediaBrowser$1
-android.media.browse.MediaBrowser$2
-android.media.browse.MediaBrowser$6
-android.media.browse.MediaBrowser$ConnectionCallback
-android.media.browse.MediaBrowser$MediaServiceConnection
-android.media.browse.MediaBrowser$MediaServiceConnection$1
-android.media.browse.MediaBrowser$ServiceCallbacks
-android.media.midi.IMidiDeviceListener
-android.media.midi.IMidiDeviceOpenCallback
-android.media.midi.IMidiDeviceServer
-android.media.midi.IMidiManager
-android.media.midi.IMidiManager$Stub
-android.media.midi.MidiDeviceInfo
-android.media.midi.MidiDeviceStatus
-android.media.midi.MidiManager
-android.media.projection.IMediaProjection
-android.media.projection.IMediaProjectionManager
-android.media.projection.IMediaProjectionManager$Stub
-android.media.projection.IMediaProjectionManager$Stub$Proxy
-android.media.projection.IMediaProjectionWatcherCallback
-android.media.projection.IMediaProjectionWatcherCallback$Stub
-android.media.projection.IMediaProjectionWatcherCallback$Stub$Proxy
-android.media.projection.MediaProjectionInfo
-android.media.projection.MediaProjectionManager
-android.media.projection.MediaProjectionManager$Callback
-android.media.projection.MediaProjectionManager$CallbackDelegate
-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
-android.media.session.ISession$Stub
-android.media.session.ISession$Stub$Proxy
-android.media.session.ISessionCallback
-android.media.session.ISessionCallback$Stub
-android.media.session.ISessionCallback$Stub$Proxy
-android.media.session.ISessionController
-android.media.session.ISessionController$Stub
-android.media.session.ISessionController$Stub$Proxy
-android.media.session.ISessionControllerCallback
-android.media.session.ISessionControllerCallback$Stub
-android.media.session.ISessionControllerCallback$Stub$Proxy
-android.media.session.ISessionManager
-android.media.session.ISessionManager$Stub
-android.media.session.ISessionManager$Stub$Proxy
-android.media.session.MediaController
-android.media.session.MediaController$Callback
-android.media.session.MediaController$CallbackStub
-android.media.session.MediaController$MessageHandler
-android.media.session.MediaController$PlaybackInfo
-android.media.session.MediaController$TransportControls
-android.media.session.MediaSession
-android.media.session.MediaSession$Callback
-android.media.session.MediaSession$CallbackMessageHandler
-android.media.session.MediaSession$CallbackStub
-android.media.session.MediaSession$QueueItem
-android.media.session.MediaSession$QueueItem$1
-android.media.session.MediaSession$Token
-android.media.session.MediaSession$Token$1
-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
-android.media.session.MediaSessionManager$SessionsChangedWrapper$1$1
-android.media.session.ParcelableVolumeInfo
-android.media.session.ParcelableVolumeInfo$1
-android.media.session.PlaybackState
-android.media.session.PlaybackState$1
-android.media.session.PlaybackState$Builder
-android.media.session.PlaybackState$CustomAction
-android.media.session.PlaybackState$CustomAction$1
-android.media.session.PlaybackState$CustomAction$Builder
-android.media.soundtrigger.SoundTriggerManager
-android.media.tv.TvInputHardwareInfo$Builder
-android.media.tv.TvInputManager
-android.media.tv.TvStreamConfig
-android.media.tv.TvStreamConfig$Builder
-android.metrics.LogMaker
-android.mtp.MtpDatabase
-android.mtp.MtpDevice
-android.mtp.MtpDeviceInfo
-android.mtp.MtpEvent
-android.mtp.MtpObjectInfo
-android.mtp.MtpPropertyGroup
-android.mtp.MtpPropertyList
-android.mtp.MtpServer
-android.mtp.MtpStorage
-android.mtp.MtpStorageInfo
-android.net.ConnectivityManager
-android.net.ConnectivityManager$CallbackHandler
-android.net.ConnectivityManager$NetworkCallback
-android.net.ConnectivityManager$OnNetworkActiveListener
-android.net.ConnectivityManager$PacketKeepaliveCallback
-android.net.ConnectivityMetricsEvent
-android.net.ConnectivityMetricsEvent$1
-android.net.ConnectivityThread
-android.net.ConnectivityThread$Singleton
-android.net.Credentials
-android.net.DataUsageRequest
-android.net.DhcpInfo
-android.net.DhcpInfo$1
-android.net.DhcpResults
-android.net.DhcpResults$1
-android.net.EthernetManager
-android.net.EthernetManager$1
-android.net.EthernetManager$2
-android.net.EventLogTags
-android.net.IConnectivityManager
-android.net.IConnectivityManager$Stub
-android.net.IConnectivityManager$Stub$Proxy
-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
-android.net.INetdEventCallback
-android.net.INetworkManagementEventObserver
-android.net.INetworkManagementEventObserver$Stub
-android.net.INetworkPolicyListener
-android.net.INetworkPolicyListener$Stub
-android.net.INetworkPolicyListener$Stub$Proxy
-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
-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.INetworkStatsSession
-android.net.InterfaceConfiguration
-android.net.InterfaceConfiguration$1
-android.net.IpConfiguration
-android.net.IpConfiguration$1
-android.net.IpConfiguration$IpAssignment
-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
-android.net.LinkProperties$1
-android.net.LinkProperties$CompareResult
-android.net.LinkProperties$ProvisioningChange
-android.net.LocalServerSocket
-android.net.LocalSocket
-android.net.LocalSocketAddress
-android.net.LocalSocketAddress$Namespace
-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.NetworkCapabilities
-android.net.NetworkCapabilities$1
-android.net.NetworkConfig
-android.net.NetworkFactory
-android.net.NetworkFactory$NetworkRequestInfo
-android.net.NetworkIdentity
-android.net.NetworkInfo
-android.net.NetworkInfo$1
-android.net.NetworkInfo$DetailedState
-android.net.NetworkInfo$State
-android.net.NetworkKey
-android.net.NetworkKey$1
-android.net.NetworkMisc
-android.net.NetworkMisc$1
-android.net.NetworkPolicy
-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.NetworkScorerAppData
-android.net.NetworkScorerAppData$1
-android.net.NetworkSpecifier
-android.net.NetworkState
-android.net.NetworkState$1
-android.net.NetworkStats
-android.net.NetworkStats$1
-android.net.NetworkStats$Entry
-android.net.NetworkStats$NonMonotonicObserver
-android.net.NetworkStatsHistory
-android.net.NetworkStatsHistory$1
-android.net.NetworkStatsHistory$DataStreamUtils
-android.net.NetworkStatsHistory$Entry
-android.net.NetworkTemplate
-android.net.NetworkTemplate$1
-android.net.NetworkUtils
-android.net.ParseException
-android.net.Proxy
-android.net.ProxyInfo
-android.net.ProxyInfo$1
-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.SntpClient
-android.net.StaticIpConfiguration
-android.net.StaticIpConfiguration$1
-android.net.StringNetworkSpecifier
-android.net.StringNetworkSpecifier$1
-android.net.TrafficStats
-android.net.UidRange
-android.net.Uri
-android.net.Uri$1
-android.net.Uri$AbstractHierarchicalUri
-android.net.Uri$AbstractPart
-android.net.Uri$Builder
-android.net.Uri$HierarchicalUri
-android.net.Uri$OpaqueUri
-android.net.Uri$Part
-android.net.Uri$Part$EmptyPart
-android.net.Uri$PathPart
-android.net.Uri$PathSegments
-android.net.Uri$PathSegmentsBuilder
-android.net.Uri$StringUri
-android.net.WebAddress
-android.net.WifiKey
-android.net.WifiKey$1
-android.net.http.AndroidHttpClient
-android.net.http.AndroidHttpClient$1
-android.net.http.AndroidHttpClient$2
-android.net.http.AndroidHttpClient$CurlLogger
-android.net.http.AndroidHttpClient$LoggingConfiguration
-android.net.http.HttpResponseCache
-android.net.http.SslCertificate
-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.IpConnectivityLog
-android.net.metrics.IpManagerEvent
-android.net.metrics.IpManagerEvent$1
-android.net.metrics.NetworkEvent
-android.net.metrics.NetworkEvent$1
-android.net.metrics.RaEvent
-android.net.metrics.RaEvent$1
-android.net.metrics.RaEvent$Builder
-android.net.metrics.ValidationProbeEvent
-android.net.metrics.ValidationProbeEvent$1
-android.net.metrics.ValidationProbeEvent$Decoder
-android.net.nsd.INsdManager
-android.net.nsd.INsdManager$Stub
-android.net.nsd.NsdManager
-android.net.sip.ISipService
-android.net.sip.ISipService$Stub
-android.net.sip.SipManager
-android.net.wifi.IRttManager
-android.net.wifi.IRttManager$Stub
-android.net.wifi.IWifiManager
-android.net.wifi.IWifiManager$Stub
-android.net.wifi.IWifiManager$Stub$Proxy
-android.net.wifi.IWifiScanner
-android.net.wifi.IWifiScanner$Stub
-android.net.wifi.IWifiScanner$Stub$Proxy
-android.net.wifi.ParcelUtil
-android.net.wifi.RttManager
-android.net.wifi.RttManager$RttCapabilities
-android.net.wifi.RttManager$RttListener
-android.net.wifi.RttManager$RttResult
-android.net.wifi.ScanResult
-android.net.wifi.ScanResult$1
-android.net.wifi.ScanResult$InformationElement
-android.net.wifi.ScanSettings
-android.net.wifi.SupplicantState
-android.net.wifi.SupplicantState$1
-android.net.wifi.WifiActivityEnergyInfo
-android.net.wifi.WifiActivityEnergyInfo$1
-android.net.wifi.WifiConfiguration
-android.net.wifi.WifiConfiguration$1
-android.net.wifi.WifiConfiguration$KeyMgmt
-android.net.wifi.WifiConfiguration$NetworkSelectionStatus
-android.net.wifi.WifiConfiguration$Visibility
-android.net.wifi.WifiConnectionStatistics
-android.net.wifi.WifiConnectionStatistics$1
-android.net.wifi.WifiEnterpriseConfig
-android.net.wifi.WifiEnterpriseConfig$1
-android.net.wifi.WifiInfo
-android.net.wifi.WifiInfo$1
-android.net.wifi.WifiLinkLayerStats
-android.net.wifi.WifiLinkLayerStats$1
-android.net.wifi.WifiManager
-android.net.wifi.WifiManager$ActionListener
-android.net.wifi.WifiManager$MulticastLock
-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
-android.net.wifi.WifiScanner$ParcelableScanData
-android.net.wifi.WifiScanner$ParcelableScanData$1
-android.net.wifi.WifiScanner$ParcelableScanResults
-android.net.wifi.WifiScanner$ParcelableScanResults$1
-android.net.wifi.WifiScanner$PnoScanListener
-android.net.wifi.WifiScanner$ScanData
-android.net.wifi.WifiScanner$ScanData$1
-android.net.wifi.WifiScanner$ScanListener
-android.net.wifi.WifiScanner$ScanSettings
-android.net.wifi.WifiScanner$ScanSettings$1
-android.net.wifi.WifiScanner$ScanSettings$HiddenNetwork
-android.net.wifi.WifiScanner$ServiceHandler
-android.net.wifi.WifiSsid
-android.net.wifi.WifiSsid$1
-android.net.wifi.WpsInfo
-android.net.wifi.WpsInfo$1
-android.net.wifi.aware.WifiAwareManager
-android.net.wifi.hotspot2.PasspointConfiguration
-android.net.wifi.p2p.IWifiP2pManager
-android.net.wifi.p2p.IWifiP2pManager$Stub
-android.net.wifi.p2p.WifiP2pConfig
-android.net.wifi.p2p.WifiP2pConfig$1
-android.net.wifi.p2p.WifiP2pDevice
-android.net.wifi.p2p.WifiP2pDevice$1
-android.net.wifi.p2p.WifiP2pDeviceList
-android.net.wifi.p2p.WifiP2pDeviceList$1
-android.net.wifi.p2p.WifiP2pGroup
-android.net.wifi.p2p.WifiP2pGroup$1
-android.net.wifi.p2p.WifiP2pGroupList
-android.net.wifi.p2p.WifiP2pGroupList$1
-android.net.wifi.p2p.WifiP2pGroupList$2
-android.net.wifi.p2p.WifiP2pGroupList$GroupDeleteListener
-android.net.wifi.p2p.WifiP2pInfo
-android.net.wifi.p2p.WifiP2pInfo$1
-android.net.wifi.p2p.WifiP2pManager
-android.net.wifi.p2p.WifiP2pWfdInfo
-android.net.wifi.p2p.WifiP2pWfdInfo$1
-android.nfc.BeamShareData
-android.nfc.FormatException
-android.nfc.IAppCallback
-android.nfc.IAppCallback$Stub
-android.nfc.IAppCallback$Stub$Proxy
-android.nfc.INfcAdapter
-android.nfc.INfcAdapter$Stub
-android.nfc.INfcAdapter$Stub$Proxy
-android.nfc.INfcAdapterExtras
-android.nfc.INfcCardEmulation
-android.nfc.INfcCardEmulation$Stub
-android.nfc.INfcCardEmulation$Stub$Proxy
-android.nfc.INfcFCardEmulation
-android.nfc.INfcFCardEmulation$Stub
-android.nfc.INfcFCardEmulation$Stub$Proxy
-android.nfc.INfcTag
-android.nfc.INfcTag$Stub
-android.nfc.INfcTag$Stub$Proxy
-android.nfc.INfcUnlockHandler
-android.nfc.ITagRemovedCallback
-android.nfc.NdefMessage
-android.nfc.NfcActivityManager
-android.nfc.NfcActivityManager$NfcActivityState
-android.nfc.NfcActivityManager$NfcApplicationState
-android.nfc.NfcAdapter
-android.nfc.NfcAdapter$1
-android.nfc.NfcAdapter$CreateBeamUrisCallback
-android.nfc.NfcAdapter$CreateNdefMessageCallback
-android.nfc.NfcAdapter$OnNdefPushCompleteCallback
-android.nfc.NfcEvent
-android.nfc.NfcManager
-android.nfc.Tag
-android.nfc.TechListParcel
-android.nfc.TransceiveResult
-android.nfc.cardemulation.AidGroup
-android.nfc.cardemulation.AidGroup$1
-android.nfc.cardemulation.ApduServiceInfo
-android.nfc.cardemulation.ApduServiceInfo$1
-android.nfc.cardemulation.CardEmulation
-android.nfc.cardemulation.HostApduService
-android.nfc.cardemulation.HostApduService$MsgHandler
-android.opengl.EGL14
-android.opengl.EGLConfig
-android.opengl.EGLContext
-android.opengl.EGLDisplay
-android.opengl.EGLExt
-android.opengl.EGLObjectHandle
-android.opengl.EGLSurface
-android.opengl.ETC1
-android.opengl.GLES10
-android.opengl.GLES10Ext
-android.opengl.GLES11
-android.opengl.GLES11Ext
-android.opengl.GLES20
-android.opengl.GLES30
-android.opengl.GLES31
-android.opengl.GLES31Ext
-android.opengl.GLES32
-android.opengl.GLUtils
-android.opengl.Matrix
-android.opengl.Visibility
-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
-android.os.AsyncTask$AsyncTaskResult
-android.os.AsyncTask$InternalHandler
-android.os.AsyncTask$SerialExecutor
-android.os.AsyncTask$SerialExecutor$1
-android.os.AsyncTask$Status
-android.os.AsyncTask$WorkerRunnable
-android.os.BadParcelableException
-android.os.BaseBundle
-android.os.BaseBundle$NoImagePreloadHolder
-android.os.BatteryManager
-android.os.BatteryManagerInternal
-android.os.BatteryProperties
-android.os.BatteryProperties$1
-android.os.BatteryStats
-android.os.BatteryStats$BitDescription
-android.os.BatteryStats$ControllerActivityCounter
-android.os.BatteryStats$Counter
-android.os.BatteryStats$DailyItem
-android.os.BatteryStats$HistoryEventTracker
-android.os.BatteryStats$HistoryItem
-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$Sensor
-android.os.BatteryStats$Uid$Wakelock
-android.os.Binder
-android.os.BinderProxy
-android.os.Build
-android.os.Build$VERSION
-android.os.Bundle
-android.os.Bundle$1
-android.os.CancellationSignal
-android.os.CancellationSignal$OnCancelListener
-android.os.CancellationSignal$Transport
-android.os.CommonTimeConfig$OnServerDiedListener
-android.os.ConditionVariable
-android.os.CountDownTimer
-android.os.CpuUsageInfo
-android.os.CpuUsageInfo$1
-android.os.DeadObjectException
-android.os.DeadSystemException
-android.os.Debug
-android.os.Debug$MemoryInfo
-android.os.Debug$MemoryInfo$1
-android.os.DropBoxManager
-android.os.DropBoxManager$Entry
-android.os.DropBoxManager$Entry$1
-android.os.Environment
-android.os.Environment$UserEnvironment
-android.os.FactoryTest
-android.os.FileBridge
-android.os.FileBridge$FileBridgeOutputStream
-android.os.FileObserver$ObserverThread
-android.os.FileUtils
-android.os.GraphicsEnvironment
-android.os.Handler
-android.os.Handler$BlockingRunnable
-android.os.Handler$Callback
-android.os.Handler$MessengerImpl
-android.os.HandlerThread
-android.os.HardwarePropertiesManager
-android.os.HwBinder
-android.os.HwBlob
-android.os.HwParcel
-android.os.HwRemoteBinder
-android.os.IBatteryPropertiesListener
-android.os.IBatteryPropertiesListener$Stub
-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.ICancellationSignal$Stub$Proxy
-android.os.IDeviceIdentifiersPolicyService
-android.os.IDeviceIdentifiersPolicyService$Stub
-android.os.IDeviceIdleController
-android.os.IDeviceIdleController$Stub
-android.os.IDeviceIdleController$Stub$Proxy
-android.os.IHardwarePropertiesManager
-android.os.IHardwarePropertiesManager$Stub
-android.os.IHardwarePropertiesManager$Stub$Proxy
-android.os.IHwBinder
-android.os.IHwBinder$DeathRecipient
-android.os.IHwInterface
-android.os.IIncidentManager
-android.os.IIncidentManager$Stub
-android.os.IInstalld
-android.os.IInstalld$Stub
-android.os.IInstalld$Stub$Proxy
-android.os.IInterface
-android.os.IMaintenanceActivityListener
-android.os.IMessenger
-android.os.IMessenger$Stub
-android.os.IMessenger$Stub$Proxy
-android.os.INetworkActivityListener
-android.os.INetworkManagementService
-android.os.INetworkManagementService$Stub
-android.os.INetworkManagementService$Stub$Proxy
-android.os.IPermissionController
-android.os.IPermissionController$Stub
-android.os.IPowerManager
-android.os.IPowerManager$Stub
-android.os.IPowerManager$Stub$Proxy
-android.os.IProcessInfoService
-android.os.IProcessInfoService$Stub
-android.os.IProgressListener
-android.os.IRecoverySystem
-android.os.IRecoverySystem$Stub
-android.os.IRecoverySystemProgressListener
-android.os.IRemoteCallback
-android.os.IRemoteCallback$Stub
-android.os.IRemoteCallback$Stub$Proxy
-android.os.ISchedulingPolicyService
-android.os.ISchedulingPolicyService$Stub
-android.os.IServiceManager
-android.os.IUpdateLock
-android.os.IUpdateLock$Stub
-android.os.IUserManager
-android.os.IUserManager$Stub
-android.os.IUserManager$Stub$Proxy
-android.os.IVibratorService
-android.os.IVibratorService$Stub
-android.os.IVibratorService$Stub$Proxy
-android.os.IncidentManager
-android.os.LocaleList
-android.os.LocaleList$1
-android.os.Looper
-android.os.MemoryFile
-android.os.Message
-android.os.Message$1
-android.os.MessageQueue
-android.os.MessageQueue$FileDescriptorRecord
-android.os.MessageQueue$IdleHandler
-android.os.MessageQueue$OnFileDescriptorEventListener
-android.os.Messenger
-android.os.Messenger$1
-android.os.OperationCanceledException
-android.os.Parcel
-android.os.Parcel$1
-android.os.Parcel$2
-android.os.Parcel$ReadWriteHelper
-android.os.ParcelFileDescriptor
-android.os.ParcelFileDescriptor$1
-android.os.ParcelFileDescriptor$2
-android.os.ParcelFileDescriptor$AutoCloseInputStream
-android.os.ParcelFileDescriptor$AutoCloseOutputStream
-android.os.ParcelFileDescriptor$OnCloseListener
-android.os.ParcelFileDescriptor$Status
-android.os.ParcelFormatException
-android.os.ParcelUuid
-android.os.ParcelUuid$1
-android.os.Parcelable
-android.os.Parcelable$ClassLoaderCreator
-android.os.Parcelable$Creator
-android.os.ParcelableException
-android.os.ParcelableParcel
-android.os.ParcelableParcel$1
-android.os.PatternMatcher
-android.os.PatternMatcher$1
-android.os.PersistableBundle
-android.os.PersistableBundle$1
-android.os.PersistableBundle$MyReadMapCallback
-android.os.PooledStringReader
-android.os.PooledStringWriter
-android.os.PowerManager
-android.os.PowerManager$WakeLock
-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$OnResultListener
-android.os.RemoteCallbackList
-android.os.RemoteCallbackList$Callback
-android.os.RemoteException
-android.os.ResultReceiver
-android.os.ResultReceiver$1
-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.StatFs
-android.os.StrictMode
-android.os.StrictMode$1
-android.os.StrictMode$2
-android.os.StrictMode$3
-android.os.StrictMode$4
-android.os.StrictMode$5
-android.os.StrictMode$6
-android.os.StrictMode$7
-android.os.StrictMode$8
-android.os.StrictMode$9
-android.os.StrictMode$AndroidBlockGuardPolicy
-android.os.StrictMode$AndroidBlockGuardPolicy$1
-android.os.StrictMode$AndroidCloseGuardReporter
-android.os.StrictMode$InstanceTracker
-android.os.StrictMode$Span
-android.os.StrictMode$ThreadPolicy
-android.os.StrictMode$ThreadPolicy$Builder
-android.os.StrictMode$ThreadSpanState
-android.os.StrictMode$ViolationInfo
-android.os.StrictMode$ViolationInfo$1
-android.os.StrictMode$VmPolicy
-android.os.StrictMode$VmPolicy$Builder
-android.os.SynchronousResultReceiver
-android.os.SynchronousResultReceiver$Result
-android.os.SystemClock
-android.os.SystemProperties
-android.os.SystemService
-android.os.SystemService$1
-android.os.SystemService$State
-android.os.SystemVibrator
-android.os.TokenWatcher
-android.os.TokenWatcher$1
-android.os.Trace
-android.os.Trace$1
-android.os.TransactionTooLargeException
-android.os.UEventObserver
-android.os.UEventObserver$UEvent
-android.os.UEventObserver$UEventThread
-android.os.UpdateLock
-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.HealthStatsParceler
-android.os.health.SystemHealthManager
-android.os.storage.DiskInfo
-android.os.storage.DiskInfo$1
-android.os.storage.IObbActionListener
-android.os.storage.IObbActionListener$Stub
-android.os.storage.IStorageEventListener
-android.os.storage.IStorageEventListener$Stub
-android.os.storage.IStorageEventListener$Stub$Proxy
-android.os.storage.IStorageManager
-android.os.storage.IStorageManager$Stub
-android.os.storage.IStorageManager$Stub$Proxy
-android.os.storage.IStorageShutdownObserver
-android.os.storage.StorageEventListener
-android.os.storage.StorageManager
-android.os.storage.StorageManager$ObbActionListener
-android.os.storage.StorageManager$StorageEventListenerDelegate
-android.os.storage.StorageManagerInternal
-android.os.storage.StorageManagerInternal$ExternalStorageMountPolicy
-android.os.storage.StorageVolume
-android.os.storage.StorageVolume$1
-android.os.storage.VolumeInfo
-android.os.storage.VolumeInfo$1
-android.os.storage.VolumeInfo$2
-android.os.storage.VolumeRecord
-android.os.storage.VolumeRecord$1
-android.preference.GenericInflater$Parent
-android.preference.Preference
-android.preference.Preference$BaseSavedState
-android.preference.Preference$BaseSavedState$1
-android.preference.Preference$OnPreferenceChangeListener
-android.preference.PreferenceActivity
-android.preference.PreferenceFragment
-android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
-android.preference.PreferenceGroup
-android.preference.PreferenceManager
-android.preference.PreferenceManager$OnPreferenceTreeClickListener
-android.preference.PreferenceScreen
-android.print.IPrintDocumentAdapter
-android.print.IPrintJobStateChangeListener
-android.print.IPrintManager
-android.print.IPrintManager$Stub
-android.print.IPrintServicesChangeListener
-android.print.IPrintSpooler
-android.print.IPrintSpooler$Stub
-android.print.IPrintSpooler$Stub$Proxy
-android.print.IPrintSpoolerCallbacks
-android.print.IPrintSpoolerCallbacks$Stub
-android.print.IPrintSpoolerClient
-android.print.IPrintSpoolerClient$Stub
-android.print.IPrinterDiscoveryObserver
-android.print.PageRange
-android.print.PrintAttributes
-android.print.PrintDocumentAdapter
-android.print.PrintDocumentAdapter$LayoutResultCallback
-android.print.PrintDocumentAdapter$WriteResultCallback
-android.print.PrintJobId
-android.print.PrintJobInfo
-android.print.PrintManager
-android.print.PrinterId
-android.printservice.IPrintServiceClient
-android.printservice.IPrintServiceClient$Stub
-android.printservice.PrintServiceInfo
-android.printservice.PrintServiceInfo$1
-android.printservice.recommendation.IRecommendationsChangeListener
-android.provider.-$Lambda$87WmhkvObehVg0OMBzwa_MTVV8g
-android.provider.-$Lambda$a7Jyr6j_Mb70hHJ2ssL1AAhKh4c
-android.provider.BaseColumns
-android.provider.BlockedNumberContract
-android.provider.BlockedNumberContract$BlockedNumbers
-android.provider.CalendarContract
-android.provider.CalendarContract$Attendees
-android.provider.CalendarContract$AttendeesColumns
-android.provider.CalendarContract$CalendarAlerts
-android.provider.CalendarContract$CalendarAlertsColumns
-android.provider.CalendarContract$CalendarCache
-android.provider.CalendarContract$CalendarCacheColumns
-android.provider.CalendarContract$CalendarColumns
-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$ExtendedProperties
-android.provider.CalendarContract$ExtendedPropertiesColumns
-android.provider.CalendarContract$Instances
-android.provider.CalendarContract$Reminders
-android.provider.CalendarContract$RemindersColumns
-android.provider.CalendarContract$SyncColumns
-android.provider.CallLog
-android.provider.CallLog$Calls
-android.provider.ContactsContract
-android.provider.ContactsContract$BaseSyncColumns
-android.provider.ContactsContract$CommonDataKinds$BaseTypes
-android.provider.ContactsContract$CommonDataKinds$Callable
-android.provider.ContactsContract$CommonDataKinds$CommonColumns
-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$StructuredPostal
-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$DataUsageFeedback
-android.provider.ContactsContract$DataUsageStatColumns
-android.provider.ContactsContract$DeletedContacts
-android.provider.ContactsContract$DeletedContactsColumns
-android.provider.ContactsContract$Directory
-android.provider.ContactsContract$DisplayPhoto
-android.provider.ContactsContract$Groups
-android.provider.ContactsContract$GroupsColumns
-android.provider.ContactsContract$MetadataSync
-android.provider.ContactsContract$MetadataSyncColumns
-android.provider.ContactsContract$PhoneLookup
-android.provider.ContactsContract$PhoneLookupColumns
-android.provider.ContactsContract$Profile
-android.provider.ContactsContract$ProviderStatus
-android.provider.ContactsContract$RawContacts
-android.provider.ContactsContract$RawContactsColumns
-android.provider.ContactsContract$RawContactsEntity
-android.provider.ContactsContract$StatusColumns
-android.provider.ContactsContract$SyncColumns
-android.provider.DocumentsContract
-android.provider.DocumentsContract$Path
-android.provider.DocumentsProvider
-android.provider.Downloads
-android.provider.Downloads$Impl
-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$Media
-android.provider.MediaStore$Audio$Playlists
-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$MediaColumns
-android.provider.MediaStore$Video$Media
-android.provider.MediaStore$Video$VideoColumns
-android.provider.OpenableColumns
-android.provider.SearchIndexableData
-android.provider.SearchIndexableResource
-android.provider.SearchIndexablesProvider
-android.provider.SearchRecentSuggestions
-android.provider.Settings
-android.provider.Settings$ContentProviderHolder
-android.provider.Settings$GenerationTracker
-android.provider.Settings$Global
-android.provider.Settings$NameValueCache
-android.provider.Settings$NameValueTable
-android.provider.Settings$Secure
-android.provider.Settings$SettingNotFoundException
-android.provider.Settings$System
-android.provider.Settings$System$1
-android.provider.Settings$System$2
-android.provider.Settings$System$3
-android.provider.Settings$System$4
-android.provider.Settings$System$5
-android.provider.Settings$System$6
-android.provider.Settings$System$7
-android.provider.Settings$System$8
-android.provider.Settings$System$9
-android.provider.Settings$System$DiscreteValueValidator
-android.provider.Settings$System$InclusiveFloatRangeValidator
-android.provider.Settings$System$InclusiveIntegerRangeValidator
-android.provider.Settings$System$Validator
-android.provider.SyncStateContract$Columns
-android.provider.Telephony$BaseMmsColumns
-android.provider.Telephony$Carriers
-android.provider.Telephony$Mms
-android.provider.Telephony$MmsSms
-android.provider.Telephony$ServiceStateTable
-android.provider.Telephony$Sms
-android.provider.Telephony$TextBasedSmsColumns
-android.provider.Telephony$Threads
-android.provider.Telephony$ThreadsColumns
-android.provider.UserDictionary$Words
-android.provider.VoicemailContract$Status
-android.provider.VoicemailContract$Voicemails
-android.renderscript.Allocation
-android.renderscript.BaseObj
-android.renderscript.Matrix4f
-android.renderscript.RenderScriptCacheDir
-android.security.GateKeeper
-android.security.IKeyChainService
-android.security.IKeyChainService$Stub
-android.security.IKeyChainService$Stub$Proxy
-android.security.IKeystoreService
-android.security.IKeystoreService$Stub
-android.security.IKeystoreService$Stub$Proxy
-android.security.KeyChain
-android.security.KeyChain$1
-android.security.KeyChain$KeyChainConnection
-android.security.KeyStore
-android.security.NetworkSecurityPolicy
-android.security.keymaster.IKeyAttestationApplicationIdProvider
-android.security.keymaster.IKeyAttestationApplicationIdProvider$Stub
-android.security.keymaster.KeyAttestationApplicationId
-android.security.keymaster.KeymasterArguments
-android.security.keymaster.KeymasterArguments$1
-android.security.keystore.AndroidKeyStoreBCWorkaroundProvider
-android.security.keystore.AndroidKeyStoreKeyGeneratorSpi
-android.security.keystore.AndroidKeyStoreKeyGeneratorSpi$AES
-android.security.keystore.AndroidKeyStoreProvider
-android.security.keystore.AndroidKeyStoreSpi
-android.security.keystore.ArrayUtils
-android.security.keystore.KeyGenParameterSpec
-android.security.keystore.KeyGenParameterSpec$Builder
-android.security.keystore.KeyInfo
-android.security.keystore.KeyPermanentlyInvalidatedException
-android.security.keystore.KeyProperties
-android.security.keystore.KeyProperties$BlockMode
-android.security.keystore.KeyProperties$EncryptionPadding
-android.security.keystore.KeyProperties$Purpose
-android.security.keystore.KeymasterUtils
-android.security.keystore.UserNotAuthenticatedException
-android.security.keystore.Utils
-android.security.net.config.ApplicationConfig
-android.security.net.config.CertificateSource
-android.security.net.config.CertificatesEntryRef
-android.security.net.config.ConfigNetworkSecurityPolicy
-android.security.net.config.ConfigSource
-android.security.net.config.DirectoryCertificateSource
-android.security.net.config.DirectoryCertificateSource$1
-android.security.net.config.DirectoryCertificateSource$3
-android.security.net.config.DirectoryCertificateSource$CertSelector
-android.security.net.config.KeyStoreCertificateSource
-android.security.net.config.KeyStoreConfigSource
-android.security.net.config.ManifestConfigSource
-android.security.net.config.ManifestConfigSource$DefaultConfigSource
-android.security.net.config.NetworkSecurityConfig
-android.security.net.config.NetworkSecurityConfig$1
-android.security.net.config.NetworkSecurityConfig$Builder
-android.security.net.config.NetworkSecurityConfigProvider
-android.security.net.config.NetworkSecurityTrustManager
-android.security.net.config.PinSet
-android.security.net.config.RootTrustManager
-android.security.net.config.RootTrustManagerFactorySpi
-android.security.net.config.SystemCertificateSource
-android.security.net.config.TrustedCertificateStoreAdapter
-android.security.net.config.UserCertificateSource
-android.security.net.config.XmlConfigSource
-android.security.net.config.XmlConfigSource$ParserException
-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.dreams.DreamManagerInternal
-android.service.dreams.IDreamManager
-android.service.dreams.IDreamManager$Stub
-android.service.dreams.IDreamManager$Stub$Proxy
-android.service.gatekeeper.IGateKeeperService
-android.service.gatekeeper.IGateKeeperService$Stub
-android.service.gatekeeper.IGateKeeperService$Stub$Proxy
-android.service.media.IMediaBrowserService
-android.service.media.IMediaBrowserService$Stub
-android.service.media.IMediaBrowserService$Stub$Proxy
-android.service.media.IMediaBrowserServiceCallbacks
-android.service.media.IMediaBrowserServiceCallbacks$Stub
-android.service.notification.Adjustment
-android.service.notification.Condition
-android.service.notification.Condition$1
-android.service.notification.ConditionProviderService
-android.service.notification.ConditionProviderService$H
-android.service.notification.ConditionProviderService$Provider
-android.service.notification.IConditionListener
-android.service.notification.IConditionListener$Stub
-android.service.notification.IConditionProvider
-android.service.notification.IConditionProvider$Stub
-android.service.notification.INotificationListener
-android.service.notification.INotificationListener$Stub
-android.service.notification.INotificationListener$Stub$Proxy
-android.service.notification.IStatusBarNotificationHolder
-android.service.notification.IStatusBarNotificationHolder$Stub
-android.service.notification.IStatusBarNotificationHolder$Stub$Proxy
-android.service.notification.NotificationListenerService
-android.service.notification.NotificationListenerService$MyHandler
-android.service.notification.NotificationListenerService$NotificationListenerWrapper
-android.service.notification.NotificationListenerService$Ranking
-android.service.notification.NotificationListenerService$RankingMap
-android.service.notification.NotificationListenerService$RankingMap$1
-android.service.notification.NotificationRankingUpdate
-android.service.notification.NotificationRankingUpdate$1
-android.service.notification.StatusBarNotification
-android.service.notification.StatusBarNotification$1
-android.service.notification.ZenModeConfig
-android.service.notification.ZenModeConfig$1
-android.service.notification.ZenModeConfig$Diff
-android.service.notification.ZenModeConfig$EventInfo
-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.Tile
-android.service.textservice.SpellCheckerService
-android.service.textservice.SpellCheckerService$InternalISpellCheckerSession
-android.service.textservice.SpellCheckerService$Session
-android.service.textservice.SpellCheckerService$SpellCheckerServiceBinder
-android.service.voice.AlwaysOnHotwordDetector
-android.service.voice.AlwaysOnHotwordDetector$Callback
-android.service.voice.AlwaysOnHotwordDetector$EventPayload
-android.service.voice.AlwaysOnHotwordDetector$MyHandler
-android.service.voice.AlwaysOnHotwordDetector$RefreshAvailabiltyTask
-android.service.voice.AlwaysOnHotwordDetector$SoundTriggerListener
-android.service.voice.IVoiceInteractionService
-android.service.voice.IVoiceInteractionService$Stub
-android.service.voice.IVoiceInteractionService$Stub$Proxy
-android.service.voice.IVoiceInteractionSession
-android.service.voice.VoiceInteractionManagerInternal
-android.service.voice.VoiceInteractionService
-android.service.voice.VoiceInteractionService$1
-android.service.voice.VoiceInteractionService$MyHandler
-android.service.voice.VoiceInteractionServiceInfo
-android.service.vr.IPersistentVrStateCallbacks
-android.service.vr.IPersistentVrStateCallbacks$Stub
-android.service.vr.IVrManager
-android.service.vr.IVrManager$Stub
-android.service.vr.IVrManager$Stub$Proxy
-android.service.vr.IVrStateCallbacks
-android.service.vr.IVrStateCallbacks$Stub
-android.service.vr.IVrStateCallbacks$Stub$Proxy
-android.service.wallpaper.IWallpaperConnection
-android.service.wallpaper.IWallpaperConnection$Stub
-android.service.wallpaper.IWallpaperConnection$Stub$Proxy
-android.service.wallpaper.IWallpaperEngine
-android.service.wallpaper.IWallpaperEngine$Stub
-android.service.wallpaper.IWallpaperEngine$Stub$Proxy
-android.service.wallpaper.IWallpaperService
-android.service.wallpaper.IWallpaperService$Stub
-android.service.wallpaper.IWallpaperService$Stub$Proxy
-android.service.wallpaper.WallpaperService
-android.service.wallpaper.WallpaperService$Engine
-android.service.wallpaper.WallpaperService$Engine$1
-android.service.wallpaper.WallpaperService$Engine$2
-android.service.wallpaper.WallpaperService$Engine$3
-android.service.wallpaper.WallpaperService$Engine$WallpaperInputEventReceiver
-android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper
-android.service.wallpaper.WallpaperService$IWallpaperServiceWrapper
-android.service.wallpaper.WallpaperService$WallpaperCommand
-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
-android.speech.tts.ITextToSpeechService
-android.speech.tts.ITextToSpeechService$Stub
-android.speech.tts.ITextToSpeechService$Stub$Proxy
-android.speech.tts.SynthesisCallback
-android.speech.tts.SynthesisRequest
-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
-android.speech.tts.TextToSpeech$Connection$1
-android.speech.tts.TextToSpeech$Connection$SetupConnectionAsyncTask
-android.speech.tts.TextToSpeech$EngineInfo
-android.speech.tts.TextToSpeech$OnInitListener
-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.system.ErrnoException
-android.system.GaiException
-android.system.NetlinkSocketAddress
-android.system.Os
-android.system.OsConstants
-android.system.PacketSocketAddress
-android.system.StructAddrinfo
-android.system.StructFlock
-android.system.StructGroupReq
-android.system.StructIcmpHdr
-android.system.StructIfaddrs
-android.system.StructLinger
-android.system.StructPasswd
-android.system.StructPollfd
-android.system.StructStat
-android.system.StructStatVfs
-android.system.StructTimeval
-android.system.StructUcred
-android.system.StructUtsname
-android.system.UnixSocketAddress
-android.telecom.-$Lambda$afyb_ODGzn3xMew6fjs8ANSIdVo
-android.telecom.CallAudioState
-android.telecom.CallAudioState$1
-android.telecom.Conference
-android.telecom.Conference$Listener
-android.telecom.Conferenceable
-android.telecom.Connection
-android.telecom.Connection$1
-android.telecom.Connection$2
-android.telecom.Connection$FailureSignalingConnection
-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
-android.telecom.ConnectionService$2$1
-android.telecom.ConnectionService$3
-android.telecom.ConnectionService$4
-android.telecom.ConnectionService$5
-android.telecom.ConnectionService$5$1
-android.telecom.ConnectionServiceAdapter
-android.telecom.DefaultDialerManager
-android.telecom.DisconnectCause
-android.telecom.DisconnectCause$1
-android.telecom.Log
-android.telecom.Log$1
-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
-android.telecom.Logging.EventManager$EventRecord
-android.telecom.Logging.EventManager$Loggable
-android.telecom.Logging.EventManager$TimedEventPair
-android.telecom.Logging.Runnable
-android.telecom.Logging.Runnable$1
-android.telecom.Logging.Session
-android.telecom.Logging.Session$Info
-android.telecom.Logging.Session$Info$1
-android.telecom.Logging.SessionManager
-android.telecom.Logging.SessionManager$ICurrentThreadId
-android.telecom.Logging.SessionManager$ISessionCleanupTimeoutMs
-android.telecom.Logging.SessionManager$ISessionIdQueryHandler
-android.telecom.Logging.SessionManager$ISessionListener
-android.telecom.ParcelableCall
-android.telecom.ParcelableCall$1
-android.telecom.ParcelableConference
-android.telecom.ParcelableConnection
-android.telecom.ParcelableConnection$1
-android.telecom.PhoneAccount
-android.telecom.PhoneAccount$1
-android.telecom.PhoneAccount$Builder
-android.telecom.PhoneAccountHandle
-android.telecom.PhoneAccountHandle$1
-android.telecom.RemoteConnectionManager
-android.telecom.StatusHints
-android.telecom.TelecomAnalytics
-android.telecom.TelecomManager
-android.telecom.VideoProfile
-android.telecom.VideoProfile$1
-android.telephony.CarrierConfigManager
-android.telephony.CellIdentityWcdma
-android.telephony.CellIdentityWcdma$1
-android.telephony.CellInfo
-android.telephony.CellInfo$1
-android.telephony.CellInfoCdma
-android.telephony.CellInfoGsm
-android.telephony.CellInfoLte
-android.telephony.CellInfoWcdma
-android.telephony.CellInfoWcdma$1
-android.telephony.CellLocation
-android.telephony.CellSignalStrength
-android.telephony.CellSignalStrengthWcdma
-android.telephony.CellSignalStrengthWcdma$1
-android.telephony.ClientRequestStats
-android.telephony.ClientRequestStats$1
-android.telephony.DisconnectCause
-android.telephony.IccOpenLogicalChannelResponse
-android.telephony.ModemActivityInfo
-android.telephony.PhoneNumberFormattingTextWatcher
-android.telephony.PhoneNumberUtils
-android.telephony.PhoneStateListener
-android.telephony.PhoneStateListener$1
-android.telephony.PhoneStateListener$IPhoneStateListenerStub
-android.telephony.PreciseCallState
-android.telephony.PreciseCallState$1
-android.telephony.PreciseDataConnectionState
-android.telephony.PreciseDataConnectionState$1
-android.telephony.RadioAccessFamily
-android.telephony.Rlog
-android.telephony.ServiceState
-android.telephony.ServiceState$1
-android.telephony.SignalStrength
-android.telephony.SignalStrength$1
-android.telephony.SmsManager
-android.telephony.SmsMessage
-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.TelephonyHistogram
-android.telephony.TelephonyHistogram$1
-android.telephony.TelephonyManager
-android.telephony.TelephonyManager$MultiSimVariants
-android.telephony.VisualVoicemailSmsFilterSettings
-android.telephony.VoLteServiceState
-android.telephony.VoLteServiceState$1
-android.telephony.gsm.GsmCellLocation
-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
-android.text.BidiFormatter
-android.text.BidiFormatter$DirectionalityEstimator
-android.text.BoringLayout
-android.text.BoringLayout$Metrics
-android.text.CharSequenceCharacterIterator
-android.text.ClipboardManager
-android.text.DynamicLayout
-android.text.DynamicLayout$ChangeWatcher
-android.text.Editable
-android.text.Editable$Factory
-android.text.FontConfig
-android.text.FontConfig$Alias
-android.text.FontConfig$Family
-android.text.FontConfig$Font
-android.text.GetChars
-android.text.GraphicsOperations
-android.text.Html
-android.text.Html$HtmlParser
-android.text.Html$TagHandler
-android.text.HtmlToSpannedConverter
-android.text.HtmlToSpannedConverter$Bold
-android.text.HtmlToSpannedConverter$Href
-android.text.Hyphenator
-android.text.Hyphenator$HyphenationData
-android.text.InputFilter
-android.text.InputFilter$LengthFilter
-android.text.InputType
-android.text.Layout
-android.text.Layout$Alignment
-android.text.Layout$Directions
-android.text.Layout$Ellipsizer
-android.text.Layout$SpannedEllipsizer
-android.text.MeasuredText
-android.text.NoCopySpan
-android.text.NoCopySpan$Concrete
-android.text.PackedIntVector
-android.text.PackedObjectVector
-android.text.ParcelableSpan
-android.text.Selection
-android.text.Selection$END
-android.text.Selection$PositionIterator
-android.text.Selection$START
-android.text.SpanSet
-android.text.SpanWatcher
-android.text.Spannable
-android.text.Spannable$Factory
-android.text.SpannableString
-android.text.SpannableStringBuilder
-android.text.SpannableStringInternal
-android.text.Spanned
-android.text.SpannedString
-android.text.StaticLayout
-android.text.StaticLayout$Builder
-android.text.StaticLayout$LineBreaks
-android.text.TextDirectionHeuristic
-android.text.TextDirectionHeuristics
-android.text.TextDirectionHeuristics$AnyStrong
-android.text.TextDirectionHeuristics$FirstStrong
-android.text.TextDirectionHeuristics$TextDirectionAlgorithm
-android.text.TextDirectionHeuristics$TextDirectionHeuristicImpl
-android.text.TextDirectionHeuristics$TextDirectionHeuristicInternal
-android.text.TextDirectionHeuristics$TextDirectionHeuristicLocale
-android.text.TextLine
-android.text.TextPaint
-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.Formatter
-android.text.format.Formatter$BytesResult
-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
-android.text.method.BaseMovementMethod
-android.text.method.DialerKeyListener
-android.text.method.KeyListener
-android.text.method.LinkMovementMethod
-android.text.method.MetaKeyKeyListener
-android.text.method.MovementMethod
-android.text.method.NumberKeyListener
-android.text.method.PasswordTransformationMethod
-android.text.method.QwertyKeyListener
-android.text.method.QwertyKeyListener$Replaced
-android.text.method.ReplacementTransformationMethod
-android.text.method.ReplacementTransformationMethod$ReplacementCharSequence
-android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence
-android.text.method.ScrollingMovementMethod
-android.text.method.SingleLineTransformationMethod
-android.text.method.TextKeyListener
-android.text.method.TextKeyListener$Capitalize
-android.text.method.TextKeyListener$SettingsObserver
-android.text.method.Touch
-android.text.method.Touch$DragState
-android.text.method.TransformationMethod
-android.text.method.TransformationMethod2
-android.text.method.WordIterator
-android.text.style.AlignmentSpan
-android.text.style.BackgroundColorSpan
-android.text.style.CharacterStyle
-android.text.style.CharacterStyle$Passthrough
-android.text.style.ClickableSpan
-android.text.style.DynamicDrawableSpan
-android.text.style.EasyEditSpan
-android.text.style.ForegroundColorSpan
-android.text.style.ImageSpan
-android.text.style.LeadingMarginSpan
-android.text.style.LeadingMarginSpan$LeadingMarginSpan2
-android.text.style.LeadingMarginSpan$Standard
-android.text.style.LineBackgroundSpan
-android.text.style.LineHeightSpan
-android.text.style.LineHeightSpan$WithDensity
-android.text.style.MetricAffectingSpan
-android.text.style.MetricAffectingSpan$Passthrough
-android.text.style.ParagraphStyle
-android.text.style.RelativeSizeSpan
-android.text.style.ReplacementSpan
-android.text.style.SpellCheckSpan
-android.text.style.StrikethroughSpan
-android.text.style.StyleSpan
-android.text.style.SuggestionSpan
-android.text.style.TabStopSpan
-android.text.style.TextAppearanceSpan
-android.text.style.TtsSpan
-android.text.style.TtsSpan$Builder
-android.text.style.TtsSpan$SemioticClassBuilder
-android.text.style.TtsSpan$TelephoneBuilder
-android.text.style.TtsSpan$VerbatimBuilder
-android.text.style.TypefaceSpan
-android.text.style.URLSpan
-android.text.style.UnderlineSpan
-android.text.style.UpdateAppearance
-android.text.style.UpdateLayout
-android.text.style.WrapTogetherSpan
-android.text.util.Linkify
-android.text.util.Linkify$1
-android.text.util.Linkify$2
-android.text.util.Linkify$3
-android.text.util.Linkify$4
-android.text.util.Linkify$MatchFilter
-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
-android.transition.ChangeBounds$2
-android.transition.ChangeBounds$3
-android.transition.ChangeBounds$4
-android.transition.ChangeBounds$5
-android.transition.ChangeBounds$6
-android.transition.ChangeBounds$9
-android.transition.ChangeClipBounds
-android.transition.ChangeImageTransform
-android.transition.ChangeImageTransform$1
-android.transition.ChangeImageTransform$2
-android.transition.ChangeTransform
-android.transition.ChangeTransform$1
-android.transition.ChangeTransform$2
-android.transition.ChangeTransform$3
-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
-android.transition.PathMotion
-android.transition.Scene
-android.transition.SidePropagation
-android.transition.Slide
-android.transition.Slide$1
-android.transition.Slide$2
-android.transition.Slide$3
-android.transition.Slide$4
-android.transition.Slide$5
-android.transition.Slide$6
-android.transition.Slide$CalculateSlide
-android.transition.Slide$CalculateSlideHorizontal
-android.transition.Slide$CalculateSlideVertical
-android.transition.Transition
-android.transition.Transition$1
-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.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$TransitionSetListener
-android.transition.TransitionUtils
-android.transition.TransitionValues
-android.transition.TransitionValuesMaps
-android.transition.Visibility
-android.transition.Visibility$1
-android.transition.Visibility$VisibilityInfo
-android.transition.VisibilityPropagation
-android.util.AndroidException
-android.util.AndroidRuntimeException
-android.util.ArrayMap
-android.util.ArrayMap$1
-android.util.ArraySet
-android.util.ArraySet$1
-android.util.AtomicFile
-android.util.AttributeSet
-android.util.Base64
-android.util.Base64$Coder
-android.util.Base64$Decoder
-android.util.Base64$Encoder
-android.util.TimingsTraceLog
-android.util.ByteStringUtils
-android.util.ContainerHelpers
-android.util.DebugUtils
-android.util.DisplayMetrics
-android.util.EventLog
-android.util.EventLog$Event
-android.util.FastImmutableArraySet
-android.util.FastImmutableArraySet$FastIterator
-android.util.FloatProperty
-android.util.IconDrawableFactory
-android.util.IntArray
-android.util.IntProperty
-android.util.JsonReader
-android.util.JsonScope
-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$TerribleFailure
-android.util.Log$TerribleFailureHandler
-android.util.LogPrinter
-android.util.LongArray
-android.util.LongSparseArray
-android.util.LongSparseLongArray
-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.MutableBoolean
-android.util.MutableInt
-android.util.MutableLong
-android.util.NtpTrustedTime
-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
-android.util.Printer
-android.util.Property
-android.util.Range
-android.util.Rational
-android.util.ReflectiveProperty
-android.util.Singleton
-android.util.Size
-android.util.SizeF
-android.util.Slog
-android.util.SparseArray
-android.util.SparseBooleanArray
-android.util.SparseIntArray
-android.util.SparseLongArray
-android.util.Spline
-android.util.Spline$MonotoneCubicSpline
-android.util.StateSet
-android.util.SuperNotCalledException
-android.util.TimeFormatException
-android.util.TimeUtils
-android.util.TimedRemoteCaller
-android.util.TimingLogger
-android.util.TrustedTime
-android.util.TypedValue
-android.util.Xml
-android.util.Xml$XmlSerializerFactory
-android.util.XmlPullAttributes
-android.util.apk.ApkSignatureSchemeV2Verifier
-android.util.apk.ApkSignatureSchemeV2Verifier$SignatureNotFoundException
-android.util.apk.ZipUtils
-android.util.jar.StrictJarFile
-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
-android.view.ActionMode
-android.view.ActionMode$Callback
-android.view.ActionMode$Callback2
-android.view.ActionProvider
-android.view.ActionProvider$SubUiVisibilityListener
-android.view.AppTransitionAnimationSpec
-android.view.AppTransitionAnimationSpec$1
-android.view.Choreographer
-android.view.Choreographer$1
-android.view.Choreographer$2
-android.view.Choreographer$CallbackQueue
-android.view.Choreographer$CallbackRecord
-android.view.Choreographer$FrameCallback
-android.view.Choreographer$FrameDisplayEventReceiver
-android.view.Choreographer$FrameHandler
-android.view.ContextMenu
-android.view.ContextMenu$ContextMenuInfo
-android.view.ContextThemeWrapper
-android.view.Display
-android.view.Display$HdrCapabilities
-android.view.Display$HdrCapabilities$1
-android.view.Display$Mode
-android.view.Display$Mode$1
-android.view.DisplayAdjustments
-android.view.DisplayEventReceiver
-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$FocusSorter
-android.view.FocusFinder$UserSpecifiedFocusComparator
-android.view.FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter
-android.view.FrameInfo
-android.view.FrameMetrics
-android.view.FrameMetricsObserver
-android.view.FrameStats
-android.view.GestureDetector
-android.view.GestureDetector$GestureHandler
-android.view.GestureDetector$OnContextClickListener
-android.view.GestureDetector$OnDoubleTapListener
-android.view.GestureDetector$OnGestureListener
-android.view.GestureDetector$SimpleOnGestureListener
-android.view.GhostView
-android.view.Gravity
-android.view.HandlerActionQueue
-android.view.HandlerActionQueue$HandlerAction
-android.view.HardwareLayer
-android.view.IAppTransitionAnimationSpecsFuture
-android.view.IAppTransitionAnimationSpecsFuture$Stub
-android.view.IAppTransitionAnimationSpecsFuture$Stub$Proxy
-android.view.IApplicationToken
-android.view.IApplicationToken$Stub
-android.view.IDockedStackListener
-android.view.IDockedStackListener$Stub
-android.view.IDockedStackListener$Stub$Proxy
-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
-android.view.IPinnedStackController$Stub
-android.view.IPinnedStackController$Stub$Proxy
-android.view.IPinnedStackListener
-android.view.IPinnedStackListener$Stub
-android.view.IPinnedStackListener$Stub$Proxy
-android.view.IRotationWatcher
-android.view.IRotationWatcher$Stub
-android.view.IRotationWatcher$Stub$Proxy
-android.view.IWindow
-android.view.IWindow$Stub
-android.view.IWindow$Stub$Proxy
-android.view.IWindowFocusObserver
-android.view.IWindowId
-android.view.IWindowId$Stub
-android.view.IWindowId$Stub$Proxy
-android.view.IWindowManager
-android.view.IWindowManager$Stub
-android.view.IWindowManager$Stub$Proxy
-android.view.IWindowSession
-android.view.IWindowSession$Stub
-android.view.IWindowSession$Stub$Proxy
-android.view.IWindowSessionCallback
-android.view.IWindowSessionCallback$Stub
-android.view.IWindowSessionCallback$Stub$Proxy
-android.view.InflateException
-android.view.InputChannel
-android.view.InputChannel$1
-android.view.InputDevice
-android.view.InputDevice$1
-android.view.InputDevice$MotionRange
-android.view.InputEvent
-android.view.InputEvent$1
-android.view.InputEventConsistencyVerifier
-android.view.InputEventReceiver
-android.view.InputEventReceiver$Factory
-android.view.InputEventSender
-android.view.InputQueue
-android.view.InputQueue$Callback
-android.view.InputQueue$FinishedInputEventCallback
-android.view.KeyCharacterMap
-android.view.KeyCharacterMap$1
-android.view.KeyCharacterMap$FallbackAction
-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
-android.view.LayoutInflater$FactoryMerger
-android.view.LayoutInflater$Filter
-android.view.MagnificationSpec
-android.view.Menu
-android.view.MenuInflater
-android.view.MenuInflater$MenuState
-android.view.MenuItem
-android.view.MenuItem$OnActionExpandListener
-android.view.MenuItem$OnMenuItemClickListener
-android.view.MotionEvent
-android.view.MotionEvent$1
-android.view.MotionEvent$PointerCoords
-android.view.MotionEvent$PointerProperties
-android.view.NotificationHeaderView
-android.view.NotificationHeaderView$1
-android.view.NotificationHeaderView$HeaderTouchListener
-android.view.OrientationEventListener
-android.view.OrientationEventListener$SensorEventListenerImpl
-android.view.PointerIcon
-android.view.PointerIcon$1
-android.view.RecordingCanvas
-android.view.RemotableViewMethod
-android.view.RenderNode
-android.view.RenderNode$NoImagePreloadHolder
-android.view.RenderNodeAnimator
-android.view.RenderNodeAnimator$1
-android.view.RenderNodeAnimatorSetHelper
-android.view.ScaleGestureDetector
-android.view.ScaleGestureDetector$1
-android.view.ScaleGestureDetector$OnScaleGestureListener
-android.view.ScaleGestureDetector$SimpleOnScaleGestureListener
-android.view.SearchEvent
-android.view.SubMenu
-android.view.Surface
-android.view.Surface$1
-android.view.Surface$CompatibleCanvas
-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
-android.view.SurfaceView
-android.view.SurfaceView$1
-android.view.SurfaceView$2
-android.view.SurfaceView$3
-android.view.SurfaceView$4
-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
-android.view.View
-android.view.View$1
-android.view.View$10
-android.view.View$11
-android.view.View$12
-android.view.View$2
-android.view.View$3
-android.view.View$4
-android.view.View$5
-android.view.View$6
-android.view.View$7
-android.view.View$8
-android.view.View$9
-android.view.View$AccessibilityDelegate
-android.view.View$AttachInfo
-android.view.View$AttachInfo$Callbacks
-android.view.View$BaseSavedState
-android.view.View$BaseSavedState$1
-android.view.View$CheckForLongPress
-android.view.View$CheckForTap
-android.view.View$DeclaredOnClickListener
-android.view.View$ForegroundInfo
-android.view.View$ListenerInfo
-android.view.View$MatchIdPredicate
-android.view.View$MeasureSpec
-android.view.View$OnApplyWindowInsetsListener
-android.view.View$OnAttachStateChangeListener
-android.view.View$OnClickListener
-android.view.View$OnCreateContextMenuListener
-android.view.View$OnDragListener
-android.view.View$OnFocusChangeListener
-android.view.View$OnGenericMotionListener
-android.view.View$OnHoverListener
-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
-android.view.View$ScrollabilityCache
-android.view.View$TintInfo
-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
-android.view.ViewDebug$ExportedProperty
-android.view.ViewDebug$HierarchyHandler
-android.view.ViewGroup
-android.view.ViewGroup$1
-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
-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.ViewOverlay$OverlayViewGroup
-android.view.ViewParent
-android.view.ViewPropertyAnimator
-android.view.ViewPropertyAnimator$1
-android.view.ViewPropertyAnimator$2
-android.view.ViewPropertyAnimator$3
-android.view.ViewPropertyAnimator$AnimatorEventListener
-android.view.ViewPropertyAnimator$NameValuesHolder
-android.view.ViewPropertyAnimator$PropertyBundle
-android.view.ViewRootImpl
-android.view.ViewRootImpl$1
-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
-android.view.ViewRootImpl$HighContrastTextManager
-android.view.ViewRootImpl$ImeInputStage
-android.view.ViewRootImpl$InputStage
-android.view.ViewRootImpl$InvalidateOnAnimationRunnable
-android.view.ViewRootImpl$NativePostImeInputStage
-android.view.ViewRootImpl$NativePreImeInputStage
-android.view.ViewRootImpl$QueuedInputEvent
-android.view.ViewRootImpl$SyntheticInputStage
-android.view.ViewRootImpl$SyntheticJoystickHandler
-android.view.ViewRootImpl$SyntheticKeyboardHandler
-android.view.ViewRootImpl$SyntheticTouchNavigationHandler
-android.view.ViewRootImpl$SyntheticTouchNavigationHandler$1
-android.view.ViewRootImpl$SyntheticTrackballHandler
-android.view.ViewRootImpl$SystemUiVisibilityInfo
-android.view.ViewRootImpl$TrackballAxis
-android.view.ViewRootImpl$TraversalRunnable
-android.view.ViewRootImpl$ViewPostImeInputStage
-android.view.ViewRootImpl$ViewPreImeInputStage
-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
-android.view.ViewTreeObserver$InternalInsetsInfo
-android.view.ViewTreeObserver$OnComputeInternalInsetsListener
-android.view.ViewTreeObserver$OnDrawListener
-android.view.ViewTreeObserver$OnGlobalFocusChangeListener
-android.view.ViewTreeObserver$OnGlobalLayoutListener
-android.view.ViewTreeObserver$OnPreDrawListener
-android.view.ViewTreeObserver$OnScrollChangedListener
-android.view.ViewTreeObserver$OnTouchModeChangeListener
-android.view.Window
-android.view.Window$Callback
-android.view.Window$OnWindowDismissedCallback
-android.view.Window$OnWindowSwipeDismissedCallback
-android.view.Window$WindowControllerCallback
-android.view.WindowAnimationFrameStats
-android.view.WindowAnimationFrameStats$1
-android.view.WindowCallbackWrapper
-android.view.WindowCallbacks
-android.view.WindowContentFrameStats
-android.view.WindowContentFrameStats$1
-android.view.WindowId
-android.view.WindowId$1
-android.view.WindowInsets
-android.view.WindowLeaked
-android.view.WindowManager
-android.view.WindowManager$BadTokenException
-android.view.WindowManager$InvalidDisplayException
-android.view.WindowManager$KeyboardShortcutsReceiver
-android.view.WindowManager$LayoutParams
-android.view.WindowManager$LayoutParams$1
-android.view.WindowManagerGlobal
-android.view.WindowManagerGlobal$1
-android.view.WindowManagerGlobal$2
-android.view.WindowManagerImpl
-android.view.WindowManagerPolicyConstants
-android.view.WindowManagerPolicyConstants$PointerEventListener
-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$MyCallback
-android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
-android.view.accessibility.AccessibilityNodeInfo
-android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction
-android.view.accessibility.AccessibilityNodeProvider
-android.view.accessibility.AccessibilityRecord
-android.view.accessibility.CaptioningManager
-android.view.accessibility.CaptioningManager$1
-android.view.accessibility.CaptioningManager$CaptionStyle
-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
-android.view.accessibility.IAccessibilityManagerClient
-android.view.accessibility.IAccessibilityManagerClient$Stub
-android.view.accessibility.IAccessibilityManagerClient$Stub$Proxy
-android.view.animation.AccelerateDecelerateInterpolator
-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$Description
-android.view.animation.Animation$NoImagePreloadHolder
-android.view.animation.AnimationSet
-android.view.animation.AnimationUtils
-android.view.animation.AnimationUtils$1
-android.view.animation.AnimationUtils$AnimationState
-android.view.animation.BaseInterpolator
-android.view.animation.ClipRectAnimation
-android.view.animation.CycleInterpolator
-android.view.animation.DecelerateInterpolator
-android.view.animation.GridLayoutAnimationController$AnimationParameters
-android.view.animation.Interpolator
-android.view.animation.LayoutAnimationController
-android.view.animation.LayoutAnimationController$AnimationParameters
-android.view.animation.LinearInterpolator
-android.view.animation.OvershootInterpolator
-android.view.animation.PathInterpolator
-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.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
-android.view.inputmethod.ComposingText
-android.view.inputmethod.CorrectionInfo
-android.view.inputmethod.CursorAnchorInfo
-android.view.inputmethod.CursorAnchorInfo$Builder
-android.view.inputmethod.EditorInfo
-android.view.inputmethod.EditorInfo$1
-android.view.inputmethod.ExtractedText
-android.view.inputmethod.ExtractedText$1
-android.view.inputmethod.ExtractedTextRequest
-android.view.inputmethod.ExtractedTextRequest$1
-android.view.inputmethod.InputBinding
-android.view.inputmethod.InputBinding$1
-android.view.inputmethod.InputConnection
-android.view.inputmethod.InputConnectionInspector
-android.view.inputmethod.InputConnectionWrapper
-android.view.inputmethod.InputContentInfo
-android.view.inputmethod.InputMethod
-android.view.inputmethod.InputMethod$SessionCallback
-android.view.inputmethod.InputMethodInfo
-android.view.inputmethod.InputMethodInfo$1
-android.view.inputmethod.InputMethodManager
-android.view.inputmethod.InputMethodManager$1
-android.view.inputmethod.InputMethodManager$2
-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.inputmethod.InputMethodManagerInternal
-android.view.inputmethod.InputMethodSession
-android.view.inputmethod.InputMethodSession$EventCallback
-android.view.inputmethod.InputMethodSubtype
-android.view.inputmethod.InputMethodSubtype$1
-android.view.inputmethod.InputMethodSubtype$InputMethodSubtypeBuilder
-android.view.inputmethod.InputMethodSubtypeArray
-android.view.textclassifier.TextClassificationManager
-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
-android.view.textservice.SpellCheckerSession$1
-android.view.textservice.SpellCheckerSession$InternalListener
-android.view.textservice.SpellCheckerSession$SpellCheckerSessionListener
-android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl
-android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl$SpellCheckerParams
-android.view.textservice.SpellCheckerSubtype
-android.view.textservice.SpellCheckerSubtype$1
-android.view.textservice.SuggestionsInfo
-android.view.textservice.TextInfo
-android.view.textservice.TextServicesManager
-android.webkit.ConsoleMessage
-android.webkit.ConsoleMessage$MessageLevel
-android.webkit.CookieManager
-android.webkit.CookieSyncManager
-android.webkit.DownloadListener
-android.webkit.GeolocationPermissions
-android.webkit.IWebViewUpdateService
-android.webkit.IWebViewUpdateService$Stub
-android.webkit.IWebViewUpdateService$Stub$Proxy
-android.webkit.JavascriptInterface
-android.webkit.MimeTypeMap
-android.webkit.ServiceWorkerClient
-android.webkit.ServiceWorkerController
-android.webkit.ServiceWorkerWebSettings
-android.webkit.TokenBindingService
-android.webkit.URLUtil
-android.webkit.UserPackage
-android.webkit.ValueCallback
-android.webkit.WebBackForwardList
-android.webkit.WebChromeClient
-android.webkit.WebChromeClient$CustomViewCallback
-android.webkit.WebIconDatabase
-android.webkit.WebMessage
-android.webkit.WebMessagePort
-android.webkit.WebResourceRequest
-android.webkit.WebSettings
-android.webkit.WebSettings$LayoutAlgorithm
-android.webkit.WebSettings$PluginState
-android.webkit.WebSettings$RenderPriority
-android.webkit.WebSettings$ZoomDensity
-android.webkit.WebStorage
-android.webkit.WebSyncManager
-android.webkit.WebView
-android.webkit.WebView$FindListener
-android.webkit.WebView$HitTestResult
-android.webkit.WebView$PictureListener
-android.webkit.WebView$PrivateAccess
-android.webkit.WebView$VisualStateCallback
-android.webkit.WebViewClient
-android.webkit.WebViewDatabase
-android.webkit.WebViewDelegate
-android.webkit.WebViewDelegate$1
-android.webkit.WebViewDelegate$OnTraceEnabledChangeListener
-android.webkit.WebViewFactory
-android.webkit.WebViewFactory$1
-android.webkit.WebViewFactory$MissingWebViewPackageException
-android.webkit.WebViewFactory$RelroFileCreator
-android.webkit.WebViewFactoryProvider
-android.webkit.WebViewFactoryProvider$Statics
-android.webkit.WebViewProvider
-android.webkit.WebViewProvider$ScrollDelegate
-android.webkit.WebViewProvider$ViewDelegate
-android.webkit.WebViewProviderInfo
-android.webkit.WebViewProviderInfo$1
-android.webkit.WebViewProviderResponse
-android.webkit.WebViewProviderResponse$1
-android.webkit.WebViewZygote
-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$AdapterDataSetObserver
-android.widget.AbsListView$CheckForTap
-android.widget.AbsListView$FlingRunnable
-android.widget.AbsListView$FlingRunnable$1
-android.widget.AbsListView$LayoutParams
-android.widget.AbsListView$MultiChoiceModeListener
-android.widget.AbsListView$MultiChoiceModeWrapper
-android.widget.AbsListView$OnScrollListener
-android.widget.AbsListView$PerformClick
-android.widget.AbsListView$RecycleBin
-android.widget.AbsListView$RecyclerListener
-android.widget.AbsListView$SavedState
-android.widget.AbsListView$SavedState$1
-android.widget.AbsListView$SelectionBoundsAdjuster
-android.widget.AbsListView$WindowRunnnable
-android.widget.AbsSeekBar
-android.widget.AbsSpinner
-android.widget.AbsSpinner$RecycleBin
-android.widget.AbsoluteLayout
-android.widget.ActionMenuPresenter
-android.widget.ActionMenuPresenter$1
-android.widget.ActionMenuPresenter$2
-android.widget.ActionMenuPresenter$ActionMenuPopupCallback
-android.widget.ActionMenuPresenter$OverflowMenuButton
-android.widget.ActionMenuPresenter$OverflowMenuButton$1
-android.widget.ActionMenuPresenter$PopupPresenterCallback
-android.widget.ActionMenuView
-android.widget.ActionMenuView$ActionMenuChildView
-android.widget.ActionMenuView$ActionMenuPresenterCallback
-android.widget.ActionMenuView$LayoutParams
-android.widget.ActionMenuView$MenuBuilderCallback
-android.widget.ActionMenuView$OnMenuItemClickListener
-android.widget.Adapter
-android.widget.AdapterView
-android.widget.AdapterView$AdapterDataSetObserver
-android.widget.AdapterView$OnItemClickListener
-android.widget.AdapterView$OnItemLongClickListener
-android.widget.AdapterView$OnItemSelectedListener
-android.widget.AdapterView$SelectionNotifier
-android.widget.ArrayAdapter
-android.widget.AutoCompleteTextView
-android.widget.AutoCompleteTextView$DropDownItemClickListener
-android.widget.AutoCompleteTextView$MyWatcher
-android.widget.AutoCompleteTextView$PassThroughClickListener
-android.widget.AutoCompleteTextView$PopupDataSetObserver
-android.widget.AutoCompleteTextView$PopupDataSetObserver$1
-android.widget.AutoCompleteTextView$Validator
-android.widget.BaseAdapter
-android.widget.Button
-android.widget.CheckBox
-android.widget.Checkable
-android.widget.CheckedTextView
-android.widget.Chronometer
-android.widget.Chronometer$1
-android.widget.CompoundButton
-android.widget.CompoundButton$OnCheckedChangeListener
-android.widget.CursorAdapter
-android.widget.CursorFilter$CursorFilterClient
-android.widget.DatePicker
-android.widget.DateTimeView
-android.widget.DateTimeView$ReceiverInfo
-android.widget.DateTimeView$ReceiverInfo$1
-android.widget.DateTimeView$ReceiverInfo$2
-android.widget.DropDownListView
-android.widget.EdgeEffect
-android.widget.EditText
-android.widget.Editor
-android.widget.Editor$1
-android.widget.Editor$2
-android.widget.Editor$Blink
-android.widget.Editor$CursorAnchorInfoNotifier
-android.widget.Editor$CursorController
-android.widget.Editor$EditOperation
-android.widget.Editor$EditOperation$1
-android.widget.Editor$HandleView
-android.widget.Editor$InputContentType
-android.widget.Editor$InputMethodState
-android.widget.Editor$InsertionHandleView
-android.widget.Editor$InsertionHandleView$2
-android.widget.Editor$InsertionPointCursorController
-android.widget.Editor$PositionListener
-android.widget.Editor$ProcessTextIntentActionsHandler
-android.widget.Editor$SelectionModifierCursorController
-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.ExpandableListConnector
-android.widget.FastScroller
-android.widget.FastScroller$1
-android.widget.FastScroller$2
-android.widget.FastScroller$3
-android.widget.FastScroller$4
-android.widget.FastScroller$5
-android.widget.FastScroller$6
-android.widget.Filter
-android.widget.Filter$FilterListener
-android.widget.Filter$FilterResults
-android.widget.Filter$RequestArguments
-android.widget.Filter$RequestHandler
-android.widget.Filter$ResultsHandler
-android.widget.Filterable
-android.widget.ForwardingListener
-android.widget.FrameLayout
-android.widget.FrameLayout$LayoutParams
-android.widget.GridLayout
-android.widget.GridLayout$1
-android.widget.GridLayout$2
-android.widget.GridLayout$3
-android.widget.GridLayout$4
-android.widget.GridLayout$5
-android.widget.GridLayout$6
-android.widget.GridLayout$6$1
-android.widget.GridLayout$7
-android.widget.GridLayout$8
-android.widget.GridLayout$Alignment
-android.widget.GridLayout$Arc
-android.widget.GridLayout$Assoc
-android.widget.GridLayout$Axis
-android.widget.GridLayout$Axis$1
-android.widget.GridLayout$Bounds
-android.widget.GridLayout$Interval
-android.widget.GridLayout$LayoutParams
-android.widget.GridLayout$MutableInt
-android.widget.GridLayout$PackedMap
-android.widget.GridLayout$Spec
-android.widget.GridView
-android.widget.HeaderViewListAdapter
-android.widget.HorizontalScrollView
-android.widget.HorizontalScrollView$SavedState
-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
-android.widget.ListAdapter
-android.widget.ListPopupWindow
-android.widget.ListPopupWindow$2
-android.widget.ListPopupWindow$3
-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.ListView$FixedViewInfo
-android.widget.MediaController
-android.widget.MediaController$MediaPlayerControl
-android.widget.MultiAutoCompleteTextView
-android.widget.MultiAutoCompleteTextView$Tokenizer
-android.widget.NumberPicker
-android.widget.NumberPicker$Formatter
-android.widget.NumberPicker$OnValueChangeListener
-android.widget.OverScroller
-android.widget.OverScroller$SplineOverScroller
-android.widget.PopupMenu
-android.widget.PopupMenu$1
-android.widget.PopupMenu$2
-android.widget.PopupMenu$3
-android.widget.PopupMenu$OnMenuItemClickListener
-android.widget.PopupWindow
-android.widget.PopupWindow$1
-android.widget.PopupWindow$2
-android.widget.PopupWindow$OnDismissListener
-android.widget.PopupWindow$PopupBackgroundView
-android.widget.PopupWindow$PopupDecorView
-android.widget.PopupWindow$PopupDecorView$1
-android.widget.ProgressBar
-android.widget.ProgressBar$1
-android.widget.ProgressBar$ProgressTintInfo
-android.widget.ProgressBar$RefreshData
-android.widget.ProgressBar$RefreshProgressRunnable
-android.widget.ProgressBar$SavedState
-android.widget.ProgressBar$SavedState$1
-android.widget.QuickContactBadge
-android.widget.QuickContactBadge$QueryHandler
-android.widget.RadioButton
-android.widget.RadioGroup
-android.widget.RadioGroup$CheckedStateTracker
-android.widget.RadioGroup$LayoutParams
-android.widget.RadioGroup$OnCheckedChangeListener
-android.widget.RadioGroup$PassThroughHierarchyChangeListener
-android.widget.RatingBar
-android.widget.RelativeLayout
-android.widget.RelativeLayout$DependencyGraph
-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$AsyncApplyTask
-android.widget.RemoteViews$BitmapCache
-android.widget.RemoteViews$BitmapReflectionAction
-android.widget.RemoteViews$LayoutParamAction
-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$SetDrawableTint
-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.ResourceCursorAdapter
-android.widget.RtlSpacingHelper
-android.widget.ScrollBarDrawable
-android.widget.ScrollView
-android.widget.ScrollView$SavedState
-android.widget.ScrollView$SavedState$1
-android.widget.Scroller
-android.widget.Scroller$ViscousFluidInterpolator
-android.widget.SearchView$OnCloseListener
-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$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$SpinnerPopup
-android.widget.SpinnerAdapter
-android.widget.Switch
-android.widget.Switch$1
-android.widget.TabHost
-android.widget.TabHost$1
-android.widget.TabHost$2
-android.widget.TabHost$ContentStrategy
-android.widget.TabHost$FactoryContentStrategy
-android.widget.TabHost$IndicatorStrategy
-android.widget.TabHost$OnTabChangeListener
-android.widget.TabHost$TabContentFactory
-android.widget.TabHost$TabSpec
-android.widget.TabHost$ViewIndicatorStrategy
-android.widget.TabWidget
-android.widget.TabWidget$OnTabSelectionChanged
-android.widget.TabWidget$TabClickListener
-android.widget.TableLayout
-android.widget.TextClock
-android.widget.TextClock$1
-android.widget.TextClock$2
-android.widget.TextClock$FormatChangeObserver
-android.widget.TextSwitcher
-android.widget.TextView
-android.widget.TextView$2
-android.widget.TextView$3
-android.widget.TextView$BufferType
-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
-android.widget.ThemedSpinnerAdapter
-android.widget.TimePicker
-android.widget.TimePicker$OnTimeChangedListener
-android.widget.Toast
-android.widget.Toast$TN
-android.widget.Toast$TN$1
-android.widget.ToggleButton
-android.widget.Toolbar
-android.widget.Toolbar$1
-android.widget.Toolbar$2
-android.widget.Toolbar$ExpandedActionViewMenuPresenter
-android.widget.Toolbar$LayoutParams
-android.widget.Toolbar$OnMenuItemClickListener
-android.widget.VideoView
-android.widget.ViewAnimator
-android.widget.ViewFlipper
-android.widget.ViewFlipper$1
-android.widget.ViewFlipper$2
-android.widget.ViewSwitcher
-android.widget.WrapperListAdapter
-com.android.framework.protobuf.nano.CodedInputByteBufferNano
-com.android.framework.protobuf.nano.CodedOutputByteBufferNano
-com.android.framework.protobuf.nano.InternalNano
-com.android.framework.protobuf.nano.InvalidProtocolBufferNanoException
-com.android.framework.protobuf.nano.MessageNano
-com.android.framework.protobuf.nano.WireFormatNano
-com.android.i18n.phonenumbers.AlternateFormatsCountryCodeSet
-com.android.i18n.phonenumbers.AsYouTypeFormatter
-com.android.i18n.phonenumbers.CountryCodeToRegionCodeMap
-com.android.i18n.phonenumbers.MetadataLoader
-com.android.i18n.phonenumbers.MetadataManager
-com.android.i18n.phonenumbers.MetadataManager$1
-com.android.i18n.phonenumbers.MetadataSource
-com.android.i18n.phonenumbers.MultiFileMetadataSourceImpl
-com.android.i18n.phonenumbers.NumberParseException
-com.android.i18n.phonenumbers.NumberParseException$ErrorType
-com.android.i18n.phonenumbers.PhoneNumberMatcher
-com.android.i18n.phonenumbers.PhoneNumberMatcher$State
-com.android.i18n.phonenumbers.PhoneNumberUtil
-com.android.i18n.phonenumbers.PhoneNumberUtil$1
-com.android.i18n.phonenumbers.PhoneNumberUtil$Leniency
-com.android.i18n.phonenumbers.PhoneNumberUtil$Leniency$1
-com.android.i18n.phonenumbers.PhoneNumberUtil$Leniency$2
-com.android.i18n.phonenumbers.PhoneNumberUtil$Leniency$3
-com.android.i18n.phonenumbers.PhoneNumberUtil$Leniency$4
-com.android.i18n.phonenumbers.PhoneNumberUtil$PhoneNumberFormat
-com.android.i18n.phonenumbers.PhoneNumberUtil$PhoneNumberType
-com.android.i18n.phonenumbers.PhoneNumberUtil$ValidationResult
-com.android.i18n.phonenumbers.Phonemetadata$NumberFormat
-com.android.i18n.phonenumbers.Phonemetadata$PhoneMetadata
-com.android.i18n.phonenumbers.Phonemetadata$PhoneMetadataCollection
-com.android.i18n.phonenumbers.Phonemetadata$PhoneNumberDesc
-com.android.i18n.phonenumbers.Phonenumber$PhoneNumber
-com.android.i18n.phonenumbers.Phonenumber$PhoneNumber$CountryCodeSource
-com.android.i18n.phonenumbers.RegexCache
-com.android.i18n.phonenumbers.RegexCache$LRUCache
-com.android.i18n.phonenumbers.RegexCache$LRUCache$1
-com.android.i18n.phonenumbers.ShortNumbersRegionCodeSet
-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
-com.android.ims.ImsConfig
-com.android.ims.ImsConfigListener
-com.android.ims.ImsConfigListener$Stub
-com.android.ims.ImsConnectionStateListener
-com.android.ims.ImsEcbm
-com.android.ims.ImsEcbm$ImsEcbmListenerProxy
-com.android.ims.ImsEcbmStateListener
-com.android.ims.ImsException
-com.android.ims.ImsExternalCallStateListener
-com.android.ims.ImsManager
-com.android.ims.ImsManager$1
-com.android.ims.ImsManager$ImsRegistrationListenerProxy
-com.android.ims.ImsManager$ImsServiceDeathRecipient
-com.android.ims.ImsReasonInfo
-com.android.ims.ImsReasonInfo$1
-com.android.ims.ImsSsInfo
-com.android.ims.internal.IImsCallSession
-com.android.ims.internal.IImsCallSessionListener
-com.android.ims.internal.IImsConfig
-com.android.ims.internal.IImsConfig$Stub
-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.IImsMultiEndpoint
-com.android.ims.internal.IImsRegistrationListener
-com.android.ims.internal.IImsRegistrationListener$Stub
-com.android.ims.internal.IImsService
-com.android.ims.internal.IImsService$Stub
-com.android.ims.internal.IImsServiceController
-com.android.ims.internal.IImsServiceFeatureCallback
-com.android.ims.internal.IImsUt
-com.android.ims.internal.IImsUt$Stub
-com.android.ims.internal.IImsUtListener
-com.android.ims.internal.IImsUtListener$Stub
-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.AlertController
-com.android.internal.app.AlertController$1
-com.android.internal.app.AlertController$AlertParams
-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$RecycleListView
-com.android.internal.app.AssistUtils
-com.android.internal.app.ColorDisplayController
-com.android.internal.app.ColorDisplayController$Callback
-com.android.internal.app.IAppOpsCallback
-com.android.internal.app.IAppOpsCallback$Stub
-com.android.internal.app.IAppOpsCallback$Stub$Proxy
-com.android.internal.app.IAppOpsService
-com.android.internal.app.IAppOpsService$Stub
-com.android.internal.app.IAppOpsService$Stub$Proxy
-com.android.internal.app.IAssistScreenshotReceiver
-com.android.internal.app.IBatteryStats
-com.android.internal.app.IBatteryStats$Stub
-com.android.internal.app.IBatteryStats$Stub$Proxy
-com.android.internal.app.IMediaContainerService
-com.android.internal.app.IMediaContainerService$Stub
-com.android.internal.app.IMediaContainerService$Stub$Proxy
-com.android.internal.app.ISoundTriggerService
-com.android.internal.app.ISoundTriggerService$Stub
-com.android.internal.app.IVoiceInteractionManagerService
-com.android.internal.app.IVoiceInteractionManagerService$Stub
-com.android.internal.app.IVoiceInteractionManagerService$Stub$Proxy
-com.android.internal.app.IVoiceInteractionSessionListener
-com.android.internal.app.IVoiceInteractionSessionListener$Stub
-com.android.internal.app.IVoiceInteractionSessionListener$Stub$Proxy
-com.android.internal.app.IVoiceInteractionSessionShowCallback
-com.android.internal.app.IVoiceInteractionSessionShowCallback$Stub
-com.android.internal.app.IVoiceInteractor
-com.android.internal.app.IVoiceInteractor$Stub
-com.android.internal.app.ProcessMap
-com.android.internal.app.ResolverActivity
-com.android.internal.app.ToolbarActionBar
-com.android.internal.app.ToolbarActionBar$1
-com.android.internal.app.ToolbarActionBar$2
-com.android.internal.app.ToolbarActionBar$ActionMenuPresenterCallback
-com.android.internal.app.ToolbarActionBar$MenuBuilderCallback
-com.android.internal.app.ToolbarActionBar$ToolbarCallbackWrapper
-com.android.internal.app.WindowDecorActionBar
-com.android.internal.app.WindowDecorActionBar$1
-com.android.internal.app.WindowDecorActionBar$2
-com.android.internal.app.WindowDecorActionBar$3
-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.ProcessState
-com.android.internal.app.procstats.ProcessState$1
-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$ProcessStateHolder
-com.android.internal.app.procstats.PssTable
-com.android.internal.app.procstats.ServiceState
-com.android.internal.app.procstats.SparseMappingTable
-com.android.internal.app.procstats.SparseMappingTable$Table
-com.android.internal.app.procstats.SysMemUsageTable
-com.android.internal.appwidget.IAppWidgetHost
-com.android.internal.appwidget.IAppWidgetHost$Stub
-com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy
-com.android.internal.appwidget.IAppWidgetService
-com.android.internal.appwidget.IAppWidgetService$Stub
-com.android.internal.appwidget.IAppWidgetService$Stub$Proxy
-com.android.internal.backup.IBackupTransport
-com.android.internal.backup.IBackupTransport$Stub
-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
-com.android.internal.graphics.drawable.AnimationScaleListDrawable
-com.android.internal.graphics.drawable.AnimationScaleListDrawable$AnimationScaleListState
-com.android.internal.hardware.AmbientDisplayConfiguration
-com.android.internal.inputmethod.IInputContentUriToken
-com.android.internal.inputmethod.InputMethodSubtypeHandle
-com.android.internal.inputmethod.InputMethodSubtypeSwitchingController
-com.android.internal.inputmethod.InputMethodSubtypeSwitchingController$ControllerImpl
-com.android.internal.inputmethod.InputMethodSubtypeSwitchingController$DynamicRotationList
-com.android.internal.inputmethod.InputMethodSubtypeSwitchingController$ImeSubtypeListItem
-com.android.internal.inputmethod.InputMethodSubtypeSwitchingController$InputMethodAndSubtypeList
-com.android.internal.inputmethod.InputMethodSubtypeSwitchingController$InputMethodAndSubtypeList$1
-com.android.internal.inputmethod.InputMethodSubtypeSwitchingController$StaticRotationList
-com.android.internal.inputmethod.InputMethodUtils
-com.android.internal.inputmethod.InputMethodUtils$1
-com.android.internal.inputmethod.InputMethodUtils$InputMethodListBuilder
-com.android.internal.inputmethod.InputMethodUtils$InputMethodSettings
-com.android.internal.inputmethod.LocaleUtils
-com.android.internal.inputmethod.LocaleUtils$LocaleExtractor
-com.android.internal.inputmethod.LocaleUtils$ScoreEntry
-com.android.internal.location.GpsNetInitiatedHandler
-com.android.internal.location.GpsNetInitiatedHandler$1
-com.android.internal.location.GpsNetInitiatedHandler$2
-com.android.internal.location.ILocationProvider
-com.android.internal.location.ILocationProvider$Stub
-com.android.internal.location.ILocationProvider$Stub$Proxy
-com.android.internal.location.ProviderProperties
-com.android.internal.location.ProviderProperties$1
-com.android.internal.location.ProviderRequest
-com.android.internal.location.ProviderRequest$1
-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.LegacyVpnInfo
-com.android.internal.net.NetworkStatsFactory
-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.BatteryStatsHelper
-com.android.internal.os.BatteryStatsImpl
-com.android.internal.os.BatteryStatsImpl$1
-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
-com.android.internal.os.BatteryStatsImpl$SamplingTimer
-com.android.internal.os.BatteryStatsImpl$StopwatchTimer
-com.android.internal.os.BatteryStatsImpl$SystemClocks
-com.android.internal.os.BatteryStatsImpl$TimeBase
-com.android.internal.os.BatteryStatsImpl$TimeBaseObs
-com.android.internal.os.BatteryStatsImpl$Timer
-com.android.internal.os.BatteryStatsImpl$Uid
-com.android.internal.os.BatteryStatsImpl$Uid$1
-com.android.internal.os.BatteryStatsImpl$Uid$2
-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$Sensor
-com.android.internal.os.BatteryStatsImpl$Uid$Wakelock
-com.android.internal.os.BinderInternal
-com.android.internal.os.BinderInternal$GcWatcher
-com.android.internal.os.FuseAppLoop
-com.android.internal.os.FuseAppLoop$1
-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.IResultReceiver
-com.android.internal.os.IResultReceiver$Stub
-com.android.internal.os.IResultReceiver$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.PathClassLoaderFactory
-com.android.internal.os.PowerProfile
-com.android.internal.os.PowerProfile$CpuClusterKey
-com.android.internal.os.ProcessCpuTracker
-com.android.internal.os.ProcessCpuTracker$1
-com.android.internal.os.ProcessCpuTracker$FilterStats
-com.android.internal.os.ProcessCpuTracker$Stats
-com.android.internal.os.RoSystemProperties
-com.android.internal.os.RuntimeInit
-com.android.internal.os.RuntimeInit$1
-com.android.internal.os.RuntimeInit$Arguments
-com.android.internal.os.RuntimeInit$KillApplicationHandler
-com.android.internal.os.RuntimeInit$LoggingHandler
-com.android.internal.os.SamplingProfilerIntegration
-com.android.internal.os.SomeArgs
-com.android.internal.os.Zygote
-com.android.internal.os.Zygote$MethodAndArgsCaller
-com.android.internal.os.ZygoteConnection
-com.android.internal.os.ZygoteConnection$Arguments
-com.android.internal.os.ZygoteInit
-com.android.internal.os.ZygoteSecurityException
-com.android.internal.os.ZygoteServer
-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
-com.android.internal.policy.DockedDividerUtils
-com.android.internal.policy.IKeyguardDismissCallback
-com.android.internal.policy.IKeyguardDrawnCallback
-com.android.internal.policy.IKeyguardDrawnCallback$Stub
-com.android.internal.policy.IKeyguardDrawnCallback$Stub$Proxy
-com.android.internal.policy.IKeyguardExitCallback
-com.android.internal.policy.IKeyguardService
-com.android.internal.policy.IKeyguardService$Stub
-com.android.internal.policy.IKeyguardService$Stub$Proxy
-com.android.internal.policy.IKeyguardStateCallback
-com.android.internal.policy.IKeyguardStateCallback$Stub
-com.android.internal.policy.IKeyguardStateCallback$Stub$Proxy
-com.android.internal.policy.IShortcutService
-com.android.internal.policy.IShortcutService$Stub
-com.android.internal.policy.IShortcutService$Stub$Proxy
-com.android.internal.policy.PhoneFallbackEventHandler
-com.android.internal.policy.PhoneLayoutInflater
-com.android.internal.policy.PhoneWindow
-com.android.internal.policy.PhoneWindow$1
-com.android.internal.policy.PhoneWindow$ActionMenuPresenterCallback
-com.android.internal.policy.PhoneWindow$PanelFeatureState
-com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
-com.android.internal.policy.PhoneWindow$RotationWatcher
-com.android.internal.policy.PhoneWindow$RotationWatcher$1
-com.android.internal.policy.PipSnapAlgorithm
-com.android.internal.statusbar.IStatusBar
-com.android.internal.statusbar.IStatusBar$Stub
-com.android.internal.statusbar.IStatusBar$Stub$Proxy
-com.android.internal.statusbar.IStatusBarService
-com.android.internal.statusbar.IStatusBarService$Stub
-com.android.internal.statusbar.IStatusBarService$Stub$Proxy
-com.android.internal.statusbar.NotificationVisibility
-com.android.internal.statusbar.NotificationVisibility$1
-com.android.internal.statusbar.StatusBarIcon
-com.android.internal.statusbar.StatusBarIcon$1
-com.android.internal.telecom.IConnectionService
-com.android.internal.telecom.IConnectionService$Stub
-com.android.internal.telecom.IConnectionService$Stub$Proxy
-com.android.internal.telecom.IConnectionServiceAdapter
-com.android.internal.telecom.IConnectionServiceAdapter$Stub
-com.android.internal.telecom.IConnectionServiceAdapter$Stub$Proxy
-com.android.internal.telecom.IInCallAdapter
-com.android.internal.telecom.IInCallAdapter$Stub
-com.android.internal.telecom.IInCallService
-com.android.internal.telecom.IInCallService$Stub
-com.android.internal.telecom.IInCallService$Stub$Proxy
-com.android.internal.telecom.ITelecomService
-com.android.internal.telecom.ITelecomService$Stub
-com.android.internal.telecom.ITelecomService$Stub$Proxy
-com.android.internal.telecom.IVideoProvider
-com.android.internal.telecom.IVideoProvider$Stub
-com.android.internal.telecom.RemoteServiceCallback
-com.android.internal.telecom.RemoteServiceCallback$Stub
-com.android.internal.telecom.RemoteServiceCallback$Stub$Proxy
-com.android.internal.telephony.AppSmsManager
-com.android.internal.telephony.BaseCommands
-com.android.internal.telephony.Call
-com.android.internal.telephony.Call$SrvccState
-com.android.internal.telephony.Call$State
-com.android.internal.telephony.CallManager
-com.android.internal.telephony.CallManager$CallManagerHandler
-com.android.internal.telephony.CallStateException
-com.android.internal.telephony.CallTracker
-com.android.internal.telephony.CallerInfo
-com.android.internal.telephony.CallerInfoAsyncQuery
-com.android.internal.telephony.CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler
-com.android.internal.telephony.CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler$CallerInfoWorkerHandler
-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
-com.android.internal.telephony.CarrierServiceBindHelper$2
-com.android.internal.telephony.CarrierServiceBindHelper$AppBinding
-com.android.internal.telephony.CarrierServiceBindHelper$CarrierServicePackageMonitor
-com.android.internal.telephony.CarrierServiceStateTracker
-com.android.internal.telephony.CarrierServiceStateTracker$1
-com.android.internal.telephony.CarrierSignalAgent
-com.android.internal.telephony.CarrierSignalAgent$1
-com.android.internal.telephony.CellBroadcastHandler
-com.android.internal.telephony.CellNetworkScanResult
-com.android.internal.telephony.ClientWakelockAccountant
-com.android.internal.telephony.ClientWakelockTracker
-com.android.internal.telephony.CommandException
-com.android.internal.telephony.CommandException$Error
-com.android.internal.telephony.CommandsInterface
-com.android.internal.telephony.CommandsInterface$RadioState
-com.android.internal.telephony.Connection
-com.android.internal.telephony.DctConstants$Activity
-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
-com.android.internal.telephony.GsmCdmaCall
-com.android.internal.telephony.GsmCdmaCallTracker
-com.android.internal.telephony.GsmCdmaCallTracker$1
-com.android.internal.telephony.GsmCdmaConnection
-com.android.internal.telephony.GsmCdmaPhone
-com.android.internal.telephony.GsmCdmaPhone$1
-com.android.internal.telephony.GsmCdmaPhone$2
-com.android.internal.telephony.HardwareConfig
-com.android.internal.telephony.ICarrierConfigLoader
-com.android.internal.telephony.ICarrierConfigLoader$Stub
-com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
-com.android.internal.telephony.IIccPhoneBook
-com.android.internal.telephony.IIccPhoneBook$Stub
-com.android.internal.telephony.IMms
-com.android.internal.telephony.IMms$Stub
-com.android.internal.telephony.IOnSubscriptionsChangedListener
-com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub
-com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub$Proxy
-com.android.internal.telephony.IPhoneStateListener
-com.android.internal.telephony.IPhoneStateListener$Stub
-com.android.internal.telephony.IPhoneStateListener$Stub$Proxy
-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.ISms$Stub$Proxy
-com.android.internal.telephony.ISub
-com.android.internal.telephony.ISub$Stub
-com.android.internal.telephony.ISub$Stub$Proxy
-com.android.internal.telephony.ITelephony
-com.android.internal.telephony.ITelephony$Stub
-com.android.internal.telephony.ITelephony$Stub$Proxy
-com.android.internal.telephony.ITelephonyRegistry
-com.android.internal.telephony.ITelephonyRegistry$Stub
-com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
-com.android.internal.telephony.IWapPushManager
-com.android.internal.telephony.IccCard
-com.android.internal.telephony.IccCardConstants$State
-com.android.internal.telephony.IccPhoneBookInterfaceManager
-com.android.internal.telephony.IccPhoneBookInterfaceManager$1
-com.android.internal.telephony.IccProvider
-com.android.internal.telephony.IccSmsInterfaceManager
-com.android.internal.telephony.IccSmsInterfaceManager$1
-com.android.internal.telephony.IccSmsInterfaceManager$CdmaBroadcastRangeManager
-com.android.internal.telephony.IccSmsInterfaceManager$CellBroadcastRangeManager
-com.android.internal.telephony.ImsSMSDispatcher
-com.android.internal.telephony.InboundSmsHandler
-com.android.internal.telephony.InboundSmsHandler$1
-com.android.internal.telephony.InboundSmsHandler$DefaultState
-com.android.internal.telephony.InboundSmsHandler$DeliveringState
-com.android.internal.telephony.InboundSmsHandler$IdleState
-com.android.internal.telephony.InboundSmsHandler$NewMessageNotificationActionReceiver
-com.android.internal.telephony.InboundSmsHandler$StartupState
-com.android.internal.telephony.InboundSmsHandler$WaitingState
-com.android.internal.telephony.IntRangeManager
-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.PhoneSubInfoController
-com.android.internal.telephony.PhoneSwitcher
-com.android.internal.telephony.PhoneSwitcher$1
-com.android.internal.telephony.PhoneSwitcher$2
-com.android.internal.telephony.PhoneSwitcher$PhoneState
-com.android.internal.telephony.PhoneSwitcher$PhoneSwitcherNetworkRequestListener
-com.android.internal.telephony.ProxyController
-com.android.internal.telephony.ProxyController$1
-com.android.internal.telephony.RIL
-com.android.internal.telephony.RIL$RadioProxyDeathRecipient
-com.android.internal.telephony.RIL$RilHandler
-com.android.internal.telephony.RILConstants
-com.android.internal.telephony.RILRequest
-com.android.internal.telephony.RadioCapability
-com.android.internal.telephony.RadioIndication
-com.android.internal.telephony.RadioResponse
-com.android.internal.telephony.RatRatcheter
-com.android.internal.telephony.RatRatcheter$1
-com.android.internal.telephony.RestrictedState
-com.android.internal.telephony.RetryManager
-com.android.internal.telephony.RilWakelockInfo
-com.android.internal.telephony.SMSDispatcher
-com.android.internal.telephony.SMSDispatcher$SettingsObserver
-com.android.internal.telephony.ServiceStateTracker
-com.android.internal.telephony.ServiceStateTracker$1
-com.android.internal.telephony.ServiceStateTracker$2
-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
-com.android.internal.telephony.SmsBroadcastUndelivered
-com.android.internal.telephony.SmsBroadcastUndelivered$1
-com.android.internal.telephony.SmsBroadcastUndelivered$ScanRawTableThread
-com.android.internal.telephony.SmsMessageBase
-com.android.internal.telephony.SmsStorageMonitor
-com.android.internal.telephony.SmsStorageMonitor$1
-com.android.internal.telephony.SmsUsageMonitor
-com.android.internal.telephony.SmsUsageMonitor$SettingsObserver
-com.android.internal.telephony.SmsUsageMonitor$SettingsObserverHandler
-com.android.internal.telephony.SubscriptionController
-com.android.internal.telephony.SubscriptionController$ScLocalLog
-com.android.internal.telephony.SubscriptionInfoUpdater
-com.android.internal.telephony.SubscriptionInfoUpdater$1
-com.android.internal.telephony.SubscriptionInfoUpdater$2
-com.android.internal.telephony.SubscriptionMonitor
-com.android.internal.telephony.SubscriptionMonitor$1
-com.android.internal.telephony.SubscriptionMonitor$2
-com.android.internal.telephony.TelephonyCapabilities
-com.android.internal.telephony.TelephonyComponentFactory
-com.android.internal.telephony.TelephonyDevController
-com.android.internal.telephony.TelephonyTester
-com.android.internal.telephony.TelephonyTester$1
-com.android.internal.telephony.UiccPhoneBookController
-com.android.internal.telephony.UiccSmsController
-com.android.internal.telephony.WakeLockStateMachine
-com.android.internal.telephony.WakeLockStateMachine$1
-com.android.internal.telephony.WakeLockStateMachine$DefaultState
-com.android.internal.telephony.WakeLockStateMachine$IdleState
-com.android.internal.telephony.WakeLockStateMachine$WaitingState
-com.android.internal.telephony.WapPushOverSms
-com.android.internal.telephony.WapPushOverSms$1
-com.android.internal.telephony.WapPushOverSms$BindServiceThread
-com.android.internal.telephony.cat.AppInterface
-com.android.internal.telephony.cat.CatLog
-com.android.internal.telephony.cat.CatService
-com.android.internal.telephony.cdma.CdmaInboundSmsHandler
-com.android.internal.telephony.cdma.CdmaSMSDispatcher
-com.android.internal.telephony.cdma.CdmaServiceCategoryProgramHandler
-com.android.internal.telephony.cdma.CdmaServiceCategoryProgramHandler$1
-com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager
-com.android.internal.telephony.cdma.EriInfo
-com.android.internal.telephony.cdma.EriManager
-com.android.internal.telephony.cdma.EriManager$EriFile
-com.android.internal.telephony.dataconnection.ApnContext
-com.android.internal.telephony.dataconnection.DataConnection
-com.android.internal.telephony.dataconnection.DataEnabledSettings
-com.android.internal.telephony.dataconnection.DcController
-com.android.internal.telephony.dataconnection.DcController$1
-com.android.internal.telephony.dataconnection.DcController$DccDefaultState
-com.android.internal.telephony.dataconnection.DcFailBringUp
-com.android.internal.telephony.dataconnection.DcFailCause
-com.android.internal.telephony.dataconnection.DcRequest
-com.android.internal.telephony.dataconnection.DcTesterDeactivateAll
-com.android.internal.telephony.dataconnection.DcTesterDeactivateAll$1
-com.android.internal.telephony.dataconnection.DcTesterFailBringUpAll
-com.android.internal.telephony.dataconnection.DcTesterFailBringUpAll$1
-com.android.internal.telephony.dataconnection.DcTracker
-com.android.internal.telephony.dataconnection.DcTracker$1
-com.android.internal.telephony.dataconnection.DcTracker$2
-com.android.internal.telephony.dataconnection.DcTracker$3
-com.android.internal.telephony.dataconnection.DcTracker$4
-com.android.internal.telephony.dataconnection.DcTracker$ApnChangeObserver
-com.android.internal.telephony.dataconnection.DcTracker$DataAllowFailReason
-com.android.internal.telephony.dataconnection.DcTracker$DataAllowFailReasonType
-com.android.internal.telephony.dataconnection.DcTracker$RetryFailures
-com.android.internal.telephony.dataconnection.DcTracker$SettingsObserver
-com.android.internal.telephony.dataconnection.DcTracker$TxRxSum
-com.android.internal.telephony.dataconnection.TelephonyNetworkFactory
-com.android.internal.telephony.dataconnection.TelephonyNetworkFactory$InternalHandler
-com.android.internal.telephony.gsm.GsmCellBroadcastHandler
-com.android.internal.telephony.gsm.GsmInboundSmsHandler
-com.android.internal.telephony.gsm.GsmSMSDispatcher
-com.android.internal.telephony.gsm.SmsMessage
-com.android.internal.telephony.gsm.UsimDataDownloadHandler
-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
-com.android.internal.telephony.ims.ImsResolver$3
-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
-com.android.internal.telephony.imsphone.ImsExternalCallTracker$ExternalCallStateListener
-com.android.internal.telephony.imsphone.ImsExternalCallTracker$ExternalConnectionListener
-com.android.internal.telephony.imsphone.ImsExternalCallTracker$ImsCallNotify
-com.android.internal.telephony.imsphone.ImsExternalConnection$Listener
-com.android.internal.telephony.imsphone.ImsPhone
-com.android.internal.telephony.imsphone.ImsPhone$1
-com.android.internal.telephony.imsphone.ImsPhone$2
-com.android.internal.telephony.imsphone.ImsPhone$3
-com.android.internal.telephony.imsphone.ImsPhoneBase
-com.android.internal.telephony.imsphone.ImsPhoneCall
-com.android.internal.telephony.imsphone.ImsPhoneCallTracker
-com.android.internal.telephony.imsphone.ImsPhoneCallTracker$1
-com.android.internal.telephony.imsphone.ImsPhoneCallTracker$2
-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
-com.android.internal.telephony.imsphone.ImsPullCall
-com.android.internal.telephony.metrics.CallSessionEventBuilder
-com.android.internal.telephony.metrics.InProgressCallSession
-com.android.internal.telephony.metrics.InProgressSmsSession
-com.android.internal.telephony.metrics.SmsSessionEventBuilder
-com.android.internal.telephony.metrics.TelephonyEventBuilder
-com.android.internal.telephony.metrics.TelephonyMetrics
-com.android.internal.telephony.nano.TelephonyProto$ImsCapabilities
-com.android.internal.telephony.nano.TelephonyProto$ImsConnectionState
-com.android.internal.telephony.nano.TelephonyProto$ImsReasonInfo
-com.android.internal.telephony.nano.TelephonyProto$RilDataCall
-com.android.internal.telephony.nano.TelephonyProto$SmsSession$Event
-com.android.internal.telephony.nano.TelephonyProto$TelephonyCallSession$Event
-com.android.internal.telephony.nano.TelephonyProto$TelephonyCallSession$Event$RilCall
-com.android.internal.telephony.nano.TelephonyProto$TelephonyEvent
-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
-com.android.internal.telephony.uicc.IccCardProxy
-com.android.internal.telephony.uicc.IccCardStatus
-com.android.internal.telephony.uicc.IccCardStatus$CardState
-com.android.internal.telephony.uicc.IccCardStatus$PinState
-com.android.internal.telephony.uicc.IccConstants
-com.android.internal.telephony.uicc.IccRecords
-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
-com.android.internal.textservice.ISpellCheckerSessionListener
-com.android.internal.textservice.ISpellCheckerSessionListener$Stub
-com.android.internal.textservice.ISpellCheckerSessionListener$Stub$Proxy
-com.android.internal.textservice.ITextServicesManager
-com.android.internal.textservice.ITextServicesManager$Stub
-com.android.internal.textservice.ITextServicesManager$Stub$Proxy
-com.android.internal.textservice.ITextServicesSessionListener
-com.android.internal.textservice.ITextServicesSessionListener$Stub
-com.android.internal.textservice.ITextServicesSessionListener$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$AsyncChannelConnection
-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
-com.android.internal.util.FastXmlSerializer
-com.android.internal.util.FileRotator
-com.android.internal.util.FileRotator$FileInfo
-com.android.internal.util.FileRotator$Reader
-com.android.internal.util.FileRotator$Rewriter
-com.android.internal.util.FileRotator$Writer
-com.android.internal.util.GrowingArrayUtils
-com.android.internal.util.HexDump
-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
-com.android.internal.util.MemInfoReader
-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.ProcFileReader
-com.android.internal.util.ProgressReporter
-com.android.internal.util.RingBufferIndices
-com.android.internal.util.ScreenShapeHelper
-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.ToBooleanFunction
-com.android.internal.util.TokenBucket
-com.android.internal.util.VirtualRefBasePtr
-com.android.internal.util.WakeupMessage
-com.android.internal.util.XmlUtils
-com.android.internal.util.XmlUtils$ReadMapCallback
-com.android.internal.util.XmlUtils$WriteMapCallback
-com.android.internal.view.ActionBarPolicy
-com.android.internal.view.BaseIWindow
-com.android.internal.view.BaseSurfaceHolder
-com.android.internal.view.IInputConnectionWrapper
-com.android.internal.view.IInputConnectionWrapper$MyHandler
-com.android.internal.view.IInputContext
-com.android.internal.view.IInputContext$Stub
-com.android.internal.view.IInputContext$Stub$Proxy
-com.android.internal.view.IInputContextCallback
-com.android.internal.view.IInputContextCallback$Stub
-com.android.internal.view.IInputContextCallback$Stub$Proxy
-com.android.internal.view.IInputMethod
-com.android.internal.view.IInputMethod$Stub
-com.android.internal.view.IInputMethod$Stub$Proxy
-com.android.internal.view.IInputMethodClient
-com.android.internal.view.IInputMethodClient$Stub
-com.android.internal.view.IInputMethodClient$Stub$Proxy
-com.android.internal.view.IInputMethodManager
-com.android.internal.view.IInputMethodManager$Stub
-com.android.internal.view.IInputMethodManager$Stub$Proxy
-com.android.internal.view.IInputMethodSession
-com.android.internal.view.IInputMethodSession$Stub
-com.android.internal.view.IInputMethodSession$Stub$Proxy
-com.android.internal.view.IInputSessionCallback
-com.android.internal.view.IInputSessionCallback$Stub
-com.android.internal.view.IInputSessionCallback$Stub$Proxy
-com.android.internal.view.InputBindResult
-com.android.internal.view.InputBindResult$1
-com.android.internal.view.InputConnectionWrapper
-com.android.internal.view.InputConnectionWrapper$InputContextCallback
-com.android.internal.view.OneShotPreDrawListener
-com.android.internal.view.RootViewSurfaceTaker
-com.android.internal.view.RotationPolicy
-com.android.internal.view.RotationPolicy$RotationPolicyListener
-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
-com.android.internal.view.animation.NativeInterpolatorFactory
-com.android.internal.view.animation.NativeInterpolatorFactoryHelper
-com.android.internal.view.menu.ActionMenuItem
-com.android.internal.view.menu.ActionMenuItemView
-com.android.internal.view.menu.ActionMenuItemView$PopupCallback
-com.android.internal.view.menu.BaseMenuPresenter
-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.MenuPopupHelper
-com.android.internal.view.menu.MenuPopupHelper$1
-com.android.internal.view.menu.MenuPresenter
-com.android.internal.view.menu.MenuPresenter$Callback
-com.android.internal.view.menu.MenuView
-com.android.internal.view.menu.MenuView$ItemView
-com.android.internal.view.menu.ShowableListMenu
-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
-com.android.internal.widget.ActionBarOverlayLayout$3
-com.android.internal.widget.ActionBarOverlayLayout$4
-com.android.internal.widget.ActionBarOverlayLayout$5
-com.android.internal.widget.ActionBarOverlayLayout$ActionBarVisibilityCallback
-com.android.internal.widget.ActionBarOverlayLayout$LayoutParams
-com.android.internal.widget.AlertDialogLayout
-com.android.internal.widget.BackgroundFallback
-com.android.internal.widget.ButtonBarLayout
-com.android.internal.widget.CachingIconView
-com.android.internal.widget.DecorContentParent
-com.android.internal.widget.DecorToolbar
-com.android.internal.widget.DialogTitle
-com.android.internal.widget.EditableInputConnection
-com.android.internal.widget.ICheckCredentialProgressCallback
-com.android.internal.widget.ILockSettings
-com.android.internal.widget.ILockSettings$Stub
-com.android.internal.widget.ILockSettings$Stub$Proxy
-com.android.internal.widget.ImageFloatingTextView
-com.android.internal.widget.LockPatternUtils
-com.android.internal.widget.LockPatternUtils$RequestThrottledException
-com.android.internal.widget.LockPatternUtils$StrongAuthTracker
-com.android.internal.widget.LockPatternUtils$StrongAuthTracker$1
-com.android.internal.widget.LockPatternUtils$StrongAuthTracker$H
-com.android.internal.widget.MediaNotificationView
-com.android.internal.widget.NotificationActionListLayout
-com.android.internal.widget.NotificationExpandButton
-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
-com.android.okhttp.AndroidShimResponseCache
-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
-com.android.okhttp.CertificatePinner$Builder
-com.android.okhttp.CipherSuite
-com.android.okhttp.ConfigAwareConnectionPool
-com.android.okhttp.ConfigAwareConnectionPool$1
-com.android.okhttp.Connection
-com.android.okhttp.ConnectionPool
-com.android.okhttp.ConnectionPool$1
-com.android.okhttp.ConnectionSpec
-com.android.okhttp.ConnectionSpec$Builder
-com.android.okhttp.Dispatcher
-com.android.okhttp.Dns
-com.android.okhttp.Dns$1
-com.android.okhttp.Handshake
-com.android.okhttp.Headers
-com.android.okhttp.Headers$Builder
-com.android.okhttp.HttpHandler
-com.android.okhttp.HttpHandler$CleartextURLFilter
-com.android.okhttp.HttpUrl
-com.android.okhttp.HttpUrl$Builder
-com.android.okhttp.HttpUrl$Builder$ParseResult
-com.android.okhttp.HttpsHandler
-com.android.okhttp.OkCacheContainer
-com.android.okhttp.OkHttpClient
-com.android.okhttp.OkHttpClient$1
-com.android.okhttp.OkUrlFactory
-com.android.okhttp.Protocol
-com.android.okhttp.Request
-com.android.okhttp.Request$Builder
-com.android.okhttp.RequestBody
-com.android.okhttp.RequestBody$2
-com.android.okhttp.Response
-com.android.okhttp.Response$Builder
-com.android.okhttp.ResponseBody
-com.android.okhttp.Route
-com.android.okhttp.TlsVersion
-com.android.okhttp.internal.ConnectionSpecSelector
-com.android.okhttp.internal.DiskLruCache
-com.android.okhttp.internal.DiskLruCache$1
-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
-com.android.okhttp.internal.InternalCache
-com.android.okhttp.internal.OptionalMethod
-com.android.okhttp.internal.Platform
-com.android.okhttp.internal.RouteDatabase
-com.android.okhttp.internal.URLFilter
-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
-com.android.okhttp.internal.http.Http1xStream
-com.android.okhttp.internal.http.Http1xStream$AbstractSource
-com.android.okhttp.internal.http.Http1xStream$ChunkedSink
-com.android.okhttp.internal.http.Http1xStream$ChunkedSource
-com.android.okhttp.internal.http.Http1xStream$FixedLengthSink
-com.android.okhttp.internal.http.Http1xStream$FixedLengthSource
-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
-com.android.okhttp.internal.http.OkHeaders$1
-com.android.okhttp.internal.http.RealResponseBody
-com.android.okhttp.internal.http.RequestException
-com.android.okhttp.internal.http.RequestLine
-com.android.okhttp.internal.http.RetryableSink
-com.android.okhttp.internal.http.RouteException
-com.android.okhttp.internal.http.RouteSelector
-com.android.okhttp.internal.http.StatusLine
-com.android.okhttp.internal.http.StreamAllocation
-com.android.okhttp.internal.huc.DelegatingHttpsURLConnection
-com.android.okhttp.internal.huc.HttpURLConnectionImpl
-com.android.okhttp.internal.huc.HttpsURLConnectionImpl
-com.android.okhttp.internal.io.FileSystem
-com.android.okhttp.internal.io.FileSystem$1
-com.android.okhttp.internal.io.RealConnection
-com.android.okhttp.internal.tls.OkHostnameVerifier
-com.android.okhttp.okio.AsyncTimeout
-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
-com.android.okhttp.okio.ByteString
-com.android.okhttp.okio.ForwardingSink
-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
-com.android.okhttp.okio.Okio$3
-com.android.okhttp.okio.RealBufferedSink
-com.android.okhttp.okio.RealBufferedSink$1
-com.android.okhttp.okio.RealBufferedSource
-com.android.okhttp.okio.RealBufferedSource$1
-com.android.okhttp.okio.Segment
-com.android.okhttp.okio.SegmentPool
-com.android.okhttp.okio.Sink
-com.android.okhttp.okio.Source
-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.CipherKeyGenerator
-com.android.org.bouncycastle.crypto.CipherParameters
-com.android.org.bouncycastle.crypto.CryptoException
-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.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.RSABlindedEngine
-com.android.org.bouncycastle.crypto.engines.RSACoreEngine
-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.jcajce.provider.asymmetric.DH$Mappings
-com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings
-com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings
-com.android.org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings
-com.android.org.bouncycastle.jcajce.provider.asymmetric.X509$Mappings
-com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.KeyFactorySpi
-com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.DSAUtil
-com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.KeyFactorySpi
-com.android.org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi
-com.android.org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$EC
-com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi
-com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding
-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
-com.android.org.bouncycastle.jcajce.provider.digest.DigestAlgorithmProvider
-com.android.org.bouncycastle.jcajce.provider.digest.MD5
-com.android.org.bouncycastle.jcajce.provider.digest.MD5$Mappings
-com.android.org.bouncycastle.jcajce.provider.digest.SHA1
-com.android.org.bouncycastle.jcajce.provider.digest.SHA1$KeyGenerator
-com.android.org.bouncycastle.jcajce.provider.digest.SHA1$Mappings
-com.android.org.bouncycastle.jcajce.provider.digest.SHA224
-com.android.org.bouncycastle.jcajce.provider.digest.SHA224$Mappings
-com.android.org.bouncycastle.jcajce.provider.digest.SHA256
-com.android.org.bouncycastle.jcajce.provider.digest.SHA256$Mappings
-com.android.org.bouncycastle.jcajce.provider.digest.SHA384
-com.android.org.bouncycastle.jcajce.provider.digest.SHA384$Mappings
-com.android.org.bouncycastle.jcajce.provider.digest.SHA512
-com.android.org.bouncycastle.jcajce.provider.digest.SHA512$Mappings
-com.android.org.bouncycastle.jcajce.provider.keystore.BC$Mappings
-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$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4
-com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.Blowfish
-com.android.org.bouncycastle.jcajce.provider.symmetric.Blowfish$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.DES
-com.android.org.bouncycastle.jcajce.provider.symmetric.DES$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.DESede
-com.android.org.bouncycastle.jcajce.provider.symmetric.DESede$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF2
-com.android.org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF2$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.PBEPKCS12
-com.android.org.bouncycastle.jcajce.provider.symmetric.PBEPKCS12$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.PBES2AlgorithmParameters
-com.android.org.bouncycastle.jcajce.provider.symmetric.PBES2AlgorithmParameters$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.RC2
-com.android.org.bouncycastle.jcajce.provider.symmetric.RC2$Mappings
-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.BaseKeyGenerator
-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.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
-com.android.org.conscrypt.ChainStrengthAnalyzer
-com.android.org.conscrypt.ClientSessionContext
-com.android.org.conscrypt.ClientSessionContext$HostAndPort
-com.android.org.conscrypt.CryptoUpcalls
-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$CacheFile
-com.android.org.conscrypt.FileClientSessionCache$Impl
-com.android.org.conscrypt.Hex
-com.android.org.conscrypt.JSSEProvider
-com.android.org.conscrypt.KeyManagerFactoryImpl
-com.android.org.conscrypt.KeyManagerImpl
-com.android.org.conscrypt.NativeCrypto
-com.android.org.conscrypt.NativeCrypto$SSLHandshakeCallbacks
-com.android.org.conscrypt.NativeCryptoJni
-com.android.org.conscrypt.NativeRef
-com.android.org.conscrypt.NativeRef$EC_GROUP
-com.android.org.conscrypt.NativeRef$EC_POINT
-com.android.org.conscrypt.NativeRef$EVP_CIPHER_CTX
-com.android.org.conscrypt.NativeRef$EVP_MD_CTX
-com.android.org.conscrypt.NativeRef$EVP_PKEY
-com.android.org.conscrypt.NativeRef$HMAC_CTX
-com.android.org.conscrypt.OpenSSLBIOInputStream
-com.android.org.conscrypt.OpenSSLCipher
-com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER
-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
-com.android.org.conscrypt.OpenSSLContextImpl$TLSv12
-com.android.org.conscrypt.OpenSSLECGroupContext
-com.android.org.conscrypt.OpenSSLECKeyFactory
-com.android.org.conscrypt.OpenSSLECPointContext
-com.android.org.conscrypt.OpenSSLECPublicKey
-com.android.org.conscrypt.OpenSSLExtendedSessionImpl
-com.android.org.conscrypt.OpenSSLKey
-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.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.OpenSSLSignature$SHA256RSA
-com.android.org.conscrypt.OpenSSLSocketFactoryImpl
-com.android.org.conscrypt.OpenSSLSocketImpl
-com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream
-com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream
-com.android.org.conscrypt.OpenSSLSocketImplWrapper
-com.android.org.conscrypt.OpenSSLX509CertPath
-com.android.org.conscrypt.OpenSSLX509CertPath$Encoding
-com.android.org.conscrypt.OpenSSLX509Certificate
-com.android.org.conscrypt.OpenSSLX509CertificateFactory
-com.android.org.conscrypt.OpenSSLX509CertificateFactory$1
-com.android.org.conscrypt.OpenSSLX509CertificateFactory$2
-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
-com.android.org.conscrypt.TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker
-com.android.org.conscrypt.TrustManagerImpl$TrustAnchorComparator
-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$2
-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
-com.android.org.conscrypt.ct.CTLogStoreImpl$InvalidLogFileException
-com.android.org.conscrypt.ct.CTPolicy
-com.android.org.conscrypt.ct.CTPolicyImpl
-com.android.org.conscrypt.ct.CTVerifier
-com.android.org.conscrypt.ct.KnownLogs
-com.android.org.conscrypt.ct.SerializationException
-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
-com.android.server.NetworkManagementSocketTagger$SocketTags
-com.android.server.SystemConfig
-com.android.server.SystemConfig$PermissionEntry
-com.android.server.WidgetBackupProvider
-com.android.server.backup.AccountSyncSettingsBackupHelper
-com.android.server.net.BaseNetworkObserver
-com.android.server.net.DnsServerEntry
-com.android.server.net.DnsServerRepository
-com.android.server.net.NetlinkTracker
-com.android.server.net.NetlinkTracker$Callback
-com.android.server.sip.SipService
-com.android.server.sip.SipService$ConnectivityReceiver
-com.android.server.sip.SipService$MyExecutor
-com.android.server.sip.SipWakeLock
-com.android.server.sip.SipWakeupTimer
-com.android.server.sip.SipWakeupTimer$MyEventComparator
-com.android.server.wifi.nano.WifiMetricsProto$AlertReasonCount
-com.android.server.wifi.nano.WifiMetricsProto$ConnectionEvent
-com.android.server.wifi.nano.WifiMetricsProto$RouterFingerPrint
-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
-com.android.server.wifi.nano.WifiMetricsProto$WifiScoreCount
-com.android.server.wm.nano.WindowManagerProtos$TaskSnapshotProto
-com.google.android.collect.Lists
-com.google.android.collect.Maps
-com.google.android.collect.Sets
-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
-com.google.android.mms.MmsException
-dalvik.annotation.optimization.CriticalNative
-dalvik.annotation.optimization.FastNative
-dalvik.system.-$Lambda$xxvwQBVHC44UYbpcpA8j0sUqLOo
-dalvik.system.BaseDexClassLoader
-dalvik.system.BaseDexClassLoader$Reporter
-dalvik.system.BlockGuard
-dalvik.system.BlockGuard$1
-dalvik.system.BlockGuard$2
-dalvik.system.BlockGuard$BlockGuardPolicyException
-dalvik.system.BlockGuard$Policy
-dalvik.system.ClassExt
-dalvik.system.CloseGuard
-dalvik.system.CloseGuard$DefaultReporter
-dalvik.system.CloseGuard$DefaultTracker
-dalvik.system.CloseGuard$Reporter
-dalvik.system.CloseGuard$Tracker
-dalvik.system.DalvikLogHandler
-dalvik.system.DalvikLogging
-dalvik.system.DexClassLoader
-dalvik.system.DexFile
-dalvik.system.DexFile$DFEnum
-dalvik.system.DexPathList
-dalvik.system.DexPathList$Element
-dalvik.system.DexPathList$NativeLibraryElement
-dalvik.system.EmulatedStackFrame
-dalvik.system.EmulatedStackFrame$Range
-dalvik.system.PathClassLoader
-dalvik.system.SocketTagger
-dalvik.system.SocketTagger$1
-dalvik.system.VMDebug
-dalvik.system.VMRuntime
-dalvik.system.VMStack
-dalvik.system.ZygoteHooks
-java.io.Bits
-java.io.BufferedInputStream
-java.io.BufferedOutputStream
-java.io.BufferedReader
-java.io.BufferedWriter
-java.io.ByteArrayInputStream
-java.io.ByteArrayOutputStream
-java.io.CharArrayWriter
-java.io.Closeable
-java.io.Console
-java.io.DataInput
-java.io.DataInputStream
-java.io.DataOutput
-java.io.DataOutputStream
-java.io.DefaultFileSystem
-java.io.EOFException
-java.io.ExpiringCache
-java.io.ExpiringCache$1
-java.io.ExpiringCache$Entry
-java.io.Externalizable
-java.io.File
-java.io.File$PathStatus
-java.io.File$TempDirectory
-java.io.FileDescriptor
-java.io.FileDescriptor$1
-java.io.FileFilter
-java.io.FileInputStream
-java.io.FileInputStream$UseManualSkipException
-java.io.FileNotFoundException
-java.io.FileOutputStream
-java.io.FileReader
-java.io.FileSystem
-java.io.FileWriter
-java.io.FilenameFilter
-java.io.FilterInputStream
-java.io.FilterOutputStream
-java.io.FilterReader
-java.io.Flushable
-java.io.IOException
-java.io.InputStream
-java.io.InputStreamReader
-java.io.InterruptedIOException
-java.io.InvalidClassException
-java.io.InvalidObjectException
-java.io.ObjectInput
-java.io.ObjectInputStream
-java.io.ObjectInputStream$BlockDataInputStream
-java.io.ObjectInputStream$HandleTable
-java.io.ObjectInputStream$HandleTable$HandleList
-java.io.ObjectInputStream$PeekInputStream
-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$1
-java.io.ObjectStreamClass$2
-java.io.ObjectStreamClass$3
-java.io.ObjectStreamClass$4
-java.io.ObjectStreamClass$5
-java.io.ObjectStreamClass$Caches
-java.io.ObjectStreamClass$ClassDataSlot
-java.io.ObjectStreamClass$EntryFuture
-java.io.ObjectStreamClass$ExceptionInfo
-java.io.ObjectStreamClass$FieldReflector
-java.io.ObjectStreamClass$FieldReflectorKey
-java.io.ObjectStreamClass$MemberSignature
-java.io.ObjectStreamClass$WeakClassKey
-java.io.ObjectStreamConstants
-java.io.ObjectStreamException
-java.io.ObjectStreamField
-java.io.OutputStream
-java.io.OutputStreamWriter
-java.io.PrintStream
-java.io.PrintWriter
-java.io.PushbackInputStream
-java.io.PushbackReader
-java.io.RandomAccessFile
-java.io.Reader
-java.io.SequenceInputStream
-java.io.SerialCallbackContext
-java.io.Serializable
-java.io.SerializablePermission
-java.io.StreamCorruptedException
-java.io.StringReader
-java.io.StringWriter
-java.io.UnixFileSystem
-java.io.UnsupportedEncodingException
-java.io.Writer
-java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ
-java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ$1
-java.lang.AbstractMethodError
-java.lang.AbstractStringBuilder
-java.lang.AndroidHardcodedSystemProperties
-java.lang.Appendable
-java.lang.ArithmeticException
-java.lang.ArrayIndexOutOfBoundsException
-java.lang.ArrayStoreException
-java.lang.AssertionError
-java.lang.AutoCloseable
-java.lang.Boolean
-java.lang.BootClassLoader
-java.lang.Byte
-java.lang.Byte$ByteCache
-java.lang.CaseMapper
-java.lang.CaseMapper$1
-java.lang.CharSequence
-java.lang.CharSequence$1CharIterator
-java.lang.CharSequence$1CodePointIterator
-java.lang.Character
-java.lang.Character$CharacterCache
-java.lang.Character$Subset
-java.lang.Character$UnicodeBlock
-java.lang.Class
-java.lang.Class$Caches
-java.lang.ClassCastException
-java.lang.ClassLoader
-java.lang.ClassLoader$SystemClassLoader
-java.lang.ClassNotFoundException
-java.lang.CloneNotSupportedException
-java.lang.Cloneable
-java.lang.Comparable
-java.lang.Daemons
-java.lang.Daemons$Daemon
-java.lang.Daemons$FinalizerDaemon
-java.lang.Daemons$FinalizerWatchdogDaemon
-java.lang.Daemons$HeapTaskDaemon
-java.lang.Daemons$ReferenceQueueDaemon
-java.lang.Deprecated
-java.lang.DexCache
-java.lang.Double
-java.lang.Enum
-java.lang.Enum$1
-java.lang.EnumConstantNotPresentException
-java.lang.Error
-java.lang.Exception
-java.lang.ExceptionInInitializerError
-java.lang.Float
-java.lang.IllegalAccessError
-java.lang.IllegalAccessException
-java.lang.IllegalArgumentException
-java.lang.IllegalMonitorStateException
-java.lang.IllegalStateException
-java.lang.IllegalThreadStateException
-java.lang.IncompatibleClassChangeError
-java.lang.IndexOutOfBoundsException
-java.lang.InheritableThreadLocal
-java.lang.InstantiationError
-java.lang.InstantiationException
-java.lang.Integer
-java.lang.Integer$IntegerCache
-java.lang.InternalError
-java.lang.InterruptedException
-java.lang.Iterable
-java.lang.JavaLangAccess
-java.lang.LinkageError
-java.lang.Long
-java.lang.Long$LongCache
-java.lang.Math
-java.lang.Math$RandomNumberGeneratorHolder
-java.lang.NegativeArraySizeException
-java.lang.NoClassDefFoundError
-java.lang.NoSuchFieldError
-java.lang.NoSuchFieldException
-java.lang.NoSuchMethodError
-java.lang.NoSuchMethodException
-java.lang.NullPointerException
-java.lang.Number
-java.lang.NumberFormatException
-java.lang.Object
-java.lang.OutOfMemoryError
-java.lang.Package
-java.lang.Process
-java.lang.ProcessBuilder
-java.lang.ProcessEnvironment
-java.lang.Readable
-java.lang.ReflectiveOperationException
-java.lang.Runnable
-java.lang.Runtime
-java.lang.RuntimeException
-java.lang.RuntimePermission
-java.lang.SecurityException
-java.lang.SecurityManager
-java.lang.Short
-java.lang.Short$ShortCache
-java.lang.StackOverflowError
-java.lang.StackTraceElement
-java.lang.StrictMath
-java.lang.String
-java.lang.String$CaseInsensitiveComparator
-java.lang.StringBuffer
-java.lang.StringBuilder
-java.lang.StringFactory
-java.lang.StringIndexOutOfBoundsException
-java.lang.System
-java.lang.System$PropertiesWithNonOverrideableDefaults
-java.lang.Thread
-java.lang.Thread$1
-java.lang.Thread$Caches
-java.lang.Thread$State
-java.lang.Thread$UncaughtExceptionHandler
-java.lang.Thread$WeakClassKey
-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
-java.lang.Throwable$PrintStreamOrWriter
-java.lang.Throwable$SentinelHolder
-java.lang.Throwable$WrappedPrintStream
-java.lang.Throwable$WrappedPrintWriter
-java.lang.TypeNotPresentException
-java.lang.UNIXProcess
-java.lang.UnsatisfiedLinkError
-java.lang.UnsupportedOperationException
-java.lang.VMClassLoader
-java.lang.VerifyError
-java.lang.VirtualMachineError
-java.lang.Void
-java.lang.annotation.Annotation
-java.lang.annotation.AnnotationTypeMismatchException
-java.lang.annotation.IncompleteAnnotationException
-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
-java.lang.invoke.WrongMethodTypeException
-java.lang.ref.FinalizerReference
-java.lang.ref.FinalizerReference$Sentinel
-java.lang.ref.PhantomReference
-java.lang.ref.Reference
-java.lang.ref.ReferenceQueue
-java.lang.ref.SoftReference
-java.lang.ref.WeakReference
-java.lang.reflect.AccessibleObject
-java.lang.reflect.AnnotatedElement
-java.lang.reflect.Array
-java.lang.reflect.Constructor
-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
-java.lang.reflect.MalformedParametersException
-java.lang.reflect.Member
-java.lang.reflect.Method
-java.lang.reflect.Method$1
-java.lang.reflect.Modifier
-java.lang.reflect.Parameter
-java.lang.reflect.ParameterizedType
-java.lang.reflect.Proxy
-java.lang.reflect.Proxy$1
-java.lang.reflect.Proxy$Key1
-java.lang.reflect.Proxy$Key2
-java.lang.reflect.Proxy$KeyFactory
-java.lang.reflect.Proxy$KeyX
-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
-java.math.Conversion
-java.math.Division
-java.math.MathContext
-java.math.Multiplication
-java.math.NativeBN
-java.math.RoundingMode
-java.net.AbstractPlainDatagramSocketImpl
-java.net.AbstractPlainSocketImpl
-java.net.AddressCache
-java.net.AddressCache$AddressCacheEntry
-java.net.AddressCache$AddressCacheKey
-java.net.ConnectException
-java.net.CookieHandler
-java.net.CookieManager
-java.net.CookiePolicy
-java.net.CookiePolicy$1
-java.net.CookiePolicy$2
-java.net.CookiePolicy$3
-java.net.CookieStore
-java.net.DatagramPacket
-java.net.DatagramSocket
-java.net.DatagramSocket$1
-java.net.DatagramSocketImpl
-java.net.DefaultDatagramSocketImplFactory
-java.net.DefaultFileNameMap
-java.net.DefaultInterface
-java.net.FileNameMap
-java.net.HttpURLConnection
-java.net.IDN
-java.net.InMemoryCookieStore
-java.net.Inet4Address
-java.net.Inet6Address
-java.net.Inet6Address$Inet6AddressHolder
-java.net.Inet6AddressImpl
-java.net.InetAddress
-java.net.InetAddress$1
-java.net.InetAddress$InetAddressHolder
-java.net.InetAddressImpl
-java.net.InetSocketAddress
-java.net.InetSocketAddress$InetSocketAddressHolder
-java.net.InterfaceAddress
-java.net.JarURLConnection
-java.net.MalformedURLException
-java.net.MulticastSocket
-java.net.NetworkInterface
-java.net.NetworkInterface$1checkedAddresses
-java.net.NoRouteToHostException
-java.net.Parts
-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
-java.net.SocketException
-java.net.SocketImpl
-java.net.SocketInputStream
-java.net.SocketOptions
-java.net.SocketOutputStream
-java.net.SocketTimeoutException
-java.net.SocksConsts
-java.net.SocksSocketImpl
-java.net.StandardProtocolFamily
-java.net.URI
-java.net.URI$Parser
-java.net.URISyntaxException
-java.net.URL
-java.net.URLConnection
-java.net.URLDecoder
-java.net.URLEncoder
-java.net.URLStreamHandler
-java.net.URLStreamHandlerFactory
-java.net.UnknownHostException
-java.net.UnknownServiceException
-java.nio.Bits
-java.nio.Buffer
-java.nio.BufferOverflowException
-java.nio.BufferUnderflowException
-java.nio.ByteBuffer
-java.nio.ByteBufferAsCharBuffer
-java.nio.ByteBufferAsDoubleBuffer
-java.nio.ByteBufferAsFloatBuffer
-java.nio.ByteBufferAsIntBuffer
-java.nio.ByteBufferAsLongBuffer
-java.nio.ByteBufferAsShortBuffer
-java.nio.ByteOrder
-java.nio.CharBuffer
-java.nio.DirectByteBuffer
-java.nio.DirectByteBuffer$MemoryRef
-java.nio.DoubleBuffer
-java.nio.FloatBuffer
-java.nio.HeapByteBuffer
-java.nio.HeapCharBuffer
-java.nio.IntBuffer
-java.nio.InvalidMarkException
-java.nio.LongBuffer
-java.nio.MappedByteBuffer
-java.nio.NIOAccess
-java.nio.NioUtils
-java.nio.ReadOnlyBufferException
-java.nio.ShortBuffer
-java.nio.StringCharBuffer
-java.nio.channels.AsynchronousCloseException
-java.nio.channels.ByteChannel
-java.nio.channels.CancelledKeyException
-java.nio.channels.Channel
-java.nio.channels.Channels
-java.nio.channels.Channels$1
-java.nio.channels.ClosedByInterruptException
-java.nio.channels.ClosedChannelException
-java.nio.channels.DatagramChannel
-java.nio.channels.FileChannel
-java.nio.channels.FileChannel$MapMode
-java.nio.channels.FileLock
-java.nio.channels.GatheringByteChannel
-java.nio.channels.InterruptibleChannel
-java.nio.channels.MulticastChannel
-java.nio.channels.NetworkChannel
-java.nio.channels.NonWritableChannelException
-java.nio.channels.OverlappingFileLockException
-java.nio.channels.ReadableByteChannel
-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
-java.nio.charset.CharsetDecoderICU
-java.nio.charset.CharsetEncoder
-java.nio.charset.CharsetEncoderICU
-java.nio.charset.CharsetICU
-java.nio.charset.CoderResult
-java.nio.charset.CoderResult$1
-java.nio.charset.CoderResult$2
-java.nio.charset.CoderResult$Cache
-java.nio.charset.CodingErrorAction
-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
-java.nio.file.FileSystems
-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
-java.security.AccessControlException
-java.security.AccessController
-java.security.AlgorithmConstraints
-java.security.AlgorithmParameters
-java.security.AlgorithmParametersSpi
-java.security.BasicPermission
-java.security.CodeSigner
-java.security.CryptoPrimitive
-java.security.DigestException
-java.security.GeneralSecurityException
-java.security.Guard
-java.security.InvalidAlgorithmParameterException
-java.security.InvalidKeyException
-java.security.InvalidParameterException
-java.security.Key
-java.security.KeyException
-java.security.KeyFactory
-java.security.KeyFactorySpi
-java.security.KeyManagementException
-java.security.KeyPair
-java.security.KeyPairGenerator
-java.security.KeyPairGeneratorSpi
-java.security.KeyStore
-java.security.KeyStore$1
-java.security.KeyStoreException
-java.security.KeyStoreSpi
-java.security.MessageDigest
-java.security.MessageDigest$Delegate
-java.security.MessageDigestSpi
-java.security.NoSuchAlgorithmException
-java.security.NoSuchProviderException
-java.security.Permission
-java.security.PermissionCollection
-java.security.Permissions
-java.security.Principal
-java.security.PrivateKey
-java.security.PrivilegedAction
-java.security.PrivilegedActionException
-java.security.PrivilegedExceptionAction
-java.security.ProtectionDomain
-java.security.Provider
-java.security.Provider$EngineDescription
-java.security.Provider$Service
-java.security.Provider$ServiceKey
-java.security.Provider$UString
-java.security.PublicKey
-java.security.SecureRandom
-java.security.SecureRandomSpi
-java.security.Security
-java.security.Signature
-java.security.Signature$Delegate
-java.security.SignatureException
-java.security.SignatureSpi
-java.security.UnrecoverableEntryException
-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
-java.security.cert.CertPathHelperImpl
-java.security.cert.CertPathParameters
-java.security.cert.CertPathValidator
-java.security.cert.CertPathValidatorException
-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
-java.security.cert.CertificateExpiredException
-java.security.cert.CertificateFactory
-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
-java.security.cert.X509CertSelector
-java.security.cert.X509Certificate
-java.security.cert.X509Extension
-java.security.interfaces.DSAKey
-java.security.interfaces.DSAPublicKey
-java.security.interfaces.ECKey
-java.security.interfaces.ECPrivateKey
-java.security.interfaces.ECPublicKey
-java.security.interfaces.RSAKey
-java.security.interfaces.RSAPrivateKey
-java.security.interfaces.RSAPublicKey
-java.security.spec.AlgorithmParameterSpec
-java.security.spec.ECField
-java.security.spec.ECFieldFp
-java.security.spec.ECGenParameterSpec
-java.security.spec.ECParameterSpec
-java.security.spec.ECPoint
-java.security.spec.ECPrivateKeySpec
-java.security.spec.ECPublicKeySpec
-java.security.spec.EllipticCurve
-java.security.spec.EncodedKeySpec
-java.security.spec.InvalidKeySpecException
-java.security.spec.InvalidParameterSpecException
-java.security.spec.KeySpec
-java.security.spec.MGF1ParameterSpec
-java.security.spec.PKCS8EncodedKeySpec
-java.security.spec.RSAPrivateCrtKeySpec
-java.security.spec.RSAPrivateKeySpec
-java.security.spec.RSAPublicKeySpec
-java.security.spec.X509EncodedKeySpec
-java.sql.Timestamp
-java.text.AttributedCharacterIterator$Attribute
-java.text.Bidi
-java.text.BreakIterator
-java.text.CalendarBuilder
-java.text.CharacterIterator
-java.text.CollationKey
-java.text.Collator
-java.text.DateFormat
-java.text.DateFormat$Field
-java.text.DateFormatSymbols
-java.text.DecimalFormat
-java.text.DecimalFormatSymbols
-java.text.DontCareFieldPosition
-java.text.DontCareFieldPosition$1
-java.text.FieldPosition
-java.text.FieldPosition$Delegate
-java.text.Format
-java.text.Format$Field
-java.text.Format$FieldDelegate
-java.text.IcuIteratorWrapper
-java.text.MessageFormat
-java.text.MessageFormat$Field
-java.text.Normalizer
-java.text.Normalizer$Form
-java.text.NumberFormat
-java.text.ParseException
-java.text.ParsePosition
-java.text.RuleBasedCollator
-java.text.SimpleDateFormat
-java.text.StringCharacterIterator
-java.time.DateTimeException
-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
-java.util.AbstractList$ListItr
-java.util.AbstractMap
-java.util.AbstractMap$1
-java.util.AbstractMap$2
-java.util.AbstractMap$2$1
-java.util.AbstractMap$SimpleEntry
-java.util.AbstractMap$SimpleImmutableEntry
-java.util.AbstractQueue
-java.util.AbstractSequentialList
-java.util.AbstractSet
-java.util.ArrayDeque
-java.util.ArrayDeque$DeqIterator
-java.util.ArrayDeque$DescendingIterator
-java.util.ArrayList
-java.util.ArrayList$ArrayListSpliterator
-java.util.ArrayList$Itr
-java.util.ArrayList$ListItr
-java.util.ArrayList$SubList
-java.util.ArrayList$SubList$1
-java.util.ArrayPrefixHelpers$CumulateTask
-java.util.ArrayPrefixHelpers$DoubleCumulateTask
-java.util.ArrayPrefixHelpers$IntCumulateTask
-java.util.ArrayPrefixHelpers$LongCumulateTask
-java.util.Arrays
-java.util.Arrays$ArrayList
-java.util.Arrays$NaturalOrder
-java.util.ArraysParallelSortHelpers$FJByte$Sorter
-java.util.ArraysParallelSortHelpers$FJChar$Sorter
-java.util.ArraysParallelSortHelpers$FJDouble$Sorter
-java.util.ArraysParallelSortHelpers$FJFloat$Sorter
-java.util.ArraysParallelSortHelpers$FJInt$Sorter
-java.util.ArraysParallelSortHelpers$FJLong$Sorter
-java.util.ArraysParallelSortHelpers$FJObject$Sorter
-java.util.ArraysParallelSortHelpers$FJShort$Sorter
-java.util.Base64
-java.util.Base64$Decoder
-java.util.Base64$Encoder
-java.util.BitSet
-java.util.Calendar
-java.util.Collection
-java.util.Collections
-java.util.Collections$1
-java.util.Collections$2
-java.util.Collections$3
-java.util.Collections$AsLIFOQueue
-java.util.Collections$CheckedCollection
-java.util.Collections$CheckedList
-java.util.Collections$CheckedMap
-java.util.Collections$CheckedNavigableMap
-java.util.Collections$CheckedNavigableSet
-java.util.Collections$CheckedQueue
-java.util.Collections$CheckedRandomAccessList
-java.util.Collections$CheckedSet
-java.util.Collections$CheckedSortedMap
-java.util.Collections$CheckedSortedSet
-java.util.Collections$CopiesList
-java.util.Collections$EmptyEnumeration
-java.util.Collections$EmptyIterator
-java.util.Collections$EmptyList
-java.util.Collections$EmptyListIterator
-java.util.Collections$EmptyMap
-java.util.Collections$EmptySet
-java.util.Collections$ReverseComparator
-java.util.Collections$ReverseComparator2
-java.util.Collections$SetFromMap
-java.util.Collections$SingletonList
-java.util.Collections$SingletonMap
-java.util.Collections$SingletonSet
-java.util.Collections$SynchronizedCollection
-java.util.Collections$SynchronizedList
-java.util.Collections$SynchronizedMap
-java.util.Collections$SynchronizedNavigableMap
-java.util.Collections$SynchronizedNavigableSet
-java.util.Collections$SynchronizedRandomAccessList
-java.util.Collections$SynchronizedSet
-java.util.Collections$SynchronizedSortedMap
-java.util.Collections$SynchronizedSortedSet
-java.util.Collections$UnmodifiableCollection
-java.util.Collections$UnmodifiableCollection$1
-java.util.Collections$UnmodifiableList
-java.util.Collections$UnmodifiableList$1
-java.util.Collections$UnmodifiableMap
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry
-java.util.Collections$UnmodifiableNavigableMap
-java.util.Collections$UnmodifiableNavigableMap$EmptyNavigableMap
-java.util.Collections$UnmodifiableNavigableSet
-java.util.Collections$UnmodifiableNavigableSet$EmptyNavigableSet
-java.util.Collections$UnmodifiableRandomAccessList
-java.util.Collections$UnmodifiableSet
-java.util.Collections$UnmodifiableSortedMap
-java.util.Collections$UnmodifiableSortedSet
-java.util.ComparableTimSort
-java.util.Comparator
-java.util.Comparators$NaturalOrderComparator
-java.util.Comparators$NullComparator
-java.util.ConcurrentModificationException
-java.util.Currency
-java.util.Date
-java.util.Deque
-java.util.Dictionary
-java.util.DualPivotQuicksort
-java.util.EmptyStackException
-java.util.EnumMap
-java.util.EnumMap$1
-java.util.EnumMap$EntryIterator
-java.util.EnumMap$EntryIterator$Entry
-java.util.EnumMap$EntrySet
-java.util.EnumMap$EnumMapIterator
-java.util.EnumMap$KeyIterator
-java.util.EnumMap$KeySet
-java.util.EnumMap$ValueIterator
-java.util.EnumMap$Values
-java.util.EnumSet
-java.util.EnumSet$SerializationProxy
-java.util.Enumeration
-java.util.EventListener
-java.util.FormatFlagsConversionMismatchException
-java.util.Formattable
-java.util.Formatter
-java.util.Formatter$Conversion
-java.util.Formatter$DateTime
-java.util.Formatter$FixedString
-java.util.Formatter$Flags
-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
-java.util.HashMap$EntrySet
-java.util.HashMap$HashIterator
-java.util.HashMap$KeyIterator
-java.util.HashMap$KeySet
-java.util.HashMap$Node
-java.util.HashMap$TreeNode
-java.util.HashMap$ValueIterator
-java.util.HashMap$Values
-java.util.HashSet
-java.util.Hashtable
-java.util.Hashtable$EntrySet
-java.util.Hashtable$Enumerator
-java.util.Hashtable$HashtableEntry
-java.util.Hashtable$KeySet
-java.util.Hashtable$ValueCollection
-java.util.IdentityHashMap
-java.util.IdentityHashMap$EntryIterator
-java.util.IdentityHashMap$EntryIterator$Entry
-java.util.IdentityHashMap$EntrySet
-java.util.IdentityHashMap$IdentityHashMapIterator
-java.util.IdentityHashMap$KeyIterator
-java.util.IdentityHashMap$KeySet
-java.util.IdentityHashMap$ValueIterator
-java.util.IdentityHashMap$Values
-java.util.IllegalFormatException
-java.util.IllformedLocaleException
-java.util.Iterator
-java.util.JumboEnumSet
-java.util.JumboEnumSet$EnumSetIterator
-java.util.LinkedHashMap
-java.util.LinkedHashMap$LinkedEntryIterator
-java.util.LinkedHashMap$LinkedEntrySet
-java.util.LinkedHashMap$LinkedHashIterator
-java.util.LinkedHashMap$LinkedHashMapEntry
-java.util.LinkedHashMap$LinkedKeyIterator
-java.util.LinkedHashMap$LinkedKeySet
-java.util.LinkedHashMap$LinkedValueIterator
-java.util.LinkedHashMap$LinkedValues
-java.util.LinkedHashSet
-java.util.LinkedList
-java.util.LinkedList$DescendingIterator
-java.util.LinkedList$ListItr
-java.util.LinkedList$Node
-java.util.List
-java.util.ListIterator
-java.util.Locale
-java.util.Locale$Builder
-java.util.Locale$Cache
-java.util.Locale$Category
-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
-java.util.MissingResourceException
-java.util.NavigableMap
-java.util.NavigableSet
-java.util.NoSuchElementException
-java.util.Objects
-java.util.Observable
-java.util.Observer
-java.util.Optional
-java.util.PrimitiveIterator
-java.util.PrimitiveIterator$OfInt
-java.util.PriorityQueue
-java.util.PriorityQueue$Itr
-java.util.Properties
-java.util.Properties$LineReader
-java.util.PropertyResourceBundle
-java.util.Queue
-java.util.Random
-java.util.RandomAccess
-java.util.RandomAccessSubList
-java.util.RegularEnumSet
-java.util.RegularEnumSet$EnumSetIterator
-java.util.ResourceBundle
-java.util.ResourceBundle$1
-java.util.ResourceBundle$BundleReference
-java.util.ResourceBundle$CacheKey
-java.util.ResourceBundle$CacheKeyReference
-java.util.ResourceBundle$Control
-java.util.ResourceBundle$Control$1
-java.util.ResourceBundle$Control$CandidateListCache
-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
-java.util.SortedSet
-java.util.Spliterator
-java.util.Spliterator$OfDouble
-java.util.Spliterator$OfInt
-java.util.Spliterator$OfLong
-java.util.Spliterator$OfPrimitive
-java.util.Spliterators
-java.util.Spliterators$EmptySpliterator
-java.util.Spliterators$EmptySpliterator$OfDouble
-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
-java.util.StringTokenizer
-java.util.SubList
-java.util.SubList$1
-java.util.TaskQueue
-java.util.TimSort
-java.util.TimeZone
-java.util.Timer
-java.util.Timer$1
-java.util.TimerTask
-java.util.TimerThread
-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$SubMapEntryIterator
-java.util.TreeMap$NavigableSubMap$SubMapIterator
-java.util.TreeMap$NavigableSubMap$SubMapKeyIterator
-java.util.TreeMap$PrivateEntryIterator
-java.util.TreeMap$TreeMapEntry
-java.util.TreeMap$ValueIterator
-java.util.TreeMap$Values
-java.util.TreeSet
-java.util.UUID
-java.util.UUID$Holder
-java.util.UnknownFormatConversionException
-java.util.Vector
-java.util.Vector$1
-java.util.Vector$Itr
-java.util.WeakHashMap
-java.util.WeakHashMap$Entry
-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$xR9BLpu6SifNikvFgr4lEiECBsk
-java.util.concurrent.AbstractExecutorService
-java.util.concurrent.ArrayBlockingQueue
-java.util.concurrent.BlockingDeque
-java.util.concurrent.BlockingQueue
-java.util.concurrent.Callable
-java.util.concurrent.CancellationException
-java.util.concurrent.CompletableFuture
-java.util.concurrent.CompletableFuture$AltResult
-java.util.concurrent.CompletableFuture$AsynchronousCompletionTask
-java.util.concurrent.CompletableFuture$Completion
-java.util.concurrent.CompletionStage
-java.util.concurrent.ConcurrentHashMap
-java.util.concurrent.ConcurrentHashMap$BaseIterator
-java.util.concurrent.ConcurrentHashMap$BulkTask
-java.util.concurrent.ConcurrentHashMap$CollectionView
-java.util.concurrent.ConcurrentHashMap$CounterCell
-java.util.concurrent.ConcurrentHashMap$EntryIterator
-java.util.concurrent.ConcurrentHashMap$EntrySetView
-java.util.concurrent.ConcurrentHashMap$ForEachEntryTask
-java.util.concurrent.ConcurrentHashMap$ForEachKeyTask
-java.util.concurrent.ConcurrentHashMap$ForEachMappingTask
-java.util.concurrent.ConcurrentHashMap$ForEachTransformedEntryTask
-java.util.concurrent.ConcurrentHashMap$ForEachTransformedKeyTask
-java.util.concurrent.ConcurrentHashMap$ForEachTransformedMappingTask
-java.util.concurrent.ConcurrentHashMap$ForEachTransformedValueTask
-java.util.concurrent.ConcurrentHashMap$ForEachValueTask
-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
-java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToIntTask
-java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToLongTask
-java.util.concurrent.ConcurrentHashMap$MapReduceKeysTask
-java.util.concurrent.ConcurrentHashMap$MapReduceKeysToDoubleTask
-java.util.concurrent.ConcurrentHashMap$MapReduceKeysToIntTask
-java.util.concurrent.ConcurrentHashMap$MapReduceKeysToLongTask
-java.util.concurrent.ConcurrentHashMap$MapReduceMappingsTask
-java.util.concurrent.ConcurrentHashMap$MapReduceMappingsToDoubleTask
-java.util.concurrent.ConcurrentHashMap$MapReduceMappingsToIntTask
-java.util.concurrent.ConcurrentHashMap$MapReduceMappingsToLongTask
-java.util.concurrent.ConcurrentHashMap$MapReduceValuesTask
-java.util.concurrent.ConcurrentHashMap$MapReduceValuesToDoubleTask
-java.util.concurrent.ConcurrentHashMap$MapReduceValuesToIntTask
-java.util.concurrent.ConcurrentHashMap$MapReduceValuesToLongTask
-java.util.concurrent.ConcurrentHashMap$Node
-java.util.concurrent.ConcurrentHashMap$ReduceEntriesTask
-java.util.concurrent.ConcurrentHashMap$ReduceKeysTask
-java.util.concurrent.ConcurrentHashMap$ReduceValuesTask
-java.util.concurrent.ConcurrentHashMap$ReservationNode
-java.util.concurrent.ConcurrentHashMap$SearchEntriesTask
-java.util.concurrent.ConcurrentHashMap$SearchKeysTask
-java.util.concurrent.ConcurrentHashMap$SearchMappingsTask
-java.util.concurrent.ConcurrentHashMap$SearchValuesTask
-java.util.concurrent.ConcurrentHashMap$Segment
-java.util.concurrent.ConcurrentHashMap$Traverser
-java.util.concurrent.ConcurrentHashMap$TreeBin
-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
-java.util.concurrent.ConcurrentMap
-java.util.concurrent.ConcurrentNavigableMap
-java.util.concurrent.ConcurrentSkipListMap
-java.util.concurrent.ConcurrentSkipListMap$HeadIndex
-java.util.concurrent.ConcurrentSkipListMap$Index
-java.util.concurrent.ConcurrentSkipListMap$Iter
-java.util.concurrent.ConcurrentSkipListMap$Node
-java.util.concurrent.ConcurrentSkipListMap$ValueIterator
-java.util.concurrent.ConcurrentSkipListMap$Values
-java.util.concurrent.CopyOnWriteArrayList
-java.util.concurrent.CopyOnWriteArrayList$COWIterator
-java.util.concurrent.CopyOnWriteArraySet
-java.util.concurrent.CountDownLatch
-java.util.concurrent.CountDownLatch$Sync
-java.util.concurrent.CountedCompleter
-java.util.concurrent.DelayQueue
-java.util.concurrent.Delayed
-java.util.concurrent.ExecutionException
-java.util.concurrent.Executor
-java.util.concurrent.ExecutorService
-java.util.concurrent.Executors
-java.util.concurrent.Executors$DefaultThreadFactory
-java.util.concurrent.Executors$DelegatedExecutorService
-java.util.concurrent.Executors$DelegatedScheduledExecutorService
-java.util.concurrent.Executors$FinalizableDelegatedExecutorService
-java.util.concurrent.Executors$RunnableAdapter
-java.util.concurrent.ForkJoinPool
-java.util.concurrent.ForkJoinPool$1
-java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory
-java.util.concurrent.ForkJoinPool$ForkJoinWorkerThreadFactory
-java.util.concurrent.ForkJoinTask
-java.util.concurrent.ForkJoinTask$ExceptionNode
-java.util.concurrent.Future
-java.util.concurrent.FutureTask
-java.util.concurrent.FutureTask$WaitNode
-java.util.concurrent.LinkedBlockingDeque
-java.util.concurrent.LinkedBlockingDeque$AbstractItr
-java.util.concurrent.LinkedBlockingDeque$Itr
-java.util.concurrent.LinkedBlockingDeque$Node
-java.util.concurrent.LinkedBlockingQueue
-java.util.concurrent.LinkedBlockingQueue$Itr
-java.util.concurrent.LinkedBlockingQueue$Node
-java.util.concurrent.PriorityBlockingQueue
-java.util.concurrent.RejectedExecutionException
-java.util.concurrent.RejectedExecutionHandler
-java.util.concurrent.RunnableFuture
-java.util.concurrent.RunnableScheduledFuture
-java.util.concurrent.ScheduledExecutorService
-java.util.concurrent.ScheduledFuture
-java.util.concurrent.ScheduledThreadPoolExecutor
-java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
-java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
-java.util.concurrent.Semaphore
-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
-java.util.concurrent.ThreadFactory
-java.util.concurrent.ThreadLocalRandom
-java.util.concurrent.ThreadLocalRandom$1
-java.util.concurrent.ThreadPoolExecutor
-java.util.concurrent.ThreadPoolExecutor$AbortPolicy
-java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy
-java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
-java.util.concurrent.ThreadPoolExecutor$Worker
-java.util.concurrent.TimeUnit
-java.util.concurrent.TimeUnit$1
-java.util.concurrent.TimeUnit$2
-java.util.concurrent.TimeUnit$3
-java.util.concurrent.TimeUnit$4
-java.util.concurrent.TimeUnit$5
-java.util.concurrent.TimeUnit$6
-java.util.concurrent.TimeUnit$7
-java.util.concurrent.TimeoutException
-java.util.concurrent.atomic.AtomicBoolean
-java.util.concurrent.atomic.AtomicInteger
-java.util.concurrent.atomic.AtomicIntegerArray
-java.util.concurrent.atomic.AtomicIntegerFieldUpdater
-java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl
-java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl$1
-java.util.concurrent.atomic.AtomicLong
-java.util.concurrent.atomic.AtomicLongArray
-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
-java.util.concurrent.locks.AbstractQueuedSynchronizer
-java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
-java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
-java.util.concurrent.locks.Condition
-java.util.concurrent.locks.Lock
-java.util.concurrent.locks.LockSupport
-java.util.concurrent.locks.ReadWriteLock
-java.util.concurrent.locks.ReentrantLock
-java.util.concurrent.locks.ReentrantLock$FairSync
-java.util.concurrent.locks.ReentrantLock$NonfairSync
-java.util.concurrent.locks.ReentrantLock$Sync
-java.util.concurrent.locks.ReentrantReadWriteLock
-java.util.concurrent.locks.ReentrantReadWriteLock$FairSync
-java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
-java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock
-java.util.concurrent.locks.ReentrantReadWriteLock$Sync
-java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter
-java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
-java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
-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
-java.util.function.IntFunction
-java.util.function.IntToDoubleFunction
-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
-java.util.function.ToDoubleBiFunction
-java.util.function.ToDoubleFunction
-java.util.function.ToIntBiFunction
-java.util.function.ToIntFunction
-java.util.function.ToLongBiFunction
-java.util.function.ToLongFunction
-java.util.function.UnaryOperator
-java.util.jar.Attributes
-java.util.jar.Attributes$Name
-java.util.jar.JarEntry
-java.util.jar.JarFile
-java.util.jar.JarFile$JarEntryIterator
-java.util.jar.JarFile$JarFileEntry
-java.util.jar.JarVerifier
-java.util.jar.JarVerifier$1
-java.util.jar.JarVerifier$VerifierStream
-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
-java.util.logging.Level
-java.util.logging.Level$KnownLevel
-java.util.logging.LogManager
-java.util.logging.LogManager$1
-java.util.logging.LogManager$2
-java.util.logging.LogManager$3
-java.util.logging.LogManager$5
-java.util.logging.LogManager$Cleaner
-java.util.logging.LogManager$LogNode
-java.util.logging.LogManager$LoggerContext
-java.util.logging.LogManager$LoggerContext$1
-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$1
-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
-java.util.regex.MatchResult
-java.util.regex.Matcher
-java.util.regex.Matcher$OffsetBasedMatchResult
-java.util.regex.Pattern
-java.util.regex.PatternSyntaxException
-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
-java.util.stream.StreamOpFlag$Type
-java.util.stream.StreamShape
-java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator
-java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef
-java.util.stream.StreamSupport
-java.util.stream.TerminalOp
-java.util.stream.TerminalSink
-java.util.zip.Adler32
-java.util.zip.CRC32
-java.util.zip.CheckedInputStream
-java.util.zip.Checksum
-java.util.zip.DataFormatException
-java.util.zip.Deflater
-java.util.zip.DeflaterOutputStream
-java.util.zip.GZIPInputStream
-java.util.zip.GZIPInputStream$1
-java.util.zip.GZIPOutputStream
-java.util.zip.Inflater
-java.util.zip.InflaterInputStream
-java.util.zip.ZStreamRef
-java.util.zip.ZipCoder
-java.util.zip.ZipConstants
-java.util.zip.ZipEntry
-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.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.JarVerifier
-javax.crypto.JceSecurity
-javax.crypto.JceSecurity$1
-javax.crypto.KeyGenerator
-javax.crypto.KeyGeneratorSpi
-javax.crypto.Mac
-javax.crypto.MacSpi
-javax.crypto.NoSuchPaddingException
-javax.crypto.NullCipher
-javax.crypto.SecretKey
-javax.crypto.ShortBufferException
-javax.crypto.spec.IvParameterSpec
-javax.crypto.spec.OAEPParameterSpec
-javax.crypto.spec.PBEParameterSpec
-javax.crypto.spec.PSource
-javax.crypto.spec.PSource$PSpecified
-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
-javax.microedition.khronos.opengles.GL11
-javax.microedition.khronos.opengles.GL11Ext
-javax.microedition.khronos.opengles.GL11ExtensionPack
-javax.net.DefaultSocketFactory
-javax.net.ServerSocketFactory
-javax.net.SocketFactory
-javax.net.ssl.ExtendedSSLSession
-javax.net.ssl.HandshakeCompletedListener
-javax.net.ssl.HostnameVerifier
-javax.net.ssl.HttpsURLConnection
-javax.net.ssl.KeyManager
-javax.net.ssl.KeyManagerFactory
-javax.net.ssl.KeyManagerFactory$1
-javax.net.ssl.KeyManagerFactorySpi
-javax.net.ssl.SNIHostName
-javax.net.ssl.SNIServerName
-javax.net.ssl.SSLContext
-javax.net.ssl.SSLContextSpi
-javax.net.ssl.SSLEngine
-javax.net.ssl.SSLException
-javax.net.ssl.SSLParameters
-javax.net.ssl.SSLPeerUnverifiedException
-javax.net.ssl.SSLProtocolException
-javax.net.ssl.SSLServerSocketFactory
-javax.net.ssl.SSLSession
-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
-javax.net.ssl.TrustManagerFactorySpi
-javax.net.ssl.X509ExtendedKeyManager
-javax.net.ssl.X509ExtendedTrustManager
-javax.net.ssl.X509KeyManager
-javax.net.ssl.X509TrustManager
-javax.security.auth.Destroyable
-javax.security.auth.callback.UnsupportedCallbackException
-javax.security.auth.x500.X500Principal
-javax.security.cert.Certificate
-javax.security.cert.CertificateEncodingException
-javax.security.cert.CertificateException
-javax.security.cert.X509Certificate
-javax.sip.SipException
-javax.xml.parsers.ParserConfigurationException
-javax.xml.parsers.SAXParser
-javax.xml.parsers.SAXParserFactory
-javax.xml.transform.TransformerConfigurationException
-javax.xml.transform.TransformerException
-junit.framework.Assert
-libcore.icu.CollationKeyICU
-libcore.icu.DateIntervalFormat
-libcore.icu.DateUtilsBridge
-libcore.icu.ICU
-libcore.icu.LocaleData
-libcore.icu.NativeConverter
-libcore.icu.RelativeDateTimeFormatter
-libcore.icu.RelativeDateTimeFormatter$FormatterCache
-libcore.icu.TimeZoneNames
-libcore.icu.TimeZoneNames$1
-libcore.icu.TimeZoneNames$ZoneStringsCache
-libcore.internal.StringPool
-libcore.io.AsynchronousCloseMonitor
-libcore.io.BlockGuardOs
-libcore.io.BufferIterator
-libcore.io.ClassPathURLStreamHandler
-libcore.io.ClassPathURLStreamHandler$ClassPathURLConnection
-libcore.io.ClassPathURLStreamHandler$ClassPathURLConnection$1
-libcore.io.DropBox
-libcore.io.DropBox$DefaultReporter
-libcore.io.DropBox$Reporter
-libcore.io.EventLogger
-libcore.io.EventLogger$DefaultReporter
-libcore.io.EventLogger$Reporter
-libcore.io.ForwardingOs
-libcore.io.IoBridge
-libcore.io.IoTracker
-libcore.io.IoTracker$Mode
-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.Streams
-libcore.math.MathUtils
-libcore.net.MimeUtils
-libcore.net.NetworkSecurityPolicy
-libcore.net.NetworkSecurityPolicy$DefaultNetworkSecurityPolicy
-libcore.net.UriCodec
-libcore.net.event.NetworkEventDispatcher
-libcore.net.event.NetworkEventListener
-libcore.reflect.AnnotatedElements
-libcore.reflect.AnnotationFactory
-libcore.reflect.AnnotationMember
-libcore.reflect.AnnotationMember$DefaultValues
-libcore.reflect.GenericArrayTypeImpl
-libcore.reflect.GenericSignatureParser
-libcore.reflect.ListOfTypes
-libcore.reflect.ListOfVariables
-libcore.reflect.ParameterizedTypeImpl
-libcore.reflect.TypeVariableImpl
-libcore.reflect.Types
-libcore.util.BasicLruCache
-libcore.util.CharsetUtils
-libcore.util.CollectionUtils
-libcore.util.EmptyArray
-libcore.util.HexEncoding
-libcore.util.NativeAllocationRegistry
-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
-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
-org.apache.harmony.dalvik.ddmc.DdmServer
-org.apache.harmony.dalvik.ddmc.DdmVmInternal
-org.apache.harmony.luni.internal.util.TimezoneGetter
-org.apache.harmony.xml.ExpatAttributes
-org.apache.harmony.xml.ExpatException
-org.apache.harmony.xml.ExpatParser
-org.apache.harmony.xml.ExpatParser$CurrentAttributes
-org.apache.harmony.xml.ExpatParser$ExpatLocator
-org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.parsers.SAXParserFactoryImpl
-org.apache.harmony.xml.parsers.SAXParserImpl
-org.apache.http.ConnectionReuseStrategy
-org.apache.http.FormattedHeader
-org.apache.http.Header
-org.apache.http.HeaderElement
-org.apache.http.HeaderElementIterator
-org.apache.http.HeaderIterator
-org.apache.http.HttpClientConnection
-org.apache.http.HttpConnection
-org.apache.http.HttpConnectionMetrics
-org.apache.http.HttpEntity
-org.apache.http.HttpEntityEnclosingRequest
-org.apache.http.HttpException
-org.apache.http.HttpHost
-org.apache.http.HttpInetConnection
-org.apache.http.HttpMessage
-org.apache.http.HttpRequest
-org.apache.http.HttpRequestFactory
-org.apache.http.HttpRequestInterceptor
-org.apache.http.HttpResponse
-org.apache.http.HttpResponseFactory
-org.apache.http.HttpResponseInterceptor
-org.apache.http.HttpServerConnection
-org.apache.http.HttpVersion
-org.apache.http.NameValuePair
-org.apache.http.ParseException
-org.apache.http.ProtocolException
-org.apache.http.ProtocolVersion
-org.apache.http.ReasonPhraseCatalog
-org.apache.http.RequestLine
-org.apache.http.StatusLine
-org.apache.http.auth.AuthSchemeFactory
-org.apache.http.auth.AuthSchemeRegistry
-org.apache.http.auth.AuthState
-org.apache.http.auth.AuthenticationException
-org.apache.http.client.AuthenticationHandler
-org.apache.http.client.ClientProtocolException
-org.apache.http.client.CookieStore
-org.apache.http.client.CredentialsProvider
-org.apache.http.client.HttpClient
-org.apache.http.client.HttpRequestRetryHandler
-org.apache.http.client.HttpResponseException
-org.apache.http.client.RedirectHandler
-org.apache.http.client.RequestDirector
-org.apache.http.client.ResponseHandler
-org.apache.http.client.UserTokenHandler
-org.apache.http.client.entity.UrlEncodedFormEntity
-org.apache.http.client.methods.AbortableHttpRequest
-org.apache.http.client.methods.HttpEntityEnclosingRequestBase
-org.apache.http.client.methods.HttpGet
-org.apache.http.client.methods.HttpPost
-org.apache.http.client.methods.HttpPut
-org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.methods.HttpUriRequest
-org.apache.http.client.params.HttpClientParams
-org.apache.http.client.protocol.RequestAddCookies
-org.apache.http.client.protocol.RequestDefaultHeaders
-org.apache.http.client.protocol.RequestProxyAuthentication
-org.apache.http.client.protocol.RequestTargetAuthentication
-org.apache.http.client.protocol.ResponseProcessCookies
-org.apache.http.client.utils.URIUtils
-org.apache.http.client.utils.URLEncodedUtils
-org.apache.http.conn.BasicManagedEntity
-org.apache.http.conn.ClientConnectionManager
-org.apache.http.conn.ClientConnectionOperator
-org.apache.http.conn.ClientConnectionRequest
-org.apache.http.conn.ConnectTimeoutException
-org.apache.http.conn.ConnectionKeepAliveStrategy
-org.apache.http.conn.ConnectionReleaseTrigger
-org.apache.http.conn.EofSensorInputStream
-org.apache.http.conn.EofSensorWatcher
-org.apache.http.conn.ManagedClientConnection
-org.apache.http.conn.OperatedClientConnection
-org.apache.http.conn.params.ConnManagerPNames
-org.apache.http.conn.params.ConnManagerParamBean
-org.apache.http.conn.params.ConnManagerParams
-org.apache.http.conn.params.ConnManagerParams$1
-org.apache.http.conn.params.ConnPerRoute
-org.apache.http.conn.params.ConnPerRouteBean
-org.apache.http.conn.params.ConnRoutePNames
-org.apache.http.conn.params.ConnRouteParams
-org.apache.http.conn.routing.BasicRouteDirector
-org.apache.http.conn.routing.HttpRoute
-org.apache.http.conn.routing.HttpRouteDirector
-org.apache.http.conn.routing.HttpRoutePlanner
-org.apache.http.conn.routing.RouteInfo
-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.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.AndroidDistinguishedNameParser
-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.cookie.ClientCookie
-org.apache.http.cookie.Cookie
-org.apache.http.cookie.CookieAttributeHandler
-org.apache.http.cookie.CookieIdentityComparator
-org.apache.http.cookie.CookieOrigin
-org.apache.http.cookie.CookiePathComparator
-org.apache.http.cookie.CookieSpec
-org.apache.http.cookie.CookieSpecFactory
-org.apache.http.cookie.CookieSpecRegistry
-org.apache.http.cookie.MalformedCookieException
-org.apache.http.cookie.SetCookie
-org.apache.http.entity.AbstractHttpEntity
-org.apache.http.entity.BasicHttpEntity
-org.apache.http.entity.ByteArrayEntity
-org.apache.http.entity.ContentLengthStrategy
-org.apache.http.entity.HttpEntityWrapper
-org.apache.http.entity.InputStreamEntity
-org.apache.http.entity.StringEntity
-org.apache.http.impl.AbstractHttpClientConnection
-org.apache.http.impl.AbstractHttpServerConnection
-org.apache.http.impl.DefaultConnectionReuseStrategy
-org.apache.http.impl.DefaultHttpRequestFactory
-org.apache.http.impl.DefaultHttpResponseFactory
-org.apache.http.impl.DefaultHttpServerConnection
-org.apache.http.impl.EnglishReasonPhraseCatalog
-org.apache.http.impl.HttpConnectionMetricsImpl
-org.apache.http.impl.SocketHttpClientConnection
-org.apache.http.impl.SocketHttpServerConnection
-org.apache.http.impl.auth.BasicSchemeFactory
-org.apache.http.impl.auth.DigestSchemeFactory
-org.apache.http.impl.client.AbstractAuthenticationHandler
-org.apache.http.impl.client.AbstractHttpClient
-org.apache.http.impl.client.BasicCookieStore
-org.apache.http.impl.client.BasicCredentialsProvider
-org.apache.http.impl.client.ClientParamsStack
-org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy
-org.apache.http.impl.client.DefaultHttpClient
-org.apache.http.impl.client.DefaultHttpRequestRetryHandler
-org.apache.http.impl.client.DefaultProxyAuthenticationHandler
-org.apache.http.impl.client.DefaultRedirectHandler
-org.apache.http.impl.client.DefaultRequestDirector
-org.apache.http.impl.client.DefaultTargetAuthenticationHandler
-org.apache.http.impl.client.DefaultUserTokenHandler
-org.apache.http.impl.client.EntityEnclosingRequestWrapper
-org.apache.http.impl.client.RequestWrapper
-org.apache.http.impl.client.RoutedRequest
-org.apache.http.impl.client.TunnelRefusedException
-org.apache.http.impl.conn.AbstractClientConnAdapter
-org.apache.http.impl.conn.AbstractPoolEntry
-org.apache.http.impl.conn.AbstractPooledConnAdapter
-org.apache.http.impl.conn.DefaultClientConnection
-org.apache.http.impl.conn.DefaultClientConnectionOperator
-org.apache.http.impl.conn.DefaultResponseParser
-org.apache.http.impl.conn.IdleConnectionHandler
-org.apache.http.impl.conn.IdleConnectionHandler$TimeValues
-org.apache.http.impl.conn.ProxySelectorRoutePlanner
-org.apache.http.impl.conn.tsccm.AbstractConnPool
-org.apache.http.impl.conn.tsccm.BasicPoolEntry
-org.apache.http.impl.conn.tsccm.BasicPoolEntryRef
-org.apache.http.impl.conn.tsccm.BasicPooledConnAdapter
-org.apache.http.impl.conn.tsccm.ConnPoolByRoute
-org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1
-org.apache.http.impl.conn.tsccm.PoolEntryRequest
-org.apache.http.impl.conn.tsccm.RefQueueHandler
-org.apache.http.impl.conn.tsccm.RefQueueWorker
-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.WaitingThreadAborter
-org.apache.http.impl.cookie.AbstractCookieAttributeHandler
-org.apache.http.impl.cookie.AbstractCookieSpec
-org.apache.http.impl.cookie.BasicClientCookie
-org.apache.http.impl.cookie.BasicCommentHandler
-org.apache.http.impl.cookie.BasicDomainHandler
-org.apache.http.impl.cookie.BasicExpiresHandler
-org.apache.http.impl.cookie.BasicMaxAgeHandler
-org.apache.http.impl.cookie.BasicPathHandler
-org.apache.http.impl.cookie.BasicSecureHandler
-org.apache.http.impl.cookie.BestMatchSpec
-org.apache.http.impl.cookie.BestMatchSpecFactory
-org.apache.http.impl.cookie.BrowserCompatSpec
-org.apache.http.impl.cookie.BrowserCompatSpecFactory
-org.apache.http.impl.cookie.CookieSpecBase
-org.apache.http.impl.cookie.DateParseException
-org.apache.http.impl.cookie.DateUtils
-org.apache.http.impl.cookie.DateUtils$DateFormatHolder
-org.apache.http.impl.cookie.DateUtils$DateFormatHolder$1
-org.apache.http.impl.cookie.NetscapeDomainHandler
-org.apache.http.impl.cookie.NetscapeDraftHeaderParser
-org.apache.http.impl.cookie.NetscapeDraftSpec
-org.apache.http.impl.cookie.NetscapeDraftSpecFactory
-org.apache.http.impl.cookie.RFC2109DomainHandler
-org.apache.http.impl.cookie.RFC2109Spec
-org.apache.http.impl.cookie.RFC2109SpecFactory
-org.apache.http.impl.cookie.RFC2109VersionHandler
-org.apache.http.impl.cookie.RFC2965CommentUrlAttributeHandler
-org.apache.http.impl.cookie.RFC2965DiscardAttributeHandler
-org.apache.http.impl.cookie.RFC2965DomainAttributeHandler
-org.apache.http.impl.cookie.RFC2965PortAttributeHandler
-org.apache.http.impl.cookie.RFC2965Spec
-org.apache.http.impl.cookie.RFC2965SpecFactory
-org.apache.http.impl.cookie.RFC2965VersionAttributeHandler
-org.apache.http.impl.entity.EntityDeserializer
-org.apache.http.impl.entity.EntitySerializer
-org.apache.http.impl.entity.LaxContentLengthStrategy
-org.apache.http.impl.entity.StrictContentLengthStrategy
-org.apache.http.impl.io.AbstractMessageParser
-org.apache.http.impl.io.AbstractMessageWriter
-org.apache.http.impl.io.AbstractSessionInputBuffer
-org.apache.http.impl.io.AbstractSessionOutputBuffer
-org.apache.http.impl.io.ChunkedInputStream
-org.apache.http.impl.io.ContentLengthInputStream
-org.apache.http.impl.io.ContentLengthOutputStream
-org.apache.http.impl.io.HttpRequestParser
-org.apache.http.impl.io.HttpRequestWriter
-org.apache.http.impl.io.HttpResponseWriter
-org.apache.http.impl.io.HttpTransportMetricsImpl
-org.apache.http.impl.io.IdentityOutputStream
-org.apache.http.impl.io.SocketInputBuffer
-org.apache.http.impl.io.SocketOutputBuffer
-org.apache.http.io.HttpMessageParser
-org.apache.http.io.HttpMessageWriter
-org.apache.http.io.HttpTransportMetrics
-org.apache.http.io.SessionInputBuffer
-org.apache.http.io.SessionOutputBuffer
-org.apache.http.message.AbstractHttpMessage
-org.apache.http.message.BasicHeader
-org.apache.http.message.BasicHeaderElement
-org.apache.http.message.BasicHeaderElementIterator
-org.apache.http.message.BasicHeaderValueParser
-org.apache.http.message.BasicHttpRequest
-org.apache.http.message.BasicHttpResponse
-org.apache.http.message.BasicLineFormatter
-org.apache.http.message.BasicLineParser
-org.apache.http.message.BasicListHeaderIterator
-org.apache.http.message.BasicNameValuePair
-org.apache.http.message.BasicRequestLine
-org.apache.http.message.BasicStatusLine
-org.apache.http.message.BufferedHeader
-org.apache.http.message.HeaderGroup
-org.apache.http.message.HeaderValueParser
-org.apache.http.message.LineFormatter
-org.apache.http.message.LineParser
-org.apache.http.message.ParserCursor
-org.apache.http.params.AbstractHttpParams
-org.apache.http.params.BasicHttpParams
-org.apache.http.params.CoreConnectionPNames
-org.apache.http.params.CoreProtocolPNames
-org.apache.http.params.DefaultedHttpParams
-org.apache.http.params.HttpAbstractParamBean
-org.apache.http.params.HttpConnectionParams
-org.apache.http.params.HttpParams
-org.apache.http.params.HttpProtocolParams
-org.apache.http.protocol.BasicHttpContext
-org.apache.http.protocol.BasicHttpProcessor
-org.apache.http.protocol.DefaultedHttpContext
-org.apache.http.protocol.HTTP
-org.apache.http.protocol.HttpContext
-org.apache.http.protocol.HttpProcessor
-org.apache.http.protocol.HttpRequestExecutor
-org.apache.http.protocol.HttpRequestHandler
-org.apache.http.protocol.HttpRequestHandlerRegistry
-org.apache.http.protocol.HttpRequestHandlerResolver
-org.apache.http.protocol.HttpRequestInterceptorList
-org.apache.http.protocol.HttpResponseInterceptorList
-org.apache.http.protocol.HttpService
-org.apache.http.protocol.RequestConnControl
-org.apache.http.protocol.RequestContent
-org.apache.http.protocol.RequestExpectContinue
-org.apache.http.protocol.RequestTargetHost
-org.apache.http.protocol.RequestUserAgent
-org.apache.http.protocol.ResponseConnControl
-org.apache.http.protocol.ResponseContent
-org.apache.http.protocol.UriPatternMatcher
-org.apache.http.util.ByteArrayBuffer
-org.apache.http.util.CharArrayBuffer
-org.apache.http.util.EntityUtils
-org.apache.http.util.LangUtils
-org.ccil.cowan.tagsoup.AttributesImpl
-org.ccil.cowan.tagsoup.AutoDetector
-org.ccil.cowan.tagsoup.Element
-org.ccil.cowan.tagsoup.ElementType
-org.ccil.cowan.tagsoup.HTMLModels
-org.ccil.cowan.tagsoup.HTMLScanner
-org.ccil.cowan.tagsoup.HTMLSchema
-org.ccil.cowan.tagsoup.Parser
-org.ccil.cowan.tagsoup.Parser$1
-org.ccil.cowan.tagsoup.ScanHandler
-org.ccil.cowan.tagsoup.Scanner
-org.ccil.cowan.tagsoup.Schema
-org.json.JSON
-org.json.JSONArray
-org.json.JSONException
-org.json.JSONObject
-org.json.JSONObject$1
-org.json.JSONStringer
-org.json.JSONStringer$Scope
-org.json.JSONTokener
-org.kxml2.io.KXmlParser
-org.kxml2.io.KXmlParser$ValueContext
-org.kxml2.io.KXmlSerializer
-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.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
-org.xmlpull.v1.XmlPullParser
-org.xmlpull.v1.XmlPullParserException
-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
-sun.misc.FDBigInteger
-sun.misc.FloatingDecimal
-sun.misc.FloatingDecimal$1
-sun.misc.FloatingDecimal$ASCIIToBinaryBuffer
-sun.misc.FloatingDecimal$ASCIIToBinaryConverter
-sun.misc.FloatingDecimal$BinaryToASCIIBuffer
-sun.misc.FloatingDecimal$BinaryToASCIIConverter
-sun.misc.FloatingDecimal$ExceptionalBinaryToASCIIBuffer
-sun.misc.FloatingDecimal$PreparedASCIIToBinaryBuffer
-sun.misc.FormattedFloatingDecimal
-sun.misc.FormattedFloatingDecimal$1
-sun.misc.FormattedFloatingDecimal$Form
-sun.misc.IOUtils
-sun.misc.JavaIOFileDescriptorAccess
-sun.misc.LRUCache
-sun.misc.REException
-sun.misc.SharedSecrets
-sun.misc.Unsafe
-sun.misc.VM
-sun.misc.Version
-sun.net.ConnectionResetException
-sun.net.NetHooks
-sun.net.NetProperties
-sun.net.NetProperties$1
-sun.net.ResourceManager
-sun.net.spi.DefaultProxySelector
-sun.net.spi.DefaultProxySelector$1
-sun.net.spi.DefaultProxySelector$NonProxyInfo
-sun.net.spi.nameservice.NameService
-sun.net.util.IPAddressUtil
-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.FileChannelImpl
-sun.nio.ch.FileChannelImpl$Unmapper
-sun.nio.ch.FileDescriptorHolderSocketImpl
-sun.nio.ch.FileDispatcher
-sun.nio.ch.FileDispatcherImpl
-sun.nio.ch.FileKey
-sun.nio.ch.FileLockImpl
-sun.nio.ch.FileLockTable
-sun.nio.ch.IOStatus
-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
-sun.nio.cs.StreamDecoder
-sun.nio.cs.StreamEncoder
-sun.nio.cs.ThreadLocalCoders
-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
-sun.nio.fs.NativeBuffer$Deallocator
-sun.nio.fs.NativeBuffers
-sun.nio.fs.UnixChannelFactory
-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
-sun.nio.fs.UnixFileSystemProvider
-sun.nio.fs.UnixMountEntry
-sun.nio.fs.UnixNativeDispatcher
-sun.nio.fs.UnixPath
-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
-sun.security.jca.JCAUtil
-sun.security.jca.ProviderConfig
-sun.security.jca.ProviderConfig$2
-sun.security.jca.ProviderList
-sun.security.jca.ProviderList$1
-sun.security.jca.ProviderList$2
-sun.security.jca.ProviderList$3
-sun.security.jca.ProviderList$ServiceList
-sun.security.jca.ProviderList$ServiceList$1
-sun.security.jca.Providers
-sun.security.jca.ServiceId
-sun.security.pkcs.ContentInfo
-sun.security.pkcs.PKCS7
-sun.security.pkcs.PKCS7$VerbatimX509Certificate
-sun.security.pkcs.PKCS7$WrappedX509Certificate
-sun.security.pkcs.PKCS9Attribute
-sun.security.pkcs.SignerInfo
-sun.security.provider.CertPathProvider
-sun.security.provider.X509Factory
-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.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
-sun.security.util.DerInputBuffer
-sun.security.util.DerInputStream
-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.KeyUtil
-sun.security.util.Length
-sun.security.util.ManifestDigester
-sun.security.util.ManifestDigester$Entry
-sun.security.util.ManifestDigester$Position
-sun.security.util.ManifestEntryVerifier
-sun.security.util.ManifestEntryVerifier$SunProviderHolder
-sun.security.util.MemoryCache
-sun.security.util.MemoryCache$CacheEntry
-sun.security.util.MemoryCache$SoftCacheEntry
-sun.security.util.ObjectIdentifier
-sun.security.util.SignatureFileVerifier
-sun.security.x509.AVA
-sun.security.x509.AVAKeyword
-sun.security.x509.AccessDescription
-sun.security.x509.AlgorithmId
-sun.security.x509.AuthorityInfoAccessExtension
-sun.security.x509.AuthorityKeyIdentifierExtension
-sun.security.x509.BasicConstraintsExtension
-sun.security.x509.CRLDistributionPointsExtension
-sun.security.x509.CRLNumberExtension
-sun.security.x509.CRLReasonCodeExtension
-sun.security.x509.CertAttrSet
-sun.security.x509.CertificateAlgorithmId
-sun.security.x509.CertificateExtensions
-sun.security.x509.CertificateIssuerExtension
-sun.security.x509.CertificatePoliciesExtension
-sun.security.x509.CertificatePolicyId
-sun.security.x509.CertificateSerialNumber
-sun.security.x509.CertificateValidity
-sun.security.x509.CertificateVersion
-sun.security.x509.CertificateX509Key
-sun.security.x509.DNSName
-sun.security.x509.DeltaCRLIndicatorExtension
-sun.security.x509.DistributionPoint
-sun.security.x509.ExtendedKeyUsageExtension
-sun.security.x509.Extension
-sun.security.x509.FreshestCRLExtension
-sun.security.x509.GeneralName
-sun.security.x509.GeneralNameInterface
-sun.security.x509.GeneralNames
-sun.security.x509.InhibitAnyPolicyExtension
-sun.security.x509.IssuerAlternativeNameExtension
-sun.security.x509.IssuingDistributionPointExtension
-sun.security.x509.KeyIdentifier
-sun.security.x509.KeyUsageExtension
-sun.security.x509.NameConstraintsExtension
-sun.security.x509.NetscapeCertTypeExtension
-sun.security.x509.OCSPNoCheckExtension
-sun.security.x509.OIDMap
-sun.security.x509.OIDMap$OIDInfo
-sun.security.x509.PKIXExtensions
-sun.security.x509.PolicyConstraintsExtension
-sun.security.x509.PolicyInformation
-sun.security.x509.PolicyMappingsExtension
-sun.security.x509.PrivateKeyUsageExtension
-sun.security.x509.RDN
-sun.security.x509.SerialNumber
-sun.security.x509.SubjectAlternativeNameExtension
-sun.security.x509.SubjectInfoAccessExtension
-sun.security.x509.SubjectKeyIdentifierExtension
-sun.security.x509.URIName
-sun.security.x509.X500Name
-sun.security.x509.X500Name$1
-sun.security.x509.X509AttributeName
-sun.security.x509.X509CertImpl
-sun.security.x509.X509CertInfo
-sun.security.x509.X509Key
-sun.util.calendar.AbstractCalendar
-sun.util.calendar.BaseCalendar
-sun.util.calendar.BaseCalendar$Date
-sun.util.calendar.CalendarDate
-sun.util.calendar.CalendarSystem
-sun.util.calendar.CalendarUtils
-sun.util.calendar.Gregorian
-sun.util.calendar.Gregorian$Date
-sun.util.calendar.JulianCalendar
-sun.util.calendar.LocalGregorianCalendar
-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
-sun.util.locale.LocaleExtensions
-sun.util.locale.LocaleObjectCache
-sun.util.locale.LocaleObjectCache$CacheEntry
-sun.util.locale.LocaleSyntaxException
-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
-sun.util.logging.PlatformLogger$Level
-sun.util.logging.PlatformLogger$LoggerProxy
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 8824643..97dcb90 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -391,8 +391,12 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({SHOW_MODE_AUTO, SHOW_MODE_HIDDEN})
-    public @interface SoftKeyboardShowMode {};
+    @IntDef(prefix = { "SHOW_MODE_" }, value = {
+            SHOW_MODE_AUTO,
+            SHOW_MODE_HIDDEN
+    })
+    public @interface SoftKeyboardShowMode {}
+
     public static final int SHOW_MODE_AUTO = 0;
     public static final int SHOW_MODE_HIDDEN = 1;
 
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index bd9c9fa..782733f 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -290,8 +290,13 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({VISIBILITY_UNDEFINED, VISIBILITY_VISIBLE, VISIBILITY_USER_MANAGED_VISIBLE,
-            VISIBILITY_NOT_VISIBLE, VISIBILITY_USER_MANAGED_NOT_VISIBLE})
+    @IntDef(prefix = { "VISIBILITY_" }, value = {
+            VISIBILITY_UNDEFINED,
+            VISIBILITY_VISIBLE,
+            VISIBILITY_USER_MANAGED_VISIBLE,
+            VISIBILITY_NOT_VISIBLE,
+            VISIBILITY_USER_MANAGED_NOT_VISIBLE
+    })
     public @interface AccountVisibility {
     }
 
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index 0e8326d..04ff48c 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -95,7 +95,11 @@
 public abstract class ActionBar {
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
+    @IntDef(prefix = { "NAVIGATION_MODE_" }, value = {
+            NAVIGATION_MODE_STANDARD,
+            NAVIGATION_MODE_LIST,
+            NAVIGATION_MODE_TABS
+    })
     public @interface NavigationMode {}
 
     /**
@@ -139,15 +143,14 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {
-                    DISPLAY_USE_LOGO,
-                    DISPLAY_SHOW_HOME,
-                    DISPLAY_HOME_AS_UP,
-                    DISPLAY_SHOW_TITLE,
-                    DISPLAY_SHOW_CUSTOM,
-                    DISPLAY_TITLE_MULTIPLE_LINES
-            })
+    @IntDef(flag = true, prefix = { "DISPLAY_" }, value = {
+            DISPLAY_USE_LOGO,
+            DISPLAY_SHOW_HOME,
+            DISPLAY_HOME_AS_UP,
+            DISPLAY_SHOW_TITLE,
+            DISPLAY_SHOW_CUSTOM,
+            DISPLAY_TITLE_MULTIPLE_LINES
+    })
     public @interface DisplayOptions {}
 
     /**
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index e33b79e5..847082a 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -175,7 +175,7 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
+    @IntDef(prefix = { "BUGREPORT_OPTION_" }, value = {
             BUGREPORT_OPTION_FULL,
             BUGREPORT_OPTION_INTERACTIVE,
             BUGREPORT_OPTION_REMOTE,
@@ -533,10 +533,10 @@
     // to frameworks/base/core/proto/android/app/activitymanager.proto and the following method must
     // be updated to correctly map between them.
     /**
-     * Maps ActivityManager.PROCESS_STATE_ values to ActivityManagerProto.ProcessState enum.
+     * Maps ActivityManager.PROCESS_STATE_ values to ProcessState enum.
      *
      * @param amInt a process state of the form ActivityManager.PROCESS_STATE_
-     * @return the value of the corresponding android.app.ActivityManagerProto's ProcessState enum.
+     * @return the value of the corresponding ActivityManager's ProcessState enum.
      * @hide
      */
     public static final int processStateAmToProto(int amInt) {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index c1a5104..c943574 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -258,8 +258,10 @@
     public static final int OP_CHANGE_WIFI_STATE = 71;
     /** @hide Request package deletion through package installer */
     public static final int OP_REQUEST_DELETE_PACKAGES = 72;
+    /** @hide Bind an accessibility service. */
+    public static final int OP_BIND_ACCESSIBILITY_SERVICE = 73;
     /** @hide */
-    public static final int _NUM_OP = 73;
+    public static final int _NUM_OP = 74;
 
     /** Access to coarse location information. */
     public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -503,6 +505,7 @@
             OP_RUN_ANY_IN_BACKGROUND,
             OP_CHANGE_WIFI_STATE,
             OP_REQUEST_DELETE_PACKAGES,
+            OP_BIND_ACCESSIBILITY_SERVICE,
     };
 
     /**
@@ -583,6 +586,7 @@
             null, // OP_RUN_ANY_IN_BACKGROUND
             null, // OP_CHANGE_WIFI_STATE
             null, // OP_REQUEST_DELETE_PACKAGES
+            null, // OP_BIND_ACCESSIBILITY_SERVICE
     };
 
     /**
@@ -663,6 +667,7 @@
             "RUN_ANY_IN_BACKGROUND",
             "CHANGE_WIFI_STATE",
             "REQUEST_DELETE_PACKAGES",
+            "BIND_ACCESSIBILITY_SERVICE",
     };
 
     /**
@@ -743,6 +748,7 @@
             null, // no permission for OP_RUN_ANY_IN_BACKGROUND
             Manifest.permission.CHANGE_WIFI_STATE,
             Manifest.permission.REQUEST_DELETE_PACKAGES,
+            Manifest.permission.BIND_ACCESSIBILITY_SERVICE,
     };
 
     /**
@@ -824,6 +830,7 @@
             null, // OP_RUN_ANY_IN_BACKGROUND
             null, // OP_CHANGE_WIFI_STATE
             null, // REQUEST_DELETE_PACKAGES
+            null, // OP_BIND_ACCESSIBILITY_SERVICE
     };
 
     /**
@@ -904,6 +911,7 @@
             false, // OP_RUN_ANY_IN_BACKGROUND
             false, // OP_CHANGE_WIFI_STATE
             false, // OP_REQUEST_DELETE_PACKAGES
+            false, // OP_BIND_ACCESSIBILITY_SERVICE
     };
 
     /**
@@ -983,6 +991,7 @@
             AppOpsManager.MODE_ALLOWED,  // OP_RUN_ANY_IN_BACKGROUND
             AppOpsManager.MODE_ALLOWED,  // OP_CHANGE_WIFI_STATE
             AppOpsManager.MODE_ALLOWED,  // REQUEST_DELETE_PACKAGES
+            AppOpsManager.MODE_ALLOWED,  // OP_BIND_ACCESSIBILITY_SERVICE
     };
 
     /**
@@ -1066,6 +1075,7 @@
             false, // OP_RUN_ANY_IN_BACKGROUND
             false, // OP_CHANGE_WIFI_STATE
             false, // OP_REQUEST_DELETE_PACKAGES
+            false, // OP_BIND_ACCESSIBILITY_SERVICE
     };
 
     /**
diff --git a/core/java/android/app/FragmentTransaction.java b/core/java/android/app/FragmentTransaction.java
index 0f4a7fb..1103649 100644
--- a/core/java/android/app/FragmentTransaction.java
+++ b/core/java/android/app/FragmentTransaction.java
@@ -182,7 +182,12 @@
     public static final int TRANSIT_FRAGMENT_FADE = 3 | TRANSIT_ENTER_MASK;
 
     /** @hide */
-    @IntDef({TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, TRANSIT_FRAGMENT_CLOSE, TRANSIT_FRAGMENT_FADE})
+    @IntDef(prefix = { "TRANSIT_" }, value = {
+            TRANSIT_NONE,
+            TRANSIT_FRAGMENT_OPEN,
+            TRANSIT_FRAGMENT_CLOSE,
+            TRANSIT_FRAGMENT_FADE
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Transit {}
 
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index fb9efe6f..705f9a0 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -577,7 +577,13 @@
     public int flags;
 
     /** @hide */
-    @IntDef({PRIORITY_DEFAULT,PRIORITY_LOW,PRIORITY_MIN,PRIORITY_HIGH,PRIORITY_MAX})
+    @IntDef(prefix = { "PRIORITY_" }, value = {
+            PRIORITY_DEFAULT,
+            PRIORITY_LOW,
+            PRIORITY_MIN,
+            PRIORITY_HIGH,
+            PRIORITY_MAX
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Priority {}
 
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 23c4166..85a9be3 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -80,9 +80,14 @@
     public static final int DISABLE2_MASK = DISABLE2_QUICK_SETTINGS | DISABLE2_SYSTEM_ICONS
             | DISABLE2_NOTIFICATION_SHADE | DISABLE2_GLOBAL_ACTIONS;
 
-    @IntDef(flag = true,
-            value = {DISABLE2_NONE, DISABLE2_MASK, DISABLE2_QUICK_SETTINGS, DISABLE2_SYSTEM_ICONS,
-                    DISABLE2_NOTIFICATION_SHADE, DISABLE2_GLOBAL_ACTIONS})
+    @IntDef(flag = true, prefix = { "DISABLE2_" }, value = {
+            DISABLE2_NONE,
+            DISABLE2_MASK,
+            DISABLE2_QUICK_SETTINGS,
+            DISABLE2_SYSTEM_ICONS,
+            DISABLE2_NOTIFICATION_SHADE,
+            DISABLE2_GLOBAL_ACTIONS
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Disable2Flags {}
 
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index bc61668..0da5e24 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -98,7 +98,11 @@
     public static String ACTION_EXIT_DESK_MODE = "android.app.action.EXIT_DESK_MODE";
 
     /** @hide */
-    @IntDef({MODE_NIGHT_AUTO, MODE_NIGHT_NO, MODE_NIGHT_YES})
+    @IntDef(prefix = { "MODE_" }, value = {
+            MODE_NIGHT_AUTO,
+            MODE_NIGHT_NO,
+            MODE_NIGHT_YES
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface NightMode {}
 
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 081bd81..3829afb 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -176,7 +176,7 @@
     // flags for which kind of wallpaper to act on
 
     /** @hide */
-    @IntDef(flag = true, value = {
+    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
             FLAG_SYSTEM,
             FLAG_LOCK
     })
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java
index 80399ae..085fc79 100644
--- a/core/java/android/app/WindowConfiguration.java
+++ b/core/java/android/app/WindowConfiguration.java
@@ -89,7 +89,7 @@
     public static final int WINDOWING_MODE_FREEFORM = 5;
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "WINDOWING_MODE_" }, value = {
             WINDOWING_MODE_UNDEFINED,
             WINDOWING_MODE_FULLSCREEN,
             WINDOWING_MODE_PINNED,
@@ -115,7 +115,7 @@
     public static final int ACTIVITY_TYPE_ASSISTANT = 4;
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "ACTIVITY_TYPE_" }, value = {
             ACTIVITY_TYPE_UNDEFINED,
             ACTIVITY_TYPE_STANDARD,
             ACTIVITY_TYPE_HOME,
@@ -138,13 +138,12 @@
     public static final int WINDOW_CONFIG_ACTIVITY_TYPE = 1 << 3;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                    WINDOW_CONFIG_BOUNDS,
-                    WINDOW_CONFIG_APP_BOUNDS,
-                    WINDOW_CONFIG_WINDOWING_MODE,
-                    WINDOW_CONFIG_ACTIVITY_TYPE
-            })
+    @IntDef(flag = true, prefix = { "WINDOW_CONFIG_" }, value = {
+            WINDOW_CONFIG_BOUNDS,
+            WINDOW_CONFIG_APP_BOUNDS,
+            WINDOW_CONFIG_WINDOWING_MODE,
+            WINDOW_CONFIG_ACTIVITY_TYPE
+    })
     public @interface WindowConfig {}
 
     public WindowConfiguration() {
diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java
index d0d98c9..2e697ac 100644
--- a/core/java/android/app/admin/DeviceAdminReceiver.java
+++ b/core/java/android/app/admin/DeviceAdminReceiver.java
@@ -368,9 +368,9 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-        BUGREPORT_FAILURE_FAILED_COMPLETING,
-        BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
+    @IntDef(prefix = { "BUGREPORT_FAILURE_" }, value = {
+            BUGREPORT_FAILURE_FAILED_COMPLETING,
+            BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
     })
     public @interface BugreportFailureCode {}
 
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index e43ae5b..70153c7 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -64,6 +64,9 @@
 import android.security.Credentials;
 import android.security.KeyChain;
 import android.security.KeyChainException;
+import android.security.keymaster.KeymasterCertificateChain;
+import android.security.keystore.AttestationUtils;
+import android.security.keystore.KeyAttestationException;
 import android.security.keystore.KeyGenParameterSpec;
 import android.security.keystore.ParcelableKeyGenParameterSpec;
 import android.service.restrictions.RestrictionsReceiver;
@@ -1376,8 +1379,13 @@
     /**
      * @hide
      */
-    @IntDef({STATE_USER_UNMANAGED, STATE_USER_SETUP_INCOMPLETE, STATE_USER_SETUP_COMPLETE,
-            STATE_USER_SETUP_FINALIZED, STATE_USER_PROFILE_COMPLETE})
+    @IntDef(prefix = { "STATE_USER_" }, value = {
+            STATE_USER_UNMANAGED,
+            STATE_USER_SETUP_INCOMPLETE,
+            STATE_USER_SETUP_COMPLETE,
+            STATE_USER_SETUP_FINALIZED,
+            STATE_USER_PROFILE_COMPLETE
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface UserProvisioningState {}
 
@@ -1550,11 +1558,13 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({CODE_OK, CODE_HAS_DEVICE_OWNER, CODE_USER_HAS_PROFILE_OWNER, CODE_USER_NOT_RUNNING,
+    @IntDef(prefix = { "CODE_" }, value = {
+            CODE_OK, CODE_HAS_DEVICE_OWNER, CODE_USER_HAS_PROFILE_OWNER, CODE_USER_NOT_RUNNING,
             CODE_USER_SETUP_COMPLETED, CODE_NOT_SYSTEM_USER, CODE_HAS_PAIRED,
             CODE_MANAGED_USERS_NOT_SUPPORTED, CODE_SYSTEM_USER, CODE_CANNOT_ADD_MANAGED_PROFILE,
             CODE_NOT_SYSTEM_USER_SPLIT, CODE_DEVICE_ADMIN_NOT_SUPPORTED,
-            CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER, CODE_ADD_MANAGED_PROFILE_DISALLOWED})
+            CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER, CODE_ADD_MANAGED_PROFILE_DISALLOWED
+    })
     public @interface ProvisioningPreCondition {}
 
     /**
@@ -1636,11 +1646,15 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {LOCK_TASK_FEATURE_NONE, LOCK_TASK_FEATURE_SYSTEM_INFO,
-                    LOCK_TASK_FEATURE_NOTIFICATIONS, LOCK_TASK_FEATURE_HOME,
-                    LOCK_TASK_FEATURE_RECENTS, LOCK_TASK_FEATURE_GLOBAL_ACTIONS,
-                    LOCK_TASK_FEATURE_KEYGUARD})
+    @IntDef(flag = true, prefix = { "LOCK_TASK_FEATURE_" }, value = {
+            LOCK_TASK_FEATURE_NONE,
+            LOCK_TASK_FEATURE_SYSTEM_INFO,
+            LOCK_TASK_FEATURE_NOTIFICATIONS,
+            LOCK_TASK_FEATURE_HOME,
+            LOCK_TASK_FEATURE_RECENTS,
+            LOCK_TASK_FEATURE_GLOBAL_ACTIONS,
+            LOCK_TASK_FEATURE_KEYGUARD
+    })
     public @interface LockTaskFeature {}
 
     /**
@@ -3169,7 +3183,9 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag=true, value={FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY})
+    @IntDef(flag = true, prefix = { "FLAG_EVICT_" }, value = {
+            FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY
+    })
     public @interface LockNowFlag {}
 
     /**
@@ -3992,15 +4008,27 @@
         try {
             final ParcelableKeyGenParameterSpec parcelableSpec =
                     new ParcelableKeyGenParameterSpec(keySpec);
+            KeymasterCertificateChain attestationChain = new KeymasterCertificateChain();
             final boolean success = mService.generateKeyPair(
-                    admin, mContext.getPackageName(), algorithm, parcelableSpec);
+                    admin, mContext.getPackageName(), algorithm, parcelableSpec, attestationChain);
             if (!success) {
                 Log.e(TAG, "Error generating key via DevicePolicyManagerService.");
                 return null;
             }
 
-            final KeyPair keyPair = KeyChain.getKeyPair(mContext, keySpec.getKeystoreAlias());
-            return new AttestedKeyPair(keyPair, null);
+            final String alias = keySpec.getKeystoreAlias();
+            final KeyPair keyPair = KeyChain.getKeyPair(mContext, alias);
+            Certificate[] outputChain = null;
+            try {
+                if (AttestationUtils.isChainValid(attestationChain)) {
+                    outputChain = AttestationUtils.parseCertificateChain(attestationChain);
+                }
+            } catch (KeyAttestationException e) {
+                Log.e(TAG, "Error parsing attestation chain for alias " + alias, e);
+                mService.removeKeyPair(admin, mContext.getPackageName(), alias);
+                return null;
+            }
+            return new AttestedKeyPair(keyPair, outputChain);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         } catch (KeyChainException e) {
@@ -6233,12 +6261,13 @@
     /**
      * @hide
      */
-    @IntDef(
-            flag = true,
-            prefix = {"SKIP_", "MAKE_USER_", "START_", "LEAVE_"},
-            value = {SKIP_SETUP_WIZARD, MAKE_USER_EPHEMERAL, MAKE_USER_DEMO,
-                    START_USER_IN_BACKGROUND, LEAVE_ALL_SYSTEM_APPS_ENABLED}
-    )
+    @IntDef(flag = true, prefix = { "SKIP_", "MAKE_USER_", "START_", "LEAVE_" }, value = {
+            SKIP_SETUP_WIZARD,
+            MAKE_USER_EPHEMERAL,
+            MAKE_USER_DEMO,
+            START_USER_IN_BACKGROUND,
+            LEAVE_ALL_SYSTEM_APPS_ENABLED
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CreateAndManageUserFlags {}
 
@@ -8739,4 +8768,44 @@
             throw re.rethrowFromSystemServer();
         }
     }
+
+    //TODO STOPSHIP Add link to onTransferComplete callback when implemented.
+    /**
+     * Transfers the current administrator. All policies from the current administrator are
+     * migrated to the new administrator. The whole operation is atomic - the transfer is either
+     * complete or not done at all.
+     *
+     * Depending on the current administrator (device owner, profile owner, corporate owned
+     * profile owner), you have the following expected behaviour:
+     * <ul>
+     *     <li>A device owner can only be transferred to a new device owner</li>
+     *     <li>A profile owner can only be transferred to a new profile owner</li>
+     *     <li>A corporate owned managed profile can have two cases:
+     *          <ul>
+     *              <li>If the device owner and profile owner are the same package,
+     *              both will be transferred.</li>
+     *              <li>If the device owner and profile owner are different packages,
+     *              and if this method is called from the profile owner, only the profile owner
+     *              is transferred. Similarly, if it is called from the device owner, only
+     *              the device owner is transferred.</li>
+     *          </ul>
+     *     </li>
+     * </ul>
+     *
+     * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+     * @param target Which {@link DeviceAdminReceiver} we want the new administrator to be.
+     * @param bundle Parameters - This bundle allows the current administrator to pass data to the
+     *               new administrator. The parameters will be received in the
+     *               onTransferComplete callback.
+     * @hide
+     */
+    public void transferOwner(@NonNull ComponentName admin, @NonNull ComponentName target,
+            PersistableBundle bundle) {
+        throwIfParentInstance("transferOwner");
+        try {
+            mService.transferOwner(admin, target, bundle);
+        } catch (RemoteException re) {
+            throw re.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index b76618b..2e53594 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -36,6 +36,7 @@
 import android.os.PersistableBundle;
 import android.os.RemoteCallback;
 import android.os.UserHandle;
+import android.security.keymaster.KeymasterCertificateChain;
 import android.security.keystore.ParcelableKeyGenParameterSpec;
 
 import java.util.List;
@@ -166,7 +167,9 @@
             in byte[] certBuffer, in byte[] certChainBuffer, String alias, boolean requestAccess,
             boolean isUserSelectable);
     boolean removeKeyPair(in ComponentName who, in String callerPackage, String alias);
-    boolean generateKeyPair(in ComponentName who, in String callerPackage, in String algorithm, in ParcelableKeyGenParameterSpec keySpec);
+    boolean generateKeyPair(in ComponentName who, in String callerPackage, in String algorithm,
+            in ParcelableKeyGenParameterSpec keySpec,
+            out KeymasterCertificateChain attestationChain);
     void choosePrivateKeyAlias(int uid, in Uri uri, in String alias, IBinder aliasCallback);
 
     void setDelegatedScopes(in ComponentName who, in String delegatePackage, in List<String> scopes);
@@ -378,4 +381,5 @@
     boolean isLogoutEnabled();
 
     List<String> getDisallowedSystemApps(in ComponentName admin, int userId, String provisioningAction);
+    void transferOwner(in ComponentName admin, in ComponentName target, in PersistableBundle bundle);
 }
diff --git a/core/java/android/app/admin/PasswordMetrics.java b/core/java/android/app/admin/PasswordMetrics.java
index 4658a47..5fee853 100644
--- a/core/java/android/app/admin/PasswordMetrics.java
+++ b/core/java/android/app/admin/PasswordMetrics.java
@@ -223,7 +223,12 @@
     }
 
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({CHAR_UPPER_CASE, CHAR_LOWER_CASE, CHAR_DIGIT, CHAR_SYMBOL})
+    @IntDef(prefix = { "CHAR_" }, value = {
+            CHAR_UPPER_CASE,
+            CHAR_LOWER_CASE,
+            CHAR_DIGIT,
+            CHAR_SYMBOL
+    })
     private @interface CharacterCatagory {}
     private static final int CHAR_LOWER_CASE = 0;
     private static final int CHAR_UPPER_CASE = 1;
diff --git a/core/java/android/app/admin/SecurityLog.java b/core/java/android/app/admin/SecurityLog.java
index 2b590e0..0f93c59 100644
--- a/core/java/android/app/admin/SecurityLog.java
+++ b/core/java/android/app/admin/SecurityLog.java
@@ -43,10 +43,17 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({TAG_ADB_SHELL_INTERACTIVE, TAG_ADB_SHELL_CMD, TAG_SYNC_RECV_FILE, TAG_SYNC_SEND_FILE,
-        TAG_APP_PROCESS_START, TAG_KEYGUARD_DISMISSED, TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT,
-        TAG_KEYGUARD_SECURED})
-    public @interface SECURITY_LOG_TAG {}
+    @IntDef(prefix = { "TAG_" }, value = {
+            TAG_ADB_SHELL_INTERACTIVE,
+            TAG_ADB_SHELL_CMD,
+            TAG_SYNC_RECV_FILE,
+            TAG_SYNC_SEND_FILE,
+            TAG_APP_PROCESS_START,
+            TAG_KEYGUARD_DISMISSED,
+            TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT,
+            TAG_KEYGUARD_SECURED
+    })
+    public @interface SecurityLogTag {}
 
     /**
      * Indicate that an ADB interactive shell was opened via "adb shell".
@@ -143,13 +150,8 @@
 
         /**
          * Returns the tag of this log entry, which specifies entry's semantics.
-         * Could be one of {@link SecurityLog#TAG_SYNC_RECV_FILE},
-         * {@link SecurityLog#TAG_SYNC_SEND_FILE}, {@link SecurityLog#TAG_ADB_SHELL_CMD},
-         * {@link SecurityLog#TAG_ADB_SHELL_INTERACTIVE}, {@link SecurityLog#TAG_APP_PROCESS_START},
-         * {@link SecurityLog#TAG_KEYGUARD_DISMISSED}, {@link SecurityLog#TAG_KEYGUARD_SECURED},
-         * {@link SecurityLog#TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT}.
          */
-        public @SECURITY_LOG_TAG int getTag() {
+        public @SecurityLogTag int getTag() {
             return mEvent.getTag();
         }
 
diff --git a/core/java/android/app/admin/SystemUpdateInfo.java b/core/java/android/app/admin/SystemUpdateInfo.java
index fa31273..b0376b5 100644
--- a/core/java/android/app/admin/SystemUpdateInfo.java
+++ b/core/java/android/app/admin/SystemUpdateInfo.java
@@ -52,7 +52,11 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({SECURITY_PATCH_STATE_FALSE, SECURITY_PATCH_STATE_TRUE, SECURITY_PATCH_STATE_UNKNOWN})
+    @IntDef(prefix = { "SECURITY_PATCH_STATE_" }, value = {
+            SECURITY_PATCH_STATE_FALSE,
+            SECURITY_PATCH_STATE_TRUE,
+            SECURITY_PATCH_STATE_UNKNOWN
+    })
     public @interface SecurityPatchState {}
 
     private static final String ATTR_RECEIVED_TIME = "received-time";
diff --git a/core/java/android/app/admin/SystemUpdatePolicy.java b/core/java/android/app/admin/SystemUpdatePolicy.java
index 995d98a..232a688 100644
--- a/core/java/android/app/admin/SystemUpdatePolicy.java
+++ b/core/java/android/app/admin/SystemUpdatePolicy.java
@@ -36,10 +36,11 @@
 public class SystemUpdatePolicy implements Parcelable {
 
     /** @hide */
-    @IntDef({
-        TYPE_INSTALL_AUTOMATIC,
-        TYPE_INSTALL_WINDOWED,
-        TYPE_POSTPONE})
+    @IntDef(prefix = { "TYPE_" }, value = {
+            TYPE_INSTALL_AUTOMATIC,
+            TYPE_INSTALL_WINDOWED,
+            TYPE_POSTPONE
+    })
     @Retention(RetentionPolicy.SOURCE)
     @interface SystemUpdatePolicyType {}
 
diff --git a/core/java/android/app/servertransaction/ActivityLifecycleItem.java b/core/java/android/app/servertransaction/ActivityLifecycleItem.java
index 24141e5..0fdc7c5 100644
--- a/core/java/android/app/servertransaction/ActivityLifecycleItem.java
+++ b/core/java/android/app/servertransaction/ActivityLifecycleItem.java
@@ -27,8 +27,17 @@
  */
 public abstract class ActivityLifecycleItem extends ClientTransactionItem {
 
-    @IntDef({UNDEFINED, PRE_ON_CREATE, ON_CREATE, ON_START, ON_RESUME, ON_PAUSE, ON_STOP,
-            ON_DESTROY, ON_RESTART})
+    @IntDef(prefix = { "UNDEFINED", "PRE_", "ON_" }, value = {
+            UNDEFINED,
+            PRE_ON_CREATE,
+            ON_CREATE,
+            ON_START,
+            ON_RESUME,
+            ON_PAUSE,
+            ON_STOP,
+            ON_DESTROY,
+            ON_RESTART
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface LifecycleState{}
     public static final int UNDEFINED = -1;
diff --git a/core/java/android/app/slice/ISliceListener.aidl b/core/java/android/app/slice/ISliceListener.aidl
new file mode 100644
index 0000000..d293fd4
--- /dev/null
+++ b/core/java/android/app/slice/ISliceListener.aidl
@@ -0,0 +1,25 @@
+/**
+ * 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.app.slice;
+
+import android.app.slice.ISliceManager;
+import android.app.slice.Slice;
+
+/** @hide */
+oneway interface ISliceListener {
+    void onSliceUpdated(in Slice s);
+}
diff --git a/core/java/android/app/slice/ISliceManager.aidl b/core/java/android/app/slice/ISliceManager.aidl
index 6e52f38..5f0e542 100644
--- a/core/java/android/app/slice/ISliceManager.aidl
+++ b/core/java/android/app/slice/ISliceManager.aidl
@@ -16,6 +16,17 @@
 
 package android.app.slice;
 
+import android.app.slice.ISliceListener;
+import android.app.slice.SliceSpec;
+import android.net.Uri;
+
 /** @hide */
 interface ISliceManager {
+    void addSliceListener(in Uri uri, String pkg, in ISliceListener listener,
+            in SliceSpec[] specs);
+    void removeSliceListener(in Uri uri, String pkg, in ISliceListener listener);
+    void pinSlice(String pkg, in Uri uri, in SliceSpec[] specs);
+    void unpinSlice(String pkg, in Uri uri);
+    boolean hasSliceAccess(String pkg);
+    SliceSpec[] getPinnedSpecs(in Uri uri, String pkg);
 }
diff --git a/core/java/android/app/slice/Slice.aidl b/core/java/android/app/slice/Slice.aidl
new file mode 100644
index 0000000..e097f9d
--- /dev/null
+++ b/core/java/android/app/slice/Slice.aidl
@@ -0,0 +1,19 @@
+/**
+ * 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.app.slice;
+
+parcelable Slice;
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index b13067e..e61e8b2 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -125,6 +125,11 @@
      */
     public static final String HINT_HIDDEN = "hidden";
     /**
+     * Hint indicating this content should be shown instead of the normal content when the slice
+     * is in small format.
+     */
+    public static final String HINT_SUMMARY = "summary";
+    /**
      * Hint to indicate that this content has a toggle action associated with it. To indicate that
      * the toggle is on, use {@link #HINT_SELECTED}. When the toggle state changes, the intent
      * associated with it will be sent along with an extra {@link #EXTRA_TOGGLE_STATE} which can be
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index e99f676..f8e19c1 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -17,8 +17,11 @@
 package android.app.slice;
 
 import android.annotation.SystemService;
+import android.app.slice.ISliceListener.Stub;
 import android.content.Context;
+import android.net.Uri;
 import android.os.Handler;
+import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.ServiceManager.ServiceNotFoundException;
 
@@ -36,4 +39,93 @@
         mService = ISliceManager.Stub.asInterface(
                 ServiceManager.getServiceOrThrow(Context.SLICE_SERVICE));
     }
+
+    /**
+     */
+    public void addSliceListener(Uri uri, SliceListener listener, SliceSpec[] specs) {
+        try {
+            mService.addSliceListener(uri, mContext.getPackageName(), listener.mStub, specs);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     */
+    public void removeSliceListener(Uri uri, SliceListener listener) {
+        try {
+            mService.removeSliceListener(uri, mContext.getPackageName(), listener.mStub);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     */
+    public void pinSlice(Uri uri, SliceSpec[] specs) {
+        try {
+            mService.pinSlice(mContext.getPackageName(), uri, specs);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     */
+    public void unpinSlice(Uri uri) {
+        try {
+            mService.unpinSlice(mContext.getPackageName(), uri);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     */
+    public boolean hasSliceAccess() {
+        try {
+            return mService.hasSliceAccess(mContext.getPackageName());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     */
+    public SliceSpec[] getPinnedSpecs(Uri uri) {
+        try {
+            return mService.getPinnedSpecs(uri, mContext.getPackageName());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     */
+    public abstract static class SliceListener {
+        private final Handler mHandler;
+
+        /**
+         */
+        public SliceListener() {
+            this(Handler.getMain());
+        }
+
+        /**
+         */
+        public SliceListener(Handler h) {
+            mHandler = h;
+        }
+
+        /**
+         */
+        public abstract void onSliceUpdated(Slice s);
+
+        private final ISliceListener.Stub mStub = new Stub() {
+            @Override
+            public void onSliceUpdated(Slice s) throws RemoteException {
+                mHandler.post(() -> SliceListener.this.onSliceUpdated(s));
+            }
+        };
+    }
 }
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index ac5365c..7dcd2fe 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -105,6 +105,14 @@
     /**
      * @hide
      */
+    public static final String METHOD_PIN = "pin";
+    /**
+     * @hide
+     */
+    public static final String METHOD_UNPIN = "unpin";
+    /**
+     * @hide
+     */
     public static final String EXTRA_INTENT = "slice_intent";
     /**
      * @hide
@@ -143,6 +151,18 @@
     }
 
     /**
+     * @hide
+     */
+    public void onSlicePinned(Uri sliceUri) {
+    }
+
+    /**
+     * @hide
+     */
+    public void onSliceUnpinned(Uri sliceUri) {
+    }
+
+    /**
      * This method must be overridden if an {@link IntentFilter} is specified on the SliceProvider.
      * In that case, this method can be called and is expected to return a non-null Uri representing
      * a slice. Otherwise this will throw {@link UnsupportedOperationException}.
@@ -221,6 +241,7 @@
             getContext().enforceCallingPermission(permission.BIND_SLICE,
                     "Slice binding requires the permission BIND_SLICE");
             Intent intent = extras.getParcelable(EXTRA_INTENT);
+            if (intent == null) return null;
             Uri uri = onMapIntentToUri(intent);
             List<SliceSpec> supportedSpecs = extras.getParcelableArrayList(EXTRA_SUPPORTED_SPECS);
             Bundle b = new Bundle();
@@ -231,10 +252,62 @@
                 b.putParcelable(EXTRA_SLICE, null);
             }
             return b;
+        } else if (method.equals(METHOD_PIN)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.myUid())) {
+                getContext().enforceUriPermission(uri, permission.BIND_SLICE,
+                        permission.BIND_SLICE, Binder.getCallingPid(), Binder.getCallingUid(),
+                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+                        "Slice binding requires the permission BIND_SLICE");
+            }
+            handlePinSlice(uri);
+        } else if (method.equals(METHOD_UNPIN)) {
+            Uri uri = extras.getParcelable(EXTRA_BIND_URI);
+            if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.myUid())) {
+                getContext().enforceUriPermission(uri, permission.BIND_SLICE,
+                        permission.BIND_SLICE, Binder.getCallingPid(), Binder.getCallingUid(),
+                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+                        "Slice binding requires the permission BIND_SLICE");
+            }
+            handleUnpinSlice(uri);
         }
         return super.call(method, arg, extras);
     }
 
+    private void handlePinSlice(Uri sliceUri) {
+        if (Looper.myLooper() == Looper.getMainLooper()) {
+            onSlicePinned(sliceUri);
+        } else {
+            CountDownLatch latch = new CountDownLatch(1);
+            Handler.getMain().post(() -> {
+                onSlicePinned(sliceUri);
+                latch.countDown();
+            });
+            try {
+                latch.await();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    private void handleUnpinSlice(Uri sliceUri) {
+        if (Looper.myLooper() == Looper.getMainLooper()) {
+            onSliceUnpinned(sliceUri);
+        } else {
+            CountDownLatch latch = new CountDownLatch(1);
+            Handler.getMain().post(() -> {
+                onSliceUnpinned(sliceUri);
+                latch.countDown();
+            });
+            try {
+                latch.await();
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
     private Slice handleBindSlice(Uri sliceUri, List<SliceSpec> supportedSpecs) {
         if (Looper.myLooper() == Looper.getMainLooper()) {
             return onBindSliceStrict(sliceUri, supportedSpecs);
diff --git a/core/java/android/app/slice/SliceSpec.aidl b/core/java/android/app/slice/SliceSpec.aidl
new file mode 100644
index 0000000..92e98b7
--- /dev/null
+++ b/core/java/android/app/slice/SliceSpec.aidl
@@ -0,0 +1,19 @@
+/**
+ * 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.app.slice;
+
+parcelable SliceSpec;
diff --git a/core/java/android/app/slice/SliceSpec.java b/core/java/android/app/slice/SliceSpec.java
index 433b67e..8cc0384 100644
--- a/core/java/android/app/slice/SliceSpec.java
+++ b/core/java/android/app/slice/SliceSpec.java
@@ -103,6 +103,11 @@
         return mType.equals(other.mType) && mRevision == other.mRevision;
     }
 
+    @Override
+    public String toString() {
+        return String.format("SliceSpec{%s,%d}", mType, mRevision);
+    }
+
     public static final Creator<SliceSpec> CREATOR = new Creator<SliceSpec>() {
         @Override
         public SliceSpec createFromParcel(Parcel source) {
diff --git a/core/java/android/app/timezone/Callback.java b/core/java/android/app/timezone/Callback.java
index aea8038..e3840be6 100644
--- a/core/java/android/app/timezone/Callback.java
+++ b/core/java/android/app/timezone/Callback.java
@@ -30,9 +30,14 @@
 public abstract class Callback {
 
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({SUCCESS, ERROR_UNKNOWN_FAILURE, ERROR_INSTALL_BAD_DISTRO_STRUCTURE,
-        ERROR_INSTALL_BAD_DISTRO_FORMAT_VERSION, ERROR_INSTALL_RULES_TOO_OLD,
-        ERROR_INSTALL_VALIDATION_ERROR})
+    @IntDef(prefix = { "SUCCESS", "ERROR_" }, value = {
+            SUCCESS,
+            ERROR_UNKNOWN_FAILURE,
+            ERROR_INSTALL_BAD_DISTRO_STRUCTURE,
+            ERROR_INSTALL_BAD_DISTRO_FORMAT_VERSION,
+            ERROR_INSTALL_RULES_TOO_OLD,
+            ERROR_INSTALL_VALIDATION_ERROR
+    })
     public @interface AsyncResultCode {}
 
     /**
diff --git a/core/java/android/app/timezone/RulesManager.java b/core/java/android/app/timezone/RulesManager.java
index 417e7d2..0a38eb9 100644
--- a/core/java/android/app/timezone/RulesManager.java
+++ b/core/java/android/app/timezone/RulesManager.java
@@ -69,7 +69,11 @@
     private static final boolean DEBUG = false;
 
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({SUCCESS, ERROR_UNKNOWN_FAILURE, ERROR_OPERATION_IN_PROGRESS})
+    @IntDef(prefix = { "SUCCESS", "ERROR_" }, value = {
+            SUCCESS,
+            ERROR_UNKNOWN_FAILURE,
+            ERROR_OPERATION_IN_PROGRESS
+    })
     public @interface ResultCode {}
 
     /**
diff --git a/core/java/android/app/timezone/RulesState.java b/core/java/android/app/timezone/RulesState.java
index ec247eb..16309fa 100644
--- a/core/java/android/app/timezone/RulesState.java
+++ b/core/java/android/app/timezone/RulesState.java
@@ -63,11 +63,12 @@
 public final class RulesState implements Parcelable {
 
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
+    @IntDef(prefix = { "STAGED_OPERATION_" }, value = {
             STAGED_OPERATION_UNKNOWN,
             STAGED_OPERATION_NONE,
             STAGED_OPERATION_UNINSTALL,
-            STAGED_OPERATION_INSTALL })
+            STAGED_OPERATION_INSTALL
+    })
     private @interface StagedOperationType {}
 
     /** Staged state could not be determined. */
@@ -80,10 +81,11 @@
     public static final int STAGED_OPERATION_INSTALL = 3;
 
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
+    @IntDef(prefix = { "DISTRO_STATUS_" }, value = {
             DISTRO_STATUS_UNKNOWN,
             DISTRO_STATUS_NONE,
-            DISTRO_STATUS_INSTALLED })
+            DISTRO_STATUS_INSTALLED
+    })
     private @interface DistroStatus {}
 
     /** The current distro status could not be determined. */
diff --git a/core/java/android/app/usage/NetworkStats.java b/core/java/android/app/usage/NetworkStats.java
index 222e9a0..2e44a63 100644
--- a/core/java/android/app/usage/NetworkStats.java
+++ b/core/java/android/app/usage/NetworkStats.java
@@ -129,7 +129,11 @@
      */
     public static class Bucket {
         /** @hide */
-        @IntDef({STATE_ALL, STATE_DEFAULT, STATE_FOREGROUND})
+        @IntDef(prefix = { "STATE_" }, value = {
+                STATE_ALL,
+                STATE_DEFAULT,
+                STATE_FOREGROUND
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface State {}
 
@@ -164,7 +168,11 @@
         public static final int UID_TETHERING = TrafficStats.UID_TETHERING;
 
         /** @hide */
-        @IntDef({METERED_ALL, METERED_NO, METERED_YES})
+        @IntDef(prefix = { "METERED_" }, value = {
+                METERED_ALL,
+                METERED_NO,
+                METERED_YES
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface Metered {}
 
@@ -187,7 +195,11 @@
         public static final int METERED_YES = 0x2;
 
         /** @hide */
-        @IntDef({ROAMING_ALL, ROAMING_NO, ROAMING_YES})
+        @IntDef(prefix = { "ROAMING_" }, value = {
+                ROAMING_ALL,
+                ROAMING_NO,
+                ROAMING_YES
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface Roaming {}
 
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 8200414..f04e907 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -110,10 +110,9 @@
         public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0;
 
         /** @hide */
-        @IntDef(flag = true,
-                value = {
-                        FLAG_IS_PACKAGE_INSTANT_APP,
-                })
+        @IntDef(flag = true, prefix = { "FLAG_" }, value = {
+                FLAG_IS_PACKAGE_INSTANT_APP,
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface EventFlags {}
 
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 1fc45c9..edb6a74 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -151,7 +151,7 @@
     public static final String REASON_PREDICTED = "predicted";
 
     /** @hide */
-    @IntDef(flag = false, value = {
+    @IntDef(flag = false, prefix = { "STANDBY_BUCKET_" }, value = {
             STANDBY_BUCKET_EXEMPTED,
             STANDBY_BUCKET_ACTIVE,
             STANDBY_BUCKET_WORKING_SET,
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index c7be0f3..3290d57 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -156,7 +156,7 @@
             "android.bluetooth.adapter.extra.PREVIOUS_STATE";
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "STATE_" }, value = {
             STATE_OFF,
             STATE_TURNING_ON,
             STATE_ON,
@@ -357,7 +357,11 @@
             "android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE";
 
     /** @hide */
-    @IntDef({SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE})
+    @IntDef(prefix = { "SCAN_" }, value = {
+            SCAN_MODE_NONE,
+            SCAN_MODE_CONNECTABLE,
+            SCAN_MODE_CONNECTABLE_DISCOVERABLE
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ScanMode {}
 
diff --git a/core/java/android/companion/DeviceFilter.java b/core/java/android/companion/DeviceFilter.java
index 9b4fdfd..10135a4 100644
--- a/core/java/android/companion/DeviceFilter.java
+++ b/core/java/android/companion/DeviceFilter.java
@@ -62,7 +62,11 @@
     }
 
     /** @hide */
-    @IntDef({MEDIUM_TYPE_BLUETOOTH, MEDIUM_TYPE_BLUETOOTH_LE, MEDIUM_TYPE_WIFI})
+    @IntDef(prefix = { "MEDIUM_TYPE_" }, value = {
+            MEDIUM_TYPE_BLUETOOTH,
+            MEDIUM_TYPE_BLUETOOTH_LE,
+            MEDIUM_TYPE_WIFI
+    })
     @Retention(RetentionPolicy.SOURCE)
     @interface MediumType {}
 }
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 9ccc552..8d2e141 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -335,7 +335,7 @@
     public static final String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
 
     /** @hide */
-    @IntDef(flag = false, value = {
+    @IntDef(flag = false, prefix = { "QUERY_SORT_DIRECTION_" }, value = {
             QUERY_SORT_DIRECTION_ASCENDING,
             QUERY_SORT_DIRECTION_DESCENDING
     })
@@ -482,11 +482,10 @@
     public static final int SYNC_OBSERVER_TYPE_ALL = 0x7fffffff;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                NOTIFY_SYNC_TO_NETWORK,
-                NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS
-            })
+    @IntDef(flag = true, prefix = { "NOTIFY_" }, value = {
+            NOTIFY_SYNC_TO_NETWORK,
+            NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface NotifyFlags {}
 
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 458ba05..137c169 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -221,17 +221,16 @@
     public static final int MODE_NO_LOCALIZED_COLLATORS = 0x0010;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                BIND_AUTO_CREATE,
-                BIND_DEBUG_UNBIND,
-                BIND_NOT_FOREGROUND,
-                BIND_ABOVE_CLIENT,
-                BIND_ALLOW_OOM_MANAGEMENT,
-                BIND_WAIVE_PRIORITY,
-                BIND_IMPORTANT,
-                BIND_ADJUST_WITH_ACTIVITY
-            })
+    @IntDef(flag = true, prefix = { "BIND_" }, value = {
+            BIND_AUTO_CREATE,
+            BIND_DEBUG_UNBIND,
+            BIND_NOT_FOREGROUND,
+            BIND_ABOVE_CLIENT,
+            BIND_ALLOW_OOM_MANAGEMENT,
+            BIND_WAIVE_PRIORITY,
+            BIND_IMPORTANT,
+            BIND_ADJUST_WITH_ACTIVITY
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface BindServiceFlags {}
 
@@ -406,10 +405,9 @@
     public static final int BIND_EXTERNAL_SERVICE = 0x80000000;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                RECEIVER_VISIBLE_TO_INSTANT_APPS
-            })
+    @IntDef(flag = true, prefix = { "RECEIVER_VISIBLE_" }, value = {
+            RECEIVER_VISIBLE_TO_INSTANT_APPS
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface RegisterReceiverFlags {}
 
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 6fb1afd..e940769 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -5690,11 +5690,14 @@
     private static final int COPY_MODE_HISTORY = 2;
 
     /** @hide */
-    @IntDef(value = {COPY_MODE_ALL, COPY_MODE_FILTER, COPY_MODE_HISTORY})
+    @IntDef(prefix = { "COPY_MODE_" }, value = {
+            COPY_MODE_ALL,
+            COPY_MODE_FILTER,
+            COPY_MODE_HISTORY
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CopyMode {}
 
-
     /**
      * Create an empty intent.
      */
@@ -8966,17 +8969,16 @@
     }
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                    FILL_IN_ACTION,
-                    FILL_IN_DATA,
-                    FILL_IN_CATEGORIES,
-                    FILL_IN_COMPONENT,
-                    FILL_IN_PACKAGE,
-                    FILL_IN_SOURCE_BOUNDS,
-                    FILL_IN_SELECTOR,
-                    FILL_IN_CLIP_DATA
-            })
+    @IntDef(flag = true, prefix = { "FILL_IN_" }, value = {
+            FILL_IN_ACTION,
+            FILL_IN_DATA,
+            FILL_IN_CATEGORIES,
+            FILL_IN_COMPONENT,
+            FILL_IN_PACKAGE,
+            FILL_IN_SOURCE_BOUNDS,
+            FILL_IN_SELECTOR,
+            FILL_IN_CLIP_DATA
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface FillInFlags {}
 
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index f8cdce6..1461711 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -262,10 +262,10 @@
     public static final int COLOR_MODE_HDR = 2;
 
     /** @hide */
-    @IntDef({
-        COLOR_MODE_DEFAULT,
-        COLOR_MODE_WIDE_COLOR_GAMUT,
-        COLOR_MODE_HDR,
+    @IntDef(prefix = { "COLOR_MODE_" }, value = {
+            COLOR_MODE_DEFAULT,
+            COLOR_MODE_WIDE_COLOR_GAMUT,
+            COLOR_MODE_HDR,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ColorMode {}
@@ -492,7 +492,7 @@
     public int flags;
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "SCREEN_ORIENTATION_" }, value = {
             SCREEN_ORIENTATION_UNSET,
             SCREEN_ORIENTATION_UNSPECIFIED,
             SCREEN_ORIENTATION_LANDSCAPE,
@@ -638,25 +638,24 @@
     public int screenOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                    CONFIG_MCC,
-                    CONFIG_MNC,
-                    CONFIG_LOCALE,
-                    CONFIG_TOUCHSCREEN,
-                    CONFIG_KEYBOARD,
-                    CONFIG_KEYBOARD_HIDDEN,
-                    CONFIG_NAVIGATION,
-                    CONFIG_ORIENTATION,
-                    CONFIG_SCREEN_LAYOUT,
-                    CONFIG_UI_MODE,
-                    CONFIG_SCREEN_SIZE,
-                    CONFIG_SMALLEST_SCREEN_SIZE,
-                    CONFIG_DENSITY,
-                    CONFIG_LAYOUT_DIRECTION,
-                    CONFIG_COLOR_MODE,
-                    CONFIG_FONT_SCALE,
-            })
+    @IntDef(flag = true, prefix = { "CONFIG_" }, value = {
+            CONFIG_MCC,
+            CONFIG_MNC,
+            CONFIG_LOCALE,
+            CONFIG_TOUCHSCREEN,
+            CONFIG_KEYBOARD,
+            CONFIG_KEYBOARD_HIDDEN,
+            CONFIG_NAVIGATION,
+            CONFIG_ORIENTATION,
+            CONFIG_SCREEN_LAYOUT,
+            CONFIG_UI_MODE,
+            CONFIG_SCREEN_SIZE,
+            CONFIG_SMALLEST_SCREEN_SIZE,
+            CONFIG_DENSITY,
+            CONFIG_LAYOUT_DIRECTION,
+            CONFIG_COLOR_MODE,
+            CONFIG_FONT_SCALE,
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Config {}
 
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index d09ba0b..b4a7eec 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -343,14 +343,13 @@
         public static final int FLAG_GET_KEY_FIELDS_ONLY = 1 << 2;
 
         /** @hide */
-        @IntDef(flag = true,
-                value = {
-                        FLAG_MATCH_DYNAMIC,
-                        FLAG_MATCH_PINNED,
-                        FLAG_MATCH_MANIFEST,
-                        FLAG_GET_KEY_FIELDS_ONLY,
-                        FLAG_MATCH_MANIFEST,
-                })
+        @IntDef(flag = true, prefix = { "FLAG_" }, value = {
+                FLAG_MATCH_DYNAMIC,
+                FLAG_MATCH_PINNED,
+                FLAG_MATCH_MANIFEST,
+                FLAG_GET_KEY_FIELDS_ONLY,
+                FLAG_MATCH_MANIFEST,
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface QueryFlags {}
 
@@ -1380,7 +1379,10 @@
         public static final int REQUEST_TYPE_APPWIDGET = 2;
 
         /** @hide */
-        @IntDef(value = {REQUEST_TYPE_SHORTCUT})
+        @IntDef(prefix = { "REQUEST_TYPE_" }, value = {
+                REQUEST_TYPE_SHORTCUT,
+                REQUEST_TYPE_APPWIDGET
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface RequestType {}
 
diff --git a/core/java/android/content/pm/SharedLibraryInfo.java b/core/java/android/content/pm/SharedLibraryInfo.java
index 2f1b256..33bc951 100644
--- a/core/java/android/content/pm/SharedLibraryInfo.java
+++ b/core/java/android/content/pm/SharedLibraryInfo.java
@@ -36,13 +36,11 @@
 public final class SharedLibraryInfo implements Parcelable {
 
     /** @hide */
-    @IntDef(
-        flag = true,
-        value = {
-                TYPE_BUILTIN,
-                TYPE_DYNAMIC,
-                TYPE_STATIC,
-        })
+    @IntDef(flag = true, prefix = { "TYPE_" }, value = {
+            TYPE_BUILTIN,
+            TYPE_DYNAMIC,
+            TYPE_STATIC,
+    })
     @Retention(RetentionPolicy.SOURCE)
     @interface Type{}
 
diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java
index 9ff0775..8839cf9 100644
--- a/core/java/android/content/pm/ShortcutInfo.java
+++ b/core/java/android/content/pm/ShortcutInfo.java
@@ -109,8 +109,7 @@
     public static final int FLAG_SHADOW = 1 << 12;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
+    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
             FLAG_DYNAMIC,
             FLAG_PINNED,
             FLAG_HAS_ICON_RES,
@@ -153,15 +152,14 @@
             | CLONE_REMOVE_RES_NAMES;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                    CLONE_REMOVE_ICON,
-                    CLONE_REMOVE_INTENT,
-                    CLONE_REMOVE_NON_KEY_INFO,
-                    CLONE_REMOVE_RES_NAMES,
-                    CLONE_REMOVE_FOR_CREATOR,
-                    CLONE_REMOVE_FOR_LAUNCHER
-            })
+    @IntDef(flag = true, prefix = { "CLONE_" }, value = {
+            CLONE_REMOVE_ICON,
+            CLONE_REMOVE_INTENT,
+            CLONE_REMOVE_NON_KEY_INFO,
+            CLONE_REMOVE_RES_NAMES,
+            CLONE_REMOVE_FOR_CREATOR,
+            CLONE_REMOVE_FOR_LAUNCHER
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CloneFlags {}
 
@@ -212,7 +210,7 @@
     public static final int DISABLED_REASON_OTHER_RESTORE_ISSUE = 103;
 
     /** @hide */
-    @IntDef(value = {
+    @IntDef(prefix = { "DISABLED_REASON_" }, value = {
             DISABLED_REASON_NOT_DISABLED,
             DISABLED_REASON_BY_APP,
             DISABLED_REASON_APP_CHANGED,
@@ -220,7 +218,7 @@
             DISABLED_REASON_BACKUP_NOT_SUPPORTED,
             DISABLED_REASON_SIGNATURE_MISMATCH,
             DISABLED_REASON_OTHER_RESTORE_ISSUE,
-            })
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DisabledReason{}
 
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 26efda1..eb30979 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -781,25 +781,24 @@
     public int seq;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                    NATIVE_CONFIG_MCC,
-                    NATIVE_CONFIG_MNC,
-                    NATIVE_CONFIG_LOCALE,
-                    NATIVE_CONFIG_TOUCHSCREEN,
-                    NATIVE_CONFIG_KEYBOARD,
-                    NATIVE_CONFIG_KEYBOARD_HIDDEN,
-                    NATIVE_CONFIG_NAVIGATION,
-                    NATIVE_CONFIG_ORIENTATION,
-                    NATIVE_CONFIG_DENSITY,
-                    NATIVE_CONFIG_SCREEN_SIZE,
-                    NATIVE_CONFIG_VERSION,
-                    NATIVE_CONFIG_SCREEN_LAYOUT,
-                    NATIVE_CONFIG_UI_MODE,
-                    NATIVE_CONFIG_SMALLEST_SCREEN_SIZE,
-                    NATIVE_CONFIG_LAYOUTDIR,
-                    NATIVE_CONFIG_COLOR_MODE,
-            })
+    @IntDef(flag = true, prefix = { "NATIVE_CONFIG_" }, value = {
+            NATIVE_CONFIG_MCC,
+            NATIVE_CONFIG_MNC,
+            NATIVE_CONFIG_LOCALE,
+            NATIVE_CONFIG_TOUCHSCREEN,
+            NATIVE_CONFIG_KEYBOARD,
+            NATIVE_CONFIG_KEYBOARD_HIDDEN,
+            NATIVE_CONFIG_NAVIGATION,
+            NATIVE_CONFIG_ORIENTATION,
+            NATIVE_CONFIG_DENSITY,
+            NATIVE_CONFIG_SCREEN_SIZE,
+            NATIVE_CONFIG_VERSION,
+            NATIVE_CONFIG_SCREEN_LAYOUT,
+            NATIVE_CONFIG_UI_MODE,
+            NATIVE_CONFIG_SMALLEST_SCREEN_SIZE,
+            NATIVE_CONFIG_LAYOUTDIR,
+            NATIVE_CONFIG_COLOR_MODE,
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface NativeConfig {}
 
diff --git a/core/java/android/content/res/GradientColor.java b/core/java/android/content/res/GradientColor.java
index e465961..35ad503 100644
--- a/core/java/android/content/res/GradientColor.java
+++ b/core/java/android/content/res/GradientColor.java
@@ -75,9 +75,14 @@
 
     private static final boolean DBG_GRADIENT = false;
 
-    @IntDef({TILE_MODE_CLAMP, TILE_MODE_REPEAT, TILE_MODE_MIRROR})
+    @IntDef(prefix = { "TILE_MODE_" }, value = {
+            TILE_MODE_CLAMP,
+            TILE_MODE_REPEAT,
+            TILE_MODE_MIRROR
+    })
     @Retention(RetentionPolicy.SOURCE)
     private @interface GradientTileMode {}
+
     private static final int TILE_MODE_CLAMP = 0;
     private static final int TILE_MODE_REPEAT = 1;
     private static final int TILE_MODE_MIRROR = 2;
diff --git a/core/java/android/hardware/HardwareBuffer.java b/core/java/android/hardware/HardwareBuffer.java
index b111ad3..7866b52 100644
--- a/core/java/android/hardware/HardwareBuffer.java
+++ b/core/java/android/hardware/HardwareBuffer.java
@@ -42,7 +42,15 @@
 public final class HardwareBuffer implements Parcelable, AutoCloseable {
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({RGBA_8888, RGBA_FP16, RGBA_1010102, RGBX_8888, RGB_888, RGB_565, BLOB})
+    @IntDef(prefix = { "RGB", "BLOB" }, value = {
+            RGBA_8888,
+            RGBA_FP16,
+            RGBA_1010102,
+            RGBX_8888,
+            RGB_888,
+            RGB_565,
+            BLOB
+    })
     public @interface Format {
     }
 
diff --git a/core/java/android/hardware/SensorAdditionalInfo.java b/core/java/android/hardware/SensorAdditionalInfo.java
index 7c876cf..5ff627f 100644
--- a/core/java/android/hardware/SensorAdditionalInfo.java
+++ b/core/java/android/hardware/SensorAdditionalInfo.java
@@ -68,8 +68,15 @@
      *
      * @hide
      */
-    @IntDef({TYPE_FRAME_BEGIN, TYPE_FRAME_END, TYPE_UNTRACKED_DELAY, TYPE_INTERNAL_TEMPERATURE,
-             TYPE_VEC3_CALIBRATION, TYPE_SENSOR_PLACEMENT, TYPE_SAMPLING})
+    @IntDef(prefix = { "TYPE_" }, value = {
+            TYPE_FRAME_BEGIN,
+            TYPE_FRAME_END,
+            TYPE_UNTRACKED_DELAY,
+            TYPE_INTERNAL_TEMPERATURE,
+            TYPE_VEC3_CALIBRATION,
+            TYPE_SENSOR_PLACEMENT,
+            TYPE_SAMPLING
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface AdditionalInfoType {}
 
diff --git a/core/java/android/hardware/SensorDirectChannel.java b/core/java/android/hardware/SensorDirectChannel.java
index 36607c9..214d3ec 100644
--- a/core/java/android/hardware/SensorDirectChannel.java
+++ b/core/java/android/hardware/SensorDirectChannel.java
@@ -40,8 +40,12 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true, value = {TYPE_MEMORY_FILE, TYPE_HARDWARE_BUFFER})
-    public @interface MemoryType {};
+    @IntDef(flag = true, prefix = { "TYPE_" }, value = {
+            TYPE_MEMORY_FILE,
+            TYPE_HARDWARE_BUFFER
+    })
+    public @interface MemoryType {}
+
     /**
      * Shared memory type ashmem, wrapped in MemoryFile object.
      *
@@ -60,8 +64,13 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true, value = {RATE_STOP, RATE_NORMAL, RATE_FAST, RATE_VERY_FAST})
-    public @interface RateLevel {};
+    @IntDef(flag = true, prefix = { "RATE_" }, value = {
+            RATE_STOP,
+            RATE_NORMAL,
+            RATE_FAST,
+            RATE_VERY_FAST
+    })
+    public @interface RateLevel {}
 
     /**
      * Sensor stopped (no event output).
diff --git a/core/java/android/hardware/camera2/CameraAccessException.java b/core/java/android/hardware/camera2/CameraAccessException.java
index f9b659c..d238797 100644
--- a/core/java/android/hardware/camera2/CameraAccessException.java
+++ b/core/java/android/hardware/camera2/CameraAccessException.java
@@ -16,7 +16,6 @@
 
 package android.hardware.camera2;
 
-import android.annotation.NonNull;
 import android.annotation.IntDef;
 import android.util.AndroidException;
 
@@ -81,15 +80,16 @@
      */
     public static final int CAMERA_DEPRECATED_HAL = 1000;
 
-     /** @hide */
-     @Retention(RetentionPolicy.SOURCE)
-     @IntDef(
-         {CAMERA_IN_USE,
-          MAX_CAMERAS_IN_USE,
-          CAMERA_DISABLED,
-          CAMERA_DISCONNECTED,
-          CAMERA_ERROR})
-     public @interface AccessError {};
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(prefix = { "CAMERA_", "MAX_CAMERAS_IN_USE" }, value = {
+            CAMERA_IN_USE,
+            MAX_CAMERAS_IN_USE,
+            CAMERA_DISABLED,
+            CAMERA_DISCONNECTED,
+            CAMERA_ERROR
+    })
+    public @interface AccessError {}
 
     // Make the eclipse warning about serializable exceptions go away
     private static final long serialVersionUID = 5630338637471475675L; // randomly generated
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index c531a89..1de8882 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -188,7 +188,11 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({SWITCH_STATE_UNKNOWN, SWITCH_STATE_OFF, SWITCH_STATE_ON})
+    @IntDef(prefix = { "SWITCH_STATE_" }, value = {
+            SWITCH_STATE_UNKNOWN,
+            SWITCH_STATE_OFF,
+            SWITCH_STATE_ON
+    })
     public @interface SwitchState {}
 
     /**
diff --git a/core/java/android/hardware/location/ContextHubTransaction.java b/core/java/android/hardware/location/ContextHubTransaction.java
index b808de3..2a66cbc 100644
--- a/core/java/android/hardware/location/ContextHubTransaction.java
+++ b/core/java/android/hardware/location/ContextHubTransaction.java
@@ -47,13 +47,15 @@
      * Constants describing the type of a transaction through the Context Hub Service.
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
+    @IntDef(prefix = { "TYPE_" }, value = {
             TYPE_LOAD_NANOAPP,
             TYPE_UNLOAD_NANOAPP,
             TYPE_ENABLE_NANOAPP,
             TYPE_DISABLE_NANOAPP,
-            TYPE_QUERY_NANOAPPS})
-    public @interface Type {}
+            TYPE_QUERY_NANOAPPS
+    })
+    public @interface Type { }
+
     public static final int TYPE_LOAD_NANOAPP = 0;
     public static final int TYPE_UNLOAD_NANOAPP = 1;
     public static final int TYPE_ENABLE_NANOAPP = 2;
@@ -64,7 +66,7 @@
      * Constants describing the result of a transaction or request through the Context Hub Service.
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
+    @IntDef(prefix = { "TRANSACTION_" }, value = {
             TRANSACTION_SUCCESS,
             TRANSACTION_FAILED_UNKNOWN,
             TRANSACTION_FAILED_BAD_PARAMS,
@@ -73,7 +75,8 @@
             TRANSACTION_FAILED_AT_HUB,
             TRANSACTION_FAILED_TIMEOUT,
             TRANSACTION_FAILED_SERVICE_INTERNAL_FAILURE,
-            TRANSACTION_FAILED_HAL_UNAVAILABLE})
+            TRANSACTION_FAILED_HAL_UNAVAILABLE
+    })
     public @interface Result {}
     public static final int TRANSACTION_SUCCESS = 0;
     /**
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 4f4361f..4d54e31 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -161,7 +161,8 @@
         private final Set<Integer> mSupportedIdentifierTypes;
         @NonNull private final Map<String, String> mVendorInfo;
 
-        ModuleProperties(int id, String serviceName, int classId, String implementor,
+        /** @hide */
+        public ModuleProperties(int id, String serviceName, int classId, String implementor,
                 String product, String version, String serial, int numTuners, int numAudioSources,
                 boolean isCaptureSupported, BandDescriptor[] bands, boolean isBgScanSupported,
                 @ProgramSelector.ProgramType int[] supportedProgramTypes,
diff --git a/core/java/android/net/IIpSecService.aidl b/core/java/android/net/IIpSecService.aidl
index 0b1ea98..d9b57db 100644
--- a/core/java/android/net/IIpSecService.aidl
+++ b/core/java/android/net/IIpSecService.aidl
@@ -30,7 +30,7 @@
  */
 interface IIpSecService
 {
-    IpSecSpiResponse reserveSecurityParameterIndex(
+    IpSecSpiResponse allocateSecurityParameterIndex(
             int direction, in String remoteAddress, int requestedSpi, in IBinder binder);
 
     void releaseSecurityParameterIndex(int resourceId);
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index a9e60ec..6a4b891 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -46,7 +46,7 @@
  * to create a VPN should use {@link VpnService}.
  *
  * @see <a href="https://tools.ietf.org/html/rfc4301">RFC 4301, Security Architecture for the
- * Internet Protocol</a>
+ *     Internet Protocol</a>
  */
 @SystemService(Context.IPSEC_SERVICE)
 public final class IpSecManager {
@@ -59,8 +59,7 @@
      *
      * @hide
      */
-    @TestApi
-    public static final int INVALID_SECURITY_PARAMETER_INDEX = 0;
+    @TestApi public static final int INVALID_SECURITY_PARAMETER_INDEX = 0;
 
     /** @hide */
     public interface Status {
@@ -78,7 +77,7 @@
      * <p>The combination of remote {@code InetAddress} and SPI must be unique across all apps on
      * one device. If this error is encountered, a new SPI is required before a transform may be
      * created. This error can be avoided by calling {@link
-     * IpSecManager#reserveSecurityParameterIndex}.
+     * IpSecManager#allocateSecurityParameterIndex}.
      */
     public static final class SpiUnavailableException extends AndroidException {
         private final int mSpi;
@@ -121,7 +120,7 @@
      * This class represents a reserved SPI.
      *
      * <p>Objects of this type are used to track reserved security parameter indices. They can be
-     * obtained by calling {@link IpSecManager#reserveSecurityParameterIndex} and must be released
+     * obtained by calling {@link IpSecManager#allocateSecurityParameterIndex} and must be released
      * by calling {@link #close()} when they are no longer needed.
      */
     public static final class SecurityParameterIndex implements AutoCloseable {
@@ -170,7 +169,7 @@
             mRemoteAddress = remoteAddress;
             try {
                 IpSecSpiResponse result =
-                        mService.reserveSecurityParameterIndex(
+                        mService.allocateSecurityParameterIndex(
                                 direction, remoteAddress.getHostAddress(), spi, new Binder());
 
                 if (result == null) {
@@ -228,7 +227,7 @@
      *     for this user
      * @throws SpiUnavailableException indicating that a particular SPI cannot be reserved
      */
-    public SecurityParameterIndex reserveSecurityParameterIndex(
+    public SecurityParameterIndex allocateSecurityParameterIndex(
             int direction, InetAddress remoteAddress) throws ResourceUnavailableException {
         try {
             return new SecurityParameterIndex(
@@ -255,7 +254,7 @@
      *     for this user
      * @throws SpiUnavailableException indicating that the requested SPI could not be reserved
      */
-    public SecurityParameterIndex reserveSecurityParameterIndex(
+    public SecurityParameterIndex allocateSecurityParameterIndex(
             int direction, InetAddress remoteAddress, int requestedSpi)
             throws SpiUnavailableException, ResourceUnavailableException {
         if (requestedSpi == IpSecManager.INVALID_SECURITY_PARAMETER_INDEX) {
@@ -273,16 +272,18 @@
      * unprotected traffic can resume on that socket.
      *
      * <p>For security reasons, the destination address of any traffic on the socket must match the
-     * remote {@code  InetAddress} of the {@code IpSecTransform}. Attempts to send traffic to any
+     * remote {@code InetAddress} of the {@code IpSecTransform}. Attempts to send traffic to any
      * other IP address will result in an IOException. In addition, reads and writes on the socket
      * will throw IOException if the user deactivates the transform (by calling {@link
      * IpSecTransform#close()}) without calling {@link #removeTransportModeTransform}.
      *
-     * <h4>Rekey Procedure</h4> <p>When applying a new tranform to a socket, the previous transform
-     * will be removed. However, inbound traffic on the old transform will continue to be decrypted
-     * until that transform is deallocated by calling {@link IpSecTransform#close()}. This overlap
-     * allows rekey procedures where both transforms are valid until both endpoints are using the
-     * new transform and all in-flight packets have been received.
+     * <h4>Rekey Procedure</h4>
+     *
+     * <p>When applying a new tranform to a socket, the previous transform will be removed. However,
+     * inbound traffic on the old transform will continue to be decrypted until that transform is
+     * deallocated by calling {@link IpSecTransform#close()}. This overlap allows rekey procedures
+     * where both transforms are valid until both endpoints are using the new transform and all
+     * in-flight packets have been received.
      *
      * @param socket a stream socket
      * @param transform a transport mode {@code IpSecTransform}
@@ -310,11 +311,13 @@
      * will throw IOException if the user deactivates the transform (by calling {@link
      * IpSecTransform#close()}) without calling {@link #removeTransportModeTransform}.
      *
-     * <h4>Rekey Procedure</h4> <p>When applying a new tranform to a socket, the previous transform
-     * will be removed. However, inbound traffic on the old transform will continue to be decrypted
-     * until that transform is deallocated by calling {@link IpSecTransform#close()}. This overlap
-     * allows rekey procedures where both transforms are valid until both endpoints are using the
-     * new transform and all in-flight packets have been received.
+     * <h4>Rekey Procedure</h4>
+     *
+     * <p>When applying a new tranform to a socket, the previous transform will be removed. However,
+     * inbound traffic on the old transform will continue to be decrypted until that transform is
+     * deallocated by calling {@link IpSecTransform#close()}. This overlap allows rekey procedures
+     * where both transforms are valid until both endpoints are using the new transform and all
+     * in-flight packets have been received.
      *
      * @param socket a datagram socket
      * @param transform a transport mode {@code IpSecTransform}
@@ -342,11 +345,13 @@
      * will throw IOException if the user deactivates the transform (by calling {@link
      * IpSecTransform#close()}) without calling {@link #removeTransportModeTransform}.
      *
-     * <h4>Rekey Procedure</h4> <p>When applying a new tranform to a socket, the previous transform
-     * will be removed. However, inbound traffic on the old transform will continue to be decrypted
-     * until that transform is deallocated by calling {@link IpSecTransform#close()}. This overlap
-     * allows rekey procedures where both transforms are valid until both endpoints are using the
-     * new transform and all in-flight packets have been received.
+     * <h4>Rekey Procedure</h4>
+     *
+     * <p>When applying a new tranform to a socket, the previous transform will be removed. However,
+     * inbound traffic on the old transform will continue to be decrypted until that transform is
+     * deallocated by calling {@link IpSecTransform#close()}. This overlap allows rekey procedures
+     * where both transforms are valid until both endpoints are using the new transform and all
+     * in-flight packets have been received.
      *
      * @param socket a socket file descriptor
      * @param transform a transport mode {@code IpSecTransform}
@@ -379,7 +384,8 @@
      * Applications should probably not use this API directly. Instead, they should use {@link
      * VpnService} to provide VPN capability in a more generic fashion.
      *
-     * TODO: Update javadoc for tunnel mode APIs at the same time the APIs are re-worked.
+     * <p>TODO: Update javadoc for tunnel mode APIs at the same time the APIs are re-worked.
+     *
      * @param net a {@link Network} that will be tunneled via IP Sec.
      * @param transform an {@link IpSecTransform}, which must be an active Tunnel Mode transform.
      * @hide
@@ -469,7 +475,8 @@
      * all traffic that cannot be routed to the Tunnel's outbound interface. If that interface is
      * lost, all traffic will drop.
      *
-     * TODO: Update javadoc for tunnel mode APIs at the same time the APIs are re-worked.
+     * <p>TODO: Update javadoc for tunnel mode APIs at the same time the APIs are re-worked.
+     *
      * @param net a network that currently has transform applied to it.
      * @param transform a Tunnel Mode IPsec Transform that has been previously applied to the given
      *     network
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index cda4ec7..7cd742b 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -47,7 +47,7 @@
  * system resources.
  *
  * @see <a href="https://tools.ietf.org/html/rfc4301">RFC 4301, Security Architecture for the
- * Internet Protocol</a>
+ *     Internet Protocol</a>
  */
 public final class IpSecTransform implements AutoCloseable {
     private static final String TAG = "IpSecTransform";
@@ -116,8 +116,7 @@
     }
 
     /**
-     * Checks the result status and throws an appropriate exception if
-     * the status is not Status.OK.
+     * Checks the result status and throws an appropriate exception if the status is not Status.OK.
      */
     private void checkResultStatus(int status)
             throws IOException, IpSecManager.ResourceUnavailableException,
@@ -267,9 +266,7 @@
         return;
     }
 
-    /**
-     * This class is used to build {@link IpSecTransform} objects.
-     */
+    /** This class is used to build {@link IpSecTransform} objects. */
     public static class Builder {
         private Context mContext;
         private IpSecConfig mConfig;
@@ -339,7 +336,7 @@
          *
          * <p>Because IPsec operates at the IP layer, this 32-bit identifier uniquely identifies
          * packets to a given destination address. To prevent SPI collisions, values should be
-         * reserved by calling {@link IpSecManager#reserveSecurityParameterIndex}.
+         * reserved by calling {@link IpSecManager#allocateSecurityParameterIndex}.
          *
          * <p>If the SPI and algorithms are omitted for one direction, traffic in that direction
          * will not be encrypted or authenticated.
@@ -374,10 +371,9 @@
          * <p>This allows IPsec traffic to pass through a NAT.
          *
          * @see <a href="https://tools.ietf.org/html/rfc3948">RFC 3948, UDP Encapsulation of IPsec
-         * ESP Packets</a>
+         *     ESP Packets</a>
          * @see <a href="https://tools.ietf.org/html/rfc7296#section-2.23">RFC 7296 section 2.23,
-         * NAT Traversal of IKEv2</a>
-         *
+         *     NAT Traversal of IKEv2</a>
          * @param localSocket a socket for sending and receiving encapsulated traffic
          * @param remotePort the UDP port number of the remote host that will send and receive
          *     encapsulated traffic. In the case of IKEv2, this should be port 4500.
@@ -402,7 +398,6 @@
          *
          * @param intervalSeconds the maximum number of seconds between keepalive packets. Must be
          *     between 20s and 3600s.
-         *
          * @hide
          */
         @SystemApi
@@ -418,7 +413,6 @@
          * will not affect any network traffic until it has been applied to one or more sockets.
          *
          * @see IpSecManager#applyTransportModeTransform
-         *
          * @param remoteAddress the remote {@code InetAddress} of traffic on sockets that will use
          *     this transform
          * @throws IllegalArgumentException indicating that a particular combination of transform
@@ -453,8 +447,8 @@
          */
         public IpSecTransform buildTunnelModeTransform(
                 InetAddress localAddress, InetAddress remoteAddress) {
-            //FIXME: argument validation here
-            //throw new IllegalArgumentException("Natt Keepalive requires UDP Encapsulation");
+            // FIXME: argument validation here
+            // throw new IllegalArgumentException("Natt Keepalive requires UDP Encapsulation");
             mConfig.setLocalAddress(localAddress.getHostAddress());
             mConfig.setRemoteAddress(remoteAddress.getHostAddress());
             mConfig.setMode(MODE_TUNNEL);
diff --git a/core/java/android/os/HardwarePropertiesManager.java b/core/java/android/os/HardwarePropertiesManager.java
index aad202e..eae7d70 100644
--- a/core/java/android/os/HardwarePropertiesManager.java
+++ b/core/java/android/os/HardwarePropertiesManager.java
@@ -40,9 +40,11 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-        DEVICE_TEMPERATURE_CPU, DEVICE_TEMPERATURE_GPU, DEVICE_TEMPERATURE_BATTERY,
-                DEVICE_TEMPERATURE_SKIN
+    @IntDef(prefix = { "DEVICE_TEMPERATURE_" }, value = {
+            DEVICE_TEMPERATURE_CPU,
+            DEVICE_TEMPERATURE_GPU,
+            DEVICE_TEMPERATURE_BATTERY,
+            DEVICE_TEMPERATURE_SKIN
     })
     public @interface DeviceTemperatureType {}
 
@@ -50,9 +52,11 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-        TEMPERATURE_CURRENT, TEMPERATURE_THROTTLING, TEMPERATURE_SHUTDOWN,
-                TEMPERATURE_THROTTLING_BELOW_VR_MIN
+    @IntDef(prefix = { "TEMPERATURE_" }, value = {
+            TEMPERATURE_CURRENT,
+            TEMPERATURE_THROTTLING,
+            TEMPERATURE_SHUTDOWN,
+            TEMPERATURE_THROTTLING_BELOW_VR_MIN
     })
     public @interface TemperatureSource {}
 
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index 624e28a..96e7a59 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -871,7 +871,11 @@
 
         /** @hide */
         @Retention(RetentionPolicy.SOURCE)
-        @IntDef(flag=true, value={EVENT_INPUT, EVENT_OUTPUT, EVENT_ERROR})
+        @IntDef(flag = true, prefix = { "EVENT_" }, value = {
+                EVENT_INPUT,
+                EVENT_OUTPUT,
+                EVENT_ERROR
+        })
         public @interface Events {}
 
         /**
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 01fe5bf..56c6391 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -466,7 +466,7 @@
      * @hide
      */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
+    @IntDef(prefix = { "SHUTDOWN_REASON_" }, value = {
             SHUTDOWN_REASON_UNKNOWN,
             SHUTDOWN_REASON_SHUTDOWN,
             SHUTDOWN_REASON_REBOOT,
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 61dd462..fb60bbb 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -103,8 +103,12 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag=true, value={RESTRICTION_NOT_SET, RESTRICTION_SOURCE_SYSTEM,
-            RESTRICTION_SOURCE_DEVICE_OWNER, RESTRICTION_SOURCE_PROFILE_OWNER})
+    @IntDef(flag = true, prefix = { "RESTRICTION_" }, value = {
+            RESTRICTION_NOT_SET,
+            RESTRICTION_SOURCE_SYSTEM,
+            RESTRICTION_SOURCE_DEVICE_OWNER,
+            RESTRICTION_SOURCE_PROFILE_OWNER
+    })
     @SystemApi
     public @interface UserRestrictionSource {}
 
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 4796712..9833fe1 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1690,7 +1690,7 @@
     public static final int FLAG_ALLOCATE_DEFY_HALF_RESERVED = 1 << 2;
 
     /** @hide */
-    @IntDef(flag = true, value = {
+    @IntDef(flag = true, prefix = { "FLAG_ALLOCATE_" }, value = {
             FLAG_ALLOCATE_AGGRESSIVE,
             FLAG_ALLOCATE_DEFY_ALL_RESERVED,
             FLAG_ALLOCATE_DEFY_HALF_RESERVED,
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index ce5b11e..f0d9a0c 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -49,8 +49,9 @@
 public final class PrintAttributes implements Parcelable {
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true, value = {
-            COLOR_MODE_MONOCHROME, COLOR_MODE_COLOR
+    @IntDef(flag = true, prefix = { "COLOR_MODE_" }, value = {
+            COLOR_MODE_MONOCHROME,
+            COLOR_MODE_COLOR
     })
     @interface ColorMode {
     }
@@ -64,8 +65,10 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true, value = {
-            DUPLEX_MODE_NONE, DUPLEX_MODE_LONG_EDGE, DUPLEX_MODE_SHORT_EDGE
+    @IntDef(flag = true, prefix = { "DUPLEX_MODE_" }, value = {
+            DUPLEX_MODE_NONE,
+            DUPLEX_MODE_LONG_EDGE,
+            DUPLEX_MODE_SHORT_EDGE
     })
     @interface DuplexMode {
     }
diff --git a/core/java/android/print/PrintDocumentInfo.java b/core/java/android/print/PrintDocumentInfo.java
index 6143404..55c902e 100644
--- a/core/java/android/print/PrintDocumentInfo.java
+++ b/core/java/android/print/PrintDocumentInfo.java
@@ -83,11 +83,14 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            CONTENT_TYPE_UNKNOWN, CONTENT_TYPE_DOCUMENT, CONTENT_TYPE_PHOTO
+    @IntDef(prefix = { "CONTENT_TYPE_" }, value = {
+            CONTENT_TYPE_UNKNOWN,
+            CONTENT_TYPE_DOCUMENT,
+            CONTENT_TYPE_PHOTO
     })
     public @interface ContentType {
     }
+
     /**
      * Content type: unknown.
      */
diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java
index 94686a8..85fdd64 100644
--- a/core/java/android/print/PrintJobInfo.java
+++ b/core/java/android/print/PrintJobInfo.java
@@ -45,9 +45,14 @@
 public final class PrintJobInfo implements Parcelable {
 
     /** @hide */
-    @IntDef({
-            STATE_CREATED, STATE_QUEUED, STATE_STARTED, STATE_BLOCKED, STATE_COMPLETED,
-            STATE_FAILED, STATE_CANCELED
+    @IntDef(prefix = { "STATE_" }, value = {
+            STATE_CREATED,
+            STATE_QUEUED,
+            STATE_STARTED,
+            STATE_BLOCKED,
+            STATE_COMPLETED,
+            STATE_FAILED,
+            STATE_CANCELED
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface State {
diff --git a/core/java/android/print/PrinterInfo.java b/core/java/android/print/PrinterInfo.java
index 88feab7..e79cc65 100644
--- a/core/java/android/print/PrinterInfo.java
+++ b/core/java/android/print/PrinterInfo.java
@@ -53,12 +53,15 @@
 public final class PrinterInfo implements Parcelable {
 
     /** @hide */
-    @IntDef({
-            STATUS_IDLE, STATUS_BUSY, STATUS_UNAVAILABLE
+    @IntDef(prefix = { "STATUS_" }, value = {
+            STATUS_IDLE,
+            STATUS_BUSY,
+            STATUS_UNAVAILABLE
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Status {
     }
+
     /** Printer status: the printer is idle and ready to print. */
     public static final int STATUS_IDLE = PrinterInfoProto.STATUS_IDLE;
 
diff --git a/core/java/android/provider/FontsContract.java b/core/java/android/provider/FontsContract.java
index d8540ff..a1d1c57 100644
--- a/core/java/android/provider/FontsContract.java
+++ b/core/java/android/provider/FontsContract.java
@@ -283,7 +283,11 @@
         public static final int STATUS_REJECTED = 3;
 
         /** @hide */
-        @IntDef({STATUS_OK, STATUS_WRONG_CERTIFICATES, STATUS_UNEXPECTED_DATA_PROVIDED})
+        @IntDef(prefix = { "STATUS_" }, value = {
+                STATUS_OK,
+                STATUS_WRONG_CERTIFICATES,
+                STATUS_UNEXPECTED_DATA_PROVIDED
+        })
         @Retention(RetentionPolicy.SOURCE)
         @interface FontResultStatus {}
 
@@ -438,9 +442,13 @@
         public static final int FAIL_REASON_MALFORMED_QUERY = Columns.RESULT_CODE_MALFORMED_QUERY;
 
         /** @hide */
-        @IntDef({ FAIL_REASON_PROVIDER_NOT_FOUND, FAIL_REASON_FONT_LOAD_ERROR,
-                FAIL_REASON_FONT_NOT_FOUND, FAIL_REASON_FONT_UNAVAILABLE,
-                FAIL_REASON_MALFORMED_QUERY })
+        @IntDef(prefix = { "FAIL_" }, value = {
+                FAIL_REASON_PROVIDER_NOT_FOUND,
+                FAIL_REASON_FONT_LOAD_ERROR,
+                FAIL_REASON_FONT_NOT_FOUND,
+                FAIL_REASON_FONT_UNAVAILABLE,
+                FAIL_REASON_MALFORMED_QUERY
+        })
         @Retention(RetentionPolicy.SOURCE)
         @interface FontRequestFailReason {}
 
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 0bae3b8..abc16ce 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1689,7 +1689,7 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
+    @IntDef(prefix = { "RESET_MODE_" }, value = {
             RESET_MODE_PACKAGE_DEFAULTS,
             RESET_MODE_UNTRUSTED_DEFAULTS,
             RESET_MODE_UNTRUSTED_CHANGES,
diff --git a/core/java/android/security/recoverablekeystore/KeyDerivationParameters.aidl b/core/java/android/security/recoverablekeystore/KeyDerivationParameters.aidl
new file mode 100644
index 0000000..fe13179
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyDerivationParameters.aidl
@@ -0,0 +1,20 @@
+/*
+ * 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.security.recoverablekeystore;
+
+/* @hide */
+parcelable KeyDerivationParameters;
diff --git a/core/java/android/security/recoverablekeystore/KeyDerivationParameters.java b/core/java/android/security/recoverablekeystore/KeyDerivationParameters.java
new file mode 100644
index 0000000..2205c41
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyDerivationParameters.java
@@ -0,0 +1,112 @@
+/*
+ * 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.security.recoverablekeystore;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Collection of parameters which define a key derivation function.
+ * Supports
+ *
+ * <ul>
+ * <li>SHA256
+ * <li>Argon2id
+ * </ul>
+ * @hide
+ */
+public final class KeyDerivationParameters implements Parcelable {
+    private final int mAlgorithm;
+    private byte[] mSalt;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({ALGORITHM_SHA256, ALGORITHM_ARGON2ID})
+    public @interface KeyDerivationAlgorithm {
+    }
+
+    /**
+     * Salted SHA256
+     */
+    public static final int ALGORITHM_SHA256 = 1;
+
+    /**
+     * Argon2ID
+     */
+    // TODO: add Argon2ID support.
+    public static final int ALGORITHM_ARGON2ID = 2;
+
+    /**
+     * Creates instance of the class to to derive key using salted SHA256 hash.
+     */
+    public KeyDerivationParameters createSHA256Parameters(@NonNull byte[] salt) {
+        return new KeyDerivationParameters(ALGORITHM_SHA256, salt);
+    }
+
+    private KeyDerivationParameters(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt) {
+        mAlgorithm = algorithm;
+        mSalt = Preconditions.checkNotNull(salt);
+    }
+
+    /**
+     * Gets algorithm.
+     */
+    public @KeyDerivationAlgorithm int getAlgorithm() {
+        return mAlgorithm;
+    }
+
+    /**
+     * Gets salt.
+     */
+    public @NonNull byte[] getSalt() {
+        return mSalt;
+    }
+
+    public static final Parcelable.Creator<KeyDerivationParameters> CREATOR =
+            new Parcelable.Creator<KeyDerivationParameters>() {
+        public KeyDerivationParameters createFromParcel(Parcel in) {
+                return new KeyDerivationParameters(in);
+        }
+
+        public KeyDerivationParameters[] newArray(int length) {
+            return new KeyDerivationParameters[length];
+        }
+    };
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mAlgorithm);
+        out.writeByteArray(mSalt);
+    }
+
+    protected KeyDerivationParameters(Parcel in) {
+        mAlgorithm = in.readInt();
+        mSalt = in.createByteArray();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+}
diff --git a/core/java/android/security/recoverablekeystore/KeyEntryRecoveryData.aidl b/core/java/android/security/recoverablekeystore/KeyEntryRecoveryData.aidl
new file mode 100644
index 0000000..1058463a
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyEntryRecoveryData.aidl
@@ -0,0 +1,20 @@
+/*
+ * 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.security.keystore.recoverablekeystore;
+
+/* @hide */
+parcelable KeyEntryRecoveryData;
diff --git a/core/java/android/security/recoverablekeystore/KeyEntryRecoveryData.java b/core/java/android/security/recoverablekeystore/KeyEntryRecoveryData.java
new file mode 100644
index 0000000..80f5aa7
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyEntryRecoveryData.java
@@ -0,0 +1,90 @@
+/*
+ * 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.security.recoverablekeystore;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+
+/**
+ * Helper class with data necessary recover a single application key, given a recovery key.
+ *
+ * <ul>
+ * <li>Alias - Keystore alias of the key.
+ * <li>Encrypted key material.
+ * </ul>
+ *
+ * Note that Application info is not included. Recovery Agent can only make its own keys
+ * recoverable.
+ *
+ * @hide
+ */
+public final class KeyEntryRecoveryData implements Parcelable {
+    private final byte[] mAlias;
+    // The only supported format is AES-256 symmetric key.
+    private final byte[] mEncryptedKeyMaterial;
+
+    public KeyEntryRecoveryData(@NonNull byte[] alias, @NonNull byte[] encryptedKeyMaterial) {
+        mAlias = Preconditions.checkNotNull(alias);
+        mEncryptedKeyMaterial = Preconditions.checkNotNull(encryptedKeyMaterial);
+    }
+
+    /**
+     * Application-specific alias of the key.
+     * @see java.security.KeyStore.aliases
+     */
+    public @NonNull byte[] getAlias() {
+        return mAlias;
+    }
+
+    /**
+     * Encrypted key material encrypted by recovery key.
+     */
+    public @NonNull byte[] getEncryptedKeyMaterial() {
+        return mEncryptedKeyMaterial;
+    }
+
+    public static final Parcelable.Creator<KeyEntryRecoveryData> CREATOR =
+            new Parcelable.Creator<KeyEntryRecoveryData>() {
+        public KeyEntryRecoveryData createFromParcel(Parcel in) {
+                return new KeyEntryRecoveryData(in);
+        }
+
+        public KeyEntryRecoveryData[] newArray(int length) {
+            return new KeyEntryRecoveryData[length];
+        }
+    };
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeByteArray(mAlias);
+        out.writeByteArray(mEncryptedKeyMaterial);
+    }
+
+    protected KeyEntryRecoveryData(Parcel in) {
+        mAlias = in.createByteArray();
+        mEncryptedKeyMaterial = in.createByteArray();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+}
diff --git a/core/java/android/security/recoverablekeystore/KeyStoreRecoveryData.aidl b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryData.aidl
new file mode 100644
index 0000000..bd76051
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryData.aidl
@@ -0,0 +1,20 @@
+/*
+ * 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.security.recoverablekeystore;
+
+/* @hide */
+parcelable KeyStoreRecoveryData;
diff --git a/core/java/android/security/recoverablekeystore/KeyStoreRecoveryData.java b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryData.java
new file mode 100644
index 0000000..087f7a2
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryData.java
@@ -0,0 +1,115 @@
+/*
+ * 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.security.recoverablekeystore;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.List;
+
+/**
+ * Helper class which returns data necessary to recover keys.
+ * Contains
+ *
+ * <ul>
+ * <li>Snapshot version.
+ * <li>Recovery metadata with UI and key derivation parameters.
+ * <li>List of application keys encrypted by recovery key.
+ * <li>Encrypted recovery key.
+ * </ul>
+ *
+ * @hide
+ */
+public final class KeyStoreRecoveryData implements Parcelable {
+    private final int mSnapshotVersion;
+    private final List<KeyStoreRecoveryMetadata> mRecoveryMetadata;
+    private final List<KeyEntryRecoveryData> mApplicationKeyBlobs;
+    private final byte[] mEncryptedRecoveryKeyBlob;
+
+    public KeyStoreRecoveryData(int snapshotVersion, @NonNull List<KeyStoreRecoveryMetadata>
+            recoveryMetadata, @NonNull List<KeyEntryRecoveryData> applicationKeyBlobs,
+            @NonNull byte[] encryptedRecoveryKeyBlob) {
+        mSnapshotVersion = snapshotVersion;
+        mRecoveryMetadata = Preconditions.checkNotNull(recoveryMetadata);
+        mApplicationKeyBlobs = Preconditions.checkNotNull(applicationKeyBlobs);
+        mEncryptedRecoveryKeyBlob = Preconditions.checkNotNull(encryptedRecoveryKeyBlob);
+    }
+
+    /**
+     * Snapshot version for given account. It is incremented when user secret or list of application
+     * keys changes.
+     */
+    public int getSnapshotVersion() {
+        return mSnapshotVersion;
+    }
+
+    /**
+     * UI and key derivation parameters. Note that combination of secrets may be used.
+     */
+    public @NonNull List<KeyStoreRecoveryMetadata> getRecoveryMetadata() {
+        return mRecoveryMetadata;
+    }
+
+    /**
+     * List of application keys, with key material encrypted by
+     * the recovery key ({@link #getEncryptedRecoveryKeyBlob}).
+     */
+    public @NonNull List<KeyEntryRecoveryData> getApplicationKeyBlobs() {
+        return mApplicationKeyBlobs;
+    }
+
+    /**
+     * Recovery key blob, encrypted by user secret and recovery service public key.
+     */
+    public @NonNull byte[] getEncryptedRecoveryKeyBlob() {
+        return mEncryptedRecoveryKeyBlob;
+    }
+
+    public static final Parcelable.Creator<KeyStoreRecoveryData> CREATOR =
+            new Parcelable.Creator<KeyStoreRecoveryData>() {
+        public KeyStoreRecoveryData createFromParcel(Parcel in) {
+            return new KeyStoreRecoveryData(in);
+        }
+
+        public KeyStoreRecoveryData[] newArray(int length) {
+            return new KeyStoreRecoveryData[length];
+        }
+    };
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mSnapshotVersion);
+        out.writeTypedList(mRecoveryMetadata);
+        out.writeByteArray(mEncryptedRecoveryKeyBlob);
+        out.writeTypedList(mApplicationKeyBlobs);
+    }
+
+    protected KeyStoreRecoveryData(Parcel in) {
+        mSnapshotVersion = in.readInt();
+        mRecoveryMetadata = in.createTypedArrayList(KeyStoreRecoveryMetadata.CREATOR);
+        mEncryptedRecoveryKeyBlob = in.createByteArray();
+        mApplicationKeyBlobs = in.createTypedArrayList(KeyEntryRecoveryData.CREATOR);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+}
diff --git a/core/java/android/security/recoverablekeystore/KeyStoreRecoveryMetadata.aidl b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryMetadata.aidl
new file mode 100644
index 0000000..e1d49de
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryMetadata.aidl
@@ -0,0 +1,20 @@
+/*
+ * 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.security.recoverablekeystore;
+
+/* @hide */
+parcelable KeyStoreRecoveryMetadata;
diff --git a/core/java/android/security/recoverablekeystore/KeyStoreRecoveryMetadata.java b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryMetadata.java
new file mode 100644
index 0000000..43f9c80
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/KeyStoreRecoveryMetadata.java
@@ -0,0 +1,180 @@
+/*
+ * 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.security.recoverablekeystore;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
+
+/**
+ * Helper class with data necessary to recover Keystore on a new device.
+ * It defines UI shown to the user and a way to derive a cryptographic key from user output.
+ *
+ * @hide
+ */
+public final class KeyStoreRecoveryMetadata implements Parcelable {
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({TYPE_LOCKSCREEN, TYPE_CUSTOM_PASSWORD})
+    public @interface UserSecretType {
+    }
+
+    /**
+     * Lockscreen secret is required to recover KeyStore.
+     */
+    public static final int TYPE_LOCKSCREEN = 1;
+
+    /**
+     * Custom passphrase, unrelated to lock screen, is required to recover KeyStore.
+     */
+    public static final int TYPE_CUSTOM_PASSWORD = 2;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({TYPE_PIN, TYPE_PASSWORD, TYPE_PATTERN})
+    public @interface LockScreenUiFormat {
+    }
+
+    /**
+     * Pin with digits only.
+     */
+    public static final int TYPE_PIN = 1;
+
+    /**
+     * Password. String with latin-1 characters only.
+     */
+    public static final int TYPE_PASSWORD = 2;
+
+    /**
+     * Pattern with 3 by 3 grid.
+     */
+    public static final int TYPE_PATTERN = 3;
+
+    @UserSecretType
+    private final int mUserSecretType;
+
+    @LockScreenUiFormat
+    private final int mLockScreenUiFormat;
+
+    /**
+     * Parameters of key derivation function, including algorithm, difficulty, salt.
+     */
+    private KeyDerivationParameters mKeyDerivationParameters;
+    private byte[] mSecret; // Derived from user secret. The field must have limited visibility.
+
+    /**
+     * @param secret Constructor creates a reference to the secret. Caller must use
+     * @link {#clearSecret} to overwrite its value in memory.
+     */
+    public KeyStoreRecoveryMetadata(@UserSecretType int userSecretType,
+            @LockScreenUiFormat int lockScreenUiFormat,
+            @NonNull KeyDerivationParameters keyDerivationParameters, @NonNull byte[] secret) {
+        mUserSecretType = userSecretType;
+        mLockScreenUiFormat = lockScreenUiFormat;
+        mKeyDerivationParameters = Preconditions.checkNotNull(keyDerivationParameters);
+        mSecret = Preconditions.checkNotNull(secret);
+    }
+
+    /**
+     * Specifies UX shown to user during recovery.
+     *
+     * @see KeyStore.TYPE_PIN
+     * @see KeyStore.TYPE_PASSWORD
+     * @see KeyStore.TYPE_PATTERN
+     */
+    public @LockScreenUiFormat int getLockScreenUiFormat() {
+        return mLockScreenUiFormat;
+    }
+
+    /**
+     * Specifies function used to derive symmetric key from user input
+     * Format is defined in separate util class.
+     */
+    public @NonNull KeyDerivationParameters getKeyDerivationParameters() {
+        return mKeyDerivationParameters;
+    }
+
+    /**
+     * Secret string derived from user input.
+     */
+    public @NonNull byte[] getSecret() {
+        return mSecret;
+    }
+
+    /**
+     * @see KeyStore.TYPE_LOCKSCREEN
+     * @see KeyStore.TYPE_CUSTOM_PASSWORD
+     */
+    public @UserSecretType int getUserSecretType() {
+        return mUserSecretType;
+    }
+
+    /**
+     * Removes secret from memory than object is no longer used.
+     * Since finalizer call is not reliable, please use @link {#clearSecret} directly.
+     */
+    @Override
+    protected void finalize() throws Throwable {
+        clearSecret();
+        super.finalize();
+    }
+
+    /**
+     * Fills mSecret with zeroes.
+     */
+    public void clearSecret() {
+        Arrays.fill(mSecret, (byte) 0);
+    }
+
+    public static final Parcelable.Creator<KeyStoreRecoveryMetadata> CREATOR =
+            new Parcelable.Creator<KeyStoreRecoveryMetadata>() {
+        public KeyStoreRecoveryMetadata createFromParcel(Parcel in) {
+            return new KeyStoreRecoveryMetadata(in);
+        }
+
+        public KeyStoreRecoveryMetadata[] newArray(int length) {
+            return new KeyStoreRecoveryMetadata[length];
+        }
+    };
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mUserSecretType);
+        out.writeInt(mLockScreenUiFormat);
+        out.writeTypedObject(mKeyDerivationParameters, flags);
+        out.writeByteArray(mSecret);
+    }
+
+    protected KeyStoreRecoveryMetadata(Parcel in) {
+        mUserSecretType = in.readInt();
+        mLockScreenUiFormat = in.readInt();
+        mKeyDerivationParameters = in.readTypedObject(KeyDerivationParameters.CREATOR);
+        mSecret = in.createByteArray();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+}
diff --git a/core/java/android/security/recoverablekeystore/RecoverableKeyStoreLoader.java b/core/java/android/security/recoverablekeystore/RecoverableKeyStoreLoader.java
new file mode 100644
index 0000000..0510320
--- /dev/null
+++ b/core/java/android/security/recoverablekeystore/RecoverableKeyStoreLoader.java
@@ -0,0 +1,228 @@
+/*
+ * 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.security.recoverablekeystore;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.ServiceManager;
+
+import com.android.internal.widget.ILockSettings;
+
+import java.util.List;
+
+/**
+ * A wrapper around KeyStore which lets key be exported to
+ * trusted hardware on server side and recovered later.
+ *
+ * @hide
+ */
+public class RecoverableKeyStoreLoader  {
+
+    private final ILockSettings mBinder;
+
+    // Exception codes, should be in sync with {@code KeyStoreException}.
+    public static final int SYSTEM_ERROR = 4;
+
+    public static final int UNINITIALIZED_RECOVERY_PUBLIC_KEY = 20;
+
+    // Too many updates to recovery public key or server parameters.
+    public static final int RATE_LIMIT_EXCEEDED = 21;
+
+    private RecoverableKeyStoreLoader(ILockSettings binder) {
+        mBinder = binder;
+    }
+
+    /**
+     * @hide
+     */
+    public static RecoverableKeyStoreLoader getInstance() {
+        ILockSettings lockSettings =
+                ILockSettings.Stub.asInterface(ServiceManager.getService("lock_settings"));
+        return new RecoverableKeyStoreLoader(lockSettings);
+    }
+
+    /**
+     * @hide
+     */
+    public static class RecoverableKeyStoreLoaderException extends Exception {
+        private final int mErrorCode;
+
+        public RecoverableKeyStoreLoaderException(int errorCode, String message) {
+            super(message);
+            mErrorCode = errorCode;
+        }
+
+        public int getErrorCode() {
+            return mErrorCode;
+        }
+    }
+
+    /**
+     * Initializes key recovery service for the calling application. RecoverableKeyStoreLoader
+     * randomly chooses one of the keys from the list
+     * and keeps it to use for future key export operations. Collection of all keys
+     * in the list must be signed by the provided {@code rootCertificateAlias}, which must also be
+     * present in the list of root certificates preinstalled on the device. The random selection
+     * allows RecoverableKeyStoreLoader to select which of a set of remote recovery service
+     * devices will be used.
+     *
+     * <p>In addition, RecoverableKeyStoreLoader enforces a delay of three months between
+     * consecutive initialization attempts, to limit the ability of an attacker to often switch
+     * remote recovery devices and significantly increase number of recovery attempts.
+     *
+     * @param rootCertificateAlias alias of a root certificate preinstalled on the device
+     * @param signedPublicKeyList binary blob a list of X509 certificates and signature
+     * @throws RecoverableKeyStoreLoaderException if signature is invalid, or key rotation was rate
+     * limited.
+     * @hide
+     */
+    public void initRecoveryService(@NonNull String rootCertificateAlias,
+            @NonNull byte[] signedPublicKeyList)
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+        // TODO: extend widget/ILockSettings.aidl
+        /* try {
+            mBinder.initRecoveryService(rootCertificate, publicKeyList);
+        } catch (RemoteException  e) {
+            throw e.rethrowFromSystemServer();
+        } */
+    }
+
+    /**
+     * Returns data necessary to store all recoverable keys for given account.
+     * Key material is encrypted with user secret and recovery public key.
+     */
+    public KeyStoreRecoveryData getRecoveryData(@NonNull byte[] account)
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Server parameters used to generate new recovery key blobs. This value will be included in
+     * {@code KeyStoreRecoveryData.getEncryptedRecoveryKeyBlob()}.
+     * The same value must be included in vaultParams  {@link startRecoverySession}
+     *
+     * @see #getRecoveryData
+     * @throws RecoverableKeyStoreLoaderException If parameters rotation is rate limited.
+     */
+    public void updateServerParameters(long serverParameters)
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Updates recovery status for given keys.
+     * It is used to notify keystore that key was successfully stored on the server or
+     * there were an error. Returned as a part of KeyInfo data structure.
+     *
+     * @param packageName Application whose recoverable keys' statuses are to be updated.
+     * @param aliases List of application-specific key aliases. If the array is empty, updates the
+     * status for all existing recoverable keys.
+     * @param status Status specific to recovery agent.
+     */
+    public void setRecoveryStatus(@NonNull String packageName, @Nullable String[] aliases,
+            int status) throws NameNotFoundException, RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Specifies a set of secret types used for end-to-end keystore encryption.
+     * Knowing all of them is necessary to recover data.
+     *
+     * @param secretTypes {@link KeyStoreRecoveryMetadata#TYPE_LOCKSCREEN} or
+     * {@link KeyStoreRecoveryMetadata#TYPE_CUSTOM_PASSWORD}
+     */
+    public void setRecoverySecretTypes(@NonNull @KeyStoreRecoveryMetadata.UserSecretType
+            int[] secretTypes) throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Defines a set of secret types used for end-to-end keystore encryption.
+     * Knowing all of them is necessary to generate KeyStoreRecoveryData.
+     * @see KeyStoreRecoveryData
+     */
+    public @NonNull @KeyStoreRecoveryMetadata.UserSecretType int[] getRecoverySecretTypes()
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Returns a list of recovery secret types, necessary to create a pending recovery snapshot.
+     * When user enters a secret of a pending type
+     * {@link #recoverySecretAvailable} should be called.
+     */
+    public @NonNull @KeyStoreRecoveryMetadata.UserSecretType int[] getPendingRecoverySecretTypes()
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Method notifies KeyStore that a user-generated secret is available.
+     * This method generates a symmetric session key which a trusted remote device can use
+     * to return a recovery key.
+     * Caller should use {@link KeyStoreRecoveryMetadata#clearSecret} to override the secret value
+     * in memory.
+     *
+     * @param recoverySecret user generated secret together with parameters necessary to
+     * regenerate it on a new device.
+     */
+    public void recoverySecretAvailable(@NonNull KeyStoreRecoveryMetadata recoverySecret)
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Initializes recovery session and returns a blob with proof of recovery secrets possession.
+     * The method generates symmetric key for a session, which trusted remote device can use
+     * to return recovery key.
+     *
+     * @param sessionId ID for recovery session.
+     * @param verifierPublicKey Certificate with Public key used to create the recovery blob on
+     * the source device. Keystore will verify the certificate using root of trust.
+     * @param vaultParams Must match the parameters in the corresponding field in the recovery blob.
+     * Used to limit number of guesses.
+     * @param vaultChallenge Data passed from server for this recovery session and used to prevent
+     * replay attacks
+     * @param secrets Secrets provided by user, the method only uses type and secret fields.
+     * @return Binary blob with recovery claim. It is encrypted with verifierPublicKey and
+     * contains a proof of user secrets, session symmetric key and parameters necessary to identify
+     * the counter with the number of failed recovery attempts.
+     */
+    public @NonNull byte[] startRecoverySession(@NonNull String sessionId,
+            @NonNull byte[] verifierPublicKey, @NonNull byte[] vaultParams,
+            @NonNull byte[] vaultChallenge, @NonNull List<KeyStoreRecoveryMetadata> secrets)
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+
+    /**
+     * Imports keys.
+     *
+     * @param sessionId Id for recovery session, same as in = {@link startRecoverySession}.
+     * @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session.
+     * @param applicationKeys Application keys. Key material can be decrypted using recoveryKeyBlob
+     * and session. KeyStore only uses package names from the application info in
+     * {@link KeyEntryRecoveryData}. Caller is responsibility to perform certificates check.
+     */
+    public void recoverKeys(@NonNull String sessionId, @NonNull byte[] recoveryKeyBlob,
+            @NonNull List<KeyEntryRecoveryData> applicationKeys)
+            throws RecoverableKeyStoreLoaderException {
+        throw new RecoverableKeyStoreLoaderException(SYSTEM_ERROR, "Not implemented");
+    }
+}
diff --git a/core/java/android/service/autofill/FillEventHistory.java b/core/java/android/service/autofill/FillEventHistory.java
index facad2d..a527f16 100644
--- a/core/java/android/service/autofill/FillEventHistory.java
+++ b/core/java/android/service/autofill/FillEventHistory.java
@@ -226,12 +226,13 @@
         public static final int TYPE_CONTEXT_COMMITTED = 4;
 
         /** @hide */
-        @IntDef(
-                value = {TYPE_DATASET_SELECTED,
-                        TYPE_DATASET_AUTHENTICATION_SELECTED,
-                        TYPE_AUTHENTICATION_SELECTED,
-                        TYPE_SAVE_SHOWN,
-                        TYPE_CONTEXT_COMMITTED})
+        @IntDef(prefix = { "TYPE_" }, value = {
+                TYPE_DATASET_SELECTED,
+                TYPE_DATASET_AUTHENTICATION_SELECTED,
+                TYPE_AUTHENTICATION_SELECTED,
+                TYPE_SAVE_SHOWN,
+                TYPE_CONTEXT_COMMITTED
+        })
         @Retention(RetentionPolicy.SOURCE)
         @interface EventIds{}
 
diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java
index ddc92f6..33619ac 100644
--- a/core/java/android/service/autofill/FillRequest.java
+++ b/core/java/android/service/autofill/FillRequest.java
@@ -69,9 +69,9 @@
     public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE;
 
     /** @hide */
-    @IntDef(
-        flag = true,
-        value = {FLAG_MANUAL_REQUEST})
+    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
+            FLAG_MANUAL_REQUEST
+    })
     @Retention(RetentionPolicy.SOURCE)
     @interface RequestFlags{}
 
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 04db698..014d3e8 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -63,7 +63,7 @@
     public static final int FLAG_DISABLE_ACTIVITY_ONLY = 0x2;
 
     /** @hide */
-    @IntDef(flag = true, value = {
+    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
             FLAG_TRACK_CONTEXT_COMMITED,
             FLAG_DISABLE_ACTIVITY_ONLY
     })
diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java
index 0b50f07..a5a6177 100644
--- a/core/java/android/service/autofill/SaveInfo.java
+++ b/core/java/android/service/autofill/SaveInfo.java
@@ -198,23 +198,22 @@
     public static final int NEGATIVE_BUTTON_STYLE_REJECT = 1;
 
     /** @hide */
-    @IntDef(
-        value = {
-                NEGATIVE_BUTTON_STYLE_CANCEL,
-                NEGATIVE_BUTTON_STYLE_REJECT})
+    @IntDef(prefix = { "NEGATIVE_BUTTON_STYLE_" }, value = {
+            NEGATIVE_BUTTON_STYLE_CANCEL,
+            NEGATIVE_BUTTON_STYLE_REJECT
+    })
     @Retention(RetentionPolicy.SOURCE)
     @interface NegativeButtonStyle{}
 
     /** @hide */
-    @IntDef(
-       flag = true,
-       value = {
-               SAVE_DATA_TYPE_GENERIC,
-               SAVE_DATA_TYPE_PASSWORD,
-               SAVE_DATA_TYPE_ADDRESS,
-               SAVE_DATA_TYPE_CREDIT_CARD,
-               SAVE_DATA_TYPE_USERNAME,
-               SAVE_DATA_TYPE_EMAIL_ADDRESS})
+    @IntDef(flag = true, prefix = { "SAVE_DATA_TYPE_" }, value = {
+            SAVE_DATA_TYPE_GENERIC,
+            SAVE_DATA_TYPE_PASSWORD,
+            SAVE_DATA_TYPE_ADDRESS,
+            SAVE_DATA_TYPE_CREDIT_CARD,
+            SAVE_DATA_TYPE_USERNAME,
+            SAVE_DATA_TYPE_EMAIL_ADDRESS
+    })
     @Retention(RetentionPolicy.SOURCE)
     @interface SaveDataType{}
 
@@ -235,9 +234,10 @@
     public static final int FLAG_DONT_SAVE_ON_FINISH = 0x2;
 
     /** @hide */
-    @IntDef(
-            flag = true,
-            value = {FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE, FLAG_DONT_SAVE_ON_FINISH})
+    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
+            FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE,
+            FLAG_DONT_SAVE_ON_FINISH
+    })
     @Retention(RetentionPolicy.SOURCE)
     @interface SaveInfoFlags{}
 
diff --git a/core/java/android/service/notification/Condition.java b/core/java/android/service/notification/Condition.java
index 447afe6..2a352ad 100644
--- a/core/java/android/service/notification/Condition.java
+++ b/core/java/android/service/notification/Condition.java
@@ -39,7 +39,12 @@
     public static final String SCHEME = "condition";
 
     /** @hide */
-    @IntDef({STATE_FALSE, STATE_TRUE, STATE_TRUE, STATE_ERROR})
+    @IntDef(prefix = { "STATE_" }, value = {
+            STATE_FALSE,
+            STATE_TRUE,
+            STATE_UNKNOWN,
+            STATE_ERROR
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface State {}
 
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index dac663e7..18d4a1e 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -229,8 +229,11 @@
 
 
     /** @hide */
-    @IntDef({NOTIFICATION_CHANNEL_OR_GROUP_ADDED, NOTIFICATION_CHANNEL_OR_GROUP_UPDATED,
-            NOTIFICATION_CHANNEL_OR_GROUP_DELETED})
+    @IntDef(prefix = { "NOTIFICATION_CHANNEL_OR_GROUP_" }, value = {
+            NOTIFICATION_CHANNEL_OR_GROUP_ADDED,
+            NOTIFICATION_CHANNEL_OR_GROUP_UPDATED,
+            NOTIFICATION_CHANNEL_OR_GROUP_DELETED
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ChannelOrGroupModificationTypes {}
 
diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
index 9332a5b..0bf68b7 100644
--- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java
+++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java
@@ -65,10 +65,10 @@
      */
     public static final int FLASH_LOCK_LOCKED = 1;
 
-    @IntDef({
-        FLASH_LOCK_UNKNOWN,
-        FLASH_LOCK_LOCKED,
-        FLASH_LOCK_UNLOCKED,
+    @IntDef(prefix = { "FLASH_LOCK_" }, value = {
+            FLASH_LOCK_UNKNOWN,
+            FLASH_LOCK_LOCKED,
+            FLASH_LOCK_UNLOCKED,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface FlashLockState {}
diff --git a/core/java/android/service/settings/suggestions/Suggestion.java b/core/java/android/service/settings/suggestions/Suggestion.java
index cfeb7fc..11e1e67 100644
--- a/core/java/android/service/settings/suggestions/Suggestion.java
+++ b/core/java/android/service/settings/suggestions/Suggestion.java
@@ -38,7 +38,7 @@
     /**
      * @hide
      */
-    @IntDef(flag = true, value = {
+    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
             FLAG_HAS_BUTTON,
     })
     @Retention(RetentionPolicy.SOURCE)
diff --git a/core/java/android/service/trust/TrustAgentService.java b/core/java/android/service/trust/TrustAgentService.java
index 5ef934e..4bade9f 100644
--- a/core/java/android/service/trust/TrustAgentService.java
+++ b/core/java/android/service/trust/TrustAgentService.java
@@ -114,11 +114,10 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {
-                    FLAG_GRANT_TRUST_INITIATED_BY_USER,
-                    FLAG_GRANT_TRUST_DISMISS_KEYGUARD,
-            })
+    @IntDef(flag = true, prefix = { "FLAG_GRANT_TRUST_" }, value = {
+            FLAG_GRANT_TRUST_INITIATED_BY_USER,
+            FLAG_GRANT_TRUST_DISMISS_KEYGUARD,
+    })
     public @interface GrantTrustFlags {}
 
 
@@ -138,11 +137,10 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {
-                TOKEN_STATE_ACTIVE,
-                TOKEN_STATE_INACTIVE,
-            })
+    @IntDef(flag = true, prefix = { "TOKEN_STATE_" }, value = {
+            TOKEN_STATE_ACTIVE,
+            TOKEN_STATE_INACTIVE,
+    })
     public @interface TokenState {}
 
     private static final int MSG_UNLOCK_ATTEMPT = 1;
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index 9464a87..76d89ef 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -87,11 +87,11 @@
 
     // Keyphrase management actions. Used in getManageIntent() ----//
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(value = {
-                MANAGE_ACTION_ENROLL,
-                MANAGE_ACTION_RE_ENROLL,
-                MANAGE_ACTION_UN_ENROLL
-            })
+    @IntDef(prefix = { "MANAGE_ACTION_" }, value = {
+            MANAGE_ACTION_ENROLL,
+            MANAGE_ACTION_RE_ENROLL,
+            MANAGE_ACTION_UN_ENROLL
+    })
     private @interface ManageActions {}
 
     /**
@@ -116,12 +116,11 @@
     //-- Flags for startRecognition    ----//
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {
-                RECOGNITION_FLAG_NONE,
-                RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO,
-                RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS
-            })
+    @IntDef(flag = true, prefix = { "RECOGNITION_FLAG_" }, value = {
+            RECOGNITION_FLAG_NONE,
+            RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO,
+            RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS
+    })
     public @interface RecognitionFlags {}
 
     /**
@@ -150,11 +149,10 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {
-                RECOGNITION_MODE_VOICE_TRIGGER,
-                RECOGNITION_MODE_USER_IDENTIFICATION,
-            })
+    @IntDef(flag = true, prefix = { "RECOGNITION_MODE_" }, value = {
+            RECOGNITION_MODE_VOICE_TRIGGER,
+            RECOGNITION_MODE_USER_IDENTIFICATION,
+    })
     public @interface RecognitionModes {}
 
     /**
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 763ea2c..01562b3 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -80,8 +80,15 @@
     public static final int STOPPED = -2;
 
     /** @hide */
-    @IntDef({ERROR_SYNTHESIS, ERROR_SERVICE, ERROR_OUTPUT, ERROR_NETWORK, ERROR_NETWORK_TIMEOUT,
-             ERROR_INVALID_REQUEST, ERROR_NOT_INSTALLED_YET})
+    @IntDef(prefix = { "ERROR_" }, value = {
+            ERROR_SYNTHESIS,
+            ERROR_SERVICE,
+            ERROR_OUTPUT,
+            ERROR_NETWORK,
+            ERROR_NETWORK_TIMEOUT,
+            ERROR_INVALID_REQUEST,
+            ERROR_NOT_INSTALLED_YET
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Error {}
 
diff --git a/core/java/android/text/FontConfig.java b/core/java/android/text/FontConfig.java
index 4654e83..7386e3e 100644
--- a/core/java/android/text/FontConfig.java
+++ b/core/java/android/text/FontConfig.java
@@ -179,7 +179,11 @@
 
         /** @hide */
         @Retention(SOURCE)
-        @IntDef({VARIANT_DEFAULT, VARIANT_COMPACT, VARIANT_ELEGANT})
+        @IntDef(prefix = { "VARIANT_" }, value = {
+                VARIANT_DEFAULT,
+                VARIANT_COMPACT,
+                VARIANT_ELEGANT
+        })
         public @interface Variant {}
 
         /**
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 2a693a1..bf4b6ac 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -48,7 +48,11 @@
  */
 public abstract class Layout {
     /** @hide */
-    @IntDef({BREAK_STRATEGY_SIMPLE, BREAK_STRATEGY_HIGH_QUALITY, BREAK_STRATEGY_BALANCED})
+    @IntDef(prefix = { "BREAK_STRATEGY_" }, value = {
+            BREAK_STRATEGY_SIMPLE,
+            BREAK_STRATEGY_HIGH_QUALITY,
+            BREAK_STRATEGY_BALANCED
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface BreakStrategy {}
 
@@ -73,8 +77,11 @@
     public static final int BREAK_STRATEGY_BALANCED = 2;
 
     /** @hide */
-    @IntDef({HYPHENATION_FREQUENCY_NORMAL, HYPHENATION_FREQUENCY_FULL,
-             HYPHENATION_FREQUENCY_NONE})
+    @IntDef(prefix = { "HYPHENATION_FREQUENCY_" }, value = {
+            HYPHENATION_FREQUENCY_NORMAL,
+            HYPHENATION_FREQUENCY_FULL,
+            HYPHENATION_FREQUENCY_NONE
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface HyphenationFrequency {}
 
@@ -105,7 +112,10 @@
         ArrayUtils.emptyArray(ParagraphStyle.class);
 
     /** @hide */
-    @IntDef({JUSTIFICATION_MODE_NONE, JUSTIFICATION_MODE_INTER_WORD})
+    @IntDef(prefix = { "JUSTIFICATION_MODE_" }, value = {
+            JUSTIFICATION_MODE_NONE,
+            JUSTIFICATION_MODE_INTER_WORD
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface JustificationMode {}
 
@@ -2267,7 +2277,10 @@
     private int mJustificationMode;
 
     /** @hide */
-    @IntDef({DIR_LEFT_TO_RIGHT, DIR_RIGHT_TO_LEFT})
+    @IntDef(prefix = { "DIR_" }, value = {
+            DIR_LEFT_TO_RIGHT,
+            DIR_RIGHT_TO_LEFT
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Direction {}
 
@@ -2308,7 +2321,10 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT, TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT})
+    @IntDef(prefix = { "TEXT_SELECTION_LAYOUT_" }, value = {
+            TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT,
+            TEXT_SELECTION_LAYOUT_LEFT_TO_RIGHT
+    })
     public @interface TextSelectionLayout {}
 
     /** @hide */
diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java
index 5b851ca..f0838a1 100644
--- a/core/java/android/transition/Visibility.java
+++ b/core/java/android/transition/Visibility.java
@@ -52,7 +52,10 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag=true, value={MODE_IN, MODE_OUT})
+    @IntDef(flag = true, prefix = { "MODE_" }, value = {
+            MODE_IN,
+            MODE_OUT
+    })
     @interface VisibilityMode {}
 
     /**
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 9673be0..5bd7446 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -1323,10 +1323,10 @@
         public static final int HDR_TYPE_HLG = 3;
 
         /** @hide */
-        @IntDef({
-            HDR_TYPE_DOLBY_VISION,
-            HDR_TYPE_HDR10,
-            HDR_TYPE_HLG,
+        @IntDef(prefix = { "HDR_TYPE_" }, value = {
+                HDR_TYPE_DOLBY_VISION,
+                HDR_TYPE_HDR10,
+                HDR_TYPE_HLG,
         })
         @Retention(RetentionPolicy.SOURCE)
         public @interface HdrType {}
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index ddced6c..a417a4a0 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -121,8 +121,12 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({SCALING_MODE_FREEZE, SCALING_MODE_SCALE_TO_WINDOW,
-                    SCALING_MODE_SCALE_CROP, SCALING_MODE_NO_SCALE_CROP})
+    @IntDef(prefix = { "SCALING_MODE_" }, value = {
+            SCALING_MODE_FREEZE,
+            SCALING_MODE_SCALE_TO_WINDOW,
+            SCALING_MODE_SCALE_CROP,
+            SCALING_MODE_NO_SCALE_CROP
+    })
     public @interface ScalingMode {}
     // From system/window.h
     /** @hide */
@@ -135,7 +139,12 @@
     public static final int SCALING_MODE_NO_SCALE_CROP = 3;
 
     /** @hide */
-    @IntDef({ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_270})
+    @IntDef(prefix = { "ROTATION_" }, value = {
+            ROTATION_0,
+            ROTATION_90,
+            ROTATION_180,
+            ROTATION_270
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Rotation {}
 
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 357b8d9..268e460 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -30,6 +30,7 @@
 import android.graphics.GraphicBuffer;
 import android.graphics.PixelFormat;
 import android.graphics.Matrix;
+import android.graphics.Point;
 import android.graphics.Rect;
 import android.graphics.Region;
 import android.os.IBinder;
@@ -37,8 +38,12 @@
 import android.os.Parcelable;
 import android.os.Process;
 import android.os.UserHandle;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.view.Surface.OutOfResourcesException;
+
+import com.android.internal.annotations.GuardedBy;
+
 import dalvik.system.CloseGuard;
 import libcore.util.NativeAllocationRegistry;
 
@@ -153,6 +158,13 @@
     private final String mName;
     long mNativeObject; // package visibility only for Surface.java access
 
+    // TODO: Move this to native.
+    private final Object mSizeLock = new Object();
+    @GuardedBy("mSizeLock")
+    private int mWidth;
+    @GuardedBy("mSizeLock")
+    private int mHeight;
+
     static Transaction sGlobalTransaction;
     static long sTransactionNestCount = 0;
 
@@ -567,6 +579,8 @@
         }
 
         mName = name;
+        mWidth = w;
+        mHeight = h;
         mNativeObject = nativeCreate(session, name, w, h, format, flags,
             parent != null ? parent.mNativeObject : 0, windowType, ownerUid);
         if (mNativeObject == 0) {
@@ -582,6 +596,8 @@
     // event logging.
     public SurfaceControl(SurfaceControl other) {
         mName = other.mName;
+        mWidth = other.mWidth;
+        mHeight = other.mHeight;
         mNativeObject = other.mNativeObject;
         other.mCloseGuard.close();
         other.mNativeObject = 0;
@@ -590,6 +606,8 @@
 
     private SurfaceControl(Parcel in) {
         mName = in.readString();
+        mWidth = in.readInt();
+        mHeight = in.readInt();
         mNativeObject = nativeReadFromParcel(in);
         if (mNativeObject == 0) {
             throw new IllegalArgumentException("Couldn't read SurfaceControl from parcel=" + in);
@@ -605,6 +623,8 @@
     @Override
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeString(mName);
+        dest.writeInt(mWidth);
+        dest.writeInt(mHeight);
         nativeWriteToParcel(mNativeObject, dest);
     }
 
@@ -922,6 +942,18 @@
         }
     }
 
+    public int getWidth() {
+        synchronized (mSizeLock) {
+            return mWidth;
+        }
+    }
+
+    public int getHeight() {
+        synchronized (mSizeLock) {
+            return mHeight;
+        }
+    }
+
     @Override
     public String toString() {
         return "Surface(name=" + mName + ")/@0x" +
@@ -1282,6 +1314,7 @@
                 nativeGetNativeTransactionFinalizer(), 512);
         private long mNativeObject;
 
+        private final ArrayMap<SurfaceControl, Point> mResizedSurfaces = new ArrayMap<>();
         Runnable mFreeNativeResources;
 
         public Transaction() {
@@ -1312,9 +1345,22 @@
          * Jankier version of apply. Avoid use (b/28068298).
          */
         public void apply(boolean sync) {
+            applyResizedSurfaces();
             nativeApplyTransaction(mNativeObject, sync);
         }
 
+        private void applyResizedSurfaces() {
+            for (int i = mResizedSurfaces.size() - 1; i >= 0; i--) {
+                final Point size = mResizedSurfaces.valueAt(i);
+                final SurfaceControl surfaceControl = mResizedSurfaces.keyAt(i);
+                synchronized (surfaceControl.mSizeLock) {
+                    surfaceControl.mWidth = size.x;
+                    surfaceControl.mHeight = size.y;
+                }
+            }
+            mResizedSurfaces.clear();
+        }
+
         public Transaction show(SurfaceControl sc) {
             sc.checkNotReleased();
             nativeSetFlags(mNativeObject, sc.mNativeObject, 0, SURFACE_HIDDEN);
@@ -1335,6 +1381,7 @@
 
         public Transaction setSize(SurfaceControl sc, int w, int h) {
             sc.checkNotReleased();
+            mResizedSurfaces.put(sc, new Point(w, h));
             nativeSetSize(mNativeObject, sc.mNativeObject, w, h);
             return this;
         }
@@ -1567,6 +1614,8 @@
          * other transaction as if it had been applied.
          */
         public Transaction merge(Transaction other) {
+            mResizedSurfaces.putAll(other.mResizedSurfaces);
+            other.mResizedSurfaces.clear();
             nativeMergeTransaction(mNativeObject, other.mNativeObject);
             return this;
         }
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 0a69772..6a8f8b1 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -344,8 +344,10 @@
     private static final int FLAG_DUMP_FRAMESTATS   = 1 << 0;
     private static final int FLAG_DUMP_RESET        = 1 << 1;
 
-    @IntDef(flag = true, value = {
-            FLAG_DUMP_FRAMESTATS, FLAG_DUMP_RESET })
+    @IntDef(flag = true, prefix = { "FLAG_DUMP_" }, value = {
+            FLAG_DUMP_FRAMESTATS,
+            FLAG_DUMP_RESET
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DumpFlags {}
 
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 623759e..02beee0 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -1178,7 +1178,7 @@
     private AutofillId mAutofillId;
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "AUTOFILL_TYPE_" }, value = {
             AUTOFILL_TYPE_NONE,
             AUTOFILL_TYPE_TEXT,
             AUTOFILL_TYPE_TOGGLE,
@@ -1249,7 +1249,7 @@
     public static final int AUTOFILL_TYPE_DATE = 4;
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "IMPORTANT_FOR_AUTOFILL_" }, value = {
             IMPORTANT_FOR_AUTOFILL_AUTO,
             IMPORTANT_FOR_AUTOFILL_YES,
             IMPORTANT_FOR_AUTOFILL_NO,
@@ -1300,9 +1300,9 @@
     public static final int IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS = 0x8;
 
     /** @hide */
-    @IntDef(
-            flag = true,
-            value = {AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS})
+    @IntDef(flag = true, prefix = { "AUTOFILL_FLAG_" }, value = {
+            AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface AutofillFlags {}
 
@@ -1452,7 +1452,11 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({DRAWING_CACHE_QUALITY_LOW, DRAWING_CACHE_QUALITY_HIGH, DRAWING_CACHE_QUALITY_AUTO})
+    @IntDef(prefix = { "DRAWING_CACHE_QUALITY_" }, value = {
+            DRAWING_CACHE_QUALITY_LOW,
+            DRAWING_CACHE_QUALITY_HIGH,
+            DRAWING_CACHE_QUALITY_AUTO
+    })
     public @interface DrawingCacheQuality {}
 
     /**
@@ -1551,13 +1555,12 @@
      */
     static final int CONTEXT_CLICKABLE = 0x00800000;
 
-
     /** @hide */
-    @IntDef({
-        SCROLLBARS_INSIDE_OVERLAY,
-        SCROLLBARS_INSIDE_INSET,
-        SCROLLBARS_OUTSIDE_OVERLAY,
-        SCROLLBARS_OUTSIDE_INSET
+    @IntDef(prefix = { "SCROLLBARS_" }, value = {
+            SCROLLBARS_INSIDE_OVERLAY,
+            SCROLLBARS_INSIDE_INSET,
+            SCROLLBARS_OUTSIDE_OVERLAY,
+            SCROLLBARS_OUTSIDE_INSET
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ScrollBarStyle {}
@@ -1651,11 +1654,10 @@
     static final int TOOLTIP = 0x40000000;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                FOCUSABLES_ALL,
-                FOCUSABLES_TOUCH_MODE
-            })
+    @IntDef(flag = true, prefix = { "FOCUSABLES_" }, value = {
+            FOCUSABLES_ALL,
+            FOCUSABLES_TOUCH_MODE
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface FocusableMode {}
 
@@ -1672,7 +1674,7 @@
     public static final int FOCUSABLES_TOUCH_MODE = 0x00000001;
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "FOCUS_" }, value = {
             FOCUS_BACKWARD,
             FOCUS_FORWARD,
             FOCUS_LEFT,
@@ -1684,7 +1686,7 @@
     public @interface FocusDirection {}
 
     /** @hide */
-    @IntDef({
+    @IntDef(prefix = { "FOCUS_" }, value = {
             FOCUS_LEFT,
             FOCUS_UP,
             FOCUS_RIGHT,
@@ -2426,20 +2428,20 @@
     static final int PFLAG2_DRAG_HOVERED               = 0x00000002;
 
     /** @hide */
-    @IntDef({
-        LAYOUT_DIRECTION_LTR,
-        LAYOUT_DIRECTION_RTL,
-        LAYOUT_DIRECTION_INHERIT,
-        LAYOUT_DIRECTION_LOCALE
+    @IntDef(prefix = { "LAYOUT_DIRECTION_" }, value = {
+            LAYOUT_DIRECTION_LTR,
+            LAYOUT_DIRECTION_RTL,
+            LAYOUT_DIRECTION_INHERIT,
+            LAYOUT_DIRECTION_LOCALE
     })
     @Retention(RetentionPolicy.SOURCE)
     // Not called LayoutDirection to avoid conflict with android.util.LayoutDirection
     public @interface LayoutDir {}
 
     /** @hide */
-    @IntDef({
-        LAYOUT_DIRECTION_LTR,
-        LAYOUT_DIRECTION_RTL
+    @IntDef(prefix = { "LAYOUT_DIRECTION_" }, value = {
+            LAYOUT_DIRECTION_LTR,
+            LAYOUT_DIRECTION_RTL
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ResolvedLayoutDir {}
@@ -2645,14 +2647,14 @@
             TEXT_DIRECTION_RESOLVED_DEFAULT << PFLAG2_TEXT_DIRECTION_RESOLVED_MASK_SHIFT;
 
     /** @hide */
-    @IntDef({
-        TEXT_ALIGNMENT_INHERIT,
-        TEXT_ALIGNMENT_GRAVITY,
-        TEXT_ALIGNMENT_CENTER,
-        TEXT_ALIGNMENT_TEXT_START,
-        TEXT_ALIGNMENT_TEXT_END,
-        TEXT_ALIGNMENT_VIEW_START,
-        TEXT_ALIGNMENT_VIEW_END
+    @IntDef(prefix = { "TEXT_ALIGNMENT_" }, value = {
+            TEXT_ALIGNMENT_INHERIT,
+            TEXT_ALIGNMENT_GRAVITY,
+            TEXT_ALIGNMENT_CENTER,
+            TEXT_ALIGNMENT_TEXT_START,
+            TEXT_ALIGNMENT_TEXT_END,
+            TEXT_ALIGNMENT_VIEW_START,
+            TEXT_ALIGNMENT_VIEW_END
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface TextAlignment {}
@@ -3049,15 +3051,14 @@
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {
-                    SCROLL_INDICATOR_TOP,
-                    SCROLL_INDICATOR_BOTTOM,
-                    SCROLL_INDICATOR_LEFT,
-                    SCROLL_INDICATOR_RIGHT,
-                    SCROLL_INDICATOR_START,
-                    SCROLL_INDICATOR_END,
-            })
+    @IntDef(flag = true, prefix = { "SCROLL_INDICATOR_" }, value = {
+            SCROLL_INDICATOR_TOP,
+            SCROLL_INDICATOR_BOTTOM,
+            SCROLL_INDICATOR_LEFT,
+            SCROLL_INDICATOR_RIGHT,
+            SCROLL_INDICATOR_START,
+            SCROLL_INDICATOR_END,
+    })
     public @interface ScrollIndicators {}
 
     /**
@@ -3683,8 +3684,10 @@
             | SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = { FIND_VIEWS_WITH_TEXT, FIND_VIEWS_WITH_CONTENT_DESCRIPTION })
+    @IntDef(flag = true, prefix = { "FIND_VIEWS_" }, value = {
+            FIND_VIEWS_WITH_TEXT,
+            FIND_VIEWS_WITH_CONTENT_DESCRIPTION
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface FindViewFlags {}
 
@@ -4296,6 +4299,38 @@
          */
         Runnable mShowTooltipRunnable;
         Runnable mHideTooltipRunnable;
+
+        /**
+         * Hover move is ignored if it is within this distance in pixels from the previous one.
+         */
+        int mHoverSlop;
+
+        /**
+         * Update the anchor position if it significantly (that is by at least mHoverSlop)
+         * different from the previously stored position. Ignoring insignificant changes
+         * filters out the jitter which is typical for such input sources as stylus.
+         *
+         * @return True if the position has been updated.
+         */
+        private boolean updateAnchorPos(MotionEvent event) {
+            final int newAnchorX = (int) event.getX();
+            final int newAnchorY = (int) event.getY();
+            if (Math.abs(newAnchorX - mAnchorX) <= mHoverSlop
+                    && Math.abs(newAnchorY - mAnchorY) <= mHoverSlop) {
+                return false;
+            }
+            mAnchorX = newAnchorX;
+            mAnchorY = newAnchorY;
+            return true;
+        }
+
+        /**
+         *  Clear the anchor position to ensure that the next change is considered significant.
+         */
+        private void clearAnchorPos() {
+            mAnchorX = Integer.MAX_VALUE;
+            mAnchorY = Integer.MAX_VALUE;
+        }
     }
 
     TooltipInfo mTooltipInfo;
@@ -26813,6 +26848,8 @@
                 mTooltipInfo = new TooltipInfo();
                 mTooltipInfo.mShowTooltipRunnable = this::showHoverTooltip;
                 mTooltipInfo.mHideTooltipRunnable = this::hideTooltip;
+                mTooltipInfo.mHoverSlop = ViewConfiguration.get(mContext).getScaledHoverSlop();
+                mTooltipInfo.clearAnchorPos();
             }
             mTooltipInfo.mTooltipText = tooltipText;
         }
@@ -26879,6 +26916,7 @@
         mTooltipInfo.mTooltipPopup.hide();
         mTooltipInfo.mTooltipPopup = null;
         mTooltipInfo.mTooltipFromLongClick = false;
+        mTooltipInfo.clearAnchorPos();
         if (mAttachInfo != null) {
             mAttachInfo.mTooltipHost = null;
         }
@@ -26903,11 +26941,9 @@
                 if ((mViewFlags & TOOLTIP) != TOOLTIP || (mViewFlags & ENABLED_MASK) != ENABLED) {
                     break;
                 }
-                if (!mTooltipInfo.mTooltipFromLongClick) {
+                if (!mTooltipInfo.mTooltipFromLongClick && mTooltipInfo.updateAnchorPos(event)) {
                     if (mTooltipInfo.mTooltipPopup == null) {
                         // Schedule showing the tooltip after a timeout.
-                        mTooltipInfo.mAnchorX = (int) event.getX();
-                        mTooltipInfo.mAnchorY = (int) event.getY();
                         removeCallbacks(mTooltipInfo.mShowTooltipRunnable);
                         postDelayed(mTooltipInfo.mShowTooltipRunnable,
                                 ViewConfiguration.getHoverTooltipShowTimeout());
@@ -26929,6 +26965,7 @@
                 return true;
 
             case MotionEvent.ACTION_HOVER_EXIT:
+                mTooltipInfo.clearAnchorPos();
                 if (!mTooltipInfo.mTooltipFromLongClick) {
                     hideTooltip();
                 }
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index c44c8dd..c5a94da 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -290,6 +290,7 @@
     private final int mMaximumFlingVelocity;
     private final int mScrollbarSize;
     private final int mTouchSlop;
+    private final int mHoverSlop;
     private final int mMinScrollbarTouchTarget;
     private final int mDoubleTapTouchSlop;
     private final int mPagingTouchSlop;
@@ -320,6 +321,7 @@
         mMaximumFlingVelocity = MAXIMUM_FLING_VELOCITY;
         mScrollbarSize = SCROLL_BAR_SIZE;
         mTouchSlop = TOUCH_SLOP;
+        mHoverSlop = TOUCH_SLOP / 2;
         mMinScrollbarTouchTarget = MIN_SCROLLBAR_TOUCH_TARGET;
         mDoubleTapTouchSlop = DOUBLE_TAP_TOUCH_SLOP;
         mPagingTouchSlop = PAGING_TOUCH_SLOP;
@@ -407,6 +409,8 @@
                 com.android.internal.R.bool.config_ui_enableFadingMarquee);
         mTouchSlop = res.getDimensionPixelSize(
                 com.android.internal.R.dimen.config_viewConfigurationTouchSlop);
+        mHoverSlop = res.getDimensionPixelSize(
+                com.android.internal.R.dimen.config_viewConfigurationHoverSlop);
         mMinScrollbarTouchTarget = res.getDimensionPixelSize(
                 com.android.internal.R.dimen.config_minScrollbarTouchTarget);
         mPagingTouchSlop = mTouchSlop * 2;
@@ -640,6 +644,14 @@
     }
 
     /**
+     * @return Distance in pixels a hover can wander while it is still considered "stationary".
+     *
+     */
+    public int getScaledHoverSlop() {
+        return mHoverSlop;
+    }
+
+    /**
      * @return Distance in pixels the first touch can wander before we do not consider this a
      * potential double tap event
      * @hide
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index ce3022e..012e864 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1746,7 +1746,7 @@
          * @hide
          */
         @Retention(RetentionPolicy.SOURCE)
-        @IntDef(flag = true, value = {
+        @IntDef(flag = true, prefix = { "SOFT_INPUT_" }, value = {
                 SOFT_INPUT_STATE_UNSPECIFIED,
                 SOFT_INPUT_STATE_UNCHANGED,
                 SOFT_INPUT_STATE_HIDDEN,
diff --git a/core/java/android/view/accessibility/AccessibilityRequestPreparer.java b/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
index 889feb9..25f830a 100644
--- a/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
+++ b/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
@@ -44,10 +44,9 @@
     public static final int REQUEST_TYPE_EXTRA_DATA = 0x00000001;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                REQUEST_TYPE_EXTRA_DATA
-            })
+    @IntDef(flag = true, prefix = { "REQUEST_TYPE_" }, value = {
+            REQUEST_TYPE_EXTRA_DATA
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface RequestTypes {}
 
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 419aeb3..6d84aa0 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -1987,7 +1987,11 @@
     public abstract static class AutofillCallback {
 
         /** @hide */
-        @IntDef({EVENT_INPUT_SHOWN, EVENT_INPUT_HIDDEN, EVENT_INPUT_UNAVAILABLE})
+        @IntDef(prefix = { "EVENT_INPUT_" }, value = {
+                EVENT_INPUT_SHOWN,
+                EVENT_INPUT_HIDDEN,
+                EVENT_INPUT_UNAVAILABLE
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface AutofillEventType {}
 
diff --git a/core/java/android/webkit/TracingConfig.java b/core/java/android/webkit/TracingConfig.java
new file mode 100644
index 0000000..75e2bf7
--- /dev/null
+++ b/core/java/android/webkit/TracingConfig.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 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.webkit;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Holds tracing configuration information and predefined settings.
+ */
+public class TracingConfig {
+
+    private final String mCustomCategoryPattern;
+    private final @PresetCategories int mPresetCategories;
+    private @TracingMode int mTracingMode;
+
+    /** @hide */
+    @IntDef({CATEGORIES_NONE, CATEGORIES_WEB_DEVELOPER, CATEGORIES_INPUT_LATENCY,
+            CATEGORIES_RENDERING, CATEGORIES_JAVASCRIPT_AND_RENDERING, CATEGORIES_FRAME_VIEWER})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface PresetCategories {}
+
+    /**
+     * Indicates that there are no preset categories.
+     */
+    public static final int CATEGORIES_NONE = -1;
+
+    /**
+     * Predefined categories typically useful for web developers.
+     * Typically includes blink, compositor, renderer.scheduler and v8 categories.
+     */
+    public static final int CATEGORIES_WEB_DEVELOPER = 0;
+
+    /**
+     * Predefined categories for analyzing input latency issues.
+     * Typically includes input, renderer.scheduler categories.
+     */
+    public static final int CATEGORIES_INPUT_LATENCY = 1;
+
+    /**
+     * Predefined categories for analyzing rendering issues.
+     * Typically includes blink, compositor and gpu categories.
+     */
+    public static final int CATEGORIES_RENDERING = 2;
+
+    /**
+     * Predefined categories for analyzing javascript and rendering issues.
+     * Typically includes blink, compositor, gpu, renderer.schduler and v8 categories.
+     */
+    public static final int CATEGORIES_JAVASCRIPT_AND_RENDERING = 3;
+
+    /**
+     * Predefined categories for studying difficult rendering performance problems.
+     * Typically includes blink, compositor, gpu, renderer.scheduler, v8 and
+     * some other compositor categories which are disabled by default.
+     */
+    public static final int CATEGORIES_FRAME_VIEWER = 4;
+
+    /** @hide */
+    @IntDef({RECORD_UNTIL_FULL, RECORD_CONTINUOUSLY, RECORD_UNTIL_FULL_LARGE_BUFFER,
+            RECORD_TO_CONSOLE})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface TracingMode {}
+
+    /**
+     * Record trace events until the internal tracing buffer is full. Default tracing mode.
+     * Typically the buffer memory usage is between {@link #RECORD_CONTINUOUSLY} and the
+     * {@link #RECORD_UNTIL_FULL_LARGE_BUFFER}. Depending on the implementation typically allows
+     * up to 256k events to be stored.
+     */
+    public static final int RECORD_UNTIL_FULL = 0;
+
+    /**
+     * Record trace events continuously using an internal ring buffer. Overwrites
+     * old events if they exceed buffer capacity. Uses less memory than both
+     * {@link #RECORD_UNTIL_FULL} and {@link #RECORD_UNTIL_FULL_LARGE_BUFFER} modes.
+     * Depending on the implementation typically allows up to 64k events to be stored.
+     */
+    public static final int RECORD_CONTINUOUSLY = 1;
+
+    /**
+     * Record trace events using a larger internal tracing buffer until it is full.
+     * Uses more memory than the other modes and may not be suitable on devices
+     * with smaller RAM. Depending on the implementation typically allows up to
+     * 512 million events to be stored.
+     */
+    public static final int RECORD_UNTIL_FULL_LARGE_BUFFER = 2;
+
+    /**
+     * Record trace events to console (logcat). The events are discarded and nothing
+     * is sent back to the caller. Uses the least memory as compared to the other modes.
+     */
+    public static final int RECORD_TO_CONSOLE = 3;
+
+    /**
+     * Create config with the preset categories.
+     * <p>
+     * Example:
+     *    TracingConfig(CATEGORIES_WEB_DEVELOPER) -- records trace events from the "web developer"
+     *                                               preset categories.
+     *
+     * @param presetCategories preset categories to use, one of {@link #CATEGORIES_WEB_DEVELOPER},
+     *                    {@link #CATEGORIES_INPUT_LATENCY}, {@link #CATEGORIES_RENDERING},
+     *                    {@link #CATEGORIES_JAVASCRIPT_AND_RENDERING} or
+     *                    {@link #CATEGORIES_FRAME_VIEWER}.
+     *
+     * Note: for specifying custom categories without presets use
+     * {@link #TracingConfig(int, String, int)}.
+     *
+     */
+    public TracingConfig(@PresetCategories int presetCategories) {
+        this(presetCategories, "", RECORD_UNTIL_FULL);
+    }
+
+    /**
+     * Create a configuration with both preset categories and custom categories.
+     * Also allows to specify the tracing mode.
+     *
+     * Note that the categories are defined by the currently-in-use version of WebView. They live
+     * in chromium code and are not part of the Android API. See
+     * See <a href="https://www.chromium.org/developers/how-tos/trace-event-profiling-tool">
+     * chromium documentation on tracing</a> for more details.
+     *
+     * <p>
+     * Examples:
+     *
+     *  Preset category with a specified trace mode:
+     *    TracingConfig(CATEGORIES_WEB_DEVELOPER, "", RECORD_UNTIL_FULL_LARGE_BUFFER);
+     *  Custom categories:
+     *    TracingConfig(CATEGORIES_NONE, "browser", RECORD_UNTIL_FULL)
+     *      -- records only the trace events from the "browser" category.
+     *    TraceConfig(CATEGORIES_NONE, "-input,-gpu", RECORD_UNTIL_FULL)
+     *      -- records all trace events excluding the events from the "input" and 'gpu' categories.
+     *    TracingConfig(CATEGORIES_NONE, "blink*,devtools*", RECORD_UNTIL_FULL)
+     *      -- records only the trace events matching the "blink*" and "devtools*" patterns
+     *         (e.g. "blink_gc" and "devtools.timeline" categories).
+     *
+     *  Combination of preset and additional custom categories:
+     *    TracingConfig(CATEGORIES_WEB_DEVELOPER, "memory-infra", RECORD_CONTINUOUSLY)
+     *      -- records events from the "web developer" categories and events from the "memory-infra"
+     *         category to understand where memory is being used.
+     *
+     * @param presetCategories preset categories to use, one of {@link #CATEGORIES_WEB_DEVELOPER},
+     *                    {@link #CATEGORIES_INPUT_LATENCY}, {@link #CATEGORIES_RENDERING},
+     *                    {@link #CATEGORIES_JAVASCRIPT_AND_RENDERING} or
+     *                    {@link #CATEGORIES_FRAME_VIEWER}.
+     * @param customCategories a comma-delimited list of category wildcards. A category can
+     *                         have an optional '-' prefix to make it an excluded category.
+     * @param tracingMode tracing mode to use, one of {@link #RECORD_UNTIL_FULL},
+     *                    {@link #RECORD_CONTINUOUSLY}, {@link #RECORD_UNTIL_FULL_LARGE_BUFFER}
+     *                    or {@link #RECORD_TO_CONSOLE}.
+     */
+    public TracingConfig(@PresetCategories int presetCategories,
+            @NonNull String customCategories, @TracingMode int tracingMode) {
+        mPresetCategories = presetCategories;
+        mCustomCategoryPattern = customCategories;
+        mTracingMode = RECORD_UNTIL_FULL;
+    }
+
+    /**
+     * Returns the custom category pattern for this configuration.
+     *
+     * @return empty string if no custom category pattern is specified.
+     */
+    @NonNull
+    public String getCustomCategoryPattern() {
+        return mCustomCategoryPattern;
+    }
+
+    /**
+     * Returns the preset categories value of this configuration.
+     */
+    @PresetCategories
+    public int getPresetCategories() {
+        return mPresetCategories;
+    }
+
+    /**
+     * Returns the tracing mode of this configuration.
+     */
+    @TracingMode
+    public int getTracingMode() {
+        return mTracingMode;
+    }
+
+}
diff --git a/core/java/android/webkit/TracingController.java b/core/java/android/webkit/TracingController.java
new file mode 100644
index 0000000..cadb8a1
--- /dev/null
+++ b/core/java/android/webkit/TracingController.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 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.webkit;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Handler;
+
+/**
+ * Manages tracing of WebViews. In particular provides functionality for the app
+ * to enable/disable tracing of parts of code and to collect tracing data.
+ * This is useful for profiling performance issues, debugging and memory usage
+ * analysis in production and real life scenarios.
+ * <p>
+ * The resulting trace data is sent back as a byte sequence in json format. This
+ * file can be loaded in "chrome://tracing" for further analysis.
+ * <p>
+ * Note: All methods in this class must be called on the UI thread. All callbacks
+ * are also called on the UI thread.
+ * <p>
+ * Example usage:
+ * <pre class="prettyprint">
+ * TracingController tracingController = TracingController.getInstance();
+ * tracingController.start(new TraceConfig(CATEGORIES_WEB_DEVELOPER));
+ * [..]
+ * tracingController.stopAndFlush(new TraceFileOutput("trace.json"), null);
+ * </pre></p>
+ */
+public abstract class TracingController {
+
+    /**
+     * Interface for capturing tracing data.
+     */
+    public interface TracingOutputStream {
+        /**
+         * Will be called to return tracing data in chunks.
+         * Tracing data is returned in json format an array of bytes.
+         */
+        void write(byte[] chunk);
+
+        /**
+         * Called when tracing is finished and the data collection is over.
+         * There will be no calls to #write after #complete is called.
+         */
+        void complete();
+    }
+
+    /**
+     * Returns the default TracingController instance. At present there is
+     * only one TracingController instance for all WebView instances,
+     * however this restriction may be relaxed in the future.
+     *
+     * @return the default TracingController instance
+     */
+    @NonNull
+    public static TracingController getInstance() {
+        return WebViewFactory.getProvider().getTracingController();
+    }
+
+    /**
+     * Starts tracing all webviews. Depeding on the trace mode in traceConfig
+     * specifies how the trace events are recorded.
+     *
+     * For tracing modes {@link TracingConfig#RECORD_UNTIL_FULL},
+     * {@link TracingConfig#RECORD_CONTINUOUSLY} and
+     * {@link TracingConfig#RECORD_UNTIL_FULL_LARGE_BUFFER} the events are recorded
+     * using an internal buffer and flushed to the outputStream when
+     * {@link #stopAndFlush(TracingOutputStream, Handler)} is called.
+     *
+     * @param tracingConfig configuration options to use for tracing
+     * @return false if the system is already tracing, true otherwise.
+     */
+    public abstract boolean start(TracingConfig tracingConfig);
+
+    /**
+     * Stops tracing and discards all tracing data.
+     *
+     * This method is particularly useful in conjunction with the
+     * {@link TracingConfig#RECORD_TO_CONSOLE} tracing mode because tracing data is logged to
+     * console and not sent to an outputStream as with
+     * {@link #stopAndFlush(TracingOutputStream, Handler)}.
+     *
+     * @return false if the system was not tracing at the time of the call, true
+     *         otherwise.
+     */
+    public abstract boolean stop();
+
+    /**
+     * Stops tracing and flushes tracing data to the specifid outputStream.
+     *
+     * Note that if the {@link TracingConfig#RECORD_TO_CONSOLE} tracing mode is used
+     * nothing will be sent to the outputStream and no TracingOuputStream methods will be
+     * called. In that case it is more convenient to just use {@link #stop()} instead.
+     *
+     * @param outputStream the output steam the tracing data will be sent to.
+     * @param handler the {@link android.os.Handler} on which the outputStream callbacks
+     *                will be invoked. If the handler is null the current thread's Looper
+     *                will be used.
+     * @return false if the system was not tracing at the time of the call, true
+     *         otherwise.
+     */
+    public abstract boolean stopAndFlush(TracingOutputStream outputStream,
+            @Nullable Handler handler);
+
+    /** True if the system is tracing */
+    public abstract boolean isTracing();
+
+    // TODO: consider adding getTraceBufferUsage, percentage and approx event count.
+    // TODO: consider adding String getCategories(), for obtaining the actual list
+    // of categories used (given that presets are ints).
+
+}
diff --git a/core/java/android/webkit/TracingFileOutputStream.java b/core/java/android/webkit/TracingFileOutputStream.java
new file mode 100644
index 0000000..8a5fa36
--- /dev/null
+++ b/core/java/android/webkit/TracingFileOutputStream.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 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.webkit;
+
+import android.annotation.NonNull;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Simple TracingOutputStream implementation which writes the trace data from
+ * {@link TracingController} to a new file.
+ *
+ */
+public class TracingFileOutputStream implements TracingController.TracingOutputStream {
+
+    private FileOutputStream mFileOutput;
+
+    public TracingFileOutputStream(@NonNull String filename) throws FileNotFoundException {
+        mFileOutput = new FileOutputStream(filename);
+    }
+
+    /**
+     * Writes bytes chunk to the file.
+     */
+    public void write(byte[] chunk) {
+        try {
+            mFileOutput.write(chunk);
+        } catch (IOException e) {
+            onIOException(e);
+        }
+    }
+
+    /**
+     * Closes the file.
+     */
+    public void complete() {
+        try {
+            mFileOutput.close();
+        } catch (IOException e) {
+            onIOException(e);
+        }
+    }
+
+    private void onIOException(IOException e) {
+        throw new RuntimeException(e);
+    }
+}
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index e493739..90cc481 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -122,7 +122,13 @@
     }
 
     /** @hide */
-    @IntDef({LOAD_DEFAULT, LOAD_NORMAL, LOAD_CACHE_ELSE_NETWORK, LOAD_NO_CACHE, LOAD_CACHE_ONLY})
+    @IntDef(prefix = { "LOAD_" }, value = {
+            LOAD_DEFAULT,
+            LOAD_NORMAL,
+            LOAD_CACHE_ELSE_NETWORK,
+            LOAD_NO_CACHE,
+            LOAD_CACHE_ONLY
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CacheMode {}
 
@@ -1415,13 +1421,12 @@
     /**
      * @hide
      */
-    @IntDef(flag = true,
-            value = {
-                    MENU_ITEM_NONE,
-                    MENU_ITEM_SHARE,
-                    MENU_ITEM_WEB_SEARCH,
-                    MENU_ITEM_PROCESS_TEXT
-            })
+    @IntDef(flag = true, prefix = { "MENU_ITEM_" }, value = {
+            MENU_ITEM_NONE,
+            MENU_ITEM_SHARE,
+            MENU_ITEM_WEB_SEARCH,
+            MENU_ITEM_PROCESS_TEXT
+    })
     @Retention(RetentionPolicy.SOURCE)
     @Target({ElementType.PARAMETER, ElementType.METHOD})
     private @interface MenuItemFlags {}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6f99254..e985923 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -997,6 +997,10 @@
      * hex encoding of URLs for octets outside that range. For example, '#',
      * '%', '\', '?' should be replaced by %23, %25, %27, %3f respectively.
      * <p>
+     * The {@code mimeType} parameter specifies the format of the data.
+     * If WebView can't handle the specified MIME type, it will download the data.
+     * If {@code null}, defaults to 'text/html'.
+     * <p>
      * The 'data' scheme URL formed by this method uses the default US-ASCII
      * charset. If you need need to set a different charset, you should form a
      * 'data' scheme URL which explicitly specifies a charset parameter in the
@@ -1005,8 +1009,7 @@
      * always overrides that specified in the HTML or XML document itself.
      *
      * @param data a String of data in the given encoding
-     * @param mimeType the MIMEType of the data, e.g. 'text/html'. If {@code null},
-     *                 defaults to 'text/html'.
+     * @param mimeType the MIME type of the data, e.g. 'text/html'.
      * @param encoding the encoding of the data
      */
     public void loadData(String data, @Nullable String mimeType, @Nullable String encoding) {
@@ -1020,6 +1023,10 @@
      * applying JavaScript's same origin policy. The historyUrl is used for the
      * history entry.
      * <p>
+     * The {@code mimeType} parameter specifies the format of the data.
+     * If WebView can't handle the specified MIME type, it will download the data.
+     * If {@code null}, defaults to 'text/html'.
+     * <p>
      * Note that content specified in this way can access local device files
      * (via 'file' scheme URLs) only if baseUrl specifies a scheme other than
      * 'http', 'https', 'ftp', 'ftps', 'about' or 'javascript'.
@@ -1037,8 +1044,7 @@
      * @param baseUrl the URL to use as the page's base URL. If {@code null} defaults to
      *                'about:blank'.
      * @param data a String of data in the given encoding
-     * @param mimeType the MIMEType of the data, e.g. 'text/html'. If {@code null},
-     *                 defaults to 'text/html'.
+     * @param mimeType the MIME type of the data, e.g. 'text/html'.
      * @param encoding the encoding of the data
      * @param historyUrl the URL to use as the history entry. If {@code null} defaults
      *                   to 'about:blank'. If non-null, this must be a valid URL.
@@ -2249,10 +2255,10 @@
     }
 
     /** @hide */
-    @IntDef({
-        RENDERER_PRIORITY_WAIVED,
-        RENDERER_PRIORITY_BOUND,
-        RENDERER_PRIORITY_IMPORTANT
+    @IntDef(prefix = { "RENDERER_PRIORITY_" }, value = {
+            RENDERER_PRIORITY_WAIVED,
+            RENDERER_PRIORITY_BOUND,
+            RENDERER_PRIORITY_IMPORTANT
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface RendererPriority {}
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index 46c3983..d0f9eee 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -256,11 +256,11 @@
     public static final int ERROR_UNSAFE_RESOURCE = -16;
 
     /** @hide */
-    @IntDef({
-        SAFE_BROWSING_THREAT_UNKNOWN,
-        SAFE_BROWSING_THREAT_MALWARE,
-        SAFE_BROWSING_THREAT_PHISHING,
-        SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE
+    @IntDef(prefix = { "SAFE_BROWSING_THREAT_" }, value = {
+            SAFE_BROWSING_THREAT_UNKNOWN,
+            SAFE_BROWSING_THREAT_MALWARE,
+            SAFE_BROWSING_THREAT_PHISHING,
+            SAFE_BROWSING_THREAT_UNWANTED_SOFTWARE
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface SafeBrowsingThreat {}
diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java
index 4c47abc..3ced6a5 100644
--- a/core/java/android/webkit/WebViewFactoryProvider.java
+++ b/core/java/android/webkit/WebViewFactoryProvider.java
@@ -134,6 +134,14 @@
     TokenBindingService getTokenBindingService();
 
     /**
+     * Gets the TracingController instance for this WebView implementation. The
+     * implementation must return the same instance on subsequent calls.
+     *
+     * @return the TracingController instance
+     */
+    TracingController getTracingController();
+
+    /**
      * Gets the ServiceWorkerController instance for this WebView implementation. The
      * implementation must return the same instance on subsequent calls.
      *
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index dfb3642..b2b93fa 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -107,7 +107,10 @@
     public static final int MODE_CALENDAR = 2;
 
     /** @hide */
-    @IntDef({MODE_SPINNER, MODE_CALENDAR})
+    @IntDef(prefix = { "MODE_" }, value = {
+            MODE_SPINNER,
+            MODE_CALENDAR
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DatePickerMode {}
 
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index e065dc1..a440398 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -4924,7 +4924,10 @@
     }
 
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({HANDLE_TYPE_SELECTION_START, HANDLE_TYPE_SELECTION_END})
+    @IntDef(prefix = { "HANDLE_TYPE_" }, value = {
+            HANDLE_TYPE_SELECTION_START,
+            HANDLE_TYPE_SELECTION_END
+    })
     public @interface HandleType {}
     public static final int HANDLE_TYPE_SELECTION_START = 0;
     public static final int HANDLE_TYPE_SELECTION_END = 1;
@@ -6129,7 +6132,11 @@
         }
 
         @Retention(RetentionPolicy.SOURCE)
-        @IntDef({MERGE_EDIT_MODE_FORCE_MERGE, MERGE_EDIT_MODE_NEVER_MERGE, MERGE_EDIT_MODE_NORMAL})
+        @IntDef(prefix = { "MERGE_EDIT_MODE_" }, value = {
+                MERGE_EDIT_MODE_FORCE_MERGE,
+                MERGE_EDIT_MODE_NEVER_MERGE,
+                MERGE_EDIT_MODE_NORMAL
+        })
         private @interface MergeMode {}
         private static final int MERGE_EDIT_MODE_FORCE_MERGE = 0;
         private static final int MERGE_EDIT_MODE_NEVER_MERGE = 1;
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index cbd1e0a..012b918 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -172,7 +172,10 @@
     // Public constants
 
     /** @hide */
-    @IntDef({HORIZONTAL, VERTICAL})
+    @IntDef(prefix = { "HORIZONTAL", "VERTICAL" }, value = {
+            HORIZONTAL,
+            VERTICAL
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Orientation {}
 
@@ -198,7 +201,10 @@
     public static final int UNDEFINED = Integer.MIN_VALUE;
 
     /** @hide */
-    @IntDef({ALIGN_BOUNDS, ALIGN_MARGINS})
+    @IntDef(prefix = { "ALIGN_" }, value = {
+            ALIGN_BOUNDS,
+            ALIGN_MARGINS
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface AlignmentMode {}
 
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index fcb44af..1ec9b2f 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -65,7 +65,12 @@
 @RemoteView
 public class GridView extends AbsListView {
     /** @hide */
-    @IntDef({NO_STRETCH, STRETCH_SPACING, STRETCH_COLUMN_WIDTH, STRETCH_SPACING_UNIFORM})
+    @IntDef(prefix = { "NO_STRETCH", "STRETCH_" }, value = {
+            NO_STRETCH,
+            STRETCH_SPACING,
+            STRETCH_COLUMN_WIDTH,
+            STRETCH_SPACING_UNIFORM
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface StretchMode {}
 
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 380bf7a..7ea1f1e 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -95,13 +95,12 @@
     public static final int VERTICAL = 1;
 
     /** @hide */
-    @IntDef(flag = true,
-            value = {
-                SHOW_DIVIDER_NONE,
-                SHOW_DIVIDER_BEGINNING,
-                SHOW_DIVIDER_MIDDLE,
-                SHOW_DIVIDER_END
-            })
+    @IntDef(flag = true, prefix = { "SHOW_DIVIDER_" }, value = {
+            SHOW_DIVIDER_NONE,
+            SHOW_DIVIDER_BEGINNING,
+            SHOW_DIVIDER_MIDDLE,
+            SHOW_DIVIDER_END
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface DividerMode {}
 
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 4d3189e..d98b865 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -510,7 +510,11 @@
      */
     public interface OnScrollListener {
         /** @hide */
-        @IntDef({SCROLL_STATE_IDLE, SCROLL_STATE_TOUCH_SCROLL, SCROLL_STATE_FLING})
+        @IntDef(prefix = { "SCROLL_STATE_" }, value = {
+                SCROLL_STATE_IDLE,
+                SCROLL_STATE_TOUCH_SCROLL,
+                SCROLL_STATE_FLING
+        })
         @Retention(RetentionPolicy.SOURCE)
         public @interface ScrollState {}
 
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index f8083ba..903d3ca 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -751,7 +751,10 @@
     public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1;
 
     /** @hide */
-    @IntDef({AUTO_SIZE_TEXT_TYPE_NONE, AUTO_SIZE_TEXT_TYPE_UNIFORM})
+    @IntDef(prefix = { "AUTO_SIZE_TEXT_TYPE_" }, value = {
+            AUTO_SIZE_TEXT_TYPE_NONE,
+            AUTO_SIZE_TEXT_TYPE_UNIFORM
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface AutoSizeTextType {}
     // Default minimum size for auto-sizing text in scaled pixels.
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index ae6881e..cfec3f2 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -77,7 +77,10 @@
     public static final int MODE_CLOCK = 2;
 
     /** @hide */
-    @IntDef({MODE_SPINNER, MODE_CLOCK})
+    @IntDef(prefix = { "MODE_" }, value = {
+            MODE_SPINNER,
+            MODE_CLOCK
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface TimePickerMode {}
 
diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java
index d807120..edcf209 100644
--- a/core/java/android/widget/Toast.java
+++ b/core/java/android/widget/Toast.java
@@ -71,7 +71,10 @@
     static final boolean localLOGV = false;
 
     /** @hide */
-    @IntDef({LENGTH_SHORT, LENGTH_LONG})
+    @IntDef(prefix = { "LENGTH_" }, value = {
+            LENGTH_SHORT,
+            LENGTH_LONG
+    })
     @Retention(RetentionPolicy.SOURCE)
     public @interface Duration {}
 
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index a050a3c..5d6d5bc 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -11228,7 +11228,9 @@
         reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null,
                 status, plugType, level, temp);
 
-        final boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
+        final boolean onBattery =
+            plugType == BATTERY_PLUGGED_NONE &&
+            status != BatteryManager.BATTERY_STATUS_UNKNOWN;
         final long uptime = mClocks.uptimeMillis();
         final long elapsedRealtime = mClocks.elapsedRealtime();
         if (!mHaveBatteryLevel) {
@@ -11262,7 +11264,8 @@
                 mRecordingHistory = true;
                 startRecordingHistory(elapsedRealtime, uptime, true);
             }
-        } else if (level < 96) {
+        } else if (level < 96 &&
+            status != BatteryManager.BATTERY_STATUS_UNKNOWN) {
             if (!mRecordingHistory) {
                 mRecordingHistory = true;
                 startRecordingHistory(elapsedRealtime, uptime, true);
@@ -11400,9 +11403,12 @@
                 addHistoryRecordLocked(elapsedRealtime, uptime);
             }
         }
-        if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
-            // We don't record history while we are plugged in and fully charged.
-            // The next time we are unplugged, history will be cleared.
+        if (!onBattery &&
+            (status == BatteryManager.BATTERY_STATUS_FULL ||
+             status == BatteryManager.BATTERY_STATUS_UNKNOWN)) {
+            // We don't record history while we are plugged in and fully charged
+            // (or when battery is not present).  The next time we are
+            // unplugged, history will be cleared.
             mRecordingHistory = DEBUG;
         }
 
diff --git a/core/proto/android/app/activitymanager.proto b/core/proto/android/app/activitymanager.proto
index e87499e..7385050 100644
--- a/core/proto/android/app/activitymanager.proto
+++ b/core/proto/android/app/activitymanager.proto
@@ -20,61 +20,59 @@
 
 option java_multiple_files = true;
 
-message ActivityManagerProto {
+// ActivityManager.java PROCESS_STATEs
+enum ProcessState {
+  // Order matters for process states, so values have been spaced to provide
+  // room for future additions.
 
-    // ActivityManager.java PROCESS_STATEs
-    enum ProcessState {
-      // Order matters for process states, so values have been spaced to provide
-      // room for future additions.
-
-      // Not a real process state.
-      PROCESS_STATE_UNKNOWN = -100;
-      // Process is a persistent system process.
-      PROCESS_STATE_PERSISTENT = 0;
-      // Process is a persistent system process and is doing UI.
-      PROCESS_STATE_PERSISTENT_UI = 100;
-      // Process is hosting the current top activities. Note that this covers
-      // all activities that are visible to the user.
-      PROCESS_STATE_TOP = 200;
-      // Process is hosting a foreground service due to a system binding.
-      PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 300;
-      // Process is hosting a foreground service.
-      PROCESS_STATE_FOREGROUND_SERVICE = 400;
-      // Same as PROCESS_STATE_TOP but while device is sleeping.
-      PROCESS_STATE_TOP_SLEEPING = 500;
-      // Process is important to the user, and something they are aware of.
-      PROCESS_STATE_IMPORTANT_FOREGROUND = 600;
-      // Process is important to the user, but not something they are aware of.
-      PROCESS_STATE_IMPORTANT_BACKGROUND = 700;
-      // Process is in the background transient so we will try to keep running.
-      PROCESS_STATE_TRANSIENT_BACKGROUND = 800;
-      // Process is in the background running a backup/restore operation.
-      PROCESS_STATE_BACKUP = 900;
-      // Process is in the background, but it can't restore its state so we want
-      // to try to avoid killing it.
-      PROCESS_STATE_HEAVY_WEIGHT = 1000;
-      // Process is in the background running a service. Unlike oom_adj, this
-      // level is used for both the normal running in background state and the
-      // executing operations state.
-      PROCESS_STATE_SERVICE = 1100;
-      // Process is in the background running a receiver. Note that from the
-      // perspective of oom_adj, receivers run at a higher foreground level, but
-      // for our prioritization here that is not necessary and putting them
-      // below services means many fewer changes in some process states as they
-      // receive broadcasts.
-      PROCESS_STATE_RECEIVER = 1200;
-      // Process is in the background but hosts the home activity.
-      PROCESS_STATE_HOME = 1300;
-      // Process is in the background but hosts the last shown activity.
-      PROCESS_STATE_LAST_ACTIVITY = 1400;
-      // Process is being cached for later use and contains activities.
-      PROCESS_STATE_CACHED_ACTIVITY = 1500;
-      // Process is being cached for later use and is a client of another cached
-      // process that contains activities.
-      PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 1600;
-      // Process is being cached for later use and is empty.
-      PROCESS_STATE_CACHED_EMPTY = 1700;
-      // Process does not exist.
-      PROCESS_STATE_NONEXISTENT = 1800;
-    }
+  // Not a real process state.
+  PROCESS_STATE_UNKNOWN = -100;
+  // Process is a persistent system process.
+  PROCESS_STATE_PERSISTENT = 0;
+  // Process is a persistent system process and is doing UI.
+  PROCESS_STATE_PERSISTENT_UI = 100;
+  // Process is hosting the current top activities. Note that this covers
+  // all activities that are visible to the user.
+  PROCESS_STATE_TOP = 200;
+  // Process is hosting a foreground service due to a system binding.
+  PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 300;
+  // Process is hosting a foreground service.
+  PROCESS_STATE_FOREGROUND_SERVICE = 400;
+  // Same as PROCESS_STATE_TOP but while device is sleeping.
+  PROCESS_STATE_TOP_SLEEPING = 500;
+  // Process is important to the user, and something they are aware of.
+  PROCESS_STATE_IMPORTANT_FOREGROUND = 600;
+  // Process is important to the user, but not something they are aware of.
+  PROCESS_STATE_IMPORTANT_BACKGROUND = 700;
+  // Process is in the background transient so we will try to keep running.
+  PROCESS_STATE_TRANSIENT_BACKGROUND = 800;
+  // Process is in the background running a backup/restore operation.
+  PROCESS_STATE_BACKUP = 900;
+  // Process is in the background, but it can't restore its state so we want
+  // to try to avoid killing it.
+  PROCESS_STATE_HEAVY_WEIGHT = 1000;
+  // Process is in the background running a service. Unlike oom_adj, this
+  // level is used for both the normal running in background state and the
+  // executing operations state.
+  PROCESS_STATE_SERVICE = 1100;
+  // Process is in the background running a receiver. Note that from the
+  // perspective of oom_adj, receivers run at a higher foreground level, but
+  // for our prioritization here that is not necessary and putting them
+  // below services means many fewer changes in some process states as they
+  // receive broadcasts.
+  PROCESS_STATE_RECEIVER = 1200;
+  // Process is in the background but hosts the home activity.
+  PROCESS_STATE_HOME = 1300;
+  // Process is in the background but hosts the last shown activity.
+  PROCESS_STATE_LAST_ACTIVITY = 1400;
+  // Process is being cached for later use and contains activities.
+  PROCESS_STATE_CACHED_ACTIVITY = 1500;
+  // Process is being cached for later use and is a client of another cached
+  // process that contains activities.
+  PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 1600;
+  // Process is being cached for later use and is empty.
+  PROCESS_STATE_CACHED_EMPTY = 1700;
+  // Process does not exist.
+  PROCESS_STATE_NONEXISTENT = 1800;
 }
+
diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto
index 7ffdc96..76a108b 100644
--- a/core/proto/android/os/system_properties.proto
+++ b/core/proto/android/os/system_properties.proto
@@ -26,7 +26,7 @@
 // Android Platform Exported System Properties
 // TODO: This is not the completed list, new properties need to be whitelisted.
 message SystemPropertiesProto {
-    option (stream_proto.stream_msg).enable_fields_mapping = true;
+    option (stream_proto.stream_msg).enable_fields_mapping_recursively = true;
 
     // Properties that are not specified below would be appended here.
     // These values stay on device only.
@@ -38,15 +38,16 @@
     }
     repeated Property extra_properties = 1;
 
-    optional int32  aac_drc_boost = 2;
-    optional int32  aac_drc_cut = 3;
-    optional int32  aac_drc_enc_target_level = 4;
-    optional int32  aac_drc_heavy = 5;
-    optional int32  aac_drc_reference_level = 6;
+    message AacDrc {
+        optional int32  boost = 1;
+        optional int32  cut = 2;
+        optional int32  enc_target_level = 3;
+        optional int32  heavy = 4;
+        optional int32  reference_level = 5;
+    }
+    optional AacDrc aac_drc = 2;
 
     message Aaudio {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional int32  hw_burst_min_usec = 1;
         optional int32  minimum_sleep_usec = 2;
         optional int32  mixer_bursts = 3;
@@ -56,23 +57,19 @@
 
         // Next Tag: 7
     }
-    optional Aaudio aaudio = 7;
+    optional Aaudio aaudio = 3;
 
-    optional int32  af_fast_track_multiplier = 8;
+    optional int32  af_fast_track_multiplier = 4;
 
     message Camera {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional bool   disable_zsl_mode = 1;
         optional int32  fifo_disable = 2;
 
         // Next Tag: 3
     }
-    optional Camera camera = 9;
+    optional Camera camera = 5;
 
     message DalvikVm {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional string appimageformat = 1;
         optional string backgroundgctype = 2;
         optional bool   checkjni = 3;
@@ -130,17 +127,15 @@
 
         // Next Tag: 55
     }
-    optional DalvikVm dalvik_vm = 10;
+    optional DalvikVm dalvik_vm = 6;
 
-    optional bool   drm_64bit_enabled = 11;
-    optional bool   drm_service_enabled = 12;
-    optional bool   dumpstate_dry_run = 13;
-    optional string gsm_sim_operator_numeric = 14;
-    optional bool   hal_instrumentation_enable = 15;
+    optional bool   drm_64bit_enabled = 7;
+    optional bool   drm_service_enabled = 8;
+    optional bool   dumpstate_dry_run = 9;
+    optional string gsm_sim_operator_numeric = 10;
+    optional bool   hal_instrumentation_enable = 11;
 
     message InitSvc {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         enum Status {
             STATUS_UNKNOWN = 0;
             STATUS_RUNNING = 1;
@@ -190,28 +185,24 @@
 
         // Next Tag: 42
     }
-    optional InitSvc init_svc = 16;
+    optional InitSvc init_svc = 12;
 
-    optional bool   keyguard_no_require_sim = 17;
-    optional string libc_debug_malloc_options = 18;
-    optional string libc_debug_malloc_program = 19;
+    optional bool   keyguard_no_require_sim = 13;
+    optional string libc_debug_malloc_options = 14;
+    optional string libc_debug_malloc_program = 15;
 
     message Log {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional string tag_WifiHAL = 1;
         optional string tag_stats_log = 2;
 
         // Next Tag: 3
     }
-    optional Log log = 20;
+    optional Log log = 16;
 
-    optional bool   media_mediadrmservice_enable = 21;
-    optional bool   media_recorder_show_manufacturer_and_model = 22;
+    optional bool   media_mediadrmservice_enable = 17;
+    optional bool   media_recorder_show_manufacturer_and_model = 18;
 
     message Persist {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional string config_calibration_fac = 1;
         optional int32  dbg_volte_avail_ovr = 2;
         optional int32  dbg_vt_avail_ovr = 3;
@@ -226,11 +217,9 @@
 
         // Next Tag: 12
     }
-    optional Persist persist = 23;
+    optional Persist persist = 19;
 
     message PmDexopt {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional string ab_ota = 1;
         optional string bg_dexopt = 2;
         optional string boot = 3;
@@ -239,11 +228,9 @@
 
         // Next Tag: 6
     }
-    optional PmDexopt pm_dexopt = 24;
+    optional PmDexopt pm_dexopt = 20;
 
     message Ro {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional int32  adb_secure = 1;
         optional string arch = 2;
         optional bool   audio_ignore_effects = 3;
@@ -252,8 +239,6 @@
         optional string board_platform = 6;
 
         message Boot {
-            option (stream_proto.stream_msg).enable_fields_mapping = true;
-
             optional string avb_version = 1;
             optional string baseband = 2;
             optional string bootdevice = 3;
@@ -280,8 +265,6 @@
         optional Boot boot = 7;
 
         message BootImage {
-            option (stream_proto.stream_msg).enable_fields_mapping = true;
-
             optional string build_date = 1;
             optional int32  build_date_utc = 2;
             optional string build_fingerprint = 3;
@@ -294,8 +277,6 @@
         optional string bootmode = 10;
 
         message Build {
-            option (stream_proto.stream_msg).enable_fields_mapping = true;
-
             optional string date = 1;
             optional int32  date_utc = 2;
             optional string description = 3;
@@ -309,15 +290,13 @@
             optional string user = 11;
 
             message Version {
-                option (stream_proto.stream_msg).enable_fields_mapping = true;
-
-                optional string version_base_os = 1;
-                optional string version_codename = 2;
-                optional string version_incremental = 3;
-                optional int32  version_preview_sdk = 4;
-                optional string version_release = 5;
-                optional int32  version_sdk = 6;
-                optional string version_security_patch = 7;
+                optional string base_os = 1;
+                optional string codename = 2;
+                optional string incremental = 3;
+                optional int32  preview_sdk = 4;
+                optional string release = 5;
+                optional int32  sdk = 6;
+                optional string security_patch = 7;
 
                 // Next Tag: 8
             }
@@ -334,8 +313,6 @@
         optional string com_google_clientidbase = 16;
 
         message Config {
-            option (stream_proto.stream_msg).enable_fields_mapping = true;
-
             optional string alarm_alert = 1;
             optional int32  media_vol_steps = 2;
             optional string notification_sound = 3;
@@ -357,8 +334,6 @@
         optional string gfx_driver_0 = 26;
 
         message Hardware {
-            option (stream_proto.stream_msg).enable_fields_mapping = true;
-
             optional string value = 1; // value of ro.hardware itself
 
             optional string activity_recognition = 2;
@@ -410,26 +385,28 @@
         optional int32  opengles_version = 31;
 
         message Product {
-            option (stream_proto.stream_msg).enable_fields_mapping = true;
-
             optional string board = 1;
             optional string brand = 2;
             optional string cpu_abi = 3;
-            optional string cpu_abilist = 4;
-            optional string cpu_abilist32 = 5;
-            optional string cpu_abilist64 = 6;
+            repeated string cpu_abilist = 4;
+            repeated string cpu_abilist32 = 5;
+            repeated string cpu_abilist64 = 6;
             optional string device = 7;
             optional int32  first_api_level = 8;
             optional string manufacturer = 9;
             optional string model = 10;
             optional string name = 11;
-            optional string vendor_brand = 12;
-            optional string vendor_device = 13;
-            optional string vendor_manufacturer = 14;
-            optional string vendor_model = 15;
-            optional string vendor_name = 16;
 
-            // Next Tag: 17
+            message Vendor {
+                optional string brand = 1;
+                optional string device = 2;
+                optional string manufacturer = 3;
+                optional string model = 4;
+                optional string name = 5;
+            }
+            optional Vendor vendor = 12;
+
+            // Next Tag: 13
         }
         optional Product product = 32;
 
@@ -452,22 +429,18 @@
 
         // Next Tag: 49
     }
-    optional Ro ro = 25;
+    optional Ro ro = 21;
 
-    optional string sendbug_preferred_domain = 26;
-    optional int32  service_bootanim_exit = 27;
+    optional string sendbug_preferred_domain = 22;
+    optional int32  service_bootanim_exit = 23;
 
     message Sys {
-        option (stream_proto.stream_msg).enable_fields_mapping = true;
-
         optional int32  boot_completed = 1;
         optional int32  boot_from_charger_mode = 2;
         optional int32  retaildemo_enabled = 3;
         optional string shutdown_requested = 4;
 
         message Usb {
-            option (stream_proto.stream_msg).enable_fields_mapping = true;
-
             optional string config = 1;
             optional int32  configfs = 2;
             optional string controller = 3;
@@ -484,16 +457,16 @@
 
         // Next Tag: 6
     }
-    optional Sys sys = 28;
+    optional Sys sys = 24;
 
-    optional int32  telephony_lteOnCdmaDevice = 29;
-    optional int32  tombstoned_max_tombstone_count = 30;
-    optional string vold_decrypt = 31;
-    optional int32  vold_post_fs_data_done = 32;
-    optional int32  vts_native_server_on = 33;
-    optional string wifi_direct_interface = 34;
-    optional string wifi_interface = 35;
+    optional int32  telephony_lteOnCdmaDevice = 25;
+    optional int32  tombstoned_max_tombstone_count = 26;
+    optional string vold_decrypt = 27;
+    optional int32  vold_post_fs_data_done = 28;
+    optional int32  vts_native_server_on = 29;
+    optional string wifi_direct_interface = 30;
+    optional string wifi_interface = 31;
 
-    // Next Tag: 36
+    // Next Tag: 32
 }
 
diff --git a/core/proto/android/server/powermanagerservice.proto b/core/proto/android/server/powermanagerservice.proto
index d3b2cde..c1bd692 100644
--- a/core/proto/android/server/powermanagerservice.proto
+++ b/core/proto/android/server/powermanagerservice.proto
@@ -57,7 +57,7 @@
         optional bool is_active = 3;
         optional int32 num_wake_locks = 4;
         optional bool is_process_state_unknown = 5;
-        optional .android.app.ActivityManagerProto.ProcessState process_state = 6;
+        optional .android.app.ProcessState process_state = 6;
     }
 
     optional ConstantsProto constants = 1;
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 8377751..dc791cf 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2097,6 +2097,10 @@
          movement threshold where scrolling should begin. -->
     <dimen name="config_viewConfigurationTouchSlop">8dp</dimen>
 
+    <!-- Base "hover slop" value used by ViewConfiguration as a
+         movement threshold under which hover is considered "stationary". -->
+    <dimen name="config_viewConfigurationHoverSlop">4dp</dimen>
+
     <!-- Minimum velocity to initiate a fling, as measured in dips per second. -->
     <dimen name="config_viewMinFlingVelocity">50dp</dimen>
 
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index be7ce5f..4b2424f 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -470,6 +470,7 @@
   <java-symbol type="dimen" name="config_minScrollbarTouchTarget" />
   <java-symbol type="dimen" name="config_prefDialogWidth" />
   <java-symbol type="dimen" name="config_viewConfigurationTouchSlop" />
+  <java-symbol type="dimen" name="config_viewConfigurationHoverSlop" />
   <java-symbol type="dimen" name="config_viewMinFlingVelocity" />
   <java-symbol type="dimen" name="config_viewMaxFlingVelocity" />
   <java-symbol type="dimen" name="config_scrollbarSize" />
diff --git a/keystore/java/android/security/IKeyChainService.aidl b/keystore/java/android/security/IKeyChainService.aidl
index b4331b2..eca52cc 100644
--- a/keystore/java/android/security/IKeyChainService.aidl
+++ b/keystore/java/android/security/IKeyChainService.aidl
@@ -16,6 +16,7 @@
 package android.security;
 
 import android.content.pm.StringParceledListSlice;
+import android.security.keymaster.KeymasterCertificateChain;
 import android.security.keystore.ParcelableKeyGenParameterSpec;
 
 /**
@@ -33,6 +34,7 @@
     void setUserSelectable(String alias, boolean isUserSelectable);
 
     boolean generateKeyPair(in String algorithm, in ParcelableKeyGenParameterSpec spec);
+    boolean attestKey(in String alias, in byte[] challenge, out KeymasterCertificateChain chain);
 
     // APIs used by CertInstaller and DevicePolicyManager
     String installCaCertificate(in byte[] caCertificate);
diff --git a/keystore/java/android/security/keystore/AttestationUtils.java b/keystore/java/android/security/keystore/AttestationUtils.java
index cf4347d..0811100 100644
--- a/keystore/java/android/security/keystore/AttestationUtils.java
+++ b/keystore/java/android/security/keystore/AttestationUtils.java
@@ -73,6 +73,33 @@
     public static final int ID_TYPE_MEID = 3;
 
     /**
+     * Creates an array of X509Certificates from the provided KeymasterCertificateChain.
+     *
+     * @hide Only called by the DevicePolicyManager.
+     */
+    @NonNull public static X509Certificate[] parseCertificateChain(
+            final KeymasterCertificateChain kmChain) throws
+            KeyAttestationException {
+        // Extract certificate chain.
+        final Collection<byte[]> rawChain = kmChain.getCertificates();
+        if (rawChain.size() < 2) {
+            throw new KeyAttestationException("Attestation certificate chain contained "
+                    + rawChain.size() + " entries. At least two are required.");
+        }
+        final ByteArrayOutputStream concatenatedRawChain = new ByteArrayOutputStream();
+        try {
+            for (final byte[] cert : rawChain) {
+                concatenatedRawChain.write(cert);
+            }
+            return CertificateFactory.getInstance("X.509").generateCertificates(
+                    new ByteArrayInputStream(concatenatedRawChain.toByteArray()))
+                            .toArray(new X509Certificate[0]);
+        } catch (Exception e) {
+            throw new KeyAttestationException("Unable to construct certificate chain", e);
+        }
+    }
+
+    /**
      * Performs attestation of the device's identifiers. This method returns a certificate chain
      * whose first element contains the requested device identifiers in an extension. The device's
      * manufacturer, model, brand, device and product are always also included in the attestation.
@@ -173,22 +200,18 @@
                     KeyStore.getKeyStoreException(errorCode));
         }
 
-        // Extract certificate chain.
-        final Collection<byte[]> rawChain = outChain.getCertificates();
-        if (rawChain.size() < 2) {
-            throw new DeviceIdAttestationException("Attestation certificate chain contained "
-                    + rawChain.size() + " entries. At least two are required.");
-        }
-        final ByteArrayOutputStream concatenatedRawChain = new ByteArrayOutputStream();
         try {
-            for (final byte[] cert : rawChain) {
-                concatenatedRawChain.write(cert);
-            }
-            return CertificateFactory.getInstance("X.509").generateCertificates(
-                    new ByteArrayInputStream(concatenatedRawChain.toByteArray()))
-                            .toArray(new X509Certificate[0]);
-        } catch (Exception e) {
-            throw new DeviceIdAttestationException("Unable to construct certificate chain", e);
+            return parseCertificateChain(outChain);
+        } catch (KeyAttestationException e) {
+            throw new DeviceIdAttestationException(e.getMessage(), e);
         }
     }
+
+    /**
+     * Returns true if the attestation chain provided is a valid key attestation chain.
+     * @hide
+     */
+    public static boolean isChainValid(KeymasterCertificateChain chain) {
+        return chain != null && chain.getCertificates().size() >= 2;
+    }
 }
diff --git a/keystore/java/android/security/keystore/KeyAttestationException.java b/keystore/java/android/security/keystore/KeyAttestationException.java
new file mode 100644
index 0000000..6cf5fb2
--- /dev/null
+++ b/keystore/java/android/security/keystore/KeyAttestationException.java
@@ -0,0 +1,46 @@
+/*
+ * 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.security.keystore;
+
+/**
+ * Thrown when {@link AttestationUtils} is unable to attest the given key or handle
+ * the resulting attestation record.
+ *
+ * @hide
+ */
+public class KeyAttestationException extends Exception {
+    /**
+     * Constructs a new {@code KeyAttestationException} with the current stack trace and the
+     * specified detail message.
+     *
+     * @param detailMessage the detail message for this exception.
+     */
+    public KeyAttestationException(String detailMessage) {
+        super(detailMessage);
+    }
+
+    /**
+     * Constructs a new {@code KeyAttestationException} with the current stack trace, the
+     * specified detail message and the specified cause.
+     *
+     * @param message the detail message for this exception.
+     * @param cause the cause of this exception, may be {@code null}.
+     */
+    public KeyAttestationException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index 87677d4..1238d87 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -680,6 +680,40 @@
         }
 
         /**
+         * A Builder constructor taking in an already-built KeyGenParameterSpec, useful for
+         * changing values of the KeyGenParameterSpec quickly.
+         * @hide Should be used internally only.
+         */
+        public Builder(@NonNull KeyGenParameterSpec sourceSpec) {
+            this(sourceSpec.getKeystoreAlias(), sourceSpec.getPurposes());
+            mUid = sourceSpec.getUid();
+            mKeySize = sourceSpec.getKeySize();
+            mSpec = sourceSpec.getAlgorithmParameterSpec();
+            mCertificateSubject = sourceSpec.getCertificateSubject();
+            mCertificateSerialNumber = sourceSpec.getCertificateSerialNumber();
+            mCertificateNotBefore = sourceSpec.getCertificateNotBefore();
+            mCertificateNotAfter = sourceSpec.getCertificateNotAfter();
+            mKeyValidityStart = sourceSpec.getKeyValidityStart();
+            mKeyValidityForOriginationEnd = sourceSpec.getKeyValidityForOriginationEnd();
+            mKeyValidityForConsumptionEnd = sourceSpec.getKeyValidityForConsumptionEnd();
+            mPurposes = sourceSpec.getPurposes();
+            if (sourceSpec.isDigestsSpecified()) {
+                mDigests = sourceSpec.getDigests();
+            }
+            mEncryptionPaddings = sourceSpec.getEncryptionPaddings();
+            mSignaturePaddings = sourceSpec.getSignaturePaddings();
+            mBlockModes = sourceSpec.getBlockModes();
+            mRandomizedEncryptionRequired = sourceSpec.isRandomizedEncryptionRequired();
+            mUserAuthenticationRequired = sourceSpec.isUserAuthenticationRequired();
+            mUserAuthenticationValidityDurationSeconds =
+                sourceSpec.getUserAuthenticationValidityDurationSeconds();
+            mAttestationChallenge = sourceSpec.getAttestationChallenge();
+            mUniqueIdIncluded = sourceSpec.isUniqueIdIncluded();
+            mUserAuthenticationValidWhileOnBody = sourceSpec.isUserAuthenticationValidWhileOnBody();
+            mInvalidatedByBiometricEnrollment = sourceSpec.isInvalidatedByBiometricEnrollment();
+        }
+
+        /**
          * Sets the UID which will own the key.
          *
          * @param uid UID or {@code -1} for the UID of the current process.
diff --git a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
index 73b489f..254b6be 100644
--- a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
+++ b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
@@ -55,7 +55,7 @@
     static final int USER_AUTHENTICATION_DURATION = 300;
     static final byte[] ATTESTATION_CHALLENGE = new byte[] {'c', 'h'};
 
-    KeyGenParameterSpec configureDefaultSpec() {
+    public static KeyGenParameterSpec configureDefaultSpec() {
         return new KeyGenParameterSpec.Builder(ALIAS, KEY_PURPOSES)
                 .setUid(UID)
                 .setKeySize(KEYSIZE)
@@ -80,7 +80,7 @@
                 .build();
     }
 
-    void validateSpecValues(KeyGenParameterSpec spec, int uid, String alias) {
+    public static void validateSpecValues(KeyGenParameterSpec spec, int uid, String alias) {
         assertThat(spec.getKeystoreAlias(), is(alias));
         assertThat(spec.getPurposes(), is(KEY_PURPOSES));
         assertThat(spec.getUid(), is(uid));
diff --git a/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java b/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java
new file mode 100644
index 0000000..865cad4
--- /dev/null
+++ b/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.security.keystore;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
+import android.security.ParcelableKeyGenParameterSpecTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** Unit tests for {@link KeyGenParameterSpec}. */
+@RunWith(AndroidJUnit4.class)
+public final class KeyGenParameterSpecTest {
+    static final String ALIAS = "keystore-alias";
+    static final int KEY_PURPOSES = KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY;
+
+    @Test
+    public void testBuilderCopyingValues() {
+        KeyGenParameterSpec spec = ParcelableKeyGenParameterSpecTest.configureDefaultSpec();
+        KeyGenParameterSpec copiedSpec =
+                new KeyGenParameterSpec.Builder(spec).build();
+        ParcelableKeyGenParameterSpecTest.validateSpecValues(
+                copiedSpec, spec.getUid(), spec.getKeystoreAlias());
+    }
+
+    @Test
+    public void testBuilderCopyingEmptyValues() {
+        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(ALIAS, KEY_PURPOSES).build();
+        KeyGenParameterSpec copiedSpec = new KeyGenParameterSpec.Builder(spec).build();
+
+        assertThat(copiedSpec.getKeystoreAlias(), is(ALIAS));
+        assertThat(copiedSpec.getPurposes(), is(KEY_PURPOSES));
+    }
+
+    @Test
+    public void testCanModifyValuesInCopiedBuilder() {
+        KeyGenParameterSpec spec = ParcelableKeyGenParameterSpecTest.configureDefaultSpec();
+        KeyGenParameterSpec copiedSpec =
+                new KeyGenParameterSpec.Builder(spec)
+                .setAttestationChallenge(null)
+                .build();
+
+        assertEquals(copiedSpec.getAttestationChallenge(), null);
+    }
+}
diff --git a/libs/incident/Android.mk b/libs/incident/Android.mk
index 439e86d..8aa4b10 100644
--- a/libs/incident/Android.mk
+++ b/libs/incident/Android.mk
@@ -36,6 +36,7 @@
         src/IncidentReportArgs.cpp
 
 LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
+LOCAL_PROTO_OPTIMIZE_TYPE := lite
 
 include $(BUILD_SHARED_LIBRARY)
 
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index e64fc75..6615b8c 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -723,9 +723,9 @@
         CountDownLatch latch = new CountDownLatch(1);
 
         // Once the new info has been fetched, we need to wait for the access points to be copied
+        mAccessPointsChangedLatch = new CountDownLatch(1);
         doAnswer(invocation -> {
                     latch.countDown();
-                    mAccessPointsChangedLatch = new CountDownLatch(1);
                     return info;
                 }).when(mockWifiManager).getConnectionInfo();
 
diff --git a/packages/SystemUI/res/layout/output_chooser.xml b/packages/SystemUI/res/layout/output_chooser.xml
new file mode 100644
index 0000000..22c3bcf
--- /dev/null
+++ b/packages/SystemUI/res/layout/output_chooser.xml
@@ -0,0 +1,55 @@
+<?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.
+-->
+<!-- extends FrameLayout -->
+<com.android.systemui.volume.OutputChooserLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:sysui="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/output_chooser"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="20dp" >
+
+    <com.android.systemui.qs.AutoSizingList
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        sysui:itemHeight="@dimen/qs_detail_item_height"
+        style="@style/AutoSizingList"/>
+
+    <LinearLayout
+        android:id="@android:id/empty"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_gravity="center"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@android:id/icon"
+            android:layout_width="56dp"
+            android:layout_height="56dp"
+            android:tint="?android:attr/textColorSecondary" />
+
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:textAppearance="@style/TextAppearance.QS.DetailEmpty"/>
+    </LinearLayout>
+</com.android.systemui.volume.OutputChooserLayout>
diff --git a/packages/SystemUI/res/layout/output_chooser_item.xml b/packages/SystemUI/res/layout/output_chooser_item.xml
new file mode 100644
index 0000000..ed7df4b
--- /dev/null
+++ b/packages/SystemUI/res/layout/output_chooser_item.xml
@@ -0,0 +1,71 @@
+<?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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:minHeight="@dimen/qs_detail_item_height"
+              android:background="@drawable/btn_borderless_rect"
+              android:clickable="true"
+              android:focusable="true"
+              android:gravity="center_vertical"
+              android:orientation="horizontal" >
+
+    <ImageView
+        android:id="@android:id/icon"
+        android:layout_width="@dimen/qs_detail_item_icon_width"
+        android:layout_height="@dimen/qs_detail_item_icon_size"
+        android:layout_marginStart="@dimen/qs_detail_item_icon_marginStart"
+        android:layout_marginEnd="@dimen/qs_detail_item_icon_marginEnd"
+        android:tint="?android:attr/textColorPrimary"/>
+
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:layout_weight="1"
+        android:orientation="vertical" >
+
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textDirection="locale"
+            android:ellipsize="end"
+            android:textAppearance="@style/TextAppearance.QS.DetailItemPrimary" />
+
+        <TextView
+            android:id="@android:id/summary"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textDirection="locale"
+            android:layout_marginTop="2dp"
+            android:textAppearance="@style/TextAppearance.QS.DetailItemSecondary" />
+    </LinearLayout>
+
+    <ImageView
+        android:id="@android:id/icon2"
+        style="@style/QSBorderlessButton"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:layout_marginStart="30dp"
+        android:clickable="true"
+        android:focusable="true"
+        android:scaleType="center"
+        android:contentDescription="@*android:string/media_route_controller_disconnect"
+        android:tint="?android:attr/textColorPrimary" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index bab1e5e..f0d2346 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -70,58 +70,77 @@
                 android:layout_height="@dimen/volume_button_size"
                 android:clickable="true"
                 android:soundEffectsEnabled="false"
-                android:src="@drawable/ic_volume_collapse_animation"
+                android:src="@drawable/ic_volume_expand_animation"
                 android:background="@drawable/ripple_drawable"
                 tools:ignore="RtlHardcoded" />
         </LinearLayout>
-        <!-- special row for ringer mode -->
         <RelativeLayout
-            android:id="@+id/ringer_mode"
+            android:id="@+id/footer"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:background="@drawable/rounded_bg_full"
             android:clipChildren="false"
             android:clipToPadding="false"
             android:layout_below="@id/volume_dialog_content"
             android:layout_margin="10dp">
+            <!-- special row for ringer mode -->
+            <RelativeLayout
+                android:id="@+id/ringer_mode"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@drawable/rounded_bg_full"
+                android:clipChildren="false"
+                android:clipToPadding="false"
+                android:layout_toStartOf="@id/output_chooser"
+                android:layout_margin="10dp">
 
+                <com.android.keyguard.AlphaOptimizedImageButton
+                    android:id="@+id/ringer_icon"
+                    style="@style/VolumeButtons"
+                    android:background="?android:selectableItemBackgroundBorderless"
+                    android:layout_width="@dimen/volume_button_size"
+                    android:layout_height="@dimen/volume_button_size"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerVertical="true"
+                    android:soundEffectsEnabled="false" />
+
+                <TextView
+                    android:id="@+id/ringer_title"
+                    android:text="@string/ring_toggle_title"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:ellipsize="end"
+                    android:maxLines="1"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerVertical="true"
+                    android:layout_toEndOf="@+id/ringer_icon"
+                    android:layout_marginStart="64dp"
+                    android:textColor="?android:attr/colorControlNormal"
+                    android:textAppearance="?android:attr/textAppearanceSmall"
+                    android:paddingStart="@dimen/volume_row_header_padding_start" />
+
+                <TextView
+                    android:id="@+id/ringer_status"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:ellipsize="end"
+                    android:layout_alignParentEnd="true"
+                    android:layout_centerVertical="true"
+                    android:layout_marginEnd="14dp"
+                    android:maxLines="1"
+                    android:textColor="?android:attr/colorControlNormal"
+                    android:textAppearance="?android:attr/textAppearanceSmall" />
+
+            </RelativeLayout>
             <com.android.keyguard.AlphaOptimizedImageButton
-                android:id="@+id/ringer_icon"
+                android:id="@+id/output_chooser"
                 style="@style/VolumeButtons"
                 android:background="?android:selectableItemBackgroundBorderless"
                 android:layout_width="@dimen/volume_button_size"
                 android:layout_height="@dimen/volume_button_size"
-                android:layout_alignParentStart="true"
-                android:layout_centerVertical="true"
-                android:soundEffectsEnabled="false" />
-
-            <TextView
-                android:id="@+id/ringer_title"
-                android:text="@string/stream_ring"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:ellipsize="end"
-                android:maxLines="1"
-                android:layout_alignParentStart="true"
-                android:layout_centerVertical="true"
-                android:layout_toEndOf="@+id/ringer_icon"
-                android:layout_marginStart="64dp"
-                android:textColor="?android:attr/colorControlNormal"
-                android:textAppearance="?android:attr/textAppearanceSmall"
-                android:paddingStart="@dimen/volume_row_header_padding_start" />
-
-            <TextView
-                android:id="@+id/ringer_status"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:ellipsize="end"
                 android:layout_alignParentEnd="true"
                 android:layout_centerVertical="true"
-                android:layout_marginEnd="14dp"
-                android:maxLines="1"
-                android:textColor="?android:attr/colorControlNormal"
-                android:textAppearance="?android:attr/textAppearanceSmall" />
-
+                android:src="@drawable/ic_settings_bluetooth"
+                android:soundEffectsEnabled="false" />
         </RelativeLayout>
     </RelativeLayout>
 </com.android.systemui.volume.VolumeUiLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 62ab74d..78e621e 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1248,6 +1248,7 @@
     <string name="stream_tts" translatable="false">Transmitted Through Speaker</string> <!-- STREAM_TTS -->
     <string name="stream_accessibility">Accessibility</string> <!-- STREAM_ACCESSIBILITY -->
 
+    <string name="ring_toggle_title">Calls</string>
     <string name="volume_ringer_status_normal">Ring</string>
     <string name="volume_ringer_status_vibrate">Vibrate</string>
     <string name="volume_ringer_status_silent">Mute</string>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 27bc599..9f39321 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -49,6 +49,7 @@
     private boolean mIsVerifyUnlockOnly;
     private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid;
     private SecurityCallback mSecurityCallback;
+    private AlertDialog mAlertDialog;
 
     private final KeyguardUpdateMonitor mUpdateMonitor;
 
@@ -95,6 +96,10 @@
 
     @Override
     public void onPause() {
+        if (mAlertDialog != null) {
+            mAlertDialog.dismiss();
+            mAlertDialog = null;
+        }
         if (mCurrentSecuritySelection != SecurityMode.None) {
             getSecurityView(mCurrentSecuritySelection).onPause();
         }
@@ -174,16 +179,20 @@
     }
 
     private void showDialog(String title, String message) {
-        final AlertDialog dialog = new AlertDialog.Builder(mContext)
+        if (mAlertDialog != null) {
+            mAlertDialog.dismiss();
+        }
+
+        mAlertDialog = new AlertDialog.Builder(mContext)
             .setTitle(title)
             .setMessage(message)
             .setCancelable(false)
             .setNeutralButton(R.string.ok, null)
             .create();
         if (!(mContext instanceof Activity)) {
-            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
+            mAlertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
         }
-        dialog.show();
+        mAlertDialog.show();
     }
 
     private void showTimeoutDialog(int userId, int timeoutMs) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java
index 49a12f4..e1376ca 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/Events.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java
@@ -80,6 +80,7 @@
     public static final int DISMISS_REASON_SETTINGS_CLICKED = 5;
     public static final int DISMISS_REASON_DONE_CLICKED = 6;
     public static final int DISMISS_STREAM_GONE = 7;
+    public static final int DISMISS_REASON_OUTPUT_CHOOSER = 8;
     public static final String[] DISMISS_REASONS = {
             "unknown",
             "touch_outside",
@@ -88,7 +89,8 @@
             "screen_off",
             "settings_clicked",
             "done_clicked",
-            "a11y_stream_changed"
+            "a11y_stream_changed",
+            "output_chooser"
     };
 
     public static final int SHOW_REASON_UNKNOWN = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java
new file mode 100644
index 0000000..fa82e33
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.volume;
+
+import static com.android.settingslib.bluetooth.Utils.getBtClassDrawableWithDescription;
+
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.Pair;
+
+import com.android.settingslib.Utils;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.policy.BluetoothController;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class OutputChooserDialog extends SystemUIDialog
+        implements DialogInterface.OnDismissListener, OutputChooserLayout.Callback {
+
+    private static final String TAG = Util.logTag(OutputChooserDialog.class);
+    private static final int MAX_DEVICES = 10;
+
+    private final Context mContext;
+    private final BluetoothController mController;
+    private OutputChooserLayout mView;
+
+
+    public OutputChooserDialog(Context context) {
+        super(context);
+        mContext = context;
+        mController = Dependency.get(BluetoothController.class);
+
+        final IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+        context.registerReceiver(mReceiver, filter);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.output_chooser);
+        setCanceledOnTouchOutside(true);
+        setOnDismissListener(this::onDismiss);
+        mView = findViewById(R.id.output_chooser);
+        mView.setCallback(this);
+        updateItems();
+        mController.addCallback(mCallback);
+    }
+
+    protected void cleanUp() {}
+
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+    }
+
+    @Override
+    public void onDismiss(DialogInterface unused) {
+        mContext.unregisterReceiver(mReceiver);
+        mController.removeCallback(mCallback);
+        cleanUp();
+    }
+
+    @Override
+    public void onDetailItemClick(OutputChooserLayout.Item item) {
+        if (item == null || item.tag == null) return;
+        final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag;
+        if (device != null && device.getMaxConnectionState()
+                == BluetoothProfile.STATE_DISCONNECTED) {
+            mController.connect(device);
+        }
+    }
+
+    @Override
+    public void onDetailItemDisconnect(OutputChooserLayout.Item item) {
+        if (item == null || item.tag == null) return;
+        final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag;
+        if (device != null) {
+            mController.disconnect(device);
+        }
+    }
+
+    private void updateItems() {
+        if (mView == null) return;
+        if (mController.isBluetoothEnabled()) {
+            mView.setEmptyState(R.drawable.ic_qs_bluetooth_detail_empty,
+                    R.string.quick_settings_bluetooth_detail_empty_text);
+            mView.setItemsVisible(true);
+        } else {
+            mView.setEmptyState(R.drawable.ic_qs_bluetooth_detail_empty,
+                    R.string.bt_is_off);
+            mView.setItemsVisible(false);
+        }
+        ArrayList<OutputChooserLayout.Item> items = new ArrayList<>();
+        final Collection<CachedBluetoothDevice> devices = mController.getDevices();
+        if (devices != null) {
+            int connectedDevices = 0;
+            int count = 0;
+            for (CachedBluetoothDevice device : devices) {
+                if (mController.getBondState(device) == BluetoothDevice.BOND_NONE) continue;
+                final int majorClass = device.getBtClass().getMajorDeviceClass();
+                if (majorClass != BluetoothClass.Device.Major.AUDIO_VIDEO
+                        && majorClass != BluetoothClass.Device.Major.UNCATEGORIZED) {
+                    continue;
+                }
+                final OutputChooserLayout.Item item = new OutputChooserLayout.Item();
+                item.iconResId = R.drawable.ic_qs_bluetooth_on;
+                item.line1 = device.getName();
+                item.tag = device;
+                int state = device.getMaxConnectionState();
+                if (state == BluetoothProfile.STATE_CONNECTED) {
+                    item.iconResId = R.drawable.ic_qs_bluetooth_connected;
+                    int batteryLevel = device.getBatteryLevel();
+                    if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
+                        Pair<Drawable, String> pair =
+                                getBtClassDrawableWithDescription(getContext(), device);
+                        item.icon = pair.first;
+                        item.line2 = mContext.getString(
+                                R.string.quick_settings_connected_battery_level,
+                                Utils.formatPercentage(batteryLevel));
+                    } else {
+                        item.line2 = mContext.getString(R.string.quick_settings_connected);
+                    }
+                    item.canDisconnect = true;
+                    items.add(connectedDevices, item);
+                    connectedDevices++;
+                } else if (state == BluetoothProfile.STATE_CONNECTING) {
+                    item.iconResId = R.drawable.ic_qs_bluetooth_connecting;
+                    item.line2 = mContext.getString(R.string.quick_settings_connecting);
+                    items.add(connectedDevices, item);
+                } else {
+                    items.add(item);
+                }
+                if (++count == MAX_DEVICES) {
+                    break;
+                }
+            }
+        }
+        mView.setItems(items.toArray(new OutputChooserLayout.Item[items.size()]));
+    }
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
+                if (D.BUG) Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS");
+                cancel();
+                cleanUp();
+            }
+        }
+    };
+
+    private final BluetoothController.Callback mCallback = new BluetoothController.Callback() {
+        @Override
+        public void onBluetoothStateChange(boolean enabled) {
+            updateItems();
+        }
+
+        @Override
+        public void onBluetoothDevicesChanged() {
+            updateItems();
+        }
+    };
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java
new file mode 100644
index 0000000..e8be4fd
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java
@@ -0,0 +1,258 @@
+/*
+ * 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.volume;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.systemui.FontSizeUtils;
+import com.android.systemui.R;
+import com.android.systemui.qs.AutoSizingList;
+
+/**
+ * Limited height list of devices.
+ */
+public class OutputChooserLayout extends FrameLayout {
+    private static final String TAG = "OutputChooserLayout";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    private final int mQsDetailIconOverlaySize;
+    private final Context mContext;
+    private final H mHandler = new H();
+    private final Adapter mAdapter = new Adapter();
+
+    private String mTag;
+    private Callback mCallback;
+    private boolean mItemsVisible = true;
+    private AutoSizingList mItemList;
+    private View mEmpty;
+    private TextView mEmptyText;
+    private ImageView mEmptyIcon;
+
+    private Item[] mItems;
+
+    public OutputChooserLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mContext = context;
+        mTag = TAG;
+        mQsDetailIconOverlaySize = (int) getResources().getDimension(
+                R.dimen.qs_detail_icon_overlay_size);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mItemList = findViewById(android.R.id.list);
+        mItemList.setVisibility(GONE);
+        mItemList.setAdapter(mAdapter);
+        mEmpty = findViewById(android.R.id.empty);
+        mEmpty.setVisibility(GONE);
+        mEmptyText = mEmpty.findViewById(android.R.id.title);
+        mEmptyIcon = mEmpty.findViewById(android.R.id.icon);
+    }
+
+    @Override
+    protected void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        FontSizeUtils.updateFontSize(mEmptyText, R.dimen.qs_detail_empty_text_size);
+        int count = mItemList.getChildCount();
+        for (int i = 0; i < count; i++) {
+            View item = mItemList.getChildAt(i);
+            FontSizeUtils.updateFontSize(item, android.R.id.title,
+                    R.dimen.qs_detail_item_primary_text_size);
+            FontSizeUtils.updateFontSize(item, android.R.id.summary,
+                    R.dimen.qs_detail_item_secondary_text_size);
+        }
+    }
+
+    public void setEmptyState(int icon, int text) {
+        mEmpty.post(() -> {
+            mEmptyIcon.setImageResource(icon);
+            mEmptyText.setText(text);
+        });
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        if (DEBUG) Log.d(mTag, "onAttachedToWindow");
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        if (DEBUG) Log.d(mTag, "onDetachedFromWindow");
+        mCallback = null;
+    }
+
+    public void setCallback(Callback callback) {
+        mHandler.removeMessages(H.SET_CALLBACK);
+        mHandler.obtainMessage(H.SET_CALLBACK, callback).sendToTarget();
+    }
+
+    public void setItems(Item[] items) {
+        mHandler.removeMessages(H.SET_ITEMS);
+        mHandler.obtainMessage(H.SET_ITEMS, items).sendToTarget();
+    }
+
+    public void setItemsVisible(boolean visible) {
+        mHandler.removeMessages(H.SET_ITEMS_VISIBLE);
+        mHandler.obtainMessage(H.SET_ITEMS_VISIBLE, visible ? 1 : 0, 0).sendToTarget();
+    }
+
+    private void handleSetCallback(Callback callback) {
+        mCallback = callback;
+    }
+
+    private void handleSetItems(Item[] items) {
+        final int itemCount = items != null ? items.length : 0;
+        mEmpty.setVisibility(itemCount == 0 ? VISIBLE : GONE);
+        mItemList.setVisibility(itemCount == 0 ? GONE : VISIBLE);
+        mItems = items;
+        mAdapter.notifyDataSetChanged();
+    }
+
+    private void handleSetItemsVisible(boolean visible) {
+        if (mItemsVisible == visible) return;
+        mItemsVisible = visible;
+        for (int i = 0; i < mItemList.getChildCount(); i++) {
+            mItemList.getChildAt(i).setVisibility(mItemsVisible ? VISIBLE : INVISIBLE);
+        }
+    }
+
+    private class Adapter extends BaseAdapter {
+
+        @Override
+        public int getCount() {
+            return mItems != null ? mItems.length : 0;
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return mItems[position];
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return 0;
+        }
+
+        @Override
+        public View getView(int position, View view, ViewGroup parent) {
+            final Item item = mItems[position];
+            if (view == null) {
+                view = LayoutInflater.from(mContext).inflate(R.layout.output_chooser_item, parent,
+                        false);
+            }
+            view.setVisibility(mItemsVisible ? VISIBLE : INVISIBLE);
+            final ImageView iv = view.findViewById(android.R.id.icon);
+            if (item.icon != null) {
+                iv.setImageDrawable(item.icon);
+            } else {
+                iv.setImageResource(item.iconResId);
+            }
+            iv.getOverlay().clear();
+            if (item.overlay != null) {
+                item.overlay.setBounds(0, 0, mQsDetailIconOverlaySize, mQsDetailIconOverlaySize);
+                iv.getOverlay().add(item.overlay);
+            }
+            final TextView title = view.findViewById(android.R.id.title);
+            title.setText(item.line1);
+            final TextView summary =  view.findViewById(android.R.id.summary);
+            final boolean twoLines = !TextUtils.isEmpty(item.line2);
+            title.setMaxLines(twoLines ? 1 : 2);
+            summary.setVisibility(twoLines ? VISIBLE : GONE);
+            summary.setText(twoLines ? item.line2 : null);
+            view.setOnClickListener(v -> {
+                if (mCallback != null) {
+                    mCallback.onDetailItemClick(item);
+                }
+            });
+
+            final ImageView icon2 = view.findViewById(android.R.id.icon2);
+            if (item.canDisconnect) {
+                icon2.setImageResource(R.drawable.ic_qs_cancel);
+                icon2.setVisibility(VISIBLE);
+                icon2.setClickable(true);
+                icon2.setOnClickListener(v -> {
+                    if (mCallback != null) {
+                        mCallback.onDetailItemDisconnect(item);
+                    }
+                });
+            } else if (item.icon2 != -1) {
+                icon2.setVisibility(VISIBLE);
+                icon2.setImageResource(item.icon2);
+                icon2.setClickable(false);
+            } else {
+                icon2.setVisibility(GONE);
+            }
+
+            return view;
+        }
+    };
+
+    private class H extends Handler {
+        private static final int SET_ITEMS = 1;
+        private static final int SET_CALLBACK = 2;
+        private static final int SET_ITEMS_VISIBLE = 3;
+
+        public H() {
+            super(Looper.getMainLooper());
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            if (msg.what == SET_ITEMS) {
+                handleSetItems((Item[]) msg.obj);
+            } else if (msg.what == SET_CALLBACK) {
+                handleSetCallback((OutputChooserLayout.Callback) msg.obj);
+            } else if (msg.what == SET_ITEMS_VISIBLE) {
+                handleSetItemsVisible(msg.arg1 != 0);
+            }
+        }
+    }
+
+    public static class Item {
+        public int iconResId;
+        public Drawable icon;
+        public Drawable overlay;
+        public CharSequence line1;
+        public CharSequence line2;
+        public Object tag;
+        public boolean canDisconnect;
+        public int icon2 = -1;
+    }
+
+    public interface Callback {
+        void onDetailItemClick(Item item);
+        void onDetailItemDisconnect(Item item);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 7959b72..d7c8010 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -19,6 +19,7 @@
 import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
 import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_GENERIC;
 
+import static com.android.systemui.volume.Events.DISMISS_REASON_OUTPUT_CHOOSER;
 import static com.android.systemui.volume.Events.DISMISS_REASON_TOUCH_OUTSIDE;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
@@ -37,7 +38,6 @@
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.TransitionDrawable;
 import android.media.AudioManager;
 import android.media.AudioSystem;
 import android.os.Debug;
@@ -106,6 +106,7 @@
     private ViewGroup mDialogRowsView;
     private ImageButton mExpandButton;
     private ImageButton mRingerIcon;
+    private ImageButton mOutputChooser;
     private TextView mRingerStatus;
     private final List<VolumeRow> mRows = new ArrayList<>();
     private ConfigurableTexts mConfigurableTexts;
@@ -113,6 +114,7 @@
     private final KeyguardManager mKeyguard;
     private final AccessibilityManager mAccessibilityMgr;
     private final Object mSafetyWarningLock = new Object();
+    private final Object mOutputChooserLock = new Object();
     private final Accessibility mAccessibility = new Accessibility();
     private final ColorStateList mActiveSliderTint;
     private final ColorStateList mInactiveSliderTint;
@@ -128,6 +130,7 @@
     private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE;
     private State mState;
     private SafetyWarningDialog mSafetyWarning;
+    private OutputChooserDialog mOutputChooserDialog;
     private boolean mHovering = false;
 
     public VolumeDialogImpl(Context context) {
@@ -213,6 +216,9 @@
         mExpandButton.setVisibility(
                 AudioSystem.isSingleVolume(mContext) ? View.GONE : View.VISIBLE);
 
+        mOutputChooser = mDialogView.findViewById(R.id.output_chooser);
+        mOutputChooser.setOnClickListener(mClickOutputChooser);
+
         if (mRows.isEmpty()) {
             addRow(AudioManager.STREAM_MUSIC,
                     R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true);
@@ -913,6 +919,23 @@
         rescheduleTimeoutH();
     }
 
+    private void showOutputChooserH() {
+        synchronized (mOutputChooserLock) {
+            if (mOutputChooserDialog != null) {
+                return;
+            }
+            mOutputChooserDialog = new OutputChooserDialog(mContext) {
+                @Override
+                protected void cleanUp() {
+                    synchronized (mOutputChooserLock) {
+                        mOutputChooserDialog = null;
+                    }
+                }
+            };
+            mOutputChooserDialog.show();
+        }
+    }
+
     private String getStreamLabelH(StreamState ss) {
         if (ss.remoteLabel != null) {
             return ss.remoteLabel;
@@ -935,6 +958,15 @@
         }
     };
 
+    private final OnClickListener mClickOutputChooser = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            // TODO: log
+            dismissH(DISMISS_REASON_OUTPUT_CHOOSER);
+            showOutputChooserH();
+        }
+    };
+
     private final VolumeDialogController.Callbacks mControllerCallbackH
             = new VolumeDialogController.Callbacks() {
         @Override
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index ac0cdd7..972a426 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -28,6 +28,7 @@
 import android.annotation.Nullable;
 import android.app.ActivityManagerInternal;
 import android.app.AlertDialog;
+import android.app.AppOpsManager;
 import android.app.PendingIntent;
 import android.appwidget.AppWidgetManagerInternal;
 import android.content.BroadcastReceiver;
@@ -193,6 +194,8 @@
 
     private final SecurityPolicy mSecurityPolicy;
 
+    private final AppOpsManager mAppOpsManager;
+
     private final MainHandler mMainHandler;
 
     private final GlobalActionPerformer mGlobalActionPerformer;
@@ -261,6 +264,7 @@
         mWindowManagerService = LocalServices.getService(WindowManagerInternal.class);
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mSecurityPolicy = new SecurityPolicy();
+        mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mMainHandler = new MainHandler(mContext.getMainLooper());
         mGlobalActionPerformer = new GlobalActionPerformer(mContext, mWindowManagerService);
 
@@ -1223,14 +1227,11 @@
         for (int i = 0, count = installedServices.size(); i < count; i++) {
             ResolveInfo resolveInfo = installedServices.get(i);
             ServiceInfo serviceInfo = resolveInfo.serviceInfo;
-            if (!android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE.equals(
-                    serviceInfo.permission)) {
-                Slog.w(LOG_TAG, "Skipping accessibilty service " + new ComponentName(
-                        serviceInfo.packageName, serviceInfo.name).flattenToShortString()
-                        + ": it does not require the permission "
-                        + android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE);
+
+            if (!canRegisterService(serviceInfo)) {
                 continue;
             }
+
             AccessibilityServiceInfo accessibilityServiceInfo;
             try {
                 accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext);
@@ -1251,6 +1252,28 @@
         return false;
     }
 
+    private boolean canRegisterService(ServiceInfo serviceInfo) {
+        if (!android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE.equals(
+                serviceInfo.permission)) {
+            Slog.w(LOG_TAG, "Skipping accessibility service " + new ComponentName(
+                    serviceInfo.packageName, serviceInfo.name).flattenToShortString()
+                    + ": it does not require the permission "
+                    + android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE);
+            return false;
+        }
+
+        int servicePackageUid = serviceInfo.applicationInfo.uid;
+        if (mAppOpsManager.noteOpNoThrow(AppOpsManager.OP_BIND_ACCESSIBILITY_SERVICE,
+                servicePackageUid, serviceInfo.packageName) != AppOpsManager.MODE_ALLOWED) {
+            Slog.w(LOG_TAG, "Skipping accessibility service " + new ComponentName(
+                    serviceInfo.packageName, serviceInfo.name).flattenToShortString()
+                    + ": disallowed by AppOps");
+            return false;
+        }
+
+        return true;
+    }
+
     private boolean readEnabledAccessibilityServicesLocked(UserState userState) {
         mTempComponentNameSet.clear();
         readComponentNamesFromSettingLocked(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
@@ -2962,11 +2985,14 @@
         }
 
         private boolean isValidPackageForUid(String packageName, int uid) {
+            final long token = Binder.clearCallingIdentity();
             try {
                 return uid == mPackageManager.getPackageUidAsUser(
                         packageName, UserHandle.getUserId(uid));
             } catch (PackageManager.NameNotFoundException e) {
                 return false;
+            } finally {
+                Binder.restoreCallingIdentity(token);
             }
         }
 
diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
index 1dba052..4adcb99f 100644
--- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java
@@ -3242,10 +3242,10 @@
             skip = true;
         }
 
-        // Do we have a transport to fetch data for us?
-        IBackupTransport transport = mTransportManager.getCurrentTransportBinder();
-        if (transport == null) {
-            if (DEBUG) Slog.w(TAG, "No transport");
+        TransportClient transportClient =
+                mTransportManager.getCurrentTransportClient("BMS.restoreAtInstall()");
+        if (transportClient == null) {
+            if (DEBUG) Slog.w(TAG, "No transport client");
             skip = true;
         }
 
@@ -3262,16 +3262,26 @@
                 // The eventual message back into the Package Manager to run the post-install
                 // steps for 'token' will be issued from the restore handling code.
 
-                // This can throw and so *must* happen before the wakelock is acquired
-                String dirName = transport.transportDirName();
-
                 mWakelock.acquire();
+
+                OnTaskFinishedListener listener = caller -> {
+                        mTransportManager.disposeOfTransportClient(transportClient, caller);
+                        mWakelock.release();
+                };
+
                 if (MORE_DEBUG) {
                     Slog.d(TAG, "Restore at install of " + packageName);
                 }
                 Message msg = mBackupHandler.obtainMessage(MSG_RUN_RESTORE);
-                msg.obj = new RestoreParams(transport, dirName, null, null,
-                        restoreSet, packageName, token);
+                msg.obj =
+                        RestoreParams.createForRestoreAtInstall(
+                                transportClient,
+                                /* observer */ null,
+                                /* monitor */ null,
+                                restoreSet,
+                                packageName,
+                                token,
+                                listener);
                 mBackupHandler.sendMessage(msg);
             } catch (Exception e) {
                 // Calling into the transport broke; back off and proceed with the installation.
@@ -3281,8 +3291,14 @@
         }
 
         if (skip) {
-            // Auto-restore disabled or no way to attempt a restore; just tell the Package
-            // Manager to proceed with the post-install handling for this package.
+            // Auto-restore disabled or no way to attempt a restore
+
+            if (transportClient != null) {
+                mTransportManager.disposeOfTransportClient(
+                        transportClient, "BMS.restoreAtInstall()");
+            }
+
+            // Tell the PackageManager to proceed with the post-install handling for this package.
             if (DEBUG) Slog.v(TAG, "Finishing install immediately");
             try {
                 mPackageManagerBinder.finishPackageInstall(token, false);
diff --git a/services/backup/java/com/android/server/backup/TransportManager.java b/services/backup/java/com/android/server/backup/TransportManager.java
index f8f1448..1f3ebf9 100644
--- a/services/backup/java/com/android/server/backup/TransportManager.java
+++ b/services/backup/java/com/android/server/backup/TransportManager.java
@@ -308,6 +308,12 @@
         }
     }
 
+    public boolean isTransportRegistered(String transportName) {
+        synchronized (mTransportLock) {
+            return getRegisteredTransportEntryLocked(transportName) != null;
+        }
+    }
+
     /**
      * Returns a {@link TransportClient} for the current transport or null if not found.
      *
diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
index 477724d..4c78348 100644
--- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java
+++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java
@@ -189,7 +189,7 @@
                     }
                     task.execute();
                 } catch (ClassCastException e) {
-                    Slog.e(TAG, "Invalid backup task in flight, obj=" + msg.obj);
+                    Slog.e(TAG, "Invalid backup/restore task in flight, obj=" + msg.obj);
                 }
                 break;
             }
@@ -229,10 +229,18 @@
                 RestoreParams params = (RestoreParams) msg.obj;
                 Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);
 
-                PerformUnifiedRestoreTask task = new PerformUnifiedRestoreTask(backupManagerService,
-                        params.transport,
-                        params.observer, params.monitor, params.token, params.pkgInfo,
-                        params.pmToken, params.isSystemRestore, params.filterSet);
+                PerformUnifiedRestoreTask task =
+                        new PerformUnifiedRestoreTask(
+                                backupManagerService,
+                                params.transportClient,
+                                params.observer,
+                                params.monitor,
+                                params.token,
+                                params.packageInfo,
+                                params.pmToken,
+                                params.isSystemRestore,
+                                params.filterSet,
+                                params.listener);
 
                 synchronized (backupManagerService.getPendingRestores()) {
                     if (backupManagerService.isRestoreInProgress()) {
@@ -299,8 +307,11 @@
                 // Like other async operations, this is entered with the wakelock held
                 RestoreSet[] sets = null;
                 RestoreGetSetsParams params = (RestoreGetSetsParams) msg.obj;
+                String callerLogString = "BH/MSG_RUN_GET_RESTORE_SETS";
                 try {
-                    sets = params.transport.getAvailableRestoreSets();
+                    IBackupTransport transport =
+                            params.transportClient.connectOrThrow(callerLogString);
+                    sets = transport.getAvailableRestoreSets();
                     // cache the result in the active session
                     synchronized (params.session) {
                         params.session.mRestoreSets = sets;
@@ -325,7 +336,7 @@
                     removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
                     sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);
 
-                    backupManagerService.getWakelock().release();
+                    params.listener.onFinished(callerLogString);
                 }
                 break;
             }
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index e65eb28..a002334 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -907,7 +907,7 @@
             mStatus = BackupTransport.TRANSPORT_OK;
             long size = 0;
             try {
-                TransportUtils.checkTransport(transport);
+                TransportUtils.checkTransportNotNull(transport);
                 size = mBackupDataName.length();
                 if (size > 0) {
                     if (mStatus == BackupTransport.TRANSPORT_OK) {
@@ -997,7 +997,7 @@
                 }
                 if (mAgentBinder != null) {
                     try {
-                        TransportUtils.checkTransport(transport);
+                        TransportUtils.checkTransportNotNull(transport);
                         long quota = transport.getBackupQuota(mCurrentPackage.packageName, false);
                         mAgentBinder.doQuotaExceeded(size, quota);
                     } catch (Exception e) {
diff --git a/services/backup/java/com/android/server/backup/params/RestoreGetSetsParams.java b/services/backup/java/com/android/server/backup/params/RestoreGetSetsParams.java
index bff476b..914e9ea 100644
--- a/services/backup/java/com/android/server/backup/params/RestoreGetSetsParams.java
+++ b/services/backup/java/com/android/server/backup/params/RestoreGetSetsParams.java
@@ -20,20 +20,24 @@
 import android.app.backup.IRestoreObserver;
 
 import com.android.internal.backup.IBackupTransport;
+import com.android.server.backup.internal.OnTaskFinishedListener;
 import com.android.server.backup.restore.ActiveRestoreSession;
+import com.android.server.backup.transport.TransportClient;
 
 public class RestoreGetSetsParams {
+    public final TransportClient transportClient;
+    public final ActiveRestoreSession session;
+    public final IRestoreObserver observer;
+    public final IBackupManagerMonitor monitor;
+    public final OnTaskFinishedListener listener;
 
-    public IBackupTransport transport;
-    public ActiveRestoreSession session;
-    public IRestoreObserver observer;
-    public IBackupManagerMonitor monitor;
-
-    public RestoreGetSetsParams(IBackupTransport _transport, ActiveRestoreSession _session,
-            IRestoreObserver _observer, IBackupManagerMonitor _monitor) {
-        transport = _transport;
+    public RestoreGetSetsParams(TransportClient _transportClient, ActiveRestoreSession _session,
+            IRestoreObserver _observer, IBackupManagerMonitor _monitor,
+            OnTaskFinishedListener _listener) {
+        transportClient = _transportClient;
         session = _session;
         observer = _observer;
         monitor = _monitor;
+        listener = _listener;
     }
 }
diff --git a/services/backup/java/com/android/server/backup/params/RestoreParams.java b/services/backup/java/com/android/server/backup/params/RestoreParams.java
index 93ce00d..e500d6e 100644
--- a/services/backup/java/com/android/server/backup/params/RestoreParams.java
+++ b/services/backup/java/com/android/server/backup/params/RestoreParams.java
@@ -20,84 +20,128 @@
 import android.app.backup.IRestoreObserver;
 import android.content.pm.PackageInfo;
 
-import com.android.internal.backup.IBackupTransport;
+import com.android.server.backup.internal.OnTaskFinishedListener;
+import com.android.server.backup.transport.TransportClient;
 
 public class RestoreParams {
-
-    public IBackupTransport transport;
-    public String dirName;
-    public IRestoreObserver observer;
-    public IBackupManagerMonitor monitor;
-    public long token;
-    public PackageInfo pkgInfo;
-    public int pmToken; // in post-install restore, the PM's token for this transaction
-    public boolean isSystemRestore;
-    public String[] filterSet;
+    public final TransportClient transportClient;
+    public final IRestoreObserver observer;
+    public final IBackupManagerMonitor monitor;
+    public final long token;
+    public final PackageInfo packageInfo;
+    public final int pmToken; // in post-install restore, the PM's token for this transaction
+    public final boolean isSystemRestore;
+    public final String[] filterSet;
+    public final OnTaskFinishedListener listener;
 
     /**
-     * Restore a single package; no kill after restore
+     * No kill after restore.
      */
-    public RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs,
-            IBackupManagerMonitor _monitor, long _token, PackageInfo _pkg) {
-        transport = _transport;
-        dirName = _dirName;
-        observer = _obs;
-        monitor = _monitor;
-        token = _token;
-        pkgInfo = _pkg;
-        pmToken = 0;
-        isSystemRestore = false;
-        filterSet = null;
+    public static RestoreParams createForSinglePackage(
+            TransportClient transportClient,
+            IRestoreObserver observer,
+            IBackupManagerMonitor monitor,
+            long token,
+            PackageInfo packageInfo,
+            OnTaskFinishedListener listener) {
+        return new RestoreParams(
+                transportClient,
+                observer,
+                monitor,
+                token,
+                packageInfo,
+                /* pmToken */ 0,
+                /* isSystemRestore */ false,
+                /* filterSet */ null,
+                listener);
     }
 
     /**
-     * Restore at install: PM token needed, kill after restore
+     * Kill after restore.
      */
-    public RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs,
-            IBackupManagerMonitor _monitor, long _token, String _pkgName, int _pmToken) {
-        transport = _transport;
-        dirName = _dirName;
-        observer = _obs;
-        monitor = _monitor;
-        token = _token;
-        pkgInfo = null;
-        pmToken = _pmToken;
-        isSystemRestore = false;
-        filterSet = new String[]{_pkgName};
+    public static RestoreParams createForRestoreAtInstall(
+            TransportClient transportClient,
+            IRestoreObserver observer,
+            IBackupManagerMonitor monitor,
+            long token,
+            String packageName,
+            int pmToken,
+            OnTaskFinishedListener listener) {
+        String[] filterSet = {packageName};
+        return new RestoreParams(
+                transportClient,
+                observer,
+                monitor,
+                token,
+                /* packageInfo */ null,
+                pmToken,
+                /* isSystemRestore */ false,
+                filterSet,
+                listener);
     }
 
     /**
-     * Restore everything possible.  This is the form that Setup Wizard or similar
-     * restore UXes use.
+     * This is the form that Setup Wizard or similar restore UXes use.
      */
-    public RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs,
-            IBackupManagerMonitor _monitor, long _token) {
-        transport = _transport;
-        dirName = _dirName;
-        observer = _obs;
-        monitor = _monitor;
-        token = _token;
-        pkgInfo = null;
-        pmToken = 0;
-        isSystemRestore = true;
-        filterSet = null;
+    public static RestoreParams createForRestoreAll(
+            TransportClient transportClient,
+            IRestoreObserver observer,
+            IBackupManagerMonitor monitor,
+            long token,
+            OnTaskFinishedListener listener) {
+        return new RestoreParams(
+                transportClient,
+                observer,
+                monitor,
+                token,
+                /* packageInfo */ null,
+                /* pmToken */ 0,
+                /* isSystemRestore */ true,
+                /* filterSet */ null,
+                listener);
     }
 
     /**
-     * Restore some set of packages.  Leave this one up to the caller to specify
-     * whether it's to be considered a system-level restore.
+     * Caller specifies whether is considered a system-level restore.
      */
-    public RestoreParams(IBackupTransport _transport, String _dirName, IRestoreObserver _obs,
-            IBackupManagerMonitor _monitor, long _token,
-            String[] _filterSet, boolean _isSystemRestore) {
-        transport = _transport;
-        dirName = _dirName;
-        observer = _obs;
-        monitor = _monitor;
-        token = _token;
-        pkgInfo = null;
-        pmToken = 0;
-        isSystemRestore = _isSystemRestore;
-        filterSet = _filterSet;
+    public static RestoreParams createForRestoreSome(
+            TransportClient transportClient,
+            IRestoreObserver observer,
+            IBackupManagerMonitor monitor,
+            long token,
+            String[] filterSet,
+            boolean isSystemRestore,
+            OnTaskFinishedListener listener) {
+        return new RestoreParams(
+                transportClient,
+                observer,
+                monitor,
+                token,
+                /* packageInfo */ null,
+                /* pmToken */ 0,
+                isSystemRestore,
+                filterSet,
+                listener);
+    }
+
+    private RestoreParams(
+            TransportClient transportClient,
+            IRestoreObserver observer,
+            IBackupManagerMonitor monitor,
+            long token,
+            PackageInfo packageInfo,
+            int pmToken,
+            boolean isSystemRestore,
+            String[] filterSet,
+            OnTaskFinishedListener listener) {
+        this.transportClient = transportClient;
+        this.observer = observer;
+        this.monitor = monitor;
+        this.token = token;
+        this.packageInfo = packageInfo;
+        this.pmToken = pmToken;
+        this.isSystemRestore = isSystemRestore;
+        this.filterSet = filterSet;
+        this.listener = listener;
     }
 }
diff --git a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
index a08c19e..7ae5b43 100644
--- a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
+++ b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java
@@ -31,33 +31,39 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Binder;
 import android.os.Message;
+import android.os.PowerManager;
 import android.util.Slog;
 
-import com.android.internal.backup.IBackupTransport;
 import com.android.server.backup.RefactoredBackupManagerService;
+import com.android.server.backup.TransportManager;
+import com.android.server.backup.internal.BackupHandler;
+import com.android.server.backup.internal.OnTaskFinishedListener;
 import com.android.server.backup.params.RestoreGetSetsParams;
 import com.android.server.backup.params.RestoreParams;
+import com.android.server.backup.transport.TransportClient;
+
+import java.util.function.BiFunction;
 
 /**
  * Restore session.
  */
 public class ActiveRestoreSession extends IRestoreSession.Stub {
-
     private static final String TAG = "RestoreSession";
 
-    private RefactoredBackupManagerService backupManagerService;
-    private String mPackageName;
-    private IBackupTransport mRestoreTransport = null;
+    private final TransportManager mTransportManager;
+    private final String mTransportName;
+    private final RefactoredBackupManagerService mBackupManagerService;
+    private final String mPackageName;
     public RestoreSet[] mRestoreSets = null;
     boolean mEnded = false;
     boolean mTimedOut = false;
 
     public ActiveRestoreSession(RefactoredBackupManagerService backupManagerService,
-            String packageName, String transport) {
-        this.backupManagerService = backupManagerService;
+            String packageName, String transportName) {
+        mBackupManagerService = backupManagerService;
         mPackageName = packageName;
-        mRestoreTransport = backupManagerService.getTransportManager().getTransportBinder(
-                transport);
+        mTransportManager = backupManagerService.getTransportManager();
+        mTransportName = transportName;
     }
 
     public void markTimedOut() {
@@ -67,7 +73,7 @@
     // --- Binder interface ---
     public synchronized int getAvailableRestoreSets(IRestoreObserver observer,
             IBackupManagerMonitor monitor) {
-        backupManagerService.getContext().enforceCallingOrSelfPermission(
+        mBackupManagerService.getContext().enforceCallingOrSelfPermission(
                 android.Manifest.permission.BACKUP,
                 "getAvailableRestoreSets");
         if (observer == null) {
@@ -85,23 +91,32 @@
 
         long oldId = Binder.clearCallingIdentity();
         try {
-            if (mRestoreTransport == null) {
-                Slog.w(TAG, "Null transport getting restore sets");
+            TransportClient transportClient =
+                    mTransportManager.getTransportClient(
+                                    mTransportName, "RestoreSession.getAvailableRestoreSets()");
+            if (transportClient == null) {
+                Slog.w(TAG, "Null transport client getting restore sets");
                 return -1;
             }
 
             // We know we're doing legit work now, so halt the timeout
             // until we're done.  It gets started again when the result
             // comes in.
-            backupManagerService.getBackupHandler().removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
+            mBackupManagerService.getBackupHandler().removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
 
-            // spin off the transport request to our service thread
-            backupManagerService.getWakelock().acquire();
-            Message msg = backupManagerService.getBackupHandler().obtainMessage(
+            PowerManager.WakeLock wakelock = mBackupManagerService.getWakelock();
+            wakelock.acquire();
+
+            // Prevent lambda from leaking 'this'
+            TransportManager transportManager = mTransportManager;
+            OnTaskFinishedListener listener = caller -> {
+                    transportManager.disposeOfTransportClient(transportClient, caller);
+                    wakelock.release();
+            };
+            Message msg = mBackupManagerService.getBackupHandler().obtainMessage(
                     MSG_RUN_GET_RESTORE_SETS,
-                    new RestoreGetSetsParams(mRestoreTransport, this, observer,
-                            monitor));
-            backupManagerService.getBackupHandler().sendMessage(msg);
+                    new RestoreGetSetsParams(transportClient, this, observer, monitor, listener));
+            mBackupManagerService.getBackupHandler().sendMessage(msg);
             return 0;
         } catch (Exception e) {
             Slog.e(TAG, "Error in getAvailableRestoreSets", e);
@@ -113,7 +128,7 @@
 
     public synchronized int restoreAll(long token, IRestoreObserver observer,
             IBackupManagerMonitor monitor) {
-        backupManagerService.getContext().enforceCallingOrSelfPermission(
+        mBackupManagerService.getContext().enforceCallingOrSelfPermission(
                 android.Manifest.permission.BACKUP,
                 "performRestore");
 
@@ -131,7 +146,7 @@
             return -1;
         }
 
-        if (mRestoreTransport == null || mRestoreSets == null) {
+        if (mRestoreSets == null) {
             Slog.e(TAG, "Ignoring restoreAll() with no restore set");
             return -1;
         }
@@ -141,37 +156,28 @@
             return -1;
         }
 
-        String dirName;
-        try {
-            dirName = mRestoreTransport.transportDirName();
-        } catch (Exception e) {
-            // Transport went AWOL; fail.
-            Slog.e(TAG, "Unable to get transport dir for restore: " + e.getMessage());
+        if (!mTransportManager.isTransportRegistered(mTransportName)) {
+            Slog.e(TAG, "Transport " + mTransportName + " not registered");
             return -1;
         }
 
-        synchronized (backupManagerService.getQueueLock()) {
+        synchronized (mBackupManagerService.getQueueLock()) {
             for (int i = 0; i < mRestoreSets.length; i++) {
                 if (token == mRestoreSets[i].token) {
-                    // Real work, so stop the session timeout until we finalize the restore
-                    backupManagerService.getBackupHandler().removeMessages(
-                            MSG_RESTORE_SESSION_TIMEOUT);
-
                     long oldId = Binder.clearCallingIdentity();
                     try {
-                        backupManagerService.getWakelock().acquire();
-                        if (MORE_DEBUG) {
-                            Slog.d(TAG, "restoreAll() kicking off");
-                        }
-                        Message msg = backupManagerService.getBackupHandler().obtainMessage(
-                                MSG_RUN_RESTORE);
-                        msg.obj = new RestoreParams(mRestoreTransport, dirName,
-                                observer, monitor, token);
-                        backupManagerService.getBackupHandler().sendMessage(msg);
+                        return sendRestoreToHandlerLocked(
+                                (transportClient, listener) ->
+                                        RestoreParams.createForRestoreAll(
+                                                transportClient,
+                                                observer,
+                                                monitor,
+                                                token,
+                                                listener),
+                                "RestoreSession.restoreAll()");
                     } finally {
                         Binder.restoreCallingIdentity(oldId);
                     }
-                    return 0;
                 }
             }
         }
@@ -183,7 +189,7 @@
     // Restores of more than a single package are treated as 'system' restores
     public synchronized int restoreSome(long token, IRestoreObserver observer,
             IBackupManagerMonitor monitor, String[] packages) {
-        backupManagerService.getContext().enforceCallingOrSelfPermission(
+        mBackupManagerService.getContext().enforceCallingOrSelfPermission(
                 android.Manifest.permission.BACKUP,
                 "performRestore");
 
@@ -227,7 +233,7 @@
             return -1;
         }
 
-        if (mRestoreTransport == null || mRestoreSets == null) {
+        if (mRestoreSets == null) {
             Slog.e(TAG, "Ignoring restoreAll() with no restore set");
             return -1;
         }
@@ -237,34 +243,30 @@
             return -1;
         }
 
-        String dirName;
-        try {
-            dirName = mRestoreTransport.transportDirName();
-        } catch (Exception e) {
-            // Transport went AWOL; fail.
-            Slog.e(TAG, "Unable to get transport name for restoreSome: " + e.getMessage());
+        if (!mTransportManager.isTransportRegistered(mTransportName)) {
+            Slog.e(TAG, "Transport " + mTransportName + " not registered");
             return -1;
         }
 
-        synchronized (backupManagerService.getQueueLock()) {
+        synchronized (mBackupManagerService.getQueueLock()) {
             for (int i = 0; i < mRestoreSets.length; i++) {
                 if (token == mRestoreSets[i].token) {
-                    // Stop the session timeout until we finalize the restore
-                    backupManagerService.getBackupHandler().removeMessages(
-                            MSG_RESTORE_SESSION_TIMEOUT);
-
                     long oldId = Binder.clearCallingIdentity();
-                    backupManagerService.getWakelock().acquire();
-                    if (MORE_DEBUG) {
-                        Slog.d(TAG, "restoreSome() of " + packages.length + " packages");
+                    try {
+                        return sendRestoreToHandlerLocked(
+                                (transportClient, listener) ->
+                                        RestoreParams.createForRestoreSome(
+                                                transportClient,
+                                                observer,
+                                                monitor,
+                                                token,
+                                                packages,
+                                                /* isSystemRestore */ packages.length > 1,
+                                                listener),
+                                "RestoreSession.restoreSome(" + packages.length + " packages)");
+                    } finally {
+                        Binder.restoreCallingIdentity(oldId);
                     }
-                    Message msg = backupManagerService.getBackupHandler().obtainMessage(
-                            MSG_RUN_RESTORE);
-                    msg.obj = new RestoreParams(mRestoreTransport, dirName, observer, monitor,
-                            token, packages, packages.length > 1);
-                    backupManagerService.getBackupHandler().sendMessage(msg);
-                    Binder.restoreCallingIdentity(oldId);
-                    return 0;
                 }
             }
         }
@@ -297,9 +299,9 @@
             }
         }
 
-        PackageInfo app = null;
+        final PackageInfo app;
         try {
-            app = backupManagerService.getPackageManager().getPackageInfo(packageName, 0);
+            app = mBackupManagerService.getPackageManager().getPackageInfo(packageName, 0);
         } catch (NameNotFoundException nnf) {
             Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName);
             return -1;
@@ -307,7 +309,7 @@
 
         // If the caller is not privileged and is not coming from the target
         // app's uid, throw a permission exception back to the caller.
-        int perm = backupManagerService.getContext().checkPermission(
+        int perm = mBackupManagerService.getContext().checkPermission(
                 android.Manifest.permission.BACKUP,
                 Binder.getCallingPid(), Binder.getCallingUid());
         if ((perm == PackageManager.PERMISSION_DENIED) &&
@@ -317,12 +319,17 @@
             throw new SecurityException("No permission to restore other packages");
         }
 
+        if (!mTransportManager.isTransportRegistered(mTransportName)) {
+            Slog.e(TAG, "Transport " + mTransportName + " not registered");
+            return -1;
+        }
+
         // So far so good; we're allowed to try to restore this package.
         long oldId = Binder.clearCallingIdentity();
         try {
             // Check whether there is data for it in the current dataset, falling back
             // to the ancestral dataset if not.
-            long token = backupManagerService.getAvailableRestoreToken(packageName);
+            long token = mBackupManagerService.getAvailableRestoreToken(packageName);
             if (DEBUG) {
                 Slog.v(TAG, "restorePackage pkg=" + packageName
                         + " token=" + Long.toHexString(token));
@@ -338,30 +345,53 @@
                 return -1;
             }
 
-            String dirName;
-            try {
-                dirName = mRestoreTransport.transportDirName();
-            } catch (Exception e) {
-                // Transport went AWOL; fail.
-                Slog.e(TAG, "Unable to get transport dir for restorePackage: " + e.getMessage());
-                return -1;
-            }
-
-            // Stop the session timeout until we finalize the restore
-            backupManagerService.getBackupHandler().removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
-
-            // Ready to go:  enqueue the restore request and claim success
-            backupManagerService.getWakelock().acquire();
-            if (MORE_DEBUG) {
-                Slog.d(TAG, "restorePackage() : " + packageName);
-            }
-            Message msg = backupManagerService.getBackupHandler().obtainMessage(MSG_RUN_RESTORE);
-            msg.obj = new RestoreParams(mRestoreTransport, dirName, observer, monitor,
-                    token, app);
-            backupManagerService.getBackupHandler().sendMessage(msg);
+            return sendRestoreToHandlerLocked(
+                    (transportClient, listener) ->
+                            RestoreParams.createForSinglePackage(
+                                    transportClient,
+                                    observer,
+                                    monitor,
+                                    token,
+                                    app,
+                                    listener),
+                    "RestoreSession.restorePackage(" + packageName + ")");
         } finally {
             Binder.restoreCallingIdentity(oldId);
         }
+    }
+
+    /**
+     * Returns 0 if operation sent or -1 otherwise.
+     */
+    private int sendRestoreToHandlerLocked(
+            BiFunction<TransportClient, OnTaskFinishedListener, RestoreParams> restoreParamsBuilder,
+            String callerLogString) {
+        TransportClient transportClient =
+                mTransportManager.getTransportClient(mTransportName, callerLogString);
+        if (transportClient == null) {
+            Slog.e(TAG, "Transport " + mTransportName + " got unregistered");
+            return -1;
+        }
+
+        // Stop the session timeout until we finalize the restore
+        BackupHandler backupHandler = mBackupManagerService.getBackupHandler();
+        backupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
+
+        PowerManager.WakeLock wakelock = mBackupManagerService.getWakelock();
+        wakelock.acquire();
+        if (MORE_DEBUG) {
+            Slog.d(TAG, callerLogString);
+        }
+
+        // Prevent lambda from leaking 'this'
+        TransportManager transportManager = mTransportManager;
+        OnTaskFinishedListener listener = caller -> {
+                transportManager.disposeOfTransportClient(transportClient, caller);
+                wakelock.release();
+        };
+        Message msg = backupHandler.obtainMessage(MSG_RUN_RESTORE);
+        msg.obj = restoreParamsBuilder.apply(transportClient, listener);
+        backupHandler.sendMessage(msg);
         return 0;
     }
 
@@ -380,7 +410,6 @@
         public void run() {
             // clean up the session's bookkeeping
             synchronized (mSession) {
-                mSession.mRestoreTransport = null;
                 mSession.mEnded = true;
             }
 
@@ -404,7 +433,7 @@
             throw new IllegalStateException("Restore session already ended");
         }
 
-        backupManagerService.getBackupHandler().post(
-                new EndRestoreRunnable(backupManagerService, this));
+        mBackupManagerService.getBackupHandler().post(
+                new EndRestoreRunnable(mBackupManagerService, this));
     }
 }
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 2db7430..86866dc 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -61,6 +61,8 @@
 import com.android.server.backup.PackageManagerBackupAgent;
 import com.android.server.backup.PackageManagerBackupAgent.Metadata;
 import com.android.server.backup.RefactoredBackupManagerService;
+import com.android.server.backup.internal.OnTaskFinishedListener;
+import com.android.server.backup.transport.TransportClient;
 import com.android.server.backup.utils.AppBackupUtils;
 import com.android.server.backup.utils.BackupManagerMonitorUtils;
 
@@ -76,8 +78,8 @@
 public class PerformUnifiedRestoreTask implements BackupRestoreTask {
 
     private RefactoredBackupManagerService backupManagerService;
-    // Transport we're working with to do the restore
-    private IBackupTransport mTransport;
+    // Transport client we're working with to do the restore
+    private final TransportClient mTransportClient;
 
     // Where per-transport saved state goes
     File mStateDir;
@@ -141,6 +143,9 @@
     // Done?
     private boolean mFinished;
 
+    // When finished call listener
+    private final OnTaskFinishedListener mListener;
+
     // Key/value: bookkeeping about staged data and files for agent access
     private File mBackupDataName;
     private File mStageName;
@@ -154,15 +159,16 @@
     // Invariant: mWakelock is already held, and this task is responsible for
     // releasing it at the end of the restore operation.
     public PerformUnifiedRestoreTask(RefactoredBackupManagerService backupManagerService,
-            IBackupTransport transport, IRestoreObserver observer,
+            TransportClient transportClient, IRestoreObserver observer,
             IBackupManagerMonitor monitor, long restoreSetToken, PackageInfo targetPackage,
-            int pmToken, boolean isFullSystemRestore, String[] filterSet) {
+            int pmToken, boolean isFullSystemRestore, String[] filterSet,
+            OnTaskFinishedListener listener) {
         this.backupManagerService = backupManagerService;
         mEphemeralOpToken = backupManagerService.generateRandomIntegerToken();
         mState = UnifiedRestoreState.INITIAL;
         mStartRealtime = SystemClock.elapsedRealtime();
 
-        mTransport = transport;
+        mTransportClient = transportClient;
         mObserver = observer;
         mMonitor = monitor;
         mToken = restoreSetToken;
@@ -171,6 +177,7 @@
         mIsSystemRestore = isFullSystemRestore;
         mFinished = false;
         mDidLaunch = false;
+        mListener = listener;
 
         if (targetPackage != null) {
             // Single package restore
@@ -342,7 +349,7 @@
         }
 
         try {
-            String transportDir = mTransport.transportDirName();
+            String transportDir = mTransportClient.getTransportDirName();
             mStateDir = new File(backupManagerService.getBaseStateDir(), transportDir);
 
             // Fetch the current metadata from the dataset first
@@ -351,7 +358,11 @@
             mAcceptSet.add(0, pmPackage);
 
             PackageInfo[] packages = mAcceptSet.toArray(new PackageInfo[0]);
-            mStatus = mTransport.startRestore(mToken, packages);
+
+            IBackupTransport transport =
+                    mTransportClient.connectOrThrow("PerformUnifiedRestoreTask.startRestore()");
+
+            mStatus = transport.startRestore(mToken, packages);
             if (mStatus != BackupTransport.TRANSPORT_OK) {
                 Slog.e(TAG, "Transport error " + mStatus + "; no restore possible");
                 mStatus = BackupTransport.TRANSPORT_ERROR;
@@ -359,7 +370,7 @@
                 return;
             }
 
-            RestoreDescription desc = mTransport.nextRestorePackage();
+            RestoreDescription desc = transport.nextRestorePackage();
             if (desc == null) {
                 Slog.e(TAG, "No restore metadata available; halting");
                 mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor,
@@ -444,7 +455,10 @@
     private void dispatchNextRestore() {
         UnifiedRestoreState nextState = UnifiedRestoreState.FINAL;
         try {
-            mRestoreDescription = mTransport.nextRestorePackage();
+            IBackupTransport transport =
+                    mTransportClient.connectOrThrow(
+                            "PerformUnifiedRestoreTask.dispatchNextRestore()");
+            mRestoreDescription = transport.nextRestorePackage();
             final String pkgName = (mRestoreDescription != null)
                     ? mRestoreDescription.getPackageName() : null;
             if (pkgName == null) {
@@ -657,13 +671,17 @@
         File downloadFile = (staging) ? mStageName : mBackupDataName;
 
         try {
+            IBackupTransport transport =
+                    mTransportClient.connectOrThrow(
+                            "PerformUnifiedRestoreTask.initiateOneRestore()");
+
             // Run the transport's restore pass
             stage = ParcelFileDescriptor.open(downloadFile,
                     ParcelFileDescriptor.MODE_READ_WRITE |
                             ParcelFileDescriptor.MODE_CREATE |
                             ParcelFileDescriptor.MODE_TRUNCATE);
 
-            if (mTransport.getRestoreData(stage) != BackupTransport.TRANSPORT_OK) {
+            if (transport.getRestoreData(stage) != BackupTransport.TRANSPORT_OK) {
                 // Transport-level failure, so we wind everything up and
                 // terminate the restore operation.
                 Slog.e(TAG, "Error getting restore data for " + packageName);
@@ -750,7 +768,7 @@
         // None of this can run on the work looper here, so we spin asynchronous
         // work like this:
         //
-        //   StreamFeederThread: read data from mTransport.getNextFullRestoreDataChunk()
+        //   StreamFeederThread: read data from transport.getNextFullRestoreDataChunk()
         //                       write it into the pipe to the engine
         //   EngineThread: FullRestoreEngine thread communicating with the target app
         //
@@ -844,10 +862,12 @@
             // spin up the engine and start moving data to it
             new Thread(mEngineThread, "unified-restore-engine").start();
 
+            String callerLogString = "PerformUnifiedRestoreTask$StreamFeederThread.run()";
             try {
+                IBackupTransport transport = mTransportClient.connectOrThrow(callerLogString);
                 while (status == BackupTransport.TRANSPORT_OK) {
                     // have the transport write some of the restoring data to us
-                    int result = mTransport.getNextFullRestoreDataChunk(tWriteEnd);
+                    int result = transport.getNextFullRestoreDataChunk(tWriteEnd);
                     if (result > 0) {
                         // The transport wrote this many bytes of restore data to the
                         // pipe, so pass it along to the engine.
@@ -936,7 +956,9 @@
                     // Something went wrong somewhere.  Whether it was at the transport
                     // level is immaterial; we need to tell the transport to bail
                     try {
-                        mTransport.abortFullRestore();
+                        IBackupTransport transport =
+                                mTransportClient.connectOrThrow(callerLogString);
+                        transport.abortFullRestore();
                     } catch (Exception e) {
                         // transport itself is dead; make sure we handle this as a
                         // fatal error
@@ -1039,8 +1061,11 @@
             Slog.d(TAG, "finishing restore mObserver=" + mObserver);
         }
 
+        String callerLogString = "PerformUnifiedRestoreTask.finalizeRestore()";
         try {
-            mTransport.finishRestore();
+            IBackupTransport transport =
+                    mTransportClient.connectOrThrow(callerLogString);
+            transport.finishRestore();
         } catch (Exception e) {
             Slog.e(TAG, "Error finishing restore", e);
         }
@@ -1087,9 +1112,6 @@
             backupManagerService.writeRestoreTokens();
         }
 
-        // done; we can finally release the wakelock and be legitimately done.
-        Slog.i(TAG, "Restore complete.");
-
         synchronized (backupManagerService.getPendingRestores()) {
             if (backupManagerService.getPendingRestores().size() > 0) {
                 if (DEBUG) {
@@ -1108,7 +1130,8 @@
             }
         }
 
-        backupManagerService.getWakelock().release();
+        Slog.i(TAG, "Restore complete.");
+        mListener.onFinished(callerLogString);
     }
 
     void keyValueAgentErrorCleanup() {
@@ -1301,13 +1324,11 @@
 
     void sendOnRestorePackage(String name) {
         if (mObserver != null) {
-            if (mObserver != null) {
-                try {
-                    mObserver.onUpdate(mCount, name);
-                } catch (RemoteException e) {
-                    Slog.d(TAG, "Restore observer died in onUpdate");
-                    mObserver = null;
-                }
+            try {
+                mObserver.onUpdate(mCount, name);
+            } catch (RemoteException e) {
+                Slog.d(TAG, "Restore observer died in onUpdate");
+                mObserver = null;
             }
         }
     }
diff --git a/services/backup/java/com/android/server/backup/restore/RestoreEngine.java b/services/backup/java/com/android/server/backup/restore/RestoreEngine.java
index b2fdbb8..9d3ae86 100644
--- a/services/backup/java/com/android/server/backup/restore/RestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/RestoreEngine.java
@@ -30,8 +30,8 @@
     public static final int TARGET_FAILURE = -2;
     public static final int TRANSPORT_FAILURE = -3;
 
-    private AtomicBoolean mRunning = new AtomicBoolean(false);
-    private AtomicInteger mResult = new AtomicInteger(SUCCESS);
+    private final AtomicBoolean mRunning = new AtomicBoolean(false);
+    private final AtomicInteger mResult = new AtomicInteger(SUCCESS);
 
     public boolean isRunning() {
         return mRunning.get();
diff --git a/services/backup/java/com/android/server/backup/transport/TransportUtils.java b/services/backup/java/com/android/server/backup/transport/TransportUtils.java
index 85599b7..92bba9b 100644
--- a/services/backup/java/com/android/server/backup/transport/TransportUtils.java
+++ b/services/backup/java/com/android/server/backup/transport/TransportUtils.java
@@ -31,7 +31,7 @@
      * Throws {@link TransportNotAvailableException} if {@param transport} is null. The semantics is
      * similar to a {@link DeadObjectException} coming from a dead transport binder.
      */
-    public static IBackupTransport checkTransport(@Nullable IBackupTransport transport)
+    public static IBackupTransport checkTransportNotNull(@Nullable IBackupTransport transport)
             throws TransportNotAvailableException {
         if (transport == null) {
             log(Log.ERROR, TAG, "Transport not available");
diff --git a/services/core/Android.bp b/services/core/Android.bp
index a2505a8..9fb2681 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -31,6 +31,7 @@
     static_libs: [
         "time_zone_distro",
         "time_zone_distro_installer",
+        "android.hardware.broadcastradio-V2.0-java",
         "android.hardware.health-V1.0-java",
         "android.hardware.health-V2.0-java",
         "android.hardware.weaver-V1.0-java",
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index 924e736..04d292f 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -421,7 +421,9 @@
         boolean logOutlier = false;
         long dischargeDuration = 0;
 
-        mBatteryLevelCritical = (mHealthInfo.batteryLevel <= mCriticalBatteryLevel);
+        mBatteryLevelCritical =
+            mHealthInfo.batteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
+            && mHealthInfo.batteryLevel <= mCriticalBatteryLevel;
         if (mHealthInfo.chargerAcOnline) {
             mPlugType = BatteryManager.BATTERY_PLUGGED_AC;
         } else if (mHealthInfo.chargerUsbOnline) {
@@ -509,6 +511,8 @@
             if (!mBatteryLevelLow) {
                 // Should we now switch in to low battery mode?
                 if (mPlugType == BATTERY_PLUGGED_NONE
+                        && mHealthInfo.batteryStatus !=
+                           BatteryManager.BATTERY_STATUS_UNKNOWN
                         && mHealthInfo.batteryLevel <= mLowBatteryWarningLevel) {
                     mBatteryLevelLow = true;
                 }
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index 2116d9a..e9eb3b3 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -827,15 +827,15 @@
         throw new IllegalArgumentException("Invalid Direction: " + direction);
     }
 
-    @Override
     /** Get a new SPI and maintain the reservation in the system server */
-    public synchronized IpSecSpiResponse reserveSecurityParameterIndex(
+    @Override
+    public synchronized IpSecSpiResponse allocateSecurityParameterIndex(
             int direction, String remoteAddress, int requestedSpi, IBinder binder)
             throws RemoteException {
         checkDirection(direction);
         checkInetAddress(remoteAddress);
         /* requestedSpi can be anything in the int range, so no check is needed. */
-        checkNotNull(binder, "Null Binder passed to reserveSecurityParameterIndex");
+        checkNotNull(binder, "Null Binder passed to allocateSecurityParameterIndex");
 
         UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
         int resourceId = mNextResourceId.getAndIncrement();
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index 9bfdd0c..af5cf1e 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -409,15 +409,16 @@
                 otherStack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
             }
         } finally {
-            if (mHomeStack != null && !isTopStack(mHomeStack)) {
+            final ActivityStack topFullscreenStack =
+                    getStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+            if (topFullscreenStack != null && mHomeStack != null && !isTopStack(mHomeStack)) {
                 // Whenever split-screen is dismissed we want the home stack directly behind the
-                // currently top stack so it shows up when the top stack is finished.
-                final ActivityStack topStack = getTopStack();
+                // current top fullscreen stack so it shows up when the top stack is finished.
                 // TODO: Would be better to use ActivityDisplay.positionChildAt() for this, however
                 // ActivityDisplay doesn't have a direct controller to WM side yet. We can switch
                 // once we have that.
                 mHomeStack.moveToFront("onSplitScreenModeDismissed");
-                topStack.moveToFront("onSplitScreenModeDismissed");
+                topFullscreenStack.moveToFront("onSplitScreenModeDismissed");
             }
             mSupervisor.mWindowManager.continueSurfaceLayout();
         }
@@ -435,7 +436,7 @@
                 }
                 otherStack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
                         false /* animate */, false /* showRecents */,
-                        false /* sendNonResizeableNotification */);
+                        true /* enteringSplitScreenMode */);
             }
         } finally {
             mSupervisor.mWindowManager.continueSurfaceLayout();
@@ -555,6 +556,16 @@
         return stack == getTopStack();
     }
 
+    boolean isTopFullscreenStack(ActivityStack stack) {
+        for (int i = mStacks.size() - 1; i >= 0; --i) {
+            final ActivityStack current = mStacks.get(i);
+            if (current.getWindowingMode() == WINDOWING_MODE_FULLSCREEN) {
+                return current == stack;
+            }
+        }
+        return false;
+    }
+
     int getIndexOf(ActivityStack stack) {
         return mStacks.indexOf(stack);
     }
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index bcb489d..8530313 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2947,9 +2947,11 @@
         try {
             return super.onTransact(code, data, reply, flags);
         } catch (RuntimeException e) {
-            // The activity manager only throws security exceptions, so let's
+            // The activity manager only throws certain exceptions intentionally, so let's
             // log all others.
-            if (!(e instanceof SecurityException)) {
+            if (!(e instanceof SecurityException
+                    || e instanceof IllegalArgumentException
+                    || e instanceof IllegalStateException)) {
                 Slog.wtf(TAG, "Activity Manager Crash."
                         + " UID:" + Binder.getCallingUid()
                         + " PID:" + Binder.getCallingPid()
@@ -10591,7 +10593,7 @@
                     stack.moveToFront("setTaskWindowingModeSplitScreenPrimary", task);
                 }
                 stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, animate, showRecents,
-                        true /* sendNonResizeableNotification */);
+                        false /* enteringSplitScreenMode */);
                 return windowingMode != task.getWindowingMode();
             } finally {
                 Binder.restoreCallingIdentity(ident);
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index d42c5de..69f6d5e 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -2731,7 +2731,8 @@
      *         {@link #mShowWhenLocked}.
      */
     boolean canShowWhenLocked() {
-        return mShowWhenLocked || service.mWindowManager.containsShowWhenLockedWindow(appToken);
+        return !inMultiWindowMode() && (mShowWhenLocked
+                || service.mWindowManager.containsShowWhenLockedWindow(appToken));
     }
 
     void setTurnScreenOn(boolean turnScreenOn) {
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index cf40be5..10c801d 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -484,20 +484,24 @@
     @Override
     public void setWindowingMode(int windowingMode) {
         setWindowingMode(windowingMode, false /* animate */, true /* showRecents */,
-                true /* sendNonResizeableNotification */);
+                false /* enteringSplitScreenMode */);
     }
 
     void setWindowingMode(int preferredWindowingMode, boolean animate, boolean showRecents,
-            boolean sendNonResizeableNotification) {
+            boolean enteringSplitScreenMode) {
+        final boolean creating = mWindowContainerController == null;
         final int currentMode = getWindowingMode();
         final ActivityDisplay display = getDisplay();
         final TaskRecord topTask = topTask();
         final ActivityStack splitScreenStack = display.getSplitScreenPrimaryStack();
         mTmpOptions.setLaunchWindowingMode(preferredWindowingMode);
 
-        // Need to make sure windowing mode is supported.
-        int windowingMode = display.resolveWindowingMode(
-                null /* ActivityRecord */, mTmpOptions, topTask, getActivityType());
+        // Need to make sure windowing mode is supported. If we in the process of creating the stack
+        // no need to resolve the windowing mode again as it is already resolved to the right mode.
+        int windowingMode = creating
+                ? preferredWindowingMode
+                : display.resolveWindowingMode(
+                        null /* ActivityRecord */, mTmpOptions, topTask, getActivityType());
         if (splitScreenStack == this && windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) {
             // Resolution to split-screen secondary for the primary split-screen stack means we want
             // to go fullscreen.
@@ -506,14 +510,19 @@
 
         final boolean alreadyInSplitScreenMode = display.hasSplitScreenPrimaryStack();
 
+        // Don't send non-resizeable notifications if the windowing mode changed was a side effect
+        // of us entering split-screen mode.
+        final boolean sendNonResizeableNotification = !enteringSplitScreenMode;
         // Take any required action due to us not supporting the preferred windowing mode.
-        if (sendNonResizeableNotification
-                && windowingMode != preferredWindowingMode && isActivityTypeStandardOrUndefined()) {
-            if (alreadyInSplitScreenMode
-                    && (preferredWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
-                    || preferredWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY)) {
-                // Looks like we can't launch in split screen mode, go ahead an dismiss split-screen
-                // and display a warning toast about it.
+        if (alreadyInSplitScreenMode && windowingMode == WINDOWING_MODE_FULLSCREEN
+                && sendNonResizeableNotification && isActivityTypeStandardOrUndefined()) {
+            final boolean preferredSplitScreen =
+                    preferredWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
+                    || preferredWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+            if (preferredSplitScreen || creating) {
+                // Looks like we can't launch in split screen mode or the stack we are launching
+                // doesn't support split-screen mode, go ahead an dismiss split-screen and display a
+                // warning toast about it.
                 mService.mTaskChangeNotificationController.notifyActivityDismissingDockedStack();
                 display.getSplitScreenPrimaryStack().setWindowingMode(WINDOWING_MODE_FULLSCREEN);
             }
@@ -544,7 +553,7 @@
             }
             super.setWindowingMode(windowingMode);
 
-            if (mWindowContainerController == null) {
+            if (creating) {
                 // Nothing else to do if we don't have a window container yet. E.g. call from ctor.
                 return;
             }
@@ -594,16 +603,22 @@
                 // the one where the home stack is visible since recents isn't visible yet, but the
                 // divider will be off. I think we should just make the initial bounds that of home
                 // so that the divider matches and remove this logic.
-                display.getOrCreateStack(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY,
-                        ACTIVITY_TYPE_RECENTS, true /* onTop */);
+                final ActivityStack recentStack = display.getOrCreateStack(
+                        WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_RECENTS,
+                        true /* onTop */);
+                recentStack.moveToFront("setWindowingMode");
                 // If task moved to docked stack - show recents if needed.
                 mService.mWindowManager.showRecentApps(false /* fromHome */);
             }
             wm.continueSurfaceLayout();
         }
 
-        mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
-        mStackSupervisor.resumeFocusedStackTopActivityLocked();
+        // Don't ensure visible activities if the windowing mode change was a side effect of us
+        // entering split-screen mode.
+        if (!enteringSplitScreenMode) {
+            mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
+            mStackSupervisor.resumeFocusedStackTopActivityLocked();
+        }
     }
 
     @Override
@@ -1668,7 +1683,7 @@
                     continue;
                 }
 
-                if (!r.visible && r != starting) {
+                if (!r.visibleIgnoringKeyguard && r != starting) {
                     // Also ignore invisible activities that are not the currently starting
                     // activity (about to be visible).
                     continue;
@@ -1796,6 +1811,7 @@
             boolean behindFullscreenActivity = !stackShouldBeVisible;
             boolean resumeNextActivity = mStackSupervisor.isFocusedStack(this)
                     && (isInStackLocked(starting) == null);
+            final boolean isTopFullscreenStack = getDisplay().isTopFullscreenStack(this);
             for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
                 final TaskRecord task = mTaskHistory.get(taskNdx);
                 final ArrayList<ActivityRecord> activities = task.mActivities;
@@ -1817,7 +1833,7 @@
 
                     // Now check whether it's really visible depending on Keyguard state.
                     final boolean reallyVisible = checkKeyguardVisibility(r,
-                            visibleIgnoringKeyguard, isTop);
+                            visibleIgnoringKeyguard, isTop && isTopFullscreenStack);
                     if (visibleIgnoringKeyguard) {
                         behindFullscreenActivity = updateBehindFullscreen(!stackShouldBeVisible,
                                 behindFullscreenActivity, r);
@@ -1943,13 +1959,11 @@
      *
      * @return true if {@param r} is visible taken Keyguard state into account, false otherwise
      */
-    boolean checkKeyguardVisibility(ActivityRecord r, boolean shouldBeVisible,
-            boolean isTop) {
-        final boolean isInPinnedStack = r.inPinnedWindowingMode();
+    boolean checkKeyguardVisibility(ActivityRecord r, boolean shouldBeVisible, boolean isTop) {
         final boolean keyguardShowing = mStackSupervisor.getKeyguardController().isKeyguardShowing(
                 mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY);
         final boolean keyguardLocked = mStackSupervisor.getKeyguardController().isKeyguardLocked();
-        final boolean showWhenLocked = r.canShowWhenLocked() && !isInPinnedStack;
+        final boolean showWhenLocked = r.canShowWhenLocked();
         final boolean dismissKeyguard = r.hasDismissKeyguardWindows();
         if (shouldBeVisible) {
             if (dismissKeyguard && mTopDismissingKeyguardActivity == null) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index edaa511..0a42aa9c 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2312,7 +2312,7 @@
         if (displayId == INVALID_DISPLAY) {
             displayId = candidateDisplayId;
         }
-        if (displayId != INVALID_DISPLAY) {
+        if (displayId != INVALID_DISPLAY && canLaunchOnDisplay(r, displayId)) {
             if (r != null) {
                 // TODO: This should also take in the windowing mode and activity type into account.
                 stack = (T) getValidLaunchStackOnDisplay(displayId, r);
@@ -2341,7 +2341,7 @@
         }
         if (stack != null) {
             display = stack.getDisplay();
-            if (display != null) {
+            if (display != null && canLaunchOnDisplay(r, display.mDisplayId)) {
                 final int windowingMode =
                         display.resolveWindowingMode(r, options, candidateTask, activityType);
                 if (stack.isCompatible(windowingMode, activityType)) {
@@ -2351,6 +2351,7 @@
         }
 
         if (display == null
+                || !canLaunchOnDisplay(r, display.mDisplayId)
                 // TODO: Can be removed once we figure-out how non-standard types should launch
                 // outside the default display.
                 || (activityType != ACTIVITY_TYPE_STANDARD
@@ -2361,6 +2362,14 @@
         return display.getOrCreateStack(r, options, candidateTask, activityType, onTop);
     }
 
+    /** @return true if activity record is null or can be launched on provided display. */
+    private boolean canLaunchOnDisplay(ActivityRecord r, int displayId) {
+        if (r == null) {
+            return true;
+        }
+        return r.canBeLaunchedOnDisplay(displayId);
+    }
+
     /**
      * Get a topmost stack on the display, that is a valid launch stack for specified activity.
      * If there is no such stack, new dynamic stack can be created.
@@ -4248,22 +4257,15 @@
 
         // Handle incorrect launch/move to secondary display if needed.
         if (isSecondaryDisplayPreferred) {
-            final boolean launchOnSecondaryDisplayFailed;
             final int actualDisplayId = task.getStack().mDisplayId;
             if (!task.canBeLaunchedOnDisplay(actualDisplayId)) {
-                // The task landed on an inappropriate display somehow, move it to the default
-                // display.
-                // TODO(multi-display): Find proper stack for the task on the default display.
-                mService.setTaskWindowingMode(task.taskId,
-                        WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY, true /* toTop */);
-                launchOnSecondaryDisplayFailed = true;
-            } else {
-                // The task might have landed on a display different from requested.
-                launchOnSecondaryDisplayFailed = actualDisplayId == DEFAULT_DISPLAY
-                        || (preferredDisplayId != INVALID_DISPLAY
-                            && preferredDisplayId != actualDisplayId);
+                throw new IllegalStateException("Task resolved to incompatible display");
             }
-            if (launchOnSecondaryDisplayFailed) {
+            // The task might have landed on a display different from requested.
+            // TODO(multi-display): Find proper stack for the task on the default display.
+            mService.setTaskWindowingMode(task.taskId,
+                    WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY, true /* toTop */);
+            if (preferredDisplayId != actualDisplayId) {
                 // Display a warning toast that we tried to put a non-resizeable task on a secondary
                 // display with config different from global config.
                 mService.mTaskChangeNotificationController
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 69cc3c7..abdbfad 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1812,6 +1812,9 @@
                 }
             }
         }
+        // Need to update mTargetStack because if task was moved out of it, the original stack may
+        // be destroyed.
+        mTargetStack = intentActivity.getStack();
         if (!mMovedToFront && mDoResume) {
             if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Bring to front target: " + mTargetStack
                     + " from " + intentActivity);
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index abb296e..2de84ab 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -662,7 +662,7 @@
      * task to be trimmed as a result of that add.
      */
     private boolean canAddTaskWithoutTrim(TaskRecord task) {
-        return findTrimIndexForAddTask(task) == -1;
+        return findRemoveIndexForAddTask(task) == -1;
     }
 
     /**
@@ -896,7 +896,7 @@
         }
 
         if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "addRecent: trimming tasks for " + task);
-        trimForAddTask(task);
+        removeForAddTask(task);
 
         task.inRecents = true;
         if (!isAffiliated || needAffiliationFix) {
@@ -1175,8 +1175,8 @@
      * If needed, remove oldest existing entries in recents that are for the same kind
      * of task as the given one.
      */
-    private void trimForAddTask(TaskRecord task) {
-        final int removeIndex = findTrimIndexForAddTask(task);
+    private void removeForAddTask(TaskRecord task) {
+        final int removeIndex = findRemoveIndexForAddTask(task);
         if (removeIndex == -1) {
             // Nothing to trim
             return;
@@ -1187,7 +1187,7 @@
         // callbacks here.
         final TaskRecord removedTask = mTasks.remove(removeIndex);
         if (removedTask != task) {
-            notifyTaskRemoved(removedTask, TRIMMED);
+            notifyTaskRemoved(removedTask, !TRIMMED);
             if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "Trimming task=" + removedTask
                     + " for addition of task=" + task);
         }
@@ -1198,7 +1198,7 @@
      * Find the task that would be removed if the given {@param task} is added to the recent tasks
      * list (if any).
      */
-    private int findTrimIndexForAddTask(TaskRecord task) {
+    private int findRemoveIndexForAddTask(TaskRecord task) {
         int recentsCount = mTasks.size();
         final Intent intent = task.intent;
         final boolean document = intent != null && intent.isDocument();
@@ -1241,7 +1241,6 @@
                         // don't need to trim it.
                         continue;
                     } else if (maxRecents > 0) {
-                        // Otherwise only trim if we are over our max recents for this task
                         --maxRecents;
                         if (!sameIntent || multiTasksAllowed) {
                             // We don't want to trim if we are not over the max allowed entries and
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index dabcbcd..91b3315 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -623,6 +623,9 @@
         if (toStack == sourceStack) {
             return false;
         }
+        if (!canBeLaunchedOnDisplay(toStack.mDisplayId)) {
+            return false;
+        }
 
         final int toStackWindowingMode = toStack.getWindowingMode();
         final ActivityRecord topActivity = getTopActivity();
@@ -2251,7 +2254,7 @@
             String callingPackage = "";
             int resizeMode = RESIZE_MODE_FORCE_RESIZEABLE;
             boolean supportsPictureInPicture = false;
-            Rect bounds = null;
+            Rect lastNonFullscreenBounds = null;
             int minWidth = INVALID_MIN_SIZE;
             int minHeight = INVALID_MIN_SIZE;
             int persistTaskVersion = 0;
@@ -2336,7 +2339,7 @@
                         supportsPictureInPicture = Boolean.parseBoolean(attrValue);
                         break;
                     case ATTR_NON_FULLSCREEN_BOUNDS:
-                        bounds = Rect.unflattenFromString(attrValue);
+                        lastNonFullscreenBounds = Rect.unflattenFromString(attrValue);
                         break;
                     case ATTR_MIN_WIDTH:
                         minWidth = Integer.parseInt(attrValue);
@@ -2431,7 +2434,8 @@
                     taskAffiliation, prevTaskId, nextTaskId, taskAffiliationColor, callingUid,
                     callingPackage, resizeMode, supportsPictureInPicture, realActivitySuspended,
                     userSetupComplete, minWidth, minHeight);
-            task.updateOverrideConfiguration(bounds);
+            task.mLastNonFullscreenBounds = lastNonFullscreenBounds;
+            task.setBounds(lastNonFullscreenBounds);
 
             for (int activityNdx = activities.size() - 1; activityNdx >=0; --activityNdx) {
                 activities.get(activityNdx).setTask(task);
diff --git a/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
index 8fdbcf6c..3064144 100644
--- a/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
+++ b/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
@@ -16,6 +16,7 @@
 
 package com.android.server.broadcastradio;
 
+import android.annotation.NonNull;
 import android.Manifest;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -28,14 +29,16 @@
 import com.android.server.SystemService;
 
 import java.util.List;
+import java.util.Objects;
+import java.util.OptionalInt;
 
 public class BroadcastRadioService extends SystemService {
     private final ServiceImpl mServiceImpl = new ServiceImpl();
 
-    /**
-     * This field is used by native code, do not access or modify.
-     */
-    private final long mNativeContext = nativeInit();
+    private final com.android.server.broadcastradio.hal1.BroadcastRadioService mHal1 =
+            new com.android.server.broadcastradio.hal1.BroadcastRadioService();
+    private final com.android.server.broadcastradio.hal2.BroadcastRadioService mHal2 =
+            new com.android.server.broadcastradio.hal2.BroadcastRadioService();
 
     private final Object mLock = new Object();
     private List<RadioManager.ModuleProperties> mModules = null;
@@ -45,22 +48,18 @@
     }
 
     @Override
-    protected void finalize() throws Throwable {
-        nativeFinalize(mNativeContext);
-        super.finalize();
-    }
-
-    private native long nativeInit();
-    private native void nativeFinalize(long nativeContext);
-    private native List<RadioManager.ModuleProperties> nativeLoadModules(long nativeContext);
-    private native Tuner nativeOpenTuner(long nativeContext, int moduleId,
-            RadioManager.BandConfig config, boolean withAudio, ITunerCallback callback);
-
-    @Override
     public void onStart() {
         publishBinderService(Context.RADIO_SERVICE, mServiceImpl);
     }
 
+    /**
+     * Finds next available index for newly loaded modules.
+     */
+    private static int getNextId(@NonNull List<RadioManager.ModuleProperties> modules) {
+        OptionalInt max = modules.stream().mapToInt(RadioManager.ModuleProperties::getId).max();
+        return max.isPresent() ? max.getAsInt() + 1 : 0;
+    }
+
     private class ServiceImpl extends IRadioService.Stub {
         private void enforcePolicyAccess() {
             if (PackageManager.PERMISSION_GRANTED != getContext().checkCallingPermission(
@@ -75,11 +74,8 @@
             synchronized (mLock) {
                 if (mModules != null) return mModules;
 
-                mModules = nativeLoadModules(mNativeContext);
-                if (mModules == null) {
-                    throw new ParcelableException(new NullPointerException(
-                            "couldn't load radio modules"));
-                }
+                mModules = mHal1.loadModules();
+                mModules.addAll(mHal2.loadModules(getNextId(mModules)));
 
                 return mModules;
             }
@@ -93,7 +89,11 @@
                 throw new IllegalArgumentException("Callback must not be empty");
             }
             synchronized (mLock) {
-                return nativeOpenTuner(mNativeContext, moduleId, bandConfig, withAudio, callback);
+                if (mHal2.hasModule(moduleId)) {
+                    throw new RuntimeException("Not implemented");
+                } else {
+                    return mHal1.openTuner(moduleId, bandConfig, withAudio, callback);
+                }
             }
         }
     }
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/BroadcastRadioService.java b/services/core/java/com/android/server/broadcastradio/hal1/BroadcastRadioService.java
new file mode 100644
index 0000000..e8ac547
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/hal1/BroadcastRadioService.java
@@ -0,0 +1,66 @@
+/**
+ * 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.broadcastradio.hal1;
+
+import android.annotation.NonNull;
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.radio.IRadioService;
+import android.hardware.radio.ITuner;
+import android.hardware.radio.ITunerCallback;
+import android.hardware.radio.RadioManager;
+import android.os.ParcelableException;
+
+import com.android.server.SystemService;
+
+import java.util.List;
+import java.util.Objects;
+
+public class BroadcastRadioService {
+    /**
+     * This field is used by native code, do not access or modify.
+     */
+    private final long mNativeContext = nativeInit();
+
+    private final Object mLock = new Object();
+
+    @Override
+    protected void finalize() throws Throwable {
+        nativeFinalize(mNativeContext);
+        super.finalize();
+    }
+
+    private native long nativeInit();
+    private native void nativeFinalize(long nativeContext);
+    private native List<RadioManager.ModuleProperties> nativeLoadModules(long nativeContext);
+    private native Tuner nativeOpenTuner(long nativeContext, int moduleId,
+            RadioManager.BandConfig config, boolean withAudio, ITunerCallback callback);
+
+    public @NonNull List<RadioManager.ModuleProperties> loadModules() {
+        synchronized (mLock) {
+            return Objects.requireNonNull(nativeLoadModules(mNativeContext));
+        }
+    }
+
+    public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig,
+            boolean withAudio, @NonNull ITunerCallback callback) {
+        synchronized (mLock) {
+            return nativeOpenTuner(mNativeContext, moduleId, bandConfig, withAudio, callback);
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/broadcastradio/Convert.java b/services/core/java/com/android/server/broadcastradio/hal1/Convert.java
similarity index 97%
rename from services/core/java/com/android/server/broadcastradio/Convert.java
rename to services/core/java/com/android/server/broadcastradio/hal1/Convert.java
index 125554f..80c7762 100644
--- a/services/core/java/com/android/server/broadcastradio/Convert.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/Convert.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.broadcastradio;
+package com.android.server.broadcastradio.hal1;
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
diff --git a/services/core/java/com/android/server/broadcastradio/Tuner.java b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
similarity index 99%
rename from services/core/java/com/android/server/broadcastradio/Tuner.java
rename to services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
index 2ea4271..cce534d 100644
--- a/services/core/java/com/android/server/broadcastradio/Tuner.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.broadcastradio;
+package com.android.server.broadcastradio.hal1;
 
 import android.annotation.NonNull;
 import android.graphics.Bitmap;
diff --git a/services/core/java/com/android/server/broadcastradio/TunerCallback.java b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
similarity index 98%
rename from services/core/java/com/android/server/broadcastradio/TunerCallback.java
rename to services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
index 2460c67..673ff88 100644
--- a/services/core/java/com/android/server/broadcastradio/TunerCallback.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.broadcastradio;
+package com.android.server.broadcastradio.hal1;
 
 import android.annotation.NonNull;
 import android.hardware.radio.ITuner;
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/BroadcastRadioService.java b/services/core/java/com/android/server/broadcastradio/hal2/BroadcastRadioService.java
new file mode 100644
index 0000000..7629477
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/hal2/BroadcastRadioService.java
@@ -0,0 +1,79 @@
+/**
+ * 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.broadcastradio.hal2;
+
+import android.annotation.NonNull;
+import android.hardware.radio.RadioManager;
+import android.hardware.broadcastradio.V2_0.IBroadcastRadio;
+import android.hidl.manager.V1_0.IServiceManager;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class BroadcastRadioService {
+    private static final String TAG = "BcRadio2Srv";
+
+    private final Map<Integer, RadioModule> mModules = new HashMap<>();
+
+    private static @NonNull List<String> listByInterface(@NonNull String fqName) {
+        try {
+            IServiceManager manager = IServiceManager.getService();
+            if (manager == null) {
+                Slog.e(TAG, "Failed to get HIDL Service Manager");
+                return Collections.emptyList();
+            }
+
+            List<String> list = manager.listByInterface(fqName);
+            if (list == null) {
+                Slog.e(TAG, "Didn't get interface list from HIDL Service Manager");
+                return Collections.emptyList();
+            }
+            return list;
+        } catch (RemoteException ex) {
+            Slog.e(TAG, "Failed fetching interface list", ex);
+            return Collections.emptyList();
+        }
+    }
+
+    public @NonNull Collection<RadioManager.ModuleProperties> loadModules(int idx) {
+        Slog.v(TAG, "loadModules(" + idx + ")");
+
+        for (String serviceName : listByInterface(IBroadcastRadio.kInterfaceName)) {
+            Slog.v(TAG, "checking service: " + serviceName);
+
+            RadioModule module = RadioModule.tryLoadingModule(idx, serviceName);
+            if (module != null) {
+                Slog.i(TAG, "loaded broadcast radio module " + idx + ": " +
+                        serviceName + " (HAL 2.0)");
+                mModules.put(idx++, module);
+            }
+        }
+
+        return mModules.values().stream().map(module -> module.mProperties).
+                collect(Collectors.toList());
+    }
+
+    public boolean hasModule(int id) {
+        return mModules.containsKey(id);
+    }
+}
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
new file mode 100644
index 0000000..c3394e9
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.broadcastradio.hal2;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.hardware.broadcastradio.V2_0.Properties;
+import android.hardware.broadcastradio.V2_0.VendorKeyValue;
+import android.hardware.radio.ProgramSelector;
+import android.hardware.radio.RadioManager;
+import android.util.Slog;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+class Convert {
+    private static final String TAG = "BcRadio2Srv.convert";
+
+    private static @NonNull Map<String, String>
+    vendorInfoFromHal(@Nullable List<VendorKeyValue> info) {
+        if (info == null) return Collections.emptyMap();
+
+        Map<String, String> map = new HashMap<>();
+        for (VendorKeyValue kvp : info) {
+            if (kvp.key == null || kvp.value == null) {
+                Slog.w(TAG, "VendorKeyValue contains null pointers");
+                continue;
+            }
+            map.put(kvp.key, kvp.value);
+        }
+
+        return map;
+    }
+
+    private static @NonNull int[]
+    identifierTypesToProgramTypes(@NonNull int[] idTypes) {
+        Set<Integer> pTypes = new HashSet<>();
+
+        for (int idType : idTypes) {
+            switch (idType) {
+                case ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY:
+                case ProgramSelector.IDENTIFIER_TYPE_RDS_PI:
+                    // TODO(b/69958423): verify AM/FM with region info
+                    pTypes.add(ProgramSelector.PROGRAM_TYPE_AM);
+                    pTypes.add(ProgramSelector.PROGRAM_TYPE_FM);
+                    break;
+                case ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT:
+                    // TODO(b/69958423): verify AM/FM with region info
+                    pTypes.add(ProgramSelector.PROGRAM_TYPE_AM_HD);
+                    pTypes.add(ProgramSelector.PROGRAM_TYPE_FM_HD);
+                    break;
+                case ProgramSelector.IDENTIFIER_TYPE_DAB_SIDECC:
+                case ProgramSelector.IDENTIFIER_TYPE_DAB_ENSEMBLE:
+                case ProgramSelector.IDENTIFIER_TYPE_DAB_SCID:
+                case ProgramSelector.IDENTIFIER_TYPE_DAB_FREQUENCY:
+                    pTypes.add(ProgramSelector.PROGRAM_TYPE_DAB);
+                    break;
+                case ProgramSelector.IDENTIFIER_TYPE_DRMO_SERVICE_ID:
+                case ProgramSelector.IDENTIFIER_TYPE_DRMO_FREQUENCY:
+                    pTypes.add(ProgramSelector.PROGRAM_TYPE_DRMO);
+                    break;
+                case ProgramSelector.IDENTIFIER_TYPE_SXM_SERVICE_ID:
+                case ProgramSelector.IDENTIFIER_TYPE_SXM_CHANNEL:
+                    pTypes.add(ProgramSelector.PROGRAM_TYPE_SXM);
+                    break;
+                default:
+                    break;
+            }
+            if (idType >= ProgramSelector.IDENTIFIER_TYPE_VENDOR_PRIMARY_START
+                    && idType <= ProgramSelector.IDENTIFIER_TYPE_VENDOR_PRIMARY_END) {
+                pTypes.add(idType);
+            }
+        }
+
+        return pTypes.stream().mapToInt(Integer::intValue).toArray();
+    }
+
+    static @NonNull RadioManager.ModuleProperties
+    propertiesFromHal(int id, @NonNull String serviceName, Properties prop) {
+        Objects.requireNonNull(prop);
+
+        // TODO(b/69958423): implement region info
+        RadioManager.BandDescriptor[] bands = new RadioManager.BandDescriptor[0];
+
+        int[] supportedIdentifierTypes = prop.supportedIdentifierTypes.stream().
+                mapToInt(Integer::intValue).toArray();
+        int[] supportedProgramTypes = identifierTypesToProgramTypes(supportedIdentifierTypes);
+
+        return new RadioManager.ModuleProperties(
+                id,
+                serviceName,
+
+                // There is no Class concept in HAL 2.0.
+                RadioManager.CLASS_AM_FM,
+
+                prop.maker,
+                prop.product,
+                prop.version,
+                prop.serial,
+
+                /* HAL 2.0 only supports single tuner and audio source per
+                 * HAL implementation instance. */
+                1,      // numTuners
+                1,      // numAudioSources
+                false,  // isCaptureSupported
+
+                bands,
+                true,  // isBgScanSupported is deprecated
+                supportedProgramTypes,
+                supportedIdentifierTypes,
+                vendorInfoFromHal(prop.vendorInfo));
+    }
+}
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java b/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java
new file mode 100644
index 0000000..34c1b0c
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java
@@ -0,0 +1,54 @@
+/**
+ * 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.broadcastradio.hal2;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.hardware.radio.RadioManager;
+import android.hardware.broadcastradio.V2_0.IBroadcastRadio;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import java.util.Objects;
+
+class RadioModule {
+    private static final String TAG = "BcRadio2Srv.module";
+
+    @NonNull private final IBroadcastRadio mService;
+    @NonNull public final RadioManager.ModuleProperties mProperties;
+
+    private RadioModule(@NonNull IBroadcastRadio service,
+            @NonNull RadioManager.ModuleProperties properties) {
+        mProperties = Objects.requireNonNull(properties);
+        mService = Objects.requireNonNull(service);
+    }
+
+    public static @Nullable RadioModule tryLoadingModule(int idx, @NonNull String fqName) {
+        try {
+            IBroadcastRadio service = IBroadcastRadio.getService();
+            if (service == null) return null;
+
+            RadioManager.ModuleProperties prop =
+                    Convert.propertiesFromHal(idx, fqName, service.getProperties());
+
+            return new RadioModule(service, prop);
+        } catch (RemoteException ex) {
+            Slog.e(TAG, "failed to load module " + fqName, ex);
+            return null;
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/location/OWNERS b/services/core/java/com/android/server/location/OWNERS
index d3c0ea8..5f0369b 100644
--- a/services/core/java/com/android/server/location/OWNERS
+++ b/services/core/java/com/android/server/location/OWNERS
@@ -1,4 +1,6 @@
 [email protected]
 [email protected]
[email protected]
[email protected]
 [email protected]
 [email protected]
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
new file mode 100644
index 0000000..e4d2b953
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
@@ -0,0 +1,167 @@
+/*
+ * 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.locksettings.recoverablekeystore;
+
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+
+/**
+ * Utility functions for the flow where the RecoverableKeyStoreLoader syncs keys with remote
+ * storage.
+ *
+ * @hide
+ */
+public class KeySyncUtils {
+
+    private static final String RECOVERY_KEY_ALGORITHM = "AES";
+    private static final int RECOVERY_KEY_SIZE_BITS = 256;
+
+    private static final byte[] THM_ENCRYPTED_RECOVERY_KEY_HEADER =
+            "V1 THM_encrypted_recovery_key".getBytes(StandardCharsets.UTF_8);
+    private static final byte[] LOCALLY_ENCRYPTED_RECOVERY_KEY_HEADER =
+            "V1 locally_encrypted_recovery_key".getBytes(StandardCharsets.UTF_8);
+    private static final byte[] ENCRYPTED_APPLICATION_KEY_HEADER =
+            "V1 encrypted_application_key".getBytes(StandardCharsets.UTF_8);
+
+    private static final byte[] THM_KF_HASH_PREFIX = "THM_KF_hash".getBytes(StandardCharsets.UTF_8);
+
+    /**
+     * Encrypts the recovery key using both the lock screen hash and the remote storage's public
+     * key.
+     *
+     * @param publicKey The public key of the remote storage.
+     * @param lockScreenHash The user's lock screen hash.
+     * @param vaultParams Additional parameters to send to the remote storage.
+     * @param recoveryKey The recovery key.
+     * @return The encrypted bytes.
+     * @throws NoSuchAlgorithmException if any SecureBox algorithm is unavailable.
+     * @throws InvalidKeyException if the public key or the lock screen could not be used to encrypt
+     *     the data.
+     *
+     * @hide
+     */
+    public byte[] thmEncryptRecoveryKey(
+            PublicKey publicKey,
+            byte[] lockScreenHash,
+            byte[] vaultParams,
+            SecretKey recoveryKey
+    ) throws NoSuchAlgorithmException, InvalidKeyException {
+        byte[] encryptedRecoveryKey = locallyEncryptRecoveryKey(lockScreenHash, recoveryKey);
+        byte[] thmKfHash = calculateThmKfHash(lockScreenHash);
+        byte[] header = concat(THM_ENCRYPTED_RECOVERY_KEY_HEADER, vaultParams);
+        return SecureBox.encrypt(
+                /*theirPublicKey=*/ publicKey,
+                /*sharedSecret=*/ thmKfHash,
+                /*header=*/ header,
+                /*payload=*/ encryptedRecoveryKey);
+    }
+
+    /**
+     * Calculates the THM_KF hash of the lock screen hash.
+     *
+     * @param lockScreenHash The lock screen hash.
+     * @return The hash.
+     * @throws NoSuchAlgorithmException if SHA-256 is unavailable (should never happen).
+     *
+     * @hide
+     */
+    public static byte[] calculateThmKfHash(byte[] lockScreenHash)
+            throws NoSuchAlgorithmException {
+        MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
+        messageDigest.update(THM_KF_HASH_PREFIX);
+        messageDigest.update(lockScreenHash);
+        return messageDigest.digest();
+    }
+
+    /**
+     * Encrypts the recovery key using the lock screen hash.
+     *
+     * @param lockScreenHash The raw lock screen hash.
+     * @param recoveryKey The recovery key.
+     * @return The encrypted bytes.
+     * @throws NoSuchAlgorithmException if any SecureBox algorithm is unavailable.
+     * @throws InvalidKeyException if the hash cannot be used to encrypt for some reason.
+     */
+    private static byte[] locallyEncryptRecoveryKey(byte[] lockScreenHash, SecretKey recoveryKey)
+            throws NoSuchAlgorithmException, InvalidKeyException {
+        return SecureBox.encrypt(
+                /*theirPublicKey=*/ null,
+                /*sharedSecret=*/ lockScreenHash,
+                /*header=*/ LOCALLY_ENCRYPTED_RECOVERY_KEY_HEADER,
+                /*payload=*/ recoveryKey.getEncoded());
+    }
+
+    /**
+     * Returns a new random 256-bit AES recovery key.
+     *
+     * @hide
+     */
+    public static SecretKey generateRecoveryKey() throws NoSuchAlgorithmException {
+        KeyGenerator keyGenerator = KeyGenerator.getInstance(RECOVERY_KEY_ALGORITHM);
+        keyGenerator.init(RECOVERY_KEY_SIZE_BITS, SecureRandom.getInstanceStrong());
+        return keyGenerator.generateKey();
+    }
+
+    /**
+     * Encrypts all of the given keys with the recovery key, using SecureBox.
+     *
+     * @param recoveryKey The recovery key.
+     * @param keys The keys, indexed by their aliases.
+     * @return The encrypted key material, indexed by aliases.
+     * @throws NoSuchAlgorithmException if any of the SecureBox algorithms are unavailable.
+     * @throws InvalidKeyException if the recovery key is not appropriate for encrypting the keys.
+     *
+     * @hide
+     */
+    public static Map<String, byte[]> encryptKeysWithRecoveryKey(
+            SecretKey recoveryKey, Map<String, SecretKey> keys)
+            throws NoSuchAlgorithmException, InvalidKeyException {
+        HashMap<String, byte[]> encryptedKeys = new HashMap<>();
+        for (String alias : keys.keySet()) {
+            SecretKey key = keys.get(alias);
+            byte[] encryptedKey = SecureBox.encrypt(
+                    /*theirPublicKey=*/ null,
+                    /*sharedSecret=*/ recoveryKey.getEncoded(),
+                    /*header=*/ ENCRYPTED_APPLICATION_KEY_HEADER,
+                    /*payload=*/ key.getEncoded());
+            encryptedKeys.put(alias, encryptedKey);
+        }
+        return encryptedKeys;
+    }
+
+    /**
+     * Returns a new array, the contents of which are the concatenation of {@code a} and {@code b}.
+     */
+    private static byte[] concat(byte[] a, byte[] b) {
+        byte[] result = new byte[a.length + b.length];
+        System.arraycopy(a, 0, result, 0, a.length);
+        System.arraycopy(b, 0, result, a.length, b.length);
+        return result;
+    }
+
+    // Statics only
+    private KeySyncUtils() {}
+}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/SecureBox.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/SecureBox.java
new file mode 100644
index 0000000..457fdc14
--- /dev/null
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/SecureBox.java
@@ -0,0 +1,39 @@
+/*
+ * 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.locksettings.recoverablekeystore;
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+
+/**
+ * TODO(b/69056040) Add implementation of SecureBox. This is a placeholder so KeySyncUtils compiles.
+ *
+ * @hide
+ */
+public class SecureBox {
+    /**
+     * TODO(b/69056040) Add implementation of encrypt.
+     *
+     * @hide
+     */
+    public static byte[] encrypt(
+            PublicKey theirPublicKey, byte[] sharedSecret, byte[] header, byte[] payload)
+            throws NoSuchAlgorithmException, InvalidKeyException {
+        throw new UnsupportedOperationException("Needs to be implemented.");
+    }
+}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java
index c97c66e..9002292 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/WrappedKey.java
@@ -16,14 +16,21 @@
 
 package com.android.server.locksettings.recoverablekeystore;
 
+import android.util.Log;
+
+import java.security.InvalidAlgorithmParameterException;
 import java.security.InvalidKeyException;
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.NoSuchPaddingException;
 import javax.crypto.SecretKey;
+import javax.crypto.spec.GCMParameterSpec;
 
 /**
  * A {@link javax.crypto.SecretKey} wrapped with AES/GCM/NoPadding.
@@ -31,7 +38,11 @@
  * @hide
  */
 public class WrappedKey {
+    private static final String TAG = "WrappedKey";
+
     private static final String KEY_WRAP_CIPHER_ALGORITHM = "AES/GCM/NoPadding";
+    private static final String APPLICATION_KEY_ALGORITHM = "AES";
+    private static final int GCM_TAG_LENGTH_BITS = 128;
 
     private final byte[] mNonce;
     private final byte[] mKeyMaterial;
@@ -112,4 +123,54 @@
     public byte[] getKeyMaterial() {
         return mKeyMaterial;
     }
+
+    /**
+     * Unwraps the {@code wrappedKeys} with the {@code platformKey}.
+     *
+     * @return The unwrapped keys, indexed by alias.
+     * @throws NoSuchAlgorithmException if AES/GCM/NoPadding Cipher or AES key type is unavailable.
+     *
+     * @hide
+     */
+    public static Map<String, SecretKey> unwrapKeys(
+            SecretKey platformKey,
+            Map<String, WrappedKey> wrappedKeys)
+            throws NoSuchAlgorithmException, NoSuchPaddingException {
+        HashMap<String, SecretKey> unwrappedKeys = new HashMap<>();
+        Cipher cipher = Cipher.getInstance(KEY_WRAP_CIPHER_ALGORITHM);
+
+        for (String alias : wrappedKeys.keySet()) {
+            WrappedKey wrappedKey = wrappedKeys.get(alias);
+            try {
+                cipher.init(
+                        Cipher.UNWRAP_MODE,
+                        platformKey,
+                        new GCMParameterSpec(GCM_TAG_LENGTH_BITS, wrappedKey.getNonce()));
+            } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
+                Log.e(TAG,
+                        String.format(
+                                Locale.US,
+                                "Could not init Cipher to unwrap recoverable key with alias '%s'",
+                                alias),
+                        e);
+                continue;
+            }
+            SecretKey key;
+            try {
+                key = (SecretKey) cipher.unwrap(
+                        wrappedKey.getKeyMaterial(), APPLICATION_KEY_ALGORITHM, Cipher.SECRET_KEY);
+            } catch (InvalidKeyException | NoSuchAlgorithmException e) {
+                Log.e(TAG,
+                        String.format(
+                                Locale.US,
+                                "Error unwrapping recoverable key with alias '%s'",
+                                alias),
+                        e);
+                continue;
+            }
+            unwrappedKeys.put(alias, key);
+        }
+
+        return unwrappedKeys;
+    }
 }
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 5f03dd2..7c75f77 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3334,7 +3334,7 @@
     }
 
     boolean keyguardOn() {
-        return isKeyguardShowingAndNotOccluded();
+        return isKeyguardShowingAndNotOccluded() || inKeyguardRestrictedKeyInputMode();
     }
 
     private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = {
@@ -6876,6 +6876,13 @@
         return mKeyguardOccluded;
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public boolean inKeyguardRestrictedKeyInputMode() {
+        if (mKeyguardDelegate == null) return false;
+        return mKeyguardDelegate.isInputRestricted();
+    }
+
     @Override
     public void dismissKeyguardLw(IKeyguardDismissCallback callback) {
         if (mKeyguardDelegate != null && mKeyguardDelegate.isShowing()) {
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index bcb7212..cfe4088 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -1360,6 +1360,17 @@
     public boolean isKeyguardTrustedLw();
 
     /**
+     * inKeyguardRestrictedKeyInputMode
+     *
+     * If keyguard screen is showing or in restricted key input mode (i.e. in
+     * keyguard password emergency screen). When in such mode, certain keys,
+     * such as the Home key and the right soft keys, don't work.
+     *
+     * @return true if in keyguard restricted input mode.
+     */
+    public boolean inKeyguardRestrictedKeyInputMode();
+
+    /**
      * Ask the policy to dismiss the keyguard, if it is currently shown.
      *
      * @param callback Callback to be informed about the result.
diff --git a/services/core/java/com/android/server/slice/PinnedSliceState.java b/services/core/java/com/android/server/slice/PinnedSliceState.java
new file mode 100644
index 0000000..cf930f5
--- /dev/null
+++ b/services/core/java/com/android/server/slice/PinnedSliceState.java
@@ -0,0 +1,215 @@
+/*
+ * 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.slice;
+
+import android.app.slice.ISliceListener;
+import android.app.slice.Slice;
+import android.app.slice.SliceProvider;
+import android.app.slice.SliceSpec;
+import android.content.ContentProviderClient;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.ArraySet;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Manages the state of a pinned slice.
+ */
+public class PinnedSliceState {
+
+    private static final long SLICE_TIMEOUT = 5000;
+    private static final String TAG = "PinnedSliceState";
+
+    private final Object mLock;
+
+    private final SliceManagerService mService;
+    private final Uri mUri;
+    @GuardedBy("mLock")
+    private final ArraySet<String> mPinnedPkgs = new ArraySet<>();
+    @GuardedBy("mLock")
+    private final ArraySet<ISliceListener> mListeners = new ArraySet<>();
+    @GuardedBy("mLock")
+    private SliceSpec[] mSupportedSpecs = null;
+
+    public PinnedSliceState(SliceManagerService service, Uri uri) {
+        mService = service;
+        mUri = uri;
+        mService.getHandler().post(this::handleSendPinned);
+        mLock = mService.getLock();
+    }
+
+    public SliceSpec[] getSpecs() {
+        return mSupportedSpecs;
+    }
+
+    public void mergeSpecs(SliceSpec[] supportedSpecs) {
+        synchronized (mLock) {
+            if (mSupportedSpecs == null) {
+                mSupportedSpecs = supportedSpecs;
+            } else {
+                List<SliceSpec> specs = Arrays.asList(mSupportedSpecs);
+                mSupportedSpecs = specs.stream().map(s -> {
+                    SliceSpec other = findSpec(supportedSpecs, s.getType());
+                    if (other == null) return null;
+                    if (other.getRevision() < s.getRevision()) {
+                        return other;
+                    }
+                    return s;
+                }).filter(s -> s != null).toArray(SliceSpec[]::new);
+            }
+        }
+    }
+
+    private SliceSpec findSpec(SliceSpec[] specs, String type) {
+        for (SliceSpec spec : specs) {
+            if (Objects.equals(spec.getType(), type)) {
+                return spec;
+            }
+        }
+        return null;
+    }
+
+    public Uri getUri() {
+        return mUri;
+    }
+
+    public void destroy() {
+        mService.getHandler().post(this::handleSendUnpinned);
+    }
+
+    public void onChange() {
+        mService.getHandler().post(this::handleBind);
+    }
+
+    public void addSliceListener(ISliceListener listener, SliceSpec[] specs) {
+        synchronized (mLock) {
+            if (mListeners.add(listener) && mListeners.size() == 1) {
+                mService.listen(mUri);
+            }
+            mergeSpecs(specs);
+        }
+    }
+
+    public boolean removeSliceListener(ISliceListener listener) {
+        synchronized (mLock) {
+            if (mListeners.remove(listener) && mListeners.size() == 0) {
+                mService.unlisten(mUri);
+            }
+        }
+        return !isPinned();
+    }
+
+    public void pin(String pkg, SliceSpec[] specs) {
+        synchronized (mLock) {
+            mPinnedPkgs.add(pkg);
+            mergeSpecs(specs);
+        }
+    }
+
+    public boolean unpin(String pkg) {
+        synchronized (mLock) {
+            mPinnedPkgs.remove(pkg);
+        }
+        return !isPinned();
+    }
+
+    public boolean isListening() {
+        synchronized (mLock) {
+            return !mListeners.isEmpty();
+        }
+    }
+
+    @VisibleForTesting
+    public boolean isPinned() {
+        synchronized (mLock) {
+            return !mPinnedPkgs.isEmpty() || !mListeners.isEmpty();
+        }
+    }
+
+    ContentProviderClient getClient() {
+        ContentProviderClient client =
+                mService.getContext().getContentResolver().acquireContentProviderClient(mUri);
+        client.setDetectNotResponding(SLICE_TIMEOUT);
+        return client;
+    }
+
+    private void handleBind() {
+        Slice s;
+        try (ContentProviderClient client = getClient()) {
+            Bundle extras = new Bundle();
+            extras.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri);
+            extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS,
+                    new ArrayList<>(Arrays.asList(mSupportedSpecs)));
+            final Bundle res;
+            try {
+                res = client.call(SliceProvider.METHOD_SLICE, null, extras);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Unable to bind slice " + mUri, e);
+                return;
+            }
+            if (res == null) return;
+            Bundle.setDefusable(res, true);
+            s = res.getParcelable(SliceProvider.EXTRA_SLICE);
+        }
+        synchronized (mLock) {
+            mListeners.removeIf(l -> {
+                try {
+                    l.onSliceUpdated(s);
+                    return false;
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Unable to notify slice " + mUri, e);
+                    return true;
+                }
+            });
+            if (!isPinned()) {
+                // All the listeners died, remove from pinned state.
+                mService.removePinnedSlice(mUri);
+            }
+        }
+    }
+
+    private void handleSendPinned() {
+        try (ContentProviderClient client = getClient()) {
+            Bundle b = new Bundle();
+            b.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri);
+            try {
+                client.call(SliceProvider.METHOD_PIN, null, b);
+            } catch (RemoteException e) {
+                Log.w(TAG, "Unable to contact " + mUri, e);
+            }
+        }
+    }
+
+    private void handleSendUnpinned() {
+        try (ContentProviderClient client = getClient()) {
+            Bundle b = new Bundle();
+            b.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri);
+            try {
+                client.call(SliceProvider.METHOD_UNPIN, null, b);
+            } catch (RemoteException e) {
+                Log.w(TAG, "Unable to contact " + mUri, e);
+            }
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java
index 047e270..2d9e772 100644
--- a/services/core/java/com/android/server/slice/SliceManagerService.java
+++ b/services/core/java/com/android/server/slice/SliceManagerService.java
@@ -16,21 +16,307 @@
 
 package com.android.server.slice;
 
-import android.app.slice.ISliceManager;
-import android.content.Context;
+import static android.content.ContentProvider.getUserIdFromUri;
+import static android.content.ContentProvider.maybeAddUserId;
 
+import android.Manifest.permission;
+import android.app.AppOpsManager;
+import android.app.slice.ISliceListener;
+import android.app.slice.ISliceManager;
+import android.app.slice.SliceSpec;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManagerInternal;
+import android.content.pm.ResolveInfo;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Process;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.app.AssistUtils;
+import com.android.internal.util.Preconditions;
+import com.android.server.LocalServices;
+import com.android.server.ServiceThread;
 import com.android.server.SystemService;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
 public class SliceManagerService extends ISliceManager.Stub {
 
-    public SliceManagerService(Context context) {
+    private static final String TAG = "SliceManagerService";
+    private final Object mLock = new Object();
 
+    private final Context mContext;
+    private final PackageManagerInternal mPackageManagerInternal;
+    private final AppOpsManager mAppOps;
+    private final AssistUtils mAssistUtils;
+
+    @GuardedBy("mLock")
+    private final ArrayMap<Uri, PinnedSliceState> mPinnedSlicesByUri = new ArrayMap<>();
+    private final Handler mHandler;
+    private final ContentObserver mObserver;
+
+    public SliceManagerService(Context context) {
+        this(context, createHandler().getLooper());
     }
 
+    @VisibleForTesting
+    SliceManagerService(Context context, Looper looper) {
+        mContext = context;
+        mPackageManagerInternal = Preconditions.checkNotNull(
+                LocalServices.getService(PackageManagerInternal.class));
+        mAppOps = context.getSystemService(AppOpsManager.class);
+        mAssistUtils = new AssistUtils(context);
+        mHandler = new Handler(looper);
+
+        mObserver = new ContentObserver(mHandler) {
+            @Override
+            public void onChange(boolean selfChange, Uri uri) {
+                try {
+                    getPinnedSlice(uri).onChange();
+                } catch (IllegalStateException e) {
+                    Log.e(TAG, "Received change for unpinned slice " + uri, e);
+                }
+            }
+        };
+    }
+
+    ///  ----- Lifecycle stuff -----
     private void systemReady() {
     }
 
-    private void onUnlockUser(int userHandle) {
+    private void onUnlockUser(int userId) {
+    }
+
+    private void onStopUser(int userId) {
+        synchronized (mLock) {
+            mPinnedSlicesByUri.values().removeIf(s -> getUserIdFromUri(s.getUri()) == userId);
+        }
+    }
+
+    ///  ----- ISliceManager stuff -----
+    @Override
+    public void addSliceListener(Uri uri, String pkg, ISliceListener listener, SliceSpec[] specs)
+            throws RemoteException {
+        verifyCaller(pkg);
+        uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
+        enforceAccess(pkg, uri);
+        getOrCreatePinnedSlice(uri).addSliceListener(listener, specs);
+    }
+
+    @Override
+    public void removeSliceListener(Uri uri, String pkg, ISliceListener listener)
+            throws RemoteException {
+        verifyCaller(pkg);
+        uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
+        enforceAccess(pkg, uri);
+        if (getPinnedSlice(uri).removeSliceListener(listener)) {
+            removePinnedSlice(uri);
+        }
+    }
+
+    @Override
+    public void pinSlice(String pkg, Uri uri, SliceSpec[] specs) throws RemoteException {
+        verifyCaller(pkg);
+        enforceFullAccess(pkg, "pinSlice", uri);
+        uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
+        getOrCreatePinnedSlice(uri).pin(pkg, specs);
+    }
+
+    @Override
+    public void unpinSlice(String pkg, Uri uri) throws RemoteException {
+        verifyCaller(pkg);
+        enforceFullAccess(pkg, "unpinSlice", uri);
+        uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
+        if (getPinnedSlice(uri).unpin(pkg)) {
+            removePinnedSlice(uri);
+        }
+    }
+
+    @Override
+    public boolean hasSliceAccess(String pkg) throws RemoteException {
+        verifyCaller(pkg);
+        return hasFullSliceAccess(pkg, Binder.getCallingUserHandle().getIdentifier());
+    }
+
+    @Override
+    public SliceSpec[] getPinnedSpecs(Uri uri, String pkg) throws RemoteException {
+        verifyCaller(pkg);
+        enforceAccess(pkg, uri);
+        return getPinnedSlice(uri).getSpecs();
+    }
+
+    ///  ----- internal code -----
+    void removePinnedSlice(Uri uri) {
+        synchronized (mLock) {
+            mPinnedSlicesByUri.remove(uri).destroy();
+        }
+    }
+
+    private PinnedSliceState getPinnedSlice(Uri uri) {
+        synchronized (mLock) {
+            PinnedSliceState manager = mPinnedSlicesByUri.get(uri);
+            if (manager == null) {
+                throw new IllegalStateException(String.format("Slice %s not pinned",
+                        uri.toString()));
+            }
+            return manager;
+        }
+    }
+
+    private PinnedSliceState getOrCreatePinnedSlice(Uri uri) {
+        synchronized (mLock) {
+            PinnedSliceState manager = mPinnedSlicesByUri.get(uri);
+            if (manager == null) {
+                manager = createPinnedSlice(uri);
+                mPinnedSlicesByUri.put(uri, manager);
+            }
+            return manager;
+        }
+    }
+
+    @VisibleForTesting
+    PinnedSliceState createPinnedSlice(Uri uri) {
+        return new PinnedSliceState(this, uri);
+    }
+
+    public Object getLock() {
+        return mLock;
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
+    public Handler getHandler() {
+        return mHandler;
+    }
+
+    private void enforceAccess(String pkg, Uri uri) {
+        getContext().enforceUriPermission(uri, permission.BIND_SLICE,
+                permission.BIND_SLICE, Binder.getCallingPid(), Binder.getCallingUid(),
+                Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+                "Slice binding requires the permission BIND_SLICE");
+        int user = Binder.getCallingUserHandle().getIdentifier();
+        if (getUserIdFromUri(uri, user) != user) {
+            getContext().enforceCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS_FULL,
+                    "Slice interaction across users requires INTERACT_ACROSS_USERS_FULL");
+        }
+    }
+
+    private void enforceFullAccess(String pkg, String name, Uri uri) {
+        int user = Binder.getCallingUserHandle().getIdentifier();
+        if (!hasFullSliceAccess(pkg, user)) {
+            throw new SecurityException(String.format("Call %s requires full slice access", name));
+        }
+        if (getUserIdFromUri(uri, user) != user) {
+            getContext().enforceCallingOrSelfPermission(permission.INTERACT_ACROSS_USERS_FULL,
+                    "Slice interaction across users requires INTERACT_ACROSS_USERS_FULL");
+        }
+    }
+
+    private void verifyCaller(String pkg) {
+        mAppOps.checkPackage(Binder.getCallingUid(), pkg);
+    }
+
+    private boolean hasFullSliceAccess(String pkg, int userId) {
+        return isDefaultHomeApp(pkg, userId) || isAssistant(pkg, userId)
+                || isGrantedFullAccess(pkg, userId);
+    }
+
+    private boolean isAssistant(String pkg, int userId) {
+        final ComponentName cn = mAssistUtils.getAssistComponentForUser(userId);
+        if (cn == null) {
+            return false;
+        }
+        return cn.getPackageName().equals(pkg);
+    }
+
+    public void listen(Uri uri) {
+        mContext.getContentResolver().registerContentObserver(uri, true, mObserver);
+    }
+
+    public void unlisten(Uri uri) {
+        mContext.getContentResolver().unregisterContentObserver(mObserver);
+        synchronized (mLock) {
+            mPinnedSlicesByUri.forEach((u, s) -> {
+                if (s.isListening()) {
+                    listen(u);
+                }
+            });
+        }
+    }
+
+    private boolean isDefaultHomeApp(String pkg, int userId) {
+        String defaultHome = getDefaultHome(userId);
+        return Objects.equals(pkg, defaultHome);
+    }
+
+    // Based on getDefaultHome in ShortcutService.
+    // TODO: Unify if possible
+    @VisibleForTesting
+    String getDefaultHome(int userId) {
+        final long token = Binder.clearCallingIdentity();
+        try {
+            final List<ResolveInfo> allHomeCandidates = new ArrayList<>();
+
+            // Default launcher from package manager.
+            final ComponentName defaultLauncher = mPackageManagerInternal
+                    .getHomeActivitiesAsUser(allHomeCandidates, userId);
+
+            ComponentName detected = null;
+            if (defaultLauncher != null) {
+                detected = defaultLauncher;
+            }
+
+            if (detected == null) {
+                // If we reach here, that means it's the first check since the user was created,
+                // and there's already multiple launchers and there's no default set.
+                // Find the system one with the highest priority.
+                // (We need to check the priority too because of FallbackHome in Settings.)
+                // If there's no system launcher yet, then no one can access slices, until
+                // the user explicitly sets one.
+                final int size = allHomeCandidates.size();
+
+                int lastPriority = Integer.MIN_VALUE;
+                for (int i = 0; i < size; i++) {
+                    final ResolveInfo ri = allHomeCandidates.get(i);
+                    if (!ri.activityInfo.applicationInfo.isSystemApp()) {
+                        continue;
+                    }
+                    if (ri.priority < lastPriority) {
+                        continue;
+                    }
+                    detected = ri.activityInfo.getComponentName();
+                    lastPriority = ri.priority;
+                }
+            }
+            return detected.getPackageName();
+        } finally {
+            Binder.restoreCallingIdentity(token);
+        }
+    }
+
+    private boolean isGrantedFullAccess(String pkg, int userId) {
+        // TODO: This will be user granted access, if we allow this through a prompt.
+        return false;
+    }
+
+    private static ServiceThread createHandler() {
+        ServiceThread handlerThread = new ServiceThread(TAG,
+                Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
+        handlerThread.start();
+        return handlerThread;
     }
 
     public static class Lifecycle extends SystemService {
@@ -57,5 +343,10 @@
         public void onUnlockUser(int userHandle) {
             mService.onUnlockUser(userHandle);
         }
+
+        @Override
+        public void onStopUser(int userHandle) {
+            mService.onStopUser(userHandle);
+        }
     }
 }
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index c39ce98..94a0cb7 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -66,6 +66,7 @@
 import android.view.SurfaceControl;
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
+import android.view.animation.Transformation;
 
 import com.android.internal.util.ToBooleanFunction;
 import com.android.server.input.InputApplicationHandle;
@@ -75,6 +76,7 @@
 import java.io.PrintWriter;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
+import java.util.LinkedList;
 
 class AppTokenList extends ArrayList<AppWindowToken> {
 }
@@ -231,7 +233,7 @@
             // If this initial window is animating, stop it -- we will do an animation to reveal
             // it from behind the starting window, so there is no need for it to also be doing its
             // own stuff.
-            winAnimator.clearAnimation();
+            win.cancelAnimation();
             if (getController() != null) {
                 getController().removeStartingWindow();
             }
@@ -389,7 +391,7 @@
         }
 
         for (int i = mChildren.size() - 1; i >= 0 && !delayed; i--) {
-            if ((mChildren.get(i)).isWindowAnimationSet()) {
+            if ((mChildren.get(i)).isSelfOrChildAnimating()) {
                 delayed = true;
             }
         }
@@ -610,8 +612,12 @@
      */
     private void destroySurfaces(boolean cleanupOnResume) {
         boolean destroyedSomething = false;
-        for (int i = mChildren.size() - 1; i >= 0; i--) {
-            final WindowState win = mChildren.get(i);
+
+        // Copying to a different list as multiple children can be removed.
+        // TODO: Not sure why this is needed.
+        final LinkedList<WindowState> children = new LinkedList<>(mChildren);
+        for (int i = children.size() - 1; i >= 0; i--) {
+            final WindowState win = children.get(i);
             destroyedSomething |= win.destroySurface(cleanupOnResume, mAppStopped);
         }
         if (destroyedSomething) {
@@ -1320,7 +1326,7 @@
                             + " pv=" + w.mPolicyVisibility
                             + " mDrawState=" + winAnimator.drawStateToString()
                             + " ph=" + w.isParentWindowHidden() + " th=" + hiddenRequested
-                            + " a=" + winAnimator.mAnimating);
+                            + " a=" + winAnimator.isAnimationSet());
                 }
             }
 
@@ -1520,6 +1526,11 @@
     }
 
     @Override
+    boolean isSelfAnimating() {
+        return mAppAnimator.isAnimating();
+    }
+
+    @Override
     void dump(PrintWriter pw, String prefix) {
         super.dump(pw, prefix);
         if (appToken != null) {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index eda8fec..f458457 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -146,6 +146,7 @@
 import android.view.MagnificationSpec;
 import android.view.Surface;
 import android.view.SurfaceControl;
+import android.view.SurfaceControl.Transaction;
 import android.view.SurfaceSession;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -339,6 +340,7 @@
             new ApplySurfaceChangesTransactionState();
     private final ScreenshotApplicationState mScreenshotApplicationState =
             new ScreenshotApplicationState();
+    private final Transaction mTmpTransaction = new Transaction();
 
     // True if this display is in the process of being removed. Used to determine if the removal of
     // the display's direct children should be allowed.
@@ -379,29 +381,11 @@
      */
     private final ArrayList<SurfaceControl> mPendingDestroyingSurfaces = new ArrayList<>();
 
+    /** Temporary float array to retrieve 3x3 matrix values. */
+    private final float[] mTmpFloats = new float[9];
+
     private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> {
         WindowStateAnimator winAnimator = w.mWinAnimator;
-        if (winAnimator.hasSurface()) {
-            final boolean wasAnimating = winAnimator.mWasAnimating;
-            final boolean nowAnimating = winAnimator.stepAnimationLocked(
-                    mTmpWindowAnimator.mCurrentTime);
-            winAnimator.mWasAnimating = nowAnimating;
-            mTmpWindowAnimator.orAnimating(nowAnimating);
-
-            if (DEBUG_WALLPAPER) Slog.v(TAG,
-                    w + ": wasAnimating=" + wasAnimating + ", nowAnimating=" + nowAnimating);
-
-            if (wasAnimating && !winAnimator.mAnimating
-                    && mWallpaperController.isWallpaperTarget(w)) {
-                mTmpWindowAnimator.mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
-                pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
-                if (DEBUG_LAYOUT_REPEATS) {
-                    mService.mWindowPlacerLocked.debugLayoutRepeats(
-                            "updateWindowsAndWallpaperLocked 2", pendingLayoutChanges);
-                }
-            }
-        }
-
         final AppWindowToken atoken = w.mAppToken;
         if (winAnimator.mDrawState == READY_TO_SHOW) {
             if (atoken == null || atoken.allDrawn) {
@@ -434,13 +418,13 @@
 
         // If this window is animating, make a note that we have an animating window and take
         // care of a request to run a detached wallpaper animation.
-        if (winAnimator.mAnimating) {
-            if (winAnimator.mAnimation != null) {
-                if ((flags & FLAG_SHOW_WALLPAPER) != 0
-                        && winAnimator.mAnimation.getDetachWallpaper()) {
+        if (winAnimator.isAnimationSet()) {
+            final AnimationAdapter anim = w.getAnimation();
+            if (anim != null) {
+                if ((flags & FLAG_SHOW_WALLPAPER) != 0 && anim.getDetachWallpaper()) {
                     mTmpWindow = w;
                 }
-                final int color = winAnimator.mAnimation.getBackgroundColor();
+                final int color = anim.getBackgroundColor();
                 if (color != 0) {
                     final TaskStack stack = w.getStack();
                     if (stack != null) {
@@ -448,7 +432,6 @@
                     }
                 }
             }
-            mTmpWindowAnimator.setAnimating(true);
         }
 
         // If this window's app token is running a detached wallpaper animation, make a note so
@@ -684,7 +667,10 @@
             mWallpaperController.updateWallpaperVisibility();
         }
 
-        w.handleWindowMovedIfNeeded();
+        // Use mTmpTransaction instead of mPendingTransaction because we don't want to commit
+        // other changes in mPendingTransaction at this point.
+        w.handleWindowMovedIfNeeded(mTmpTransaction);
+        SurfaceControl.mergeToGlobalTransaction(mTmpTransaction);
 
         final WindowStateAnimator winAnimator = w.mWinAnimator;
 
@@ -720,7 +706,7 @@
                 }
             }
             final TaskStack stack = w.getStack();
-            if ((!winAnimator.isAnimationStarting() && !winAnimator.isWaitingForOpening())
+            if ((!winAnimator.isWaitingForOpening())
                     || (stack != null && stack.isAnimatingBounds())) {
                 // Updates the shown frame before we set up the surface. This is needed
                 // because the resizing could change the top-left position (in addition to
@@ -736,6 +722,12 @@
                 winAnimator.computeShownFrameLocked();
             }
             winAnimator.setSurfaceBoundariesLocked(mTmpRecoveringMemory /* recoveringMemory */);
+
+            // Since setSurfaceBoundariesLocked applies the clipping, we need to apply the position
+            // to the surface of the window container as well. Use mTmpTransaction instead of
+            // mPendingTransaction to avoid committing any existing changes in there.
+            w.updateSurfacePosition(mTmpTransaction);
+            SurfaceControl.mergeToGlobalTransaction(mTmpTransaction);
         }
 
         final AppWindowToken atoken = w.mAppToken;
@@ -2617,8 +2609,7 @@
         forAllWindows(w -> {
             if (w.mAppToken == null && policy.canBeHiddenByKeyguardLw(w)
                     && w.wouldBeVisibleIfPolicyIgnored() && !w.isVisible()) {
-                w.mWinAnimator.setAnimation(
-                        policy.createHiddenByKeyguardExit(onWallpaper, goingToShade));
+                w.startAnimation(policy.createHiddenByKeyguardExit(onWallpaper, goingToShade));
             }
         }, true /* traverseTopToBottom */);
     }
@@ -3775,13 +3766,13 @@
     }
 
     @Override
-    void destroyAfterPendingTransaction(SurfaceControl surface) {
+    public void destroyAfterPendingTransaction(SurfaceControl surface) {
         mPendingDestroyingSurfaces.add(surface);
     }
 
     /**
      * Destroys any surfaces that have been put into the pending list with
-     * {@link #destroyAfterTransaction}.
+     * {@link #destroyAfterPendingTransaction}.
      */
     void onPendingTransactionApplied() {
         for (int i = mPendingDestroyingSurfaces.size() - 1; i >= 0; i--) {
@@ -3789,4 +3780,21 @@
         }
         mPendingDestroyingSurfaces.clear();
     }
+
+    @Override
+    void prepareSurfaces() {
+        final ScreenRotationAnimation screenRotationAnimation =
+                mService.mAnimator.getScreenRotationAnimationLocked(mDisplayId);
+        if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
+            screenRotationAnimation.getEnterTransformation().getMatrix().getValues(mTmpFloats);
+            mPendingTransaction.setMatrix(mWindowingLayer,
+                    mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
+                    mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
+            mPendingTransaction.setPosition(mWindowingLayer,
+                    mTmpFloats[Matrix.MTRANS_X], mTmpFloats[Matrix.MTRANS_Y]);
+            mPendingTransaction.setAlpha(mWindowingLayer,
+                    screenRotationAnimation.getEnterTransformation().getAlpha());
+        }
+        super.prepareSurfaces();
+    }
 }
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index a37598e..03c0768 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -751,10 +751,10 @@
 
                 // There might be an old window delaying the animation start - clear it.
                 if (mDelayedImeWin != null) {
-                    mDelayedImeWin.mWinAnimator.endDelayingAnimationStart();
+                    mDelayedImeWin.endDelayingAnimationStart();
                 }
                 mDelayedImeWin = imeWin;
-                imeWin.mWinAnimator.startDelayingAnimationStart();
+                imeWin.startDelayingAnimationStart();
             }
 
             // If we are already waiting for something to be drawn, clear out the old one so it
@@ -765,25 +765,27 @@
                 mService.mWaitingForDrawnCallback.run();
             }
             mService.mWaitingForDrawnCallback = () -> {
-                mAnimationStartDelayed = false;
-                if (mDelayedImeWin != null) {
-                    mDelayedImeWin.mWinAnimator.endDelayingAnimationStart();
+                synchronized (mService.mWindowMap) {
+                    mAnimationStartDelayed = false;
+                    if (mDelayedImeWin != null) {
+                        mDelayedImeWin.endDelayingAnimationStart();
+                    }
+                    // If the adjust status changed since this was posted, only notify
+                    // the new states and don't animate.
+                    long duration = 0;
+                    if (mAdjustedForIme == adjustedForIme
+                            && mAdjustedForDivider == adjustedForDivider) {
+                        duration = IME_ADJUST_ANIM_DURATION;
+                    } else {
+                        Slog.w(TAG, "IME adjust changed while waiting for drawn:"
+                                + " adjustedForIme=" + adjustedForIme
+                                + " adjustedForDivider=" + adjustedForDivider
+                                + " mAdjustedForIme=" + mAdjustedForIme
+                                + " mAdjustedForDivider=" + mAdjustedForDivider);
+                    }
+                    notifyAdjustedForImeChanged(
+                            mAdjustedForIme || mAdjustedForDivider, duration);
                 }
-                // If the adjust status changed since this was posted, only notify
-                // the new states and don't animate.
-                long duration = 0;
-                if (mAdjustedForIme == adjustedForIme
-                        && mAdjustedForDivider == adjustedForDivider) {
-                    duration = IME_ADJUST_ANIM_DURATION;
-                } else {
-                    Slog.w(TAG, "IME adjust changed while waiting for drawn:"
-                            + " adjustedForIme=" + adjustedForIme
-                            + " adjustedForDivider=" + adjustedForDivider
-                            + " mAdjustedForIme=" + mAdjustedForIme
-                            + " mAdjustedForDivider=" + mAdjustedForDivider);
-                }
-                notifyAdjustedForImeChanged(
-                        mAdjustedForIme || mAdjustedForDivider, duration);
             };
         } else {
             notifyAdjustedForImeChanged(
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
index 5bc2722..3ef9b3f 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
@@ -29,7 +29,6 @@
 import android.view.Choreographer;
 import android.view.SurfaceControl;
 import android.view.SurfaceControl.Transaction;
-import android.view.animation.Transformation;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
@@ -44,12 +43,19 @@
 
     private final Object mLock = new Object();
 
+    /**
+     * Lock for cancelling animations. Must be acquired on it's own, or after acquiring
+     * {@link #mLock}
+     */
+    private final Object mCancelLock = new Object();
+
     @VisibleForTesting
     Choreographer mChoreographer;
 
     private final Runnable mApplyTransactionRunnable = this::applyTransaction;
     private final AnimationHandler mAnimationHandler;
     private final Transaction mFrameTransaction;
+    private final AnimatorFactory mAnimatorFactory;
     private boolean mApplyScheduled;
 
     @GuardedBy("mLock")
@@ -58,15 +64,15 @@
 
     @GuardedBy("mLock")
     @VisibleForTesting
-    final ArrayMap<SurfaceControl, ValueAnimator> mRunningAnimations = new ArrayMap<>();
+    final ArrayMap<SurfaceControl, RunningAnimation> mRunningAnimations = new ArrayMap<>();
 
     SurfaceAnimationRunner() {
-        this(null /* callbackProvider */, new Transaction());
+        this(null /* callbackProvider */, null /* animatorFactory */, new Transaction());
     }
 
     @VisibleForTesting
     SurfaceAnimationRunner(@Nullable AnimationFrameCallbackProvider callbackProvider,
-            Transaction frameTransaction) {
+            AnimatorFactory animatorFactory, Transaction frameTransaction) {
         SurfaceAnimationThread.getHandler().runWithScissors(() -> mChoreographer = getSfInstance(),
                 0 /* timeout */);
         mFrameTransaction = frameTransaction;
@@ -74,6 +80,9 @@
         mAnimationHandler.setProvider(callbackProvider != null
                 ? callbackProvider
                 : new SfVsyncFrameCallbackProvider(mChoreographer));
+        mAnimatorFactory = animatorFactory != null
+                ? animatorFactory
+                : SfValueAnimator::new;
     }
 
     void startAnimation(AnimationSpec a, SurfaceControl animationLeash, Transaction t,
@@ -94,18 +103,17 @@
         synchronized (mLock) {
             if (mPendingAnimations.containsKey(leash)) {
                 mPendingAnimations.remove(leash);
-                // TODO: Releasing the leash is problematic if reparenting hasn't happened yet.
-                // Fix with transaction
-                //leash.release();
                 return;
             }
-            final ValueAnimator anim = mRunningAnimations.get(leash);
+            final RunningAnimation anim = mRunningAnimations.get(leash);
             if (anim != null) {
                 mRunningAnimations.remove(leash);
+                synchronized (mCancelLock) {
+                    anim.mCancelled = true;
+                }
                 SurfaceAnimationThread.getHandler().post(() -> {
-                    anim.cancel();
+                    anim.mAnim.cancel();
                     applyTransaction();
-                    //leash.release();
                 });
             }
         }
@@ -119,54 +127,51 @@
     }
 
     private void startAnimationLocked(RunningAnimation a) {
-        final ValueAnimator result = new SfValueAnimator();
+        final ValueAnimator anim = mAnimatorFactory.makeAnimator();
 
         // Animation length is already expected to be scaled.
-        result.overrideDurationScale(1.0f);
-        result.setDuration(a.animSpec.getDuration());
-        result.addUpdateListener(animation -> {
-            applyTransformation(a, mFrameTransaction, result.getCurrentPlayTime());
+        anim.overrideDurationScale(1.0f);
+        anim.setDuration(a.mAnimSpec.getDuration());
+        anim.addUpdateListener(animation -> {
+            synchronized (mCancelLock) {
+                if (!a.mCancelled) {
+                    applyTransformation(a, mFrameTransaction, anim.getCurrentPlayTime());
+                }
+            }
 
             // Transaction will be applied in the commit phase.
             scheduleApplyTransaction();
         });
-        result.addListener(new AnimatorListenerAdapter() {
-
-            private boolean mCancelled;
-
+        anim.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationStart(Animator animation) {
-                mFrameTransaction.show(a.leash);
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                mCancelled = true;
+                synchronized (mCancelLock) {
+                    if (!a.mCancelled) {
+                        mFrameTransaction.show(a.mLeash);
+                    }
+                }
             }
 
             @Override
             public void onAnimationEnd(Animator animation) {
                 synchronized (mLock) {
-                    mRunningAnimations.remove(a.leash);
-                }
-                if (!mCancelled) {
-                    // Post on other thread that we can push final state without jank.
-                    AnimationThread.getHandler().post(() -> {
-                        a.finishCallback.run();
-
-                        // Make sure to release the leash after finishCallback has been invoked such
-                        // that reparenting is done already when releasing the leash.
-                        a.leash.release();
-                    });
+                    mRunningAnimations.remove(a.mLeash);
+                    synchronized (mCancelLock) {
+                        if (!a.mCancelled) {
+                            // Post on other thread that we can push final state without jank.
+                            AnimationThread.getHandler().post(a.mFinishCallback);
+                        }
+                    }
                 }
             }
         });
-        result.start();
-        mRunningAnimations.put(a.leash, result);
+        anim.start();
+        a.mAnim = anim;
+        mRunningAnimations.put(a.mLeash, a);
     }
 
     private void applyTransformation(RunningAnimation a, Transaction t, long currentPlayTime) {
-        a.animSpec.apply(t, a.leash, currentPlayTime);
+        a.mAnimSpec.apply(t, a.mLeash, currentPlayTime);
     }
 
     private void stepAnimation(long frameTimeNanos) {
@@ -189,17 +194,26 @@
     }
 
     private static final class RunningAnimation {
-        final AnimationSpec animSpec;
-        final SurfaceControl leash;
-        final Runnable finishCallback;
+        final AnimationSpec mAnimSpec;
+        final SurfaceControl mLeash;
+        final Runnable mFinishCallback;
+        ValueAnimator mAnim;
+
+        @GuardedBy("mCancelLock")
+        private boolean mCancelled;
 
         RunningAnimation(AnimationSpec animSpec, SurfaceControl leash, Runnable finishCallback) {
-            this.animSpec = animSpec;
-            this.leash = leash;
-            this.finishCallback = finishCallback;
+            mAnimSpec = animSpec;
+            mLeash = leash;
+            mFinishCallback = finishCallback;
         }
     }
 
+    @VisibleForTesting
+    interface AnimatorFactory {
+        ValueAnimator makeAnimator();
+    }
+
     /**
      * Value animator that uses sf-vsync signal to tick.
      */
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 713d58b..e165211 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -97,7 +97,7 @@
     void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden) {
         cancelAnimation(t, true /* restarting */);
         mAnimation = anim;
-        final SurfaceControl surface = mAnimatable.getSurface();
+        final SurfaceControl surface = mAnimatable.getSurfaceControl();
         if (surface == null) {
             Slog.w(TAG, "Unable to start animation, surface is null or no children.");
             cancelAnimation();
@@ -105,7 +105,7 @@
         }
         mLeash = createAnimationLeash(surface, t,
                 mAnimatable.getSurfaceWidth(), mAnimatable.getSurfaceHeight(), hidden);
-        mAnimatable.onLeashCreated(t, mLeash);
+        mAnimatable.onAnimationLeashCreated(t, mLeash);
         if (mAnimationStartDelayed) {
             if (DEBUG_ANIM) Slog.i(TAG, "Animation start delayed");
             return;
@@ -169,7 +169,16 @@
      * surface is reparented to the leash. This method takes care of that.
      */
     void setLayer(Transaction t, int layer) {
-        t.setLayer(mLeash != null ? mLeash : mAnimatable.getSurface(), layer);
+        t.setLayer(mLeash != null ? mLeash : mAnimatable.getSurfaceControl(), layer);
+    }
+
+    /**
+     * Sets the surface to be relatively layered.
+     *
+     * @see #setLayer
+     */
+    void setRelativeLayer(Transaction t, SurfaceControl relativeTo, int layer) {
+        t.setRelativeLayer(mLeash != null ? mLeash : mAnimatable.getSurfaceControl(), relativeTo, layer);
     }
 
     /**
@@ -178,7 +187,7 @@
      * @see #setLayer
      */
     void reparent(Transaction t, SurfaceControl newParent) {
-        t.reparent(mLeash != null ? mLeash : mAnimatable.getSurface(), newParent.getHandle());
+        t.reparent(mLeash != null ? mLeash : mAnimatable.getSurfaceControl(), newParent.getHandle());
     }
 
     /**
@@ -207,8 +216,8 @@
     }
 
     private void reset(Transaction t) {
-        final SurfaceControl surface = mAnimatable.getSurface();
-        final SurfaceControl parent = mAnimatable.getParentSurface();
+        final SurfaceControl surface = mAnimatable.getSurfaceControl();
+        final SurfaceControl parent = mAnimatable.getParentSurfaceControl();
 
         // If the surface was destroyed, we don't care to reparent it back.
         final boolean destroy = mLeash != null && surface != null && parent != null;
@@ -216,19 +225,22 @@
             if (DEBUG_ANIM) Slog.i(TAG, "Reparenting to original parent");
             t.reparent(surface, parent.getHandle());
         }
+        if (mLeash != null) {
+            mAnimatable.destroyAfterPendingTransaction(mLeash);
+        }
         mLeash = null;
         mAnimation = null;
 
         // Make sure to inform the animatable after the leash was destroyed.
         if (destroy) {
-            mAnimatable.onLeashDestroyed(t);
+            mAnimatable.onAnimationLeashDestroyed(t);
         }
     }
 
     private SurfaceControl createAnimationLeash(SurfaceControl surface, Transaction t, int width,
             int height, boolean hidden) {
         if (DEBUG_ANIM) Slog.i(TAG, "Reparenting to leash");
-        final SurfaceControl.Builder builder = mAnimatable.makeLeash()
+        final SurfaceControl.Builder builder = mAnimatable.makeAnimationLeash()
                 .setName(surface + " - animation-leash")
                 .setSize(width, height);
         final SurfaceControl leash = builder.build();
@@ -273,7 +285,7 @@
          * @param t The transaction to use to apply any necessary changes.
          * @param leash The leash that was created.
          */
-        void onLeashCreated(Transaction t, SurfaceControl leash);
+        void onAnimationLeashCreated(Transaction t, SurfaceControl leash);
 
         /**
          * Called when the leash is being destroyed, and the surface was reparented back to the
@@ -281,22 +293,30 @@
          *
          * @param t The transaction to use to apply any necessary changes.
          */
-        void onLeashDestroyed(Transaction t);
+        void onAnimationLeashDestroyed(Transaction t);
 
         /**
-         * @return A new child surface.
+         * Destroy a given surface after executing {@link #getPendingTransaction}.
+         *
+         * @see WindowContainer#destroyAfterPendingTransaction
          */
-        SurfaceControl.Builder makeLeash();
+        void destroyAfterPendingTransaction(SurfaceControl surface);
+
+        /**
+         * @return A new surface to be used for the animation leash, inserted at the correct
+         *         position in the hierarchy.
+         */
+        SurfaceControl.Builder makeAnimationLeash();
 
         /**
          * @return The surface of the object to be animated.
          */
-        @Nullable SurfaceControl getSurface();
+        @Nullable SurfaceControl getSurfaceControl();
 
         /**
          * @return The parent of the surface object to be animated.
          */
-        @Nullable SurfaceControl getParentSurface();
+        @Nullable SurfaceControl getParentSurfaceControl();
 
         /**
          * @return The width of the surface to be animated.
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 6ea8a47..244eb66 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -22,7 +22,6 @@
 import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.content.res.Configuration.EMPTY;
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 
 import static com.android.server.EventLogTags.WM_TASK_REMOVED;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
@@ -43,7 +42,6 @@
 import android.util.EventLog;
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
-import android.view.DisplayInfo;
 import android.view.Surface;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -162,7 +160,7 @@
     boolean shouldDeferRemoval() {
         // TODO: This should probably return false if mChildren.isEmpty() regardless if the stack
         // is animating...
-        return hasWindowsAlive() && mStack.isAnimating();
+        return hasWindowsAlive() && mStack.isSelfOrChildAnimating();
     }
 
     @Override
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index ca9f3a9..fa7ea2f 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -203,7 +203,7 @@
 
                     // Post back to WM to handle clean-ups. We still need the input
                     // event handler for the last finishInputEvent()!
-                    mService.mH.sendEmptyMessage(H.FINISH_TASK_POSITIONING);
+                    mService.mTaskPositioningController.finishTaskPositioning();
                 }
                 handled = true;
             } catch (Exception e) {
diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java
index bb5706c..4dfe290 100644
--- a/services/core/java/com/android/server/wm/TaskPositioningController.java
+++ b/services/core/java/com/android/server/wm/TaskPositioningController.java
@@ -22,6 +22,8 @@
 import android.annotation.Nullable;
 import android.app.IActivityManager;
 import android.os.RemoteException;
+import android.os.Handler;
+import android.os.Looper;
 import android.util.Slog;
 import android.view.Display;
 import android.view.IWindow;
@@ -37,6 +39,7 @@
     private final InputManagerService mInputManager;
     private final InputMonitor mInputMonitor;
     private final IActivityManager mActivityManager;
+    private final Handler mHandler;
 
     @GuardedBy("WindowManagerSerivce.mWindowMap")
     private @Nullable TaskPositioner mTaskPositioner;
@@ -50,11 +53,12 @@
     }
 
     TaskPositioningController(WindowManagerService service, InputManagerService inputManager,
-            InputMonitor inputMonitor, IActivityManager activityManager) {
+            InputMonitor inputMonitor, IActivityManager activityManager, Looper looper) {
         mService = service;
         mInputMonitor = inputMonitor;
         mInputManager = inputManager;
         mActivityManager = activityManager;
+        mHandler = new Handler(looper);
     }
 
     boolean startMovingTask(IWindow window, float startX, float startY) {
@@ -75,24 +79,27 @@
     }
 
     void handleTapOutsideTask(DisplayContent displayContent, int x, int y) {
-        int taskId = -1;
-        synchronized (mService.mWindowMap) {
-            final Task task = displayContent.findTaskForResizePoint(x, y);
-            if (task != null) {
-                if (!startPositioningLocked(task.getTopVisibleAppMainWindow(), true /*resize*/,
-                        task.preserveOrientationOnResize(), x, y)) {
-                    return;
+        mHandler.post(() -> {
+            int taskId = -1;
+            synchronized (mService.mWindowMap) {
+                final Task task = displayContent.findTaskForResizePoint(x, y);
+                if (task != null) {
+                    if (!startPositioningLocked(task.getTopVisibleAppMainWindow(), true /*resize*/,
+                            task.preserveOrientationOnResize(), x, y)) {
+                        return;
+                    }
+                    taskId = task.mTaskId;
+                } else {
+                    taskId = displayContent.taskIdFromPoint(x, y);
                 }
-                taskId = task.mTaskId;
-            } else {
-                taskId = displayContent.taskIdFromPoint(x, y);
             }
-        }
-        if (taskId >= 0) {
-            try {
-                mActivityManager.setFocusedTask(taskId);
-            } catch(RemoteException e) {}
-        }
+            if (taskId >= 0) {
+                try {
+                    mActivityManager.setFocusedTask(taskId);
+                } catch (RemoteException e) {
+                }
+            }
+        });
     }
 
     private boolean startPositioningLocked(WindowState win, boolean resize,
@@ -145,15 +152,17 @@
         return true;
     }
 
-    void finishPositioning() {
-        if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "finishPositioning");
+    void finishTaskPositioning() {
+        mHandler.post(() -> {
+            if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "finishPositioning");
 
-        synchronized (mService.mWindowMap) {
-            if (mTaskPositioner != null) {
-                mTaskPositioner.unregister();
-                mTaskPositioner = null;
-                mInputMonitor.updateInputWindowsLw(true /*force*/);
+            synchronized (mService.mWindowMap) {
+                if (mTaskPositioner != null) {
+                    mTaskPositioner.unregister();
+                    mTaskPositioner = null;
+                    mInputMonitor.updateInputWindowsLw(true /*force*/);
+                }
             }
-        }
+        });
     }
 }
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 28b1390..9946c6a 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -935,7 +935,7 @@
 
     @Override
     void removeIfPossible() {
-        if (isAnimating()) {
+        if (isSelfOrChildAnimating()) {
             mDeferRemoval = true;
             return;
         }
@@ -1643,7 +1643,7 @@
 
     /** Returns true if a removal action is still being deferred. */
     boolean checkCompleteDeferredRemoval() {
-        if (isAnimating()) {
+        if (isSelfOrChildAnimating()) {
             return true;
         }
         if (mDeferRemoval) {
diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
index 84ad576..5abda27 100644
--- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
+++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
@@ -62,8 +62,8 @@
 
                 synchronized (this) {
                     if (!mTouchExcludeRegion.contains(x, y)) {
-                        mService.mH.obtainMessage(H.TAP_OUTSIDE_TASK,
-                                x, y, mDisplayContent).sendToTarget();
+                        mService.mTaskPositioningController.handleTapOutsideTask(
+                                mDisplayContent, x, y);
                     }
                 }
             }
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index a12c0e5..3389f71 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -115,7 +115,7 @@
     void startAnimation(Animation anim) {
         for (int ndx = mChildren.size() - 1; ndx >= 0; ndx--) {
             final WindowState windowState = mChildren.get(ndx);
-            windowState.mWinAnimator.setAnimation(anim);
+            windowState.startAnimation(anim);
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
index 56175c7..bb25297 100644
--- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java
+++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
@@ -31,7 +31,7 @@
 
     private Animation mAnimation;
     private final Point mPosition = new Point();
-    private final ThreadLocal<Tmp> mThreadLocalTmps = ThreadLocal.withInitial(Tmp::new);
+    private final ThreadLocal<TmpValues> mThreadLocalTmps = ThreadLocal.withInitial(TmpValues::new);
 
     public WindowAnimationSpec(Animation animation, Point position)  {
         mAnimation = animation;
@@ -55,7 +55,7 @@
 
     @Override
     public void apply(Transaction t, SurfaceControl leash, long currentPlayTime) {
-        final Tmp tmp = mThreadLocalTmps.get();
+        final TmpValues tmp = mThreadLocalTmps.get();
         tmp.transformation.clear();
         mAnimation.getTransformation(currentPlayTime, tmp.transformation);
         tmp.transformation.getMatrix().postTranslate(mPosition.x, mPosition.y);
@@ -63,7 +63,7 @@
         t.setAlpha(leash, tmp.transformation.getAlpha());
     }
 
-    private static class Tmp {
+    private static class TmpValues {
         final Transformation transformation = new Transformation();
         final float[] floats = new float[9];
     }
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index d6329bf..b2b6119 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -19,6 +19,9 @@
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.proto.WindowContainerProto.CONFIGURATION_CONTAINER;
 import static com.android.server.wm.proto.WindowContainerProto.ORIENTATION;
 import static com.android.server.wm.proto.WindowContainerProto.VISIBLE;
@@ -26,14 +29,20 @@
 
 import android.annotation.CallSuper;
 import android.content.res.Configuration;
+import android.graphics.PixelFormat.Opacity;
+import android.util.Slog;
 import android.view.MagnificationSpec;
 import android.view.SurfaceControl;
+import android.view.SurfaceControl.Builder;
 import android.view.SurfaceSession;
 import android.util.Pools;
 
 import android.util.proto.ProtoOutputStream;
-import com.android.internal.util.ToBooleanFunction;
 
+import com.android.internal.util.ToBooleanFunction;
+import com.android.server.wm.SurfaceAnimator.Animatable;
+
+import java.io.PrintWriter;
 import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.function.Consumer;
@@ -46,7 +55,9 @@
  * changes are made to this class.
  */
 class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E>
-        implements Comparable<WindowContainer> {
+        implements Comparable<WindowContainer>, Animatable {
+
+    private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowContainer" : TAG_WM;
 
     static final int POSITION_TOP = Integer.MAX_VALUE;
     static final int POSITION_BOTTOM = Integer.MIN_VALUE;
@@ -56,7 +67,7 @@
      * For removing or setting new parent {@link #setParent} should be used, because it also
      * performs configuration updates based on new parent's settings.
      */
-    private WindowContainer mParent = null;
+    private WindowContainer<WindowContainer> mParent = null;
 
     // List of children for this window container. List is in z-order as the children appear on
     // screen with the top-most window container at the tail of the list.
@@ -69,7 +80,7 @@
             new Pools.SynchronizedPool<>(3);
 
     // The owner/creator for this container. No controller if null.
-     WindowContainerController mController;
+    WindowContainerController mController;
 
     protected SurfaceControl mSurfaceControl;
     private int mLastLayer = 0;
@@ -78,12 +89,14 @@
     /**
      * Applied as part of the animation pass in "prepareSurfaces".
      */
-    private final Transaction mPendingTransaction;
+    protected final Transaction mPendingTransaction;
+    protected final SurfaceAnimator mSurfaceAnimator;
     protected final WindowManagerService mService;
 
     WindowContainer(WindowManagerService service) {
         mService = service;
         mPendingTransaction = service.mTransactionFactory.make();
+        mSurfaceAnimator = new SurfaceAnimator(this, this::onAnimationFinished, service);
     }
 
     @Override
@@ -101,7 +114,7 @@
         return mChildren.get(index);
     }
 
-    final protected void setParent(WindowContainer parent) {
+    final protected void setParent(WindowContainer<WindowContainer> parent) {
         mParent = parent;
         // Removing parent usually means that we've detached this entity to destroy it or to attach
         // to another parent. In both cases we don't need to update the configuration now.
@@ -123,14 +136,18 @@
         if (mParent == null) {
             return;
         }
+
         if (mSurfaceControl == null) {
             // If we don't yet have a surface, but we now have a parent, we should
             // build a surface.
             mSurfaceControl = makeSurface().build();
             getPendingTransaction().show(mSurfaceControl);
         } else {
-            // If we have a surface but a new parent, we just need to perform a reparent.
-            getPendingTransaction().reparent(mSurfaceControl, mParent.mSurfaceControl.getHandle());
+            // If we have a surface but a new parent, we just need to perform a reparent. Go through
+            // surface animator such that hierarchy is preserved when animating, i.e.
+            // mSurfaceControl stays attached to the leash and we just reparent the leash to the
+            // new parent.
+            mSurfaceAnimator.reparent(getPendingTransaction(), mParent.mSurfaceControl);
         }
 
         // Either way we need to ask the parent to assign us a Z-order.
@@ -139,8 +156,8 @@
     }
 
     // Temp. holders for a chain of containers we are currently processing.
-    private final LinkedList<WindowContainer> mTmpChain1 = new LinkedList();
-    private final LinkedList<WindowContainer> mTmpChain2 = new LinkedList();
+    private final LinkedList<WindowContainer> mTmpChain1 = new LinkedList<>();
+    private final LinkedList<WindowContainer> mTmpChain2 = new LinkedList<>();
 
     /**
      * Adds the input window container has a child of this container in order based on the input
@@ -214,7 +231,7 @@
     @CallSuper
     void removeImmediately() {
         while (!mChildren.isEmpty()) {
-            final WindowContainer child = mChildren.peekLast();
+            final E child = mChildren.peekLast();
             child.removeImmediately();
             // Need to do this after calling remove on the child because the child might try to
             // remove/detach itself from its parent which will cause an exception if we remove
@@ -401,16 +418,40 @@
         }
     }
 
-    boolean isAnimating() {
+    /**
+     * @return Whether our own container is running an animation or any child, no matter how deep in
+     *         the hierarchy, is animating.
+     */
+    boolean isSelfOrChildAnimating() {
+        if (isSelfAnimating()) {
+            return true;
+        }
         for (int j = mChildren.size() - 1; j >= 0; j--) {
             final WindowContainer wc = mChildren.get(j);
-            if (wc.isAnimating()) {
+            if (wc.isSelfOrChildAnimating()) {
                 return true;
             }
         }
         return false;
     }
 
+    /**
+     * @return Whether our own container is running an animation or our parent is animating. This
+     *         doesn't consider whether children are animating.
+     */
+    boolean isAnimating() {
+
+        // We are animating if we ourselves are animating or if our parent is animating.
+        return isSelfAnimating() || mParent != null && mParent.isAnimating();
+    }
+
+    /**
+     * @return Whether our own container running an animation at the moment.
+     */
+    boolean isSelfAnimating() {
+        return mSurfaceAnimator.isAnimating();
+    }
+
     void sendAppVisibilityToClients() {
         for (int i = mChildren.size() - 1; i >= 0; --i) {
             final WindowContainer wc = mChildren.get(i);
@@ -743,6 +784,15 @@
                 .setParent(mSurfaceControl);
     }
 
+    @Override
+    public SurfaceControl getParentSurfaceControl() {
+        final WindowContainer parent = getParent();
+        if (parent == null) {
+            return null;
+        }
+        return parent.getSurfaceControl();
+    }
+
     /**
      * @return Whether this WindowContainer should be magnified by the accessibility magnifier.
      */
@@ -765,7 +815,10 @@
     void assignLayer(Transaction t, int layer) {
         final boolean changed = layer != mLastLayer || mLastRelativeToLayer != null;
         if (mSurfaceControl != null && changed) {
-            t.setLayer(mSurfaceControl, layer);
+
+            // Route through surface animator to accommodate that our surface control might be
+            // attached to the leash, and leash is attached to parent container.
+            mSurfaceAnimator.setLayer(t, layer);
             mLastLayer = layer;
             mLastRelativeToLayer = null;
         }
@@ -774,7 +827,10 @@
     void assignRelativeLayer(Transaction t, SurfaceControl relativeTo, int layer) {
         final boolean changed = layer != mLastLayer || mLastRelativeToLayer != relativeTo;
         if (mSurfaceControl != null && changed) {
-            t.setRelativeLayer(mSurfaceControl, relativeTo, layer);
+
+            // Route through surface animator to accommodate that our surface control might be
+            // attached to the leash, and leash is attached to parent container.
+            mSurfaceAnimator.setRelativeLayer(t, relativeTo, layer);
             mLastLayer = layer;
             mLastRelativeToLayer = relativeTo;
         }
@@ -897,7 +953,8 @@
         }
     }
 
-    SurfaceControl getSurfaceControl() {
+    @Override
+    public SurfaceControl getSurfaceControl() {
         return mSurfaceControl;
     }
 
@@ -907,13 +964,105 @@
      * rather than an intentional design, so please take care when
      * expanding use.
      */
-    void destroyAfterPendingTransaction(SurfaceControl surface) {
+    @Override
+    public void destroyAfterPendingTransaction(SurfaceControl surface) {
         if (mParent != null) {
             mParent.destroyAfterPendingTransaction(surface);
         }
     }
-    
-    Transaction getPendingTransaction() {
+
+    @Override
+    public Transaction getPendingTransaction() {
         return mPendingTransaction;
     }
+
+    /**
+     * Starts an animation on the container.
+     *
+     * @param anim The animation to run.
+     * @param hidden Whether our container is currently hidden. TODO This should use isVisible at
+     *               some point but the meaning is too weird to work for all containers.
+     */
+    void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden) {
+        if (DEBUG_ANIM) Slog.v(TAG, "Starting animation on " + this + ": " + anim);
+
+        // TODO: This should use isVisible() but because isVisible has a really weird meaning at
+        // the moment this doesn't work for all animatable window containers.
+        mSurfaceAnimator.startAnimation(t, anim, hidden);
+    }
+
+    void cancelAnimation() {
+        mSurfaceAnimator.cancelAnimation();
+    }
+
+    @Override
+    public Builder makeAnimationLeash() {
+        return makeSurface();
+    }
+
+    @Override
+    public void commitPendingTransaction() {
+        scheduleAnimation();
+    }
+
+    private void reassignLayer(Transaction t) {
+        final WindowContainer parent = getParent();
+        if (parent != null) {
+            parent.assignChildLayers(t);
+        }
+    }
+
+    @Override
+    public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
+        reassignLayer(t);
+    }
+
+    @Override
+    public void onAnimationLeashDestroyed(Transaction t) {
+        reassignLayer(t);
+    }
+
+    /**
+     * Called when an animation has finished running.
+     */
+    protected void onAnimationFinished() {
+    }
+
+    /**
+     * @return The currently running animation, if any, or {@code null} otherwise.
+     */
+    AnimationAdapter getAnimation() {
+        return mSurfaceAnimator.getAnimation();
+    }
+
+    /**
+     * @see SurfaceAnimator#startDelayingAnimationStart
+     */
+    void startDelayingAnimationStart() {
+        mSurfaceAnimator.startDelayingAnimationStart();
+    }
+
+    /**
+     * @see SurfaceAnimator#endDelayingAnimationStart
+     */
+    void endDelayingAnimationStart() {
+        mSurfaceAnimator.endDelayingAnimationStart();
+    }
+
+    @Override
+    public int getSurfaceWidth() {
+        return mSurfaceControl.getWidth();
+    }
+
+    @Override
+    public int getSurfaceHeight() {
+        return mSurfaceControl.getHeight();
+    }
+
+    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
+        if (mSurfaceAnimator.isAnimating()) {
+            pw.print(prefix); pw.println("ContainerAnimator:");
+            mSurfaceAnimator.dump(pw, prefix + "  ");
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 8c9948e..9fc9f3c 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -725,8 +725,6 @@
         }
     }
 
-    boolean mAnimateWallpaperWithTarget;
-
     // TODO: Move to RootWindowContainer
     AppWindowToken mFocusedApp = null;
 
@@ -1088,8 +1086,8 @@
         mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean(
                 com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout);
 
-        mTaskPositioningController =
-                new TaskPositioningController(this, mInputManager, mInputMonitor, mActivityManager);
+        mTaskPositioningController = new TaskPositioningController(
+                this, mInputManager, mInputMonitor, mActivityManager, mH.getLooper());
         mDragDropController = new DragDropController(this, mH.getLooper());
 
         LocalServices.addService(WindowManagerInternal.class, new LocalService());
@@ -2182,18 +2180,15 @@
         if (win.isWinVisibleLw() && winAnimator.applyAnimationLocked(transit, false)) {
             focusMayChange = isDefaultDisplay;
             win.mAnimatingExit = true;
-            win.mWinAnimator.mAnimating = true;
         } else if (win.mWinAnimator.isAnimationSet()) {
             // Currently in a hide animation... turn this into
             // an exit.
             win.mAnimatingExit = true;
-            win.mWinAnimator.mAnimating = true;
         } else if (win.getDisplayContent().mWallpaperController.isWallpaperTarget(win)) {
             // If the wallpaper is currently behind this
             // window, we need to change both of them inside
             // of a transaction to avoid artifacts.
             win.mAnimatingExit = true;
-            win.mWinAnimator.mAnimating = true;
         } else {
             if (mInputMethodWindow == win) {
                 setInputMethodWindowLocked(null);
@@ -4566,6 +4561,7 @@
             if (displayContent != null) {
                 mAnimator.addDisplayLocked(displayId);
                 displayContent.initializeDisplayBaseInfo();
+                reconfigureDisplayLocked(displayContent);
             }
         }
     }
@@ -4613,7 +4609,6 @@
         public static final int DO_ANIMATION_CALLBACK = 26;
 
         public static final int CLIENT_FREEZE_TIMEOUT = 30;
-        public static final int TAP_OUTSIDE_TASK = 31;
         public static final int NOTIFY_ACTIVITY_DRAWN = 32;
 
         public static final int ALL_WINDOWS_DRAWN = 33;
@@ -4627,8 +4622,6 @@
         public static final int RESET_ANR_MESSAGE = 38;
         public static final int WALLPAPER_DRAW_PENDING_TIMEOUT = 39;
 
-        public static final int FINISH_TASK_POSITIONING = 40;
-
         public static final int UPDATE_DOCKED_STACK_DIVIDER = 41;
 
         public static final int WINDOW_REPLACEMENT_TIMEOUT = 46;
@@ -4905,17 +4898,6 @@
                     break;
                 }
 
-                case TAP_OUTSIDE_TASK: {
-                    mTaskPositioningController.handleTapOutsideTask(
-                            (DisplayContent)msg.obj, msg.arg1, msg.arg2);
-                }
-                break;
-
-                case FINISH_TASK_POSITIONING: {
-                    mTaskPositioningController.finishPositioning();
-                }
-                break;
-
                 case NOTIFY_ACTIVITY_DRAWN:
                     try {
                         mActivityManager.notifyActivityDrawn((IBinder) msg.obj);
@@ -6705,7 +6687,6 @@
         synchronized (mWindowMap) {
             final Display display = mDisplayManager.getDisplay(displayId);
             if (display != null) {
-                createDisplayContentLocked(display);
                 displayReady(displayId);
             }
             mWindowPlacerLocked.requestTraversal();
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index e38605d..6bebcf4 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -19,11 +19,11 @@
 import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.SurfaceControl.Transaction;
 import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
 import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
 import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
 import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_VISIBLE;
-import static android.view.SurfaceControl.Transaction;
 import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
 import static android.view.WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
 import static android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
@@ -91,6 +91,7 @@
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
+import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
 import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER;
 import static com.android.server.wm.WindowManagerService.TYPE_LAYER_OFFSET;
 import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
@@ -160,10 +161,14 @@
 import android.view.ViewTreeObserver;
 import android.view.WindowInfo;
 import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
 
 import com.android.internal.util.ToBooleanFunction;
 import com.android.server.input.InputWindowHandle;
 import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
 
 import java.io.PrintWriter;
 import java.lang.ref.WeakReference;
@@ -594,6 +599,8 @@
      */
     private boolean mDrawnStateEvaluated;
 
+    private final Point mSurfacePosition = new Point();
+
     /**
      * Compares two window sub-layers and returns -1 if the first is lesser than the second in terms
      * of z-order and 1 otherwise.
@@ -1470,9 +1477,9 @@
         final AppWindowToken atoken = mAppToken;
         if (atoken != null) {
             return ((!isParentWindowHidden() && !atoken.hiddenRequested)
-                    || mWinAnimator.mAnimation != null || atoken.mAppAnimator.animation != null);
+                    || mWinAnimator.isAnimationSet() || atoken.mAppAnimator.animation != null);
         }
-        return !isParentWindowHidden() || mWinAnimator.mAnimation != null;
+        return !isParentWindowHidden() || mWinAnimator.isAnimationSet();
     }
 
     /**
@@ -1505,7 +1512,7 @@
         }
         return mHasSurface && mPolicyVisibility && !mDestroying
                 && ((!isParentWindowHidden() && mViewVisibility == View.VISIBLE && !mToken.hidden)
-                        || mWinAnimator.mAnimation != null
+                        || mWinAnimator.isAnimationSet()
                         || ((mAppToken != null) && (mAppToken.mAppAnimator.animation != null)));
     }
 
@@ -1520,8 +1527,7 @@
         // started.
         final boolean appAnimationStarting = mAppToken != null
                 && mAppToken.mAppAnimator.isAnimationStarting();
-        final boolean exitingSelf = mAnimatingExit && (!mWinAnimator.isAnimationStarting()
-                && !appAnimationStarting);
+        final boolean exitingSelf = mAnimatingExit && !appAnimationStarting;
         final boolean appExiting = mAppToken != null && mAppToken.hidden && !appAnimationStarting;
 
         final boolean exiting = exitingSelf || mDestroying || appExiting;
@@ -1544,7 +1550,7 @@
         return isDrawnLw() && mPolicyVisibility
             && ((!isParentWindowHidden() &&
                     (atoken == null || !atoken.hiddenRequested))
-                        || mWinAnimator.mAnimating
+                        || mWinAnimator.isAnimationSet()
                         || (atoken != null && atoken.mAppAnimator.animation != null));
     }
 
@@ -1553,7 +1559,7 @@
      */
     @Override
     public boolean isAnimatingLw() {
-        return mWinAnimator.mAnimation != null
+        return mWinAnimator.isAnimationSet()
                 || (mAppToken != null && mAppToken.mAppAnimator.animation != null);
     }
 
@@ -1600,7 +1606,7 @@
         // to determine if it's occluding apps.
         return ((!mIsWallpaper && mAttrs.format == PixelFormat.OPAQUE)
                 || (mIsWallpaper && mWallpaperVisible))
-                && isDrawnLw() && mWinAnimator.mAnimation == null
+                && isDrawnLw() && !mWinAnimator.isAnimationSet()
                 && (mAppToken == null || mAppToken.mAppAnimator.animation == null);
     }
 
@@ -1732,7 +1738,7 @@
      * listeners and optionally animate it. Simply checking a change of position is not enough,
      * because being move due to dock divider is not a trigger for animation.
      */
-    void handleWindowMovedIfNeeded() {
+    void handleWindowMovedIfNeeded(Transaction t) {
         if (!hasMoved()) {
             return;
         }
@@ -1750,7 +1756,7 @@
                 && !isDragResizing() && !adjustedForMinimizedDockOrIme
                 && getWindowConfiguration().hasMovementAnimations()
                 && !mWinAnimator.mLastHidden) {
-            mWinAnimator.setMoveAnimation(left, top);
+            startMoveAnimation(t, left, top);
         }
 
         //TODO (multidisplay): Accessibility supported only for the default display.
@@ -2457,10 +2463,10 @@
         if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility true: " + this);
         if (doAnimation) {
             if (DEBUG_VISIBILITY) Slog.v(TAG, "doAnimation: mPolicyVisibility="
-                    + mPolicyVisibility + " mAnimation=" + mWinAnimator.mAnimation);
+                    + mPolicyVisibility + " isAnimationSet=" + mWinAnimator.isAnimationSet());
             if (!mToken.okToAnimate()) {
                 doAnimation = false;
-            } else if (mPolicyVisibility && mWinAnimator.mAnimation == null) {
+            } else if (mPolicyVisibility && !mWinAnimator.isAnimationSet()) {
                 // Check for the case where we are currently visible and
                 // not animating; we do not want to do animation at such a
                 // point to become visible when we already are.
@@ -2499,7 +2505,7 @@
         }
         if (doAnimation) {
             mWinAnimator.applyAnimationLocked(TRANSIT_EXIT, false);
-            if (mWinAnimator.mAnimation == null) {
+            if (!mWinAnimator.isAnimationSet()) {
                 doAnimation = false;
             }
         }
@@ -2599,14 +2605,6 @@
         return mAnimatingExit || (mService.mClosingApps.contains(mAppToken));
     }
 
-    @Override
-    boolean isAnimating() {
-        if (mWinAnimator.isAnimationSet() || mAnimatingExit) {
-            return true;
-        }
-        return super.isAnimating();
-    }
-
     void addWinAnimatorToList(ArrayList<WindowStateAnimator> animators) {
         animators.add(mWinAnimator);
 
@@ -3133,6 +3131,7 @@
         proto.end(token);
     }
 
+    @Override
     void dump(PrintWriter pw, String prefix, boolean dumpAll) {
         final TaskStack stack = getStack();
         pw.print(prefix); pw.print("mDisplayId="); pw.print(getDisplayId());
@@ -3275,6 +3274,7 @@
                     pw.print(" cutout=" + mLastDisplayCutout);
                     pw.println();
         }
+        super.dump(pw, prefix, dumpAll);
         pw.print(prefix); pw.print(mWinAnimator); pw.println(":");
         mWinAnimator.dump(pw, prefix + "  ", dumpAll);
         if (mAnimatingExit || mRemoveOnExit || mDestroying || mRemoved) {
@@ -3333,7 +3333,7 @@
     @Override
     String getName() {
         return Integer.toHexString(System.identityHashCode(this))
-            + " " + getWindowTag();
+                + " " + getWindowTag();
     }
 
     CharSequence getWindowTag() {
@@ -3694,7 +3694,7 @@
                     + " tok.hiddenRequested="
                     + (mAppToken != null && mAppToken.hiddenRequested)
                     + " tok.hidden=" + (mAppToken != null && mAppToken.hidden)
-                    + " animating=" + mWinAnimator.mAnimating
+                    + " animationSet=" + mWinAnimator.isAnimationSet()
                     + " tok animating="
                     + (mWinAnimator.mAppAnimator != null && mWinAnimator.mAppAnimator.animating)
                     + " Callers=" + Debug.getCallers(4));
@@ -3900,23 +3900,10 @@
         return null;
     }
 
-    boolean isWindowAnimationSet() {
-        if (mWinAnimator.isWindowAnimationSet()) {
-            return true;
-        }
-        for (int i = mChildren.size() - 1; i >= 0; --i) {
-            final WindowState c = mChildren.get(i);
-            if (c.isWindowAnimationSet()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     void onExitAnimationDone() {
         if (DEBUG_ANIM) Slog.v(TAG, "onExitAnimationDone in " + this
                 + ": exiting=" + mAnimatingExit + " remove=" + mRemoveOnExit
-                + " windowAnimating=" + mWinAnimator.isWindowAnimationSet());
+                + " selfAnimating=" + isSelfAnimating());
 
         if (!mChildren.isEmpty()) {
             // Copying to a different list as multiple children can be removed.
@@ -3940,18 +3927,16 @@
             }
         }
 
-        if (!mWinAnimator.isWindowAnimationSet()) {
-            //TODO (multidisplay): Accessibility is supported only for the default display.
-            if (mService.mAccessibilityController != null && getDisplayId() == DEFAULT_DISPLAY) {
-                mService.mAccessibilityController.onSomeWindowResizedOrMovedLocked();
-            }
-        }
-
-        if (!mAnimatingExit) {
+        if (isSelfAnimating()) {
             return;
         }
 
-        if (mWinAnimator.isWindowAnimationSet()) {
+        //TODO (multidisplay): Accessibility is supported only for the default display.
+        if (mService.mAccessibilityController != null && getDisplayId() == DEFAULT_DISPLAY) {
+            mService.mAccessibilityController.onSomeWindowResizedOrMovedLocked();
+        }
+
+        if (!mAnimatingExit) {
             return;
         }
 
@@ -4005,10 +3990,6 @@
                 mAnimatingExit = false;
                 didSomething = true;
             }
-            if (mWinAnimator.mAnimating) {
-                mWinAnimator.mAnimating = false;
-                didSomething = true;
-            }
             if (mDestroying) {
                 mDestroying = false;
                 mService.mDestroySurface.remove(this);
@@ -4097,7 +4078,7 @@
                         + " mDrawState=" + mWinAnimator.mDrawState
                         + " ph=" + isParentWindowHidden()
                         + " th=" + (mAppToken != null ? mAppToken.hiddenRequested : false)
-                        + " a=" + mWinAnimator.mAnimating);
+                        + " a=" + mWinAnimator.isAnimationSet());
             }
         }
 
@@ -4300,6 +4281,39 @@
         mLastDisplayCutout = mDisplayCutout;
     }
 
+    void startAnimation(Animation anim) {
+        final DisplayInfo displayInfo = getDisplayContent().getDisplayInfo();
+        anim.initialize(mFrame.width(), mFrame.height(),
+                displayInfo.appWidth, displayInfo.appHeight);
+        anim.restrictDuration(MAX_ANIMATION_DURATION);
+        anim.scaleCurrentDuration(mService.getWindowAnimationScaleLocked());
+        final AnimationAdapter adapter = new LocalAnimationAdapter(
+                new WindowAnimationSpec(anim, mSurfacePosition), mService.mSurfaceAnimationRunner);
+        startAnimation(mPendingTransaction, adapter);
+        commitPendingTransaction();
+    }
+
+    private void startMoveAnimation(Transaction t, int left, int top) {
+        if (DEBUG_ANIM) Slog.v(TAG, "Setting move animation on " + this);
+        final Point oldPosition = new Point();
+        final Point newPosition = new Point();
+        transformFrameToSurfacePosition(mLastFrame.left, mLastFrame.top, oldPosition);
+        transformFrameToSurfacePosition(left, top, newPosition);
+        final AnimationAdapter adapter = new LocalAnimationAdapter(
+                new MoveAnimationSpec(oldPosition.x, oldPosition.y, newPosition.x, newPosition.y),
+                mService.mSurfaceAnimationRunner);
+        startAnimation(t, adapter);
+    }
+
+    private void startAnimation(Transaction t, AnimationAdapter adapter) {
+        startAnimation(t, adapter, mWinAnimator.mLastHidden);
+    }
+
+    @Override
+    protected void onAnimationFinished() {
+        mWinAnimator.onAnimationFinished();
+    }
+
     // TODO: Hack to work around the number of states AppWindowToken needs to access without having
     // access to its windows children. Need to investigate re-writing
     // {@link AppWindowToken#updateReportedVisibilityLocked} so this can be removed.
@@ -4381,11 +4395,6 @@
         return getAnimLayerAdjustment() > 0 || mWillReplaceWindow;
     }
 
-    @Override
-    SurfaceControl.Builder makeSurface() {
-        return getParent().makeChildSurface(this);
-    }
-
     private void applyDims(Dimmer dimmer) {
         if (!mAnimatingExit && mAppDied) {
             mIsDimming = true;
@@ -4405,11 +4414,51 @@
             applyDims(dimmer);
         }
 
+        updateSurfacePosition(mPendingTransaction);
+
         mWinAnimator.prepareSurfaceLocked(true);
         super.prepareSurfaces();
     }
 
     @Override
+    public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
+        super.onAnimationLeashCreated(t, leash);
+
+        // Leash is now responsible for position, so set our position to 0.
+        t.setPosition(mSurfaceControl, 0, 0);
+    }
+
+    @Override
+    public void onAnimationLeashDestroyed(Transaction t) {
+        super.onAnimationLeashDestroyed(t);
+        updateSurfacePosition(t);
+    }
+
+    void updateSurfacePosition(Transaction t) {
+        if (mSurfaceControl == null) {
+            return;
+        }
+
+        transformFrameToSurfacePosition(mFrame.left, mFrame.top, mSurfacePosition);
+        if (!mSurfaceAnimator.hasLeash()) {
+            t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
+        }
+    }
+
+    private void transformFrameToSurfacePosition(int left, int top, Point outPoint) {
+        outPoint.set(left, top);
+        if (isChildWindow()) {
+            // TODO: This probably falls apart at some point and we should
+            // actually compute relative coordinates.
+            final WindowState parent = getParentWindow();
+            outPoint.offset(-parent.mFrame.left, -parent.mFrame.top);
+        }
+
+        // Expand for surface insets. See WindowState.expandForSurfaceInsets.
+        outPoint.offset(-mAttrs.surfaceInsets.left, -mAttrs.surfaceInsets.top);
+    }
+
+    @Override
     void assignLayer(Transaction t, int layer) {
         // See comment in assignRelativeLayerForImeTargetChild
         if (!isChildWindow()
@@ -4449,4 +4498,34 @@
             layer++;
         }
     }
+
+    private final class MoveAnimationSpec implements AnimationSpec {
+
+        private final long mDuration;
+        private Interpolator mInterpolator;
+        private Point mFrom = new Point();
+        private Point mTo = new Point();
+
+        private MoveAnimationSpec(int fromX, int fromY, int toX, int toY) {
+            final Animation anim = AnimationUtils.loadAnimation(mContext,
+                    com.android.internal.R.anim.window_move_from_decor);
+            mDuration = anim.computeDurationHint();
+            mInterpolator = anim.getInterpolator();
+            mFrom.set(fromX, fromY);
+            mTo.set(toX, toY);
+        }
+
+        @Override
+        public long getDuration() {
+            return mDuration;
+        }
+
+        @Override
+        public void apply(Transaction t, SurfaceControl leash, long currentPlayTime) {
+            final float fraction = (float) currentPlayTime / getDuration();
+            final float v = mInterpolator.getInterpolation(fraction);
+            t.setPosition(leash, mFrom.x + (mTo.x - mFrom.x) * v,
+                    mFrom.y + (mTo.y - mFrom.y) * v);
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 54c84ea..0eabc89 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -23,16 +23,16 @@
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
+import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
+import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
 import static com.android.server.wm.AppWindowAnimator.sDummyAnimation;
 import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_CROP;
 import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
 import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC;
@@ -40,7 +40,6 @@
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER;
-import static com.android.server.wm.WindowManagerService.localLOGV;
 import static com.android.server.wm.WindowManagerService.logWithStack;
 import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
 import static com.android.server.wm.WindowSurfacePlacer.SET_TURN_ON_SCREEN;
@@ -65,14 +64,13 @@
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
 import android.view.animation.AnimationUtils;
 import android.view.animation.Transformation;
 
 import com.android.server.policy.WindowManagerPolicy;
 
-import java.io.PrintWriter;
 import java.io.FileDescriptor;
+import java.io.PrintWriter;
 
 /**
  * Keep track of animations and surface operations for a single WindowState.
@@ -112,20 +110,9 @@
     final boolean mIsWallpaper;
     private final WallpaperController mWallpaperControllerLocked;
 
-    // Currently running animation.
-    boolean mAnimating;
-    boolean mLocalAnimating;
-    Animation mAnimation;
     boolean mAnimationIsEntrance;
-    boolean mHasTransformation;
-    boolean mHasLocalTransformation;
-    final Transformation mTransformation = new Transformation();
-    boolean mWasAnimating;      // Were we animating going into the most recent animation step?
     int mAnimLayer;
     int mLastLayer;
-    long mAnimationStartTime;
-    long mLastAnimationTime;
-    int mStackClip = STACK_CLIP_BEFORE_ANIM;
 
     /**
      * Set when we have changed the size of the surface, to know that
@@ -168,13 +155,6 @@
     private final Rect mSystemDecorRect = new Rect();
     private final Rect mLastSystemDecorRect = new Rect();
 
-    // Used to save animation distances between the time they are calculated and when they are used.
-    private int mAnimDx;
-    private int mAnimDy;
-
-    /** Is the next animation to be started a window move animation? */
-    private boolean mAnimateMove = false;
-
     float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1;
     private float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1;
 
@@ -226,8 +206,6 @@
 
     int mAttrType;
 
-    static final long PENDING_TRANSACTION_FINISH_WAIT_TIME = 100;
-
     boolean mForceScaleUntilResize;
 
     // WindowState.mHScale and WindowState.mVScale contain the
@@ -247,15 +225,6 @@
         mAnimator = service.mAnimator;
         mPolicy = service.mPolicy;
         mContext = service.mContext;
-        final DisplayContent displayContent = win.getDisplayContent();
-        if (displayContent != null) {
-            final DisplayInfo displayInfo = displayContent.getDisplayInfo();
-            mAnimDx = displayInfo.appWidth;
-            mAnimDy = displayInfo.appHeight;
-        } else {
-            Slog.w(TAG, "WindowStateAnimator ctor: Display has been removed");
-            // This is checked on return and dealt with.
-        }
 
         mWin = win;
         mParentWinAnimator = !win.isChildWindow() ? null : win.getParentWindow().mWinAnimator;
@@ -266,54 +235,11 @@
         mWallpaperControllerLocked = mService.mRoot.mWallpaperController;
     }
 
-    public void setAnimation(Animation anim, long startTime, int stackClip) {
-        if (localLOGV) Slog.v(TAG, "Setting animation in " + this + ": " + anim);
-        mAnimating = false;
-        mLocalAnimating = false;
-        mAnimation = anim;
-        mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION);
-        mAnimation.scaleCurrentDuration(mService.getWindowAnimationScaleLocked());
-        // Start out animation gone if window is gone, or visible if window is visible.
-        mTransformation.clear();
-        mTransformation.setAlpha(mLastHidden ? 0 : 1);
-        mHasLocalTransformation = true;
-        mAnimationStartTime = startTime;
-        mStackClip = stackClip;
-    }
-
-    public void setAnimation(Animation anim, int stackClip) {
-        setAnimation(anim, -1, stackClip);
-    }
-
-    public void setAnimation(Animation anim) {
-        setAnimation(anim, -1, STACK_CLIP_AFTER_ANIM);
-    }
-
-    public void clearAnimation() {
-        if (mAnimation != null) {
-            mAnimating = true;
-            mLocalAnimating = false;
-            mAnimation.cancel();
-            mAnimation = null;
-            mStackClip = STACK_CLIP_BEFORE_ANIM;
-        }
-    }
-
     /**
      * Is the window or its container currently set to animate or currently animating?
      */
     boolean isAnimationSet() {
-        return mAnimation != null
-                || (mParentWinAnimator != null && mParentWinAnimator.mAnimation != null)
-                || (mAppAnimator != null && mAppAnimator.isAnimating());
-    }
-
-    /**
-     * @return whether an animation is about to start, i.e. the animation is set already but we
-     *         haven't processed the first frame yet.
-     */
-    boolean isAnimationStarting() {
-        return isAnimationSet() && !mAnimating;
+        return mWin.isAnimating();
     }
 
     /** Is the window animating the DummyAnimation? */
@@ -323,13 +249,6 @@
     }
 
     /**
-     * Is this window currently set to animate or currently animating?
-     */
-    boolean isWindowAnimationSet() {
-        return mAnimation != null;
-    }
-
-    /**
      * Is this window currently waiting to run an opening animation?
      */
     boolean isWaitingForOpening() {
@@ -341,130 +260,23 @@
         if (DEBUG_ANIM) Slog.d(TAG,
                 "cancelExitAnimationForNextAnimationLocked: " + mWin);
 
-        if (mAnimation != null) {
-            mAnimation.cancel();
-            mAnimation = null;
-            mLocalAnimating = false;
-            mWin.destroySurfaceUnchecked();
-        }
+        mWin.cancelAnimation();
+        mWin.destroySurfaceUnchecked();
     }
 
-    private boolean stepAnimation(long currentTime) {
-        if ((mAnimation == null) || !mLocalAnimating) {
-            return false;
-        }
-        currentTime = getAnimationFrameTime(mAnimation, currentTime);
-        mTransformation.clear();
-        final boolean more = mAnimation.getTransformation(currentTime, mTransformation);
-        if (mAnimationStartDelayed && mAnimationIsEntrance) {
-            mTransformation.setAlpha(0f);
-        }
-        if (false && DEBUG_ANIM) Slog.v(TAG, "Stepped animation in " + this + ": more=" + more
-                + ", xform=" + mTransformation);
-        return more;
-    }
-
-    // This must be called while inside a transaction.  Returns true if
-    // there is more animation to run.
-    boolean stepAnimationLocked(long currentTime) {
-        // Save the animation state as it was before this step so WindowManagerService can tell if
-        // we just started or just stopped animating by comparing mWasAnimating with isAnimationSet().
-        mWasAnimating = mAnimating;
-        final DisplayContent displayContent = mWin.getDisplayContent();
-        if (mWin.mToken.okToAnimate()) {
-            // We will run animations as long as the display isn't frozen.
-
-            if (mWin.isDrawnLw() && mAnimation != null) {
-                mHasTransformation = true;
-                mHasLocalTransformation = true;
-                if (!mLocalAnimating) {
-                    if (DEBUG_ANIM) Slog.v(
-                        TAG, "Starting animation in " + this +
-                        " @ " + currentTime + ": ww=" + mWin.mFrame.width() +
-                        " wh=" + mWin.mFrame.height() +
-                        " dx=" + mAnimDx + " dy=" + mAnimDy +
-                        " scale=" + mService.getWindowAnimationScaleLocked());
-                    final DisplayInfo displayInfo = displayContent.getDisplayInfo();
-                    if (mAnimateMove) {
-                        mAnimateMove = false;
-                        mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(),
-                                mAnimDx, mAnimDy);
-                    } else {
-                        mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(),
-                                displayInfo.appWidth, displayInfo.appHeight);
-                    }
-                    mAnimDx = displayInfo.appWidth;
-                    mAnimDy = displayInfo.appHeight;
-                    mAnimation.setStartTime(mAnimationStartTime != -1
-                            ? mAnimationStartTime
-                            : currentTime);
-                    mLocalAnimating = true;
-                    mAnimating = true;
-                }
-                if ((mAnimation != null) && mLocalAnimating) {
-                    mLastAnimationTime = currentTime;
-                    if (stepAnimation(currentTime)) {
-                        return true;
-                    }
-                }
-                if (DEBUG_ANIM) Slog.v(
-                    TAG, "Finished animation in " + this +
-                    " @ " + currentTime);
-                //WindowManagerService.this.dump();
-            }
-            mHasLocalTransformation = false;
-            if ((!mLocalAnimating || mAnimationIsEntrance) && mAppAnimator != null
-                    && mAppAnimator.animation != null) {
-                // When our app token is animating, we kind-of pretend like
-                // we are as well.  Note the mLocalAnimating mAnimationIsEntrance
-                // part of this check means that we will only do this if
-                // our window is not currently exiting, or it is not
-                // locally animating itself.  The idea being that one that
-                // is exiting and doing a local animation should be removed
-                // once that animation is done.
-                mAnimating = true;
-                mHasTransformation = true;
-                mTransformation.clear();
-                return false;
-            } else if (mHasTransformation) {
-                // Little trick to get through the path below to act like
-                // we have finished an animation.
-                mAnimating = true;
-            } else if (isAnimationSet()) {
-                mAnimating = true;
-            }
-        } else if (mAnimation != null) {
-            // If the display is frozen, and there is a pending animation,
-            // clear it and make sure we run the cleanup code.
-            mAnimating = true;
-        }
-
-        if (!mAnimating && !mLocalAnimating) {
-            return false;
-        }
-
+    void onAnimationFinished() {
         // Done animating, clean up.
         if (DEBUG_ANIM) Slog.v(
-            TAG, "Animation done in " + this + ": exiting=" + mWin.mAnimatingExit
-            + ", reportedVisible="
-            + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false));
+                TAG, "Animation done in " + this + ": exiting=" + mWin.mAnimatingExit
+                        + ", reportedVisible="
+                        + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false));
 
-        mAnimating = false;
-        mLocalAnimating = false;
-        if (mAnimation != null) {
-            mAnimation.cancel();
-            mAnimation = null;
-        }
         if (mAnimator.mWindowDetachedWallpaper == mWin) {
             mAnimator.mWindowDetachedWallpaper = null;
         }
-        mAnimLayer = mWin.getSpecialWindowAnimLayerAdjustment();
-        if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this + " anim layer: " + mAnimLayer);
-        mHasTransformation = false;
-        mHasLocalTransformation = false;
-        mStackClip = STACK_CLIP_BEFORE_ANIM;
+
         mWin.checkPolicyVisibilityChange();
-        mTransformation.clear();
+        final DisplayContent displayContent = mWin.getDisplayContent();
         if (mAttrType == LayoutParams.TYPE_STATUS_BAR && mWin.mPolicyVisibility) {
             // Upon completion of a not-visible to visible status bar animation a relayout is
             // required.
@@ -475,7 +287,11 @@
 
         mWin.onExitAnimationDone();
         final int displayId = mWin.getDisplayId();
-        mAnimator.setPendingLayoutChanges(displayId, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
+        int pendingLayoutChanges = FINISH_LAYOUT_REDO_ANIM;
+        if (displayContent.mWallpaperController.isWallpaperTarget(mWin)) {
+            pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
+        }
+        mAnimator.setPendingLayoutChanges(displayId, pendingLayoutChanges);
         if (DEBUG_LAYOUT_REPEATS)
             mService.mWindowPlacerLocked.debugLayoutRepeats(
                     "WindowStateAnimator", mAnimator.getPendingLayoutChanges(displayId));
@@ -483,8 +299,6 @@
         if (mWin.mAppToken != null) {
             mWin.mAppToken.updateReportedVisibilityLocked();
         }
-
-        return false;
     }
 
     void hide(String reason) {
@@ -683,8 +497,8 @@
             }
 
             mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession,
-                    attrs.getTitle().toString(),
-                    width, height, format, flags, this, windowType, ownerUid);
+                    attrs.getTitle().toString(), width, height, format, flags, this,
+                    windowType, ownerUid);
             mSurfaceFormat = format;
 
             w.setHasSurface(true);
@@ -853,35 +667,8 @@
     }
 
     void computeShownFrameLocked() {
-        final boolean selfTransformation = mHasLocalTransformation;
         Transformation appTransformation = (mAppAnimator != null && mAppAnimator.hasTransformation)
                 ? mAppAnimator.transformation : null;
-        Transformation wallpaperTargetTransformation = null;
-
-        // Wallpapers are animated based on the "real" window they
-        // are currently targeting.
-        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
-        if (mIsWallpaper && wallpaperTarget != null && mService.mAnimateWallpaperWithTarget) {
-            final WindowStateAnimator wallpaperAnimator = wallpaperTarget.mWinAnimator;
-            if (wallpaperAnimator.mHasLocalTransformation &&
-                    wallpaperAnimator.mAnimation != null &&
-                    !wallpaperAnimator.mAnimation.getDetachWallpaper()) {
-                wallpaperTargetTransformation = wallpaperAnimator.mTransformation;
-                if (DEBUG_WALLPAPER && wallpaperTargetTransformation != null) {
-                    Slog.v(TAG, "WP target attached xform: " + wallpaperTargetTransformation);
-                }
-            }
-            final AppWindowAnimator wpAppAnimator = wallpaperTarget.mAppToken == null ?
-                    null : wallpaperTarget.mAppToken.mAppAnimator;
-                if (wpAppAnimator != null && wpAppAnimator.hasTransformation
-                    && wpAppAnimator.animation != null
-                    && !wpAppAnimator.animation.getDetachWallpaper()) {
-                appTransformation = wpAppAnimator.transformation;
-                if (DEBUG_WALLPAPER && appTransformation != null) {
-                    Slog.v(TAG, "WP target app xform: " + appTransformation);
-                }
-            }
-        }
 
         final int displayId = mWin.getDisplayId();
         final ScreenRotationAnimation screenRotationAnimation =
@@ -890,8 +677,7 @@
                 screenRotationAnimation != null && screenRotationAnimation.isAnimating();
 
         mHasClipRect = false;
-        if (selfTransformation || wallpaperTargetTransformation != null
-                || appTransformation != null || screenAnimation) {
+        if (appTransformation != null || screenAnimation) {
             // cache often used attributes locally
             final Rect frame = mWin.mFrame;
             final float tmpFloats[] = mService.mTmpFloats;
@@ -917,34 +703,16 @@
                 tmpMatrix.reset();
             }
             tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale);
-            if (selfTransformation) {
-                tmpMatrix.postConcat(mTransformation.getMatrix());
-            }
 
-            if (wallpaperTargetTransformation != null) {
-                tmpMatrix.postConcat(wallpaperTargetTransformation.getMatrix());
-            }
+            // WindowState.prepareSurfaces expands for surface insets (in order they don't get
+            // clipped by the WindowState surface), so we need to go into the other direction here.
+            tmpMatrix.postTranslate(mWin.mXOffset + mWin.mAttrs.surfaceInsets.left,
+                    mWin.mYOffset + mWin.mAttrs.surfaceInsets.top);
+
             if (appTransformation != null) {
                 tmpMatrix.postConcat(appTransformation.getMatrix());
             }
 
-            int left = frame.left;
-            int top = frame.top;
-            if (mWin.isChildWindow()) {
-                WindowState parent = mWin.getParentWindow();
-                left -= parent.mFrame.left;
-                top  -= parent.mFrame.top;
-            }
-
-            // The translation that applies the position of the window needs to be applied at the
-            // end in case that other translations include scaling. Otherwise the scaling will
-            // affect this translation. But it needs to be set before the screen rotation animation
-            // so the pivot point is at the center of the screen for all windows.
-            tmpMatrix.postTranslate(left + mWin.mXOffset, top + mWin.mYOffset);
-            if (screenAnimation) {
-                tmpMatrix.postConcat(screenRotationAnimation.getEnterTransformation().getMatrix());
-            }
-
             // "convert" it into SurfaceFlinger's format
             // (a 2x2 matrix + an offset)
             // Here we must not transform the position of the surface
@@ -972,12 +740,6 @@
                     || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDtDy, mDsDy)
                             && x == frame.left && y == frame.top))) {
                 //Slog.i(TAG_WM, "Applying alpha transform");
-                if (selfTransformation) {
-                    mShownAlpha *= mTransformation.getAlpha();
-                }
-                if (wallpaperTargetTransformation != null) {
-                    mShownAlpha *= wallpaperTargetTransformation.getAlpha();
-                }
                 if (appTransformation != null) {
                     mShownAlpha *= appTransformation.getAlpha();
                     if (appTransformation.hasClipRect()) {
@@ -1006,9 +768,6 @@
             if ((DEBUG_ANIM || WindowManagerService.localLOGV)
                     && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v(
                     TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha
-                    + " self=" + (selfTransformation ? mTransformation.getAlpha() : "null")
-                    + " attached=" + (wallpaperTargetTransformation == null ?
-                            "null" : wallpaperTargetTransformation.getAlpha())
                     + " app=" + (appTransformation == null ? "null" : appTransformation.getAlpha())
                     + " screen=" + (screenAnimation ?
                             screenRotationAnimation.getEnterTransformation().getAlpha() : "null"));
@@ -1028,10 +787,10 @@
                 TAG, "computeShownFrameLocked: " + this +
                 " not attached, mAlpha=" + mAlpha);
 
-        mWin.mShownPosition.set(mWin.mFrame.left, mWin.mFrame.top);
-        if (mWin.mXOffset != 0 || mWin.mYOffset != 0) {
-            mWin.mShownPosition.offset(mWin.mXOffset, mWin.mYOffset);
-        }
+        // WindowState.prepareSurfaces expands for surface insets (in order they don't get
+        // clipped by the WindowState surface), so we need to go into the other direction here.
+        mWin.mShownPosition.set(mWin.mXOffset + mWin.mAttrs.surfaceInsets.left,
+                mWin.mYOffset + mWin.mAttrs.surfaceInsets.top);
         mShownAlpha = mAlpha;
         mHaveMatrix = false;
         mDsDx = mWin.mGlobalScale;
@@ -1182,7 +941,7 @@
         if (mAppAnimator != null && mAppAnimator.animation != null) {
             return mAppAnimator.getStackClip();
         } else {
-            return mStackClip;
+            return STACK_CLIP_AFTER_ANIM;
         }
     }
 
@@ -1434,7 +1193,7 @@
         if (mSurfaceResized) {
             mReportSurfaceResized = true;
             mAnimator.setPendingLayoutChanges(w.getDisplayId(),
-                    WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
+                    FINISH_LAYOUT_REDO_WALLPAPER);
         }
     }
 
@@ -1546,7 +1305,7 @@
                         // Run another pass through performLayout to set mHasContent in the
                         // LogicalDisplay.
                         mAnimator.setPendingLayoutChanges(w.getDisplayId(),
-                                WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
+                                FINISH_LAYOUT_REDO_ANIM);
                     } else {
                         w.setOrientationChanging(false);
                     }
@@ -1720,12 +1479,18 @@
      * @return true if an animation has been loaded.
      */
     boolean applyAnimationLocked(int transit, boolean isEntrance) {
-        if (mLocalAnimating && mAnimationIsEntrance == isEntrance) {
+        if (mWin.isSelfAnimating() && mAnimationIsEntrance == isEntrance) {
             // If we are trying to apply an animation, but already running
             // an animation of the same type, then just leave that one alone.
             return true;
         }
 
+        if (isEntrance && mWin.mAttrs.type == TYPE_INPUT_METHOD) {
+            mWin.getDisplayContent().adjustForImeIfNeeded();
+            mWin.setDisplayLayoutNeeded();
+            mService.mWindowPlacerLocked.requestTraversal();
+        }
+
         // Only apply an animation if the display isn't frozen.  If it is
         // frozen, there is no reason to animate and it can cause strange
         // artifacts when we unfreeze the display if some different animation
@@ -1764,44 +1529,19 @@
                     + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3));
             if (a != null) {
                 if (DEBUG_ANIM) logWithStack(TAG, "Loaded animation " + a + " for " + this);
-                setAnimation(a);
+                mWin.startAnimation(a);
                 mAnimationIsEntrance = isEntrance;
             }
         } else {
-            clearAnimation();
+            mWin.cancelAnimation();
         }
-        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
 
-        if (mWin.mAttrs.type == TYPE_INPUT_METHOD) {
+        if (!isEntrance && mWin.mAttrs.type == TYPE_INPUT_METHOD) {
             mWin.getDisplayContent().adjustForImeIfNeeded();
-            if (isEntrance) {
-                mWin.setDisplayLayoutNeeded();
-                mService.mWindowPlacerLocked.requestTraversal();
-            }
         }
-        return mAnimation != null;
-    }
 
-    private void applyFadeoutDuringKeyguardExitAnimation() {
-        long startTime = mAnimation.getStartTime();
-        long duration = mAnimation.getDuration();
-        long elapsed = mLastAnimationTime - startTime;
-        long fadeDuration = duration - elapsed;
-        if (fadeDuration <= 0) {
-            // Never mind, this would be no visible animation, so abort the animation change.
-            return;
-        }
-        AnimationSet newAnimation = new AnimationSet(false /* shareInterpolator */);
-        newAnimation.setDuration(duration);
-        newAnimation.setStartTime(startTime);
-        newAnimation.addAnimation(mAnimation);
-        Animation fadeOut = AnimationUtils.loadAnimation(
-                mContext, com.android.internal.R.anim.app_starting_exit);
-        fadeOut.setDuration(fadeDuration);
-        fadeOut.setStartOffset(elapsed);
-        newAnimation.addAnimation(fadeOut);
-        newAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(), mAnimDx, mAnimDy);
-        mAnimation = newAnimation;
+        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
+        return isAnimationSet();
     }
 
     void writeToProto(ProtoOutputStream proto, long fieldId) {
@@ -1814,20 +1554,8 @@
     }
 
     public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
-        if (mAnimating || mLocalAnimating || mAnimationIsEntrance
-                || mAnimation != null) {
-            pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating);
-                    pw.print(" mLocalAnimating="); pw.print(mLocalAnimating);
-                    pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance);
-                    pw.print(" mAnimation="); pw.print(mAnimation);
-                    pw.print(" mStackClip="); pw.println(mStackClip);
-        }
-        if (mHasTransformation || mHasLocalTransformation) {
-            pw.print(prefix); pw.print("XForm: has=");
-                    pw.print(mHasTransformation);
-                    pw.print(" hasLocal="); pw.print(mHasLocalTransformation);
-                    pw.print(" "); mTransformation.printShortString(pw);
-                    pw.println();
+        if (mAnimationIsEntrance) {
+            pw.print(prefix); pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance);
         }
         if (mSurfaceController != null) {
             mSurfaceController.dump(pw, prefix, dumpAll);
@@ -1907,44 +1635,6 @@
         }
     }
 
-    void setMoveAnimation(int left, int top) {
-        final Animation a = AnimationUtils.loadAnimation(mContext,
-                com.android.internal.R.anim.window_move_from_decor);
-        setAnimation(a);
-        mAnimDx = mWin.mLastFrame.left - left;
-        mAnimDy = mWin.mLastFrame.top - top;
-        mAnimateMove = true;
-    }
-
-    void deferTransactionUntilParentFrame(long frameNumber) {
-        if (!mWin.isChildWindow()) {
-            return;
-        }
-        mSurfaceController.deferTransactionUntil(
-                mWin.getParentWindow().mWinAnimator.mSurfaceController.getHandle(), frameNumber);
-    }
-
-    /**
-     * Sometimes we need to synchronize the first frame of animation with some external event.
-     * To achieve this, we prolong the start of the animation and keep producing the first frame of
-     * the animation.
-     */
-    private long getAnimationFrameTime(Animation animation, long currentTime) {
-        if (mAnimationStartDelayed) {
-            animation.setStartTime(currentTime);
-            return currentTime + 1;
-        }
-        return currentTime;
-    }
-
-    void startDelayingAnimationStart() {
-        mAnimationStartDelayed = true;
-    }
-
-    void endDelayingAnimationStart() {
-        mAnimationStartDelayed = false;
-    }
-
     void seamlesslyRotateWindow(int oldRotation, int newRotation) {
         final WindowState w = mWin;
         if (!w.isVisibleNow() || w.mIsWallpaper) {
@@ -2026,4 +1716,8 @@
             mSurfaceController.detachChildren();
         }
     }
+
+    int getLayer() {
+        return mLastLayer;
+    }
 }
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index 6746754..e26a362 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -59,8 +59,8 @@
     private boolean mSurfaceShown = false;
     private float mSurfaceX = 0;
     private float mSurfaceY = 0;
-    private float mSurfaceW = 0;
-    private float mSurfaceH = 0;
+    private int mSurfaceW = 0;
+    private int mSurfaceH = 0;
 
     // Initialize to the identity matrix.
     private float mLastDsdx = 1;
@@ -517,11 +517,11 @@
         return mSurfaceY;
     }
 
-    float getWidth() {
+    int getWidth() {
         return mSurfaceW;
     }
 
-    float getHeight() {
+    int getHeight() {
         return mSurfaceH;
     }
 
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 169d0a3..d8e7457 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -462,6 +462,7 @@
             appAnimator.setNullAnimation();
             // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not
             //       animating?
+            wtoken.setAllAppWinAnimators();
             wtoken.setVisibility(animLp, false, transit, false, voiceInteraction);
             wtoken.updateReportedVisibilityLocked();
             // setAllAppWinAnimators so the windows get onExitAnimationDone once the animation is
@@ -606,7 +607,7 @@
                         + ", oldWallpaper=" + oldWallpaper
                         + ", openingApps=" + openingApps
                         + ", closingApps=" + closingApps);
-        mService.mAnimateWallpaperWithTarget = false;
+
         if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) {
             transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
             if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
@@ -645,8 +646,6 @@
                 transit = TRANSIT_WALLPAPER_OPEN;
                 if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: "
                         + AppTransition.appTransitionToString(transit));
-            } else {
-                mService.mAnimateWallpaperWithTarget = true;
             }
         }
         return transit;
diff --git a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
index 222ac5b..9892146 100644
--- a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
+++ b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
@@ -257,7 +257,7 @@
     { "nativeFinalize", "(J)V", (void*)nativeFinalize },
     { "nativeLoadModules", "(J)Ljava/util/List;", (void*)nativeLoadModules },
     { "nativeOpenTuner", "(JILandroid/hardware/radio/RadioManager$BandConfig;Z"
-            "Landroid/hardware/radio/ITunerCallback;)Lcom/android/server/broadcastradio/Tuner;",
+            "Landroid/hardware/radio/ITunerCallback;)Lcom/android/server/broadcastradio/hal1/Tuner;",
             (void*)nativeOpenTuner },
 };
 
@@ -270,7 +270,7 @@
 
     register_android_server_broadcastradio_convert(env);
 
-    auto tunerClass = FindClassOrDie(env, "com/android/server/broadcastradio/Tuner");
+    auto tunerClass = FindClassOrDie(env, "com/android/server/broadcastradio/hal1/Tuner");
     gjni.Tuner.clazz = MakeGlobalRefOrDie(env, tunerClass);
     gjni.Tuner.cstor = GetMethodIDOrDie(env, tunerClass, "<init>",
             "(Landroid/hardware/radio/ITunerCallback;IIZI)V");
@@ -281,7 +281,7 @@
     gjni.ArrayList.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
 
     auto res = jniRegisterNativeMethods(env,
-            "com/android/server/broadcastradio/BroadcastRadioService",
+            "com/android/server/broadcastradio/hal1/BroadcastRadioService",
             gRadioServiceMethods, NELEM(gRadioServiceMethods));
     LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
 }
diff --git a/services/core/jni/BroadcastRadio/Tuner.cpp b/services/core/jni/BroadcastRadio/Tuner.cpp
index 63339e9..42eb873 100644
--- a/services/core/jni/BroadcastRadio/Tuner.cpp
+++ b/services/core/jni/BroadcastRadio/Tuner.cpp
@@ -592,18 +592,18 @@
 
     register_android_server_broadcastradio_TunerCallback(vm, env);
 
-    auto tunerClass = FindClassOrDie(env, "com/android/server/broadcastradio/Tuner");
+    auto tunerClass = FindClassOrDie(env, "com/android/server/broadcastradio/hal1/Tuner");
     gjni.Tuner.nativeContext = GetFieldIDOrDie(env, tunerClass, "mNativeContext", "J");
     gjni.Tuner.region = GetFieldIDOrDie(env, tunerClass, "mRegion", "I");
     gjni.Tuner.tunerCallback = GetFieldIDOrDie(env, tunerClass, "mTunerCallback",
-            "Lcom/android/server/broadcastradio/TunerCallback;");
+            "Lcom/android/server/broadcastradio/hal1/TunerCallback;");
 
     auto arrayListClass = FindClassOrDie(env, "java/util/ArrayList");
     gjni.ArrayList.clazz = MakeGlobalRefOrDie(env, arrayListClass);
     gjni.ArrayList.cstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V");
     gjni.ArrayList.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z");
 
-    auto res = jniRegisterNativeMethods(env, "com/android/server/broadcastradio/Tuner",
+    auto res = jniRegisterNativeMethods(env, "com/android/server/broadcastradio/hal1/Tuner",
             gTunerMethods, NELEM(gTunerMethods));
     LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
 }
diff --git a/services/core/jni/BroadcastRadio/TunerCallback.cpp b/services/core/jni/BroadcastRadio/TunerCallback.cpp
index d0ba005..39f2c05 100644
--- a/services/core/jni/BroadcastRadio/TunerCallback.cpp
+++ b/services/core/jni/BroadcastRadio/TunerCallback.cpp
@@ -406,7 +406,7 @@
 }
 
 static const JNINativeMethod gTunerCallbackMethods[] = {
-    { "nativeInit", "(Lcom/android/server/broadcastradio/Tuner;I)J", (void*)nativeInit },
+    { "nativeInit", "(Lcom/android/server/broadcastradio/hal1/Tuner;I)J", (void*)nativeInit },
     { "nativeFinalize", "(J)V", (void*)nativeFinalize },
     { "nativeDetach", "(J)V", (void*)nativeDetach },
 };
@@ -420,7 +420,7 @@
 
     gvm = vm;
 
-    auto tunerCbClass = FindClassOrDie(env, "com/android/server/broadcastradio/TunerCallback");
+    auto tunerCbClass = FindClassOrDie(env, "com/android/server/broadcastradio/hal1/TunerCallback");
     gjni.TunerCallback.clazz = MakeGlobalRefOrDie(env, tunerCbClass);
     gjni.TunerCallback.nativeContext = GetFieldIDOrDie(env, tunerCbClass, "mNativeContext", "J");
     gjni.TunerCallback.handleHwFailure = GetMethodIDOrDie(env, tunerCbClass, "handleHwFailure", "()V");
@@ -444,7 +444,7 @@
     gjni.TunerCallback.onParametersUpdated = GetMethodIDOrDie(env, tunerCbClass,
             "onParametersUpdated", "(Ljava/util/Map;)V");
 
-    auto res = jniRegisterNativeMethods(env, "com/android/server/broadcastradio/TunerCallback",
+    auto res = jniRegisterNativeMethods(env, "com/android/server/broadcastradio/hal1/TunerCallback",
             gTunerCallbackMethods, NELEM(gTunerCallbackMethods));
     LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
 }
diff --git a/services/core/jni/BroadcastRadio/convert.cpp b/services/core/jni/BroadcastRadio/convert.cpp
index f5381a8..be1ad72 100644
--- a/services/core/jni/BroadcastRadio/convert.cpp
+++ b/services/core/jni/BroadcastRadio/convert.cpp
@@ -678,7 +678,7 @@
     gjni.AmBandDescriptor.cstor = GetMethodIDOrDie(env, amBandDescriptorClass,
             "<init>", "(IIIIIZ)V");
 
-    auto convertClass = FindClassOrDie(env, "com/android/server/broadcastradio/Convert");
+    auto convertClass = FindClassOrDie(env, "com/android/server/broadcastradio/hal1/Convert");
     gjni.Convert.clazz = MakeGlobalRefOrDie(env, convertClass);
     gjni.Convert.stringMapToNative = GetStaticMethodIDOrDie(env, convertClass, "stringMapToNative",
             "(Ljava/util/Map;)[[Ljava/lang/String;");
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
index 84cfabe..6dbe1a8 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
@@ -17,6 +17,9 @@
 
 import android.app.admin.IDevicePolicyManager;
 import android.content.ComponentName;
+import android.os.PersistableBundle;
+import android.security.keymaster.KeymasterCertificateChain;
+import android.security.keystore.ParcelableKeyGenParameterSpec;
 
 import com.android.internal.R;
 import com.android.server.SystemService;
@@ -55,6 +58,12 @@
      * @see {@link SystemService#onStopUser}
      */
     abstract void handleStopUser(int userId);
-    
+
     public void setSystemSetting(ComponentName who, String setting, String value){}
+
+    public void transferOwner(ComponentName admin, ComponentName target, PersistableBundle bundle) {}
+    public boolean generateKeyPair(ComponentName who, String callerPackage, String algorithm,
+            ParcelableKeyGenParameterSpec keySpec, KeymasterCertificateChain attestationChain) {
+        return false;
+    }
 }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 7ee047b..07b87f9 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -150,13 +150,16 @@
 import android.provider.ContactsInternal;
 import android.provider.Settings;
 import android.provider.Settings.Global;
+import android.security.Credentials;
 import android.security.IKeyChainAliasCallback;
 import android.security.IKeyChainService;
 import android.security.KeyChain;
 import android.security.KeyChain.KeyChainConnection;
+import android.security.keymaster.KeymasterCertificateChain;
 import android.security.keystore.KeyGenParameterSpec;
 import android.security.keystore.ParcelableKeyGenParameterSpec;
 import android.security.KeyStore;
+import android.security.keystore.AttestationUtils;
 import android.service.persistentdata.PersistentDataBlockManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -751,7 +754,7 @@
         private static final String ATTR_NUM_NETWORK_LOGGING_NOTIFICATIONS = "num-notifications";
         private static final String TAG_IS_LOGOUT_ENABLED = "is_logout_enabled";
 
-        final DeviceAdminInfo info;
+        DeviceAdminInfo info;
 
 
         static final int DEF_PASSWORD_HISTORY_LENGTH = 0;
@@ -1402,6 +1405,13 @@
             return userRestrictions;
         }
 
+        public void transfer(DeviceAdminInfo deviceAdminInfo) {
+            if (hasParentActiveAdmin()) {
+                parentAdmin.info = deviceAdminInfo;
+            }
+            info = deviceAdminInfo;
+        }
+
         void dump(String prefix, PrintWriter pw) {
             pw.print(prefix); pw.print("uid="); pw.println(getUid());
             pw.print(prefix); pw.print("testOnlyAdmin=");
@@ -2541,7 +2551,7 @@
 
 
     public DeviceAdminInfo findAdmin(ComponentName adminName, int userHandle,
-            boolean throwForMissiongPermission) {
+            boolean throwForMissingPermission) {
         if (!mHasFeature) {
             return null;
         }
@@ -2564,7 +2574,7 @@
             final String message = "DeviceAdminReceiver " + adminName + " must be protected with "
                     + permission.BIND_DEVICE_ADMIN;
             Slog.w(LOG_TAG, message);
-            if (throwForMissiongPermission &&
+            if (throwForMissingPermission &&
                     ai.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) {
                 throw new IllegalArgumentException(message);
             }
@@ -2889,7 +2899,7 @@
                     try {
                         DeviceAdminInfo dai = findAdmin(
                                 ComponentName.unflattenFromString(name), userHandle,
-                                /* throwForMissionPermission= */ false);
+                                /* throwForMissingPermission= */ false);
                         if (VERBOSE_LOG
                                 && (UserHandle.getUserId(dai.getActivityInfo().applicationInfo.uid)
                                 != userHandle)) {
@@ -3293,19 +3303,9 @@
 
         DevicePolicyData policy = getUserData(userHandle);
         DeviceAdminInfo info = findAdmin(adminReceiver, userHandle,
-                /* throwForMissionPermission= */ true);
-        if (info == null) {
-            throw new IllegalArgumentException("Bad admin: " + adminReceiver);
-        }
-        if (!info.getActivityInfo().applicationInfo.isInternal()) {
-            throw new IllegalArgumentException("Only apps in internal storage can be active admin: "
-                    + adminReceiver);
-        }
-        if (info.getActivityInfo().applicationInfo.isInstantApp()) {
-            throw new IllegalArgumentException("Instant apps cannot be device admins: "
-                    + adminReceiver);
-        }
+                /* throwForMissingPermission= */ true);
         synchronized (this) {
+            checkActiveAdminPrecondition(adminReceiver, info, policy);
             long ident = mInjector.binderClearCallingIdentity();
             try {
                 final ActiveAdmin existingAdmin
@@ -3313,10 +3313,6 @@
                 if (!refreshing && existingAdmin != null) {
                     throw new IllegalArgumentException("Admin is already added");
                 }
-                if (policy.mRemovingAdmins.contains(adminReceiver)) {
-                    throw new IllegalArgumentException(
-                            "Trying to set an admin which is being removed");
-                }
                 ActiveAdmin newAdmin = new ActiveAdmin(info, /* parent */ false);
                 newAdmin.testOnlyAdmin =
                         (existingAdmin != null) ? existingAdmin.testOnlyAdmin
@@ -3346,6 +3342,46 @@
         }
     }
 
+    private void transferActiveAdminUncheckedLocked(ComponentName incomingReceiver,
+            ComponentName outgoingReceiver, int userHandle) {
+        final DevicePolicyData policy = getUserData(userHandle);
+        final DeviceAdminInfo incomingDeviceInfo = findAdmin(incomingReceiver, userHandle,
+            /* throwForMissingPermission= */ true);
+        final ActiveAdmin adminToTransfer = policy.mAdminMap.get(outgoingReceiver);
+        final int oldAdminUid = adminToTransfer.getUid();
+
+        adminToTransfer.transfer(incomingDeviceInfo);
+        policy.mAdminMap.remove(outgoingReceiver);
+        policy.mAdminMap.put(incomingReceiver, adminToTransfer);
+        if (policy.mPasswordOwner == oldAdminUid) {
+            policy.mPasswordOwner = adminToTransfer.getUid();
+        }
+
+        saveSettingsLocked(userHandle);
+        //TODO: Make sure we revert back when we detect a failure.
+        sendAdminCommandLocked(adminToTransfer, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED,
+                null, null);
+    }
+
+    private void checkActiveAdminPrecondition(ComponentName adminReceiver, DeviceAdminInfo info,
+            DevicePolicyData policy) {
+        if (info == null) {
+            throw new IllegalArgumentException("Bad admin: " + adminReceiver);
+        }
+        if (!info.getActivityInfo().applicationInfo.isInternal()) {
+            throw new IllegalArgumentException("Only apps in internal storage can be active admin: "
+                    + adminReceiver);
+        }
+        if (info.getActivityInfo().applicationInfo.isInstantApp()) {
+            throw new IllegalArgumentException("Instant apps cannot be device admins: "
+                    + adminReceiver);
+        }
+        if (policy.mRemovingAdmins.contains(adminReceiver)) {
+            throw new IllegalArgumentException(
+                    "Trying to set an admin which is being removed");
+        }
+    }
+
     @Override
     public boolean isAdminActive(ComponentName adminReceiver, int userHandle) {
         if (!mHasFeature) {
@@ -4880,19 +4916,22 @@
 
     @Override
     public boolean generateKeyPair(ComponentName who, String callerPackage, String algorithm,
-            ParcelableKeyGenParameterSpec parcelableKeySpec) {
+            ParcelableKeyGenParameterSpec parcelableKeySpec,
+            KeymasterCertificateChain attestationChain) {
         enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                 DELEGATION_CERT_INSTALL);
         final KeyGenParameterSpec keySpec = parcelableKeySpec.getSpec();
         if (TextUtils.isEmpty(keySpec.getKeystoreAlias())) {
             throw new IllegalArgumentException("Empty alias provided.");
         }
+        final String alias = keySpec.getKeystoreAlias();
         // As the caller will be granted access to the key, ensure no UID was specified, as
         // it will not have the desired effect.
         if (keySpec.getUid() != KeyStore.UID_SELF) {
             Log.e(LOG_TAG, "Only the caller can be granted access to the generated keypair.");
             return false;
         }
+
         final int callingUid = mInjector.binderGetCallingUid();
 
         final UserHandle userHandle = mInjector.binderGetCallingUserHandle();
@@ -4901,7 +4940,16 @@
             try (KeyChainConnection keyChainConnection =
                     KeyChain.bindAsUser(mContext, userHandle)) {
                 IKeyChainService keyChain = keyChainConnection.getService();
-                final boolean generationResult = keyChain.generateKeyPair(algorithm, parcelableKeySpec);
+
+                // Copy the provided keySpec, excluding the attestation challenge, which will be
+                // used later for requesting key attestation record.
+                final KeyGenParameterSpec noAttestationSpec =
+                    new KeyGenParameterSpec.Builder(keySpec)
+                        .setAttestationChallenge(null)
+                        .build();
+
+                final boolean generationResult = keyChain.generateKeyPair(algorithm,
+                    new ParcelableKeyGenParameterSpec(noAttestationSpec));
                 if (!generationResult) {
                     Log.e(LOG_TAG, "KeyChain failed to generate a keypair.");
                     return false;
@@ -4912,7 +4960,19 @@
                 // Note the use of the calling  UID, since the request for the private
                 // key will come from the client's process, so the grant has to be for
                 // that UID.
-                keyChain.setGrant(callingUid, keySpec.getKeystoreAlias(), true);
+                keyChain.setGrant(callingUid, alias, true);
+
+                final byte[] attestationChallenge = keySpec.getAttestationChallenge();
+                if (attestationChallenge != null) {
+                    final boolean attestationResult = keyChain.attestKey(
+                            alias, attestationChallenge, attestationChain);
+                    if (!attestationResult) {
+                        Log.e(LOG_TAG, String.format(
+                                "Attestation for %s failed, deleting key.", alias));
+                        keyChain.removeKeyPair(alias);
+                        return false;
+                    }
+                }
                 return true;
             }
         } catch (RemoteException e) {
@@ -11538,4 +11598,60 @@
         return new ArrayList<>(
                 mOverlayPackagesProvider.getNonRequiredApps(admin, userId, provisioningAction));
     }
+
+    //TODO: Add callback information to the javadoc once it is completed.
+    //TODO: Make transferOwner atomic.
+    @Override
+    public void transferOwner(ComponentName admin, ComponentName target, PersistableBundle bundle) {
+        if (!mHasFeature) {
+            return;
+        }
+
+        Preconditions.checkNotNull(admin, "Admin cannot be null.");
+        Preconditions.checkNotNull(target, "Target cannot be null.");
+
+        enforceProfileOrDeviceOwner(admin);
+
+        if (admin.equals(target)) {
+            throw new IllegalArgumentException("Provided administrator and target are "
+                    + "the same object.");
+        }
+
+        if (admin.getPackageName().equals(target.getPackageName())) {
+            throw new IllegalArgumentException("Provided administrator and target have "
+                    + "the same package name.");
+        }
+
+        final int callingUserId = mInjector.userHandleGetCallingUserId();
+        final DevicePolicyData policy = getUserData(callingUserId);
+        final DeviceAdminInfo incomingDeviceInfo = findAdmin(target, callingUserId,
+                /* throwForMissingPermission= */ true);
+        checkActiveAdminPrecondition(target, incomingDeviceInfo, policy);
+
+        final long id = mInjector.binderClearCallingIdentity();
+        try {
+            //STOPSHIP add support for COMP, DO, edge cases when device is rebooted/work mode off,
+            //transfer callbacks and broadcast
+            if (isProfileOwner(admin, callingUserId)) {
+                transferProfileOwner(admin, target, callingUserId);
+            }
+        } finally {
+            mInjector.binderRestoreCallingIdentity(id);
+        }
+    }
+
+    /**
+     * Transfers the profile owner for user with id profileOwnerUserId from admin to target.
+     */
+    private void transferProfileOwner(ComponentName admin, ComponentName target,
+            int profileOwnerUserId) {
+        synchronized (this) {
+            transferActiveAdminUncheckedLocked(target, admin, profileOwnerUserId);
+            mOwners.transferProfileOwner(target, profileOwnerUserId);
+            Slog.i(LOG_TAG, "Profile owner set: " + target + " on user " + profileOwnerUserId);
+            mOwners.writeProfileOwner(profileOwnerUserId);
+            mDeviceAdminServiceController.startServiceForOwner(
+                    target.getPackageName(), profileOwnerUserId, "transfer-profile-owner");
+        }
+    }
 }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
index a5500dd..9042a8d 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
@@ -277,6 +277,17 @@
         }
     }
 
+    void transferProfileOwner(ComponentName target, int userId) {
+        synchronized (mLock) {
+            final OwnerInfo ownerInfo = mProfileOwners.get(userId);
+            final OwnerInfo newOwnerInfo = new OwnerInfo(target.getPackageName(), target,
+                    ownerInfo.userRestrictionsMigrated, ownerInfo.remoteBugreportUri,
+                    ownerInfo.remoteBugreportHash);
+            mProfileOwners.put(userId, newOwnerInfo);
+            pushToPackageManagerLocked();
+        }
+    }
+
     ComponentName getProfileOwnerComponent(int userId) {
         synchronized (mLock) {
             OwnerInfo profileOwner = mProfileOwners.get(userId);
diff --git a/services/robotests/Android.mk b/services/robotests/Android.mk
index 114929c..b5e4af7 100644
--- a/services/robotests/Android.mk
+++ b/services/robotests/Android.mk
@@ -40,15 +40,15 @@
 
 # Include the testing libraries (JUnit4 + Robolectric libs).
 LOCAL_STATIC_JAVA_LIBRARIES := \
+    platform-robolectric-android-all-stubs \
     android-support-test \
     mockito-robolectric-prebuilt \
     platform-test-annotations \
     truth-prebuilt
 
-# TODO(b/69254249): Migrate to Robolectric 3.4.2
 LOCAL_JAVA_LIBRARIES := \
     junit \
-    platform-robolectric-3.1.1-prebuilt
+    platform-robolectric-3.5.1-prebuilt
 
 LOCAL_INSTRUMENTATION_FOR := FrameworksServicesLib
 LOCAL_MODULE := FrameworksServicesRoboTests
@@ -73,5 +73,4 @@
 
 LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))backup/java
 
-# TODO(b/69254249): Migrate to Robolectric 3.4.2
-include prebuilts/misc/common/robolectric/3.1.1/run_robotests.mk
+include prebuilts/misc/common/robolectric/3.5.1/run_robotests.mk
diff --git a/services/robotests/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
index 3d5851f..2cb4a69 100644
--- a/services/robotests/src/com/android/server/backup/TransportManagerTest.java
+++ b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.mock;
+import static org.robolectric.shadow.api.Shadow.extract;
 
 import android.app.backup.BackupManager;
 import android.content.ComponentName;
@@ -31,24 +32,25 @@
 import android.platform.test.annotations.Presubmit;
 
 import com.android.server.backup.testing.BackupTransportStub;
-import com.android.server.backup.testing.DefaultPackageManagerWithQueryIntentServicesAsUser;
 import com.android.server.backup.testing.ShadowBackupTransportStub;
 import com.android.server.backup.testing.ShadowContextImplForBackup;
+import com.android.server.backup.testing.ShadowPackageManagerForBackup;
 import com.android.server.backup.testing.TransportBoundListenerStub;
 import com.android.server.backup.testing.TransportReadyCallbackStub;
 import com.android.server.backup.transport.TransportClient;
+import com.android.server.testing.FrameworkRobolectricTestRunner;
+import com.android.server.testing.SystemLoaderClasses;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
-import org.robolectric.res.builder.RobolectricPackageManager;
 import org.robolectric.shadows.ShadowLog;
 import org.robolectric.shadows.ShadowLooper;
+import org.robolectric.shadows.ShadowPackageManager;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -56,15 +58,17 @@
 import java.util.HashSet;
 import java.util.List;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(FrameworkRobolectricTestRunner.class)
 @Config(
         manifest = Config.NONE,
-        sdk = 23,
+        sdk = 26,
         shadows = {
                 ShadowContextImplForBackup.class,
-                ShadowBackupTransportStub.class
+                ShadowBackupTransportStub.class,
+                ShadowPackageManagerForBackup.class
         }
 )
+@SystemLoaderClasses({TransportManager.class})
 @Presubmit
 public class TransportManagerTest {
     private static final String PACKAGE_NAME = "some.package.name";
@@ -73,7 +77,7 @@
     private TransportInfo mTransport1;
     private TransportInfo mTransport2;
 
-    private RobolectricPackageManager mPackageManager;
+    private ShadowPackageManager mPackageManagerShadow;
 
     private final TransportBoundListenerStub mTransportBoundListenerStub =
             new TransportBoundListenerStub(true);
@@ -86,9 +90,10 @@
         MockitoAnnotations.initMocks(this);
 
         ShadowLog.stream = System.out;
-        mPackageManager = new DefaultPackageManagerWithQueryIntentServicesAsUser(
-                RuntimeEnvironment.getAppResourceLoader());
-        RuntimeEnvironment.setRobolectricPackageManager(mPackageManager);
+
+        mPackageManagerShadow =
+                (ShadowPackageManagerForBackup)
+                        extract(RuntimeEnvironment.application.getPackageManager());
 
         mTransport1 = new TransportInfo(PACKAGE_NAME, "transport1.name");
         mTransport2 = new TransportInfo(PACKAGE_NAME, "transport2.name");
@@ -532,6 +537,18 @@
         assertThat(transportName).isEqualTo("newName");
     }
 
+    @Test
+    public void isTransportRegistered_returnsCorrectly() throws Exception {
+        TransportManager transportManager =
+                createTransportManagerAndSetUpTransports(
+                        Collections.singletonList(mTransport1),
+                        Collections.singletonList(mTransport2),
+                        mTransport1.name);
+
+        assertThat(transportManager.isTransportRegistered(mTransport1.name)).isTrue();
+        assertThat(transportManager.isTransportRegistered(mTransport2.name)).isFalse();
+    }
+
     private void setUpPackageWithTransports(String packageName, List<TransportInfo> transports,
             int flags) throws Exception {
         PackageInfo packageInfo = new PackageInfo();
@@ -539,7 +556,7 @@
         packageInfo.applicationInfo = new ApplicationInfo();
         packageInfo.applicationInfo.privateFlags = flags;
 
-        mPackageManager.addPackage(packageInfo);
+        mPackageManagerShadow.addPackage(packageInfo);
 
         List<ResolveInfo> transportsInfo = new ArrayList<>();
         for (TransportInfo transport : transports) {
@@ -553,7 +570,7 @@
         Intent intent = new Intent(TransportManager.SERVICE_ACTION_TRANSPORT_HOST);
         intent.setPackage(packageName);
 
-        mPackageManager.addResolveInfoForIntent(intent, transportsInfo);
+        mPackageManagerShadow.addResolveInfoForIntent(intent, transportsInfo);
     }
 
     private TransportManager createTransportManagerAndSetUpTransports(
diff --git a/services/robotests/src/com/android/server/backup/testing/DefaultPackageManagerWithQueryIntentServicesAsUser.java b/services/robotests/src/com/android/server/backup/testing/ShadowPackageManagerForBackup.java
similarity index 69%
rename from services/robotests/src/com/android/server/backup/testing/DefaultPackageManagerWithQueryIntentServicesAsUser.java
rename to services/robotests/src/com/android/server/backup/testing/ShadowPackageManagerForBackup.java
index 5a0967b..b64b59d 100644
--- a/services/robotests/src/com/android/server/backup/testing/DefaultPackageManagerWithQueryIntentServicesAsUser.java
+++ b/services/robotests/src/com/android/server/backup/testing/ShadowPackageManagerForBackup.java
@@ -16,28 +16,22 @@
 
 package com.android.server.backup.testing;
 
+import android.app.ApplicationPackageManager;
 import android.content.Intent;
 import android.content.pm.ResolveInfo;
 
-import org.robolectric.res.ResourceLoader;
-import org.robolectric.res.builder.DefaultPackageManager;
+import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowApplicationPackageManager;
 
 import java.util.List;
 
 /**
  * Implementation of PackageManager for Robolectric which handles queryIntentServicesAsUser().
  */
-public class DefaultPackageManagerWithQueryIntentServicesAsUser extends
-        DefaultPackageManager {
-
-    /* package */
-    public DefaultPackageManagerWithQueryIntentServicesAsUser(
-            ResourceLoader appResourceLoader) {
-        super(appResourceLoader);
-    }
-
+@Implements(value = ApplicationPackageManager.class, inheritImplementationMethods = true)
+public class ShadowPackageManagerForBackup extends ShadowApplicationPackageManager {
     @Override
     public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
-        return super.queryIntentServices(intent, flags);
+        return queryIntentServices(intent, flags);
     }
 }
diff --git a/services/robotests/src/com/android/server/backup/transport/TransportClientTest.java b/services/robotests/src/com/android/server/backup/transport/TransportClientTest.java
index 4a3277f..4462d2a 100644
--- a/services/robotests/src/com/android/server/backup/transport/TransportClientTest.java
+++ b/services/robotests/src/com/android/server/backup/transport/TransportClientTest.java
@@ -17,6 +17,7 @@
 package com.android.server.backup.transport;
 
 import static com.android.server.backup.TransportManager.SERVICE_ACTION_TRANSPORT_HOST;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -37,31 +38,34 @@
 import android.platform.test.annotations.Presubmit;
 
 import com.android.internal.backup.IBackupTransport;
+import com.android.server.backup.TransportManager;
+import com.android.server.testing.FrameworkRobolectricTestRunner;
+import com.android.server.testing.SystemLoaderClasses;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowLooper;
 
-@RunWith(RobolectricTestRunner.class)
-@Config(manifest = Config.NONE, sdk = 23)
+@RunWith(FrameworkRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, sdk = 26)
+@SystemLoaderClasses({TransportManager.class, TransportClient.class})
 @Presubmit
 public class TransportClientTest {
     private static final String PACKAGE_NAME = "some.package.name";
-    private static final ComponentName TRANSPORT_COMPONENT =
-            new ComponentName(PACKAGE_NAME, PACKAGE_NAME + ".transport.Transport");
-    private static final String TRANSPORT_DIR_NAME = TRANSPORT_COMPONENT.toString();
 
     @Mock private Context mContext;
     @Mock private TransportConnectionListener mTransportConnectionListener;
     @Mock private TransportConnectionListener mTransportConnectionListener2;
     @Mock private IBackupTransport.Stub mIBackupTransport;
     private TransportClient mTransportClient;
+    private ComponentName mTransportComponent;
+    private String mTransportDirName;
     private Intent mBindIntent;
     private ShadowLooper mShadowLooper;
 
@@ -71,13 +75,16 @@
 
         Looper mainLooper = Looper.getMainLooper();
         mShadowLooper = shadowOf(mainLooper);
-        mBindIntent = new Intent(SERVICE_ACTION_TRANSPORT_HOST).setComponent(TRANSPORT_COMPONENT);
+        mTransportComponent =
+                new ComponentName(PACKAGE_NAME, PACKAGE_NAME + ".transport.Transport");
+        mTransportDirName = mTransportComponent.toString();
+        mBindIntent = new Intent(SERVICE_ACTION_TRANSPORT_HOST).setComponent(mTransportComponent);
         mTransportClient =
                 new TransportClient(
                         mContext,
                         mBindIntent,
-                        TRANSPORT_COMPONENT,
-                        TRANSPORT_DIR_NAME,
+                        mTransportComponent,
+                        mTransportDirName,
                         "1",
                         new Handler(mainLooper));
 
@@ -91,12 +98,12 @@
 
     @Test
     public void testGetTransportDirName_returnsTransportDirName() {
-        assertThat(mTransportClient.getTransportDirName()).isEqualTo(TRANSPORT_DIR_NAME);
+        assertThat(mTransportClient.getTransportDirName()).isEqualTo(mTransportDirName);
     }
 
     @Test
     public void testGetTransportComponent_returnsTransportComponent() {
-        assertThat(mTransportClient.getTransportComponent()).isEqualTo(TRANSPORT_COMPONENT);
+        assertThat(mTransportClient.getTransportComponent()).isEqualTo(mTransportComponent);
     }
 
     @Test
@@ -117,7 +124,7 @@
 
         // Simulate framework connecting
         ServiceConnection connection = verifyBindServiceAsUserAndCaptureServiceConnection(mContext);
-        connection.onServiceConnected(TRANSPORT_COMPONENT, mIBackupTransport);
+        connection.onServiceConnected(mTransportComponent, mIBackupTransport);
 
         mShadowLooper.runToEndOfTasks();
         verify(mTransportConnectionListener)
@@ -132,7 +139,7 @@
 
         mTransportClient.connectAsync(mTransportConnectionListener2, "caller2");
 
-        connection.onServiceConnected(TRANSPORT_COMPONENT, mIBackupTransport);
+        connection.onServiceConnected(mTransportComponent, mIBackupTransport);
 
         mShadowLooper.runToEndOfTasks();
         verify(mTransportConnectionListener)
@@ -145,7 +152,7 @@
     public void testConnectAsync_whenAlreadyConnected_callsListener() throws Exception {
         mTransportClient.connectAsync(mTransportConnectionListener, "caller1");
         ServiceConnection connection = verifyBindServiceAsUserAndCaptureServiceConnection(mContext);
-        connection.onServiceConnected(TRANSPORT_COMPONENT, mIBackupTransport);
+        connection.onServiceConnected(mTransportComponent, mIBackupTransport);
 
         mTransportClient.connectAsync(mTransportConnectionListener2, "caller2");
 
@@ -190,8 +197,8 @@
             throws Exception {
         mTransportClient.connectAsync(mTransportConnectionListener, "caller1");
         ServiceConnection connection = verifyBindServiceAsUserAndCaptureServiceConnection(mContext);
-        connection.onServiceConnected(TRANSPORT_COMPONENT, mIBackupTransport);
-        connection.onServiceDisconnected(TRANSPORT_COMPONENT);
+        connection.onServiceConnected(mTransportComponent, mIBackupTransport);
+        connection.onServiceDisconnected(mTransportComponent);
 
         mTransportClient.connectAsync(mTransportConnectionListener2, "caller1");
 
@@ -204,9 +211,9 @@
             throws Exception {
         mTransportClient.connectAsync(mTransportConnectionListener, "caller1");
         ServiceConnection connection = verifyBindServiceAsUserAndCaptureServiceConnection(mContext);
-        connection.onServiceConnected(TRANSPORT_COMPONENT, mIBackupTransport);
-        connection.onServiceDisconnected(TRANSPORT_COMPONENT);
-        connection.onServiceConnected(TRANSPORT_COMPONENT, mIBackupTransport);
+        connection.onServiceConnected(mTransportComponent, mIBackupTransport);
+        connection.onServiceDisconnected(mTransportComponent);
+        connection.onServiceConnected(mTransportComponent, mIBackupTransport);
 
         mTransportClient.connectAsync(mTransportConnectionListener2, "caller1");
 
@@ -221,7 +228,7 @@
         mTransportClient.connectAsync(mTransportListener, "caller");
 
         ServiceConnection connection = verifyBindServiceAsUserAndCaptureServiceConnection(mContext);
-        connection.onBindingDied(TRANSPORT_COMPONENT);
+        connection.onBindingDied(mTransportComponent);
 
         mShadowLooper.runToEndOfTasks();
         verify(mTransportListener).onTransportBound(isNull(), eq(mTransportClient));
@@ -235,7 +242,7 @@
 
         mTransportClient.connectAsync(mTransportListener2, "caller2");
 
-        connection.onBindingDied(TRANSPORT_COMPONENT);
+        connection.onBindingDied(mTransportComponent);
 
         mShadowLooper.runToEndOfTasks();
         verify(mTransportListener).onTransportBound(isNull(), eq(mTransportClient));
diff --git a/services/robotests/src/com/android/server/testing/FrameworkRobolectricTestRunner.java b/services/robotests/src/com/android/server/testing/FrameworkRobolectricTestRunner.java
new file mode 100644
index 0000000..78ac4ed
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/FrameworkRobolectricTestRunner.java
@@ -0,0 +1,162 @@
+/*
+ * 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.testing;
+
+import com.google.common.collect.ImmutableSet;
+
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.internal.SandboxFactory;
+import org.robolectric.internal.SdkEnvironment;
+import org.robolectric.internal.bytecode.InstrumentationConfiguration;
+import org.robolectric.internal.bytecode.SandboxClassLoader;
+import org.robolectric.util.Util;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+/**
+ * HACK
+ * Robolectric loads up Android environment from prebuilt android jars before running a method.
+ * These jars are versioned according to the SDK level configured for the method (or class). The
+ * jars represent a snapshot of the Android APIs in that SDK level. For Robolectric tests that are
+ * testing Android components themselves we don't want certain classes (usually the
+ * class-under-test) to be loaded from the prebuilt jar, we want it instead to be loaded from the
+ * dependencies of our test target, i.e. the system class loader. That way we can write tests
+ * against the actual classes that are in the tree, not a past version of them. Ideally we would
+ * have a locally built jar referenced by Robolectric, but until that happens one can use this
+ * class.
+ * This class reads the {@link SystemLoaderClasses} annotation on test classes and for each class
+ * in that annotation value it will bypass the android jar and load it from the system class loader.
+ * Allowing the test to test the actual class in the tree.
+ *
+ * Implementation note: One could think about overriding
+ * {@link RobolectricTestRunner#createClassLoaderConfig(FrameworkMethod)} method and putting the
+ * classes in the annotation in the {@link InstrumentationConfiguration} list of classes not to
+ * acquire. Unfortunately, this will not work because we will not be instrumenting the class.
+ * Instead, we have to load the class bytes from the system class loader but still instrument it, we
+ * do this by overriding {@link SandboxClassLoader#getByteCode(String)} and loading the class bytes
+ * from the system class loader if it in the {@link SystemLoaderClasses} annotation. This way the
+ * {@link SandboxClassLoader} still instruments the class, but it's not loaded from the android jar.
+ * Finally, we inject the custom class loader in place of the default one.
+ *
+ * TODO: Remove this when we are using locally built android jars in the method's environment.
+ */
+public class FrameworkRobolectricTestRunner extends RobolectricTestRunner {
+    private final SandboxFactory mSandboxFactory;
+
+    public FrameworkRobolectricTestRunner(Class<?> testClass) throws InitializationError {
+        super(testClass);
+        SystemLoaderClasses annotation = testClass.getAnnotation(SystemLoaderClasses.class);
+        Class<?>[] systemLoaderClasses =
+                (annotation != null) ? annotation.value() : new Class<?>[0];
+        Set<String> systemLoaderClassNames = classesToClassNames(systemLoaderClasses);
+        mSandboxFactory = new FrameworkSandboxFactory(systemLoaderClassNames);
+    }
+
+    @Nonnull
+    @Override
+    protected SdkEnvironment getSandbox(FrameworkMethod method) {
+        // HACK: Calling super just to get SdkConfig via sandbox.getSdkConfig(), because
+        // RobolectricFrameworkMethod, the runtime class of method, is package-protected
+        SdkEnvironment sandbox = super.getSandbox(method);
+        return mSandboxFactory.getSdkEnvironment(
+                createClassLoaderConfig(method),
+                getJarResolver(),
+                sandbox.getSdkConfig());
+    }
+
+    private static class FrameworkClassLoader extends SandboxClassLoader {
+        private final Set<String> mSystemLoaderClasses;
+
+        private FrameworkClassLoader(
+                Set<String> systemLoaderClasses,
+                ClassLoader systemClassLoader,
+                InstrumentationConfiguration instrumentationConfig,
+                URL... urls) {
+            super(systemClassLoader, instrumentationConfig, urls);
+            mSystemLoaderClasses = systemLoaderClasses;
+        }
+
+        @Override
+        protected byte[] getByteCode(String className) throws ClassNotFoundException {
+            String classFileName = className.replace('.', '/') + ".class";
+            if (shouldLoadFromSystemLoader(className)) {
+                try (InputStream classByteStream = getResourceAsStream(classFileName)) {
+                    if (classByteStream == null) {
+                        throw new ClassNotFoundException(className);
+                    }
+                    return Util.readBytes(classByteStream);
+                } catch (IOException e) {
+                    throw new ClassNotFoundException(
+                            "Couldn't load " + className + " from system class loader", e);
+                }
+            }
+            return super.getByteCode(className);
+        }
+
+        /**
+         * Classes like com.package.ClassName$InnerClass should also be loaded from the system class
+         * loader, so we test if the classes in the annotation are prefixes of the class to load.
+         */
+        private boolean shouldLoadFromSystemLoader(String className) {
+            for (String classNamePrefix : mSystemLoaderClasses) {
+                if (className.startsWith(classNamePrefix)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    private static class FrameworkSandboxFactory extends SandboxFactory {
+        private final Set<String> mSystemLoaderClasses;
+
+        private FrameworkSandboxFactory(Set<String> systemLoaderClasses) {
+            mSystemLoaderClasses = systemLoaderClasses;
+        }
+
+        @Nonnull
+        @Override
+        public ClassLoader createClassLoader(
+                InstrumentationConfiguration instrumentationConfig, URL... urls) {
+            return new FrameworkClassLoader(
+                    mSystemLoaderClasses,
+                    ClassLoader.getSystemClassLoader(),
+                    instrumentationConfig,
+                    urls);
+        }
+    }
+
+    private static Set<String> classesToClassNames(Class<?>[] classes) {
+        ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+        for (Class<?> classObject : classes) {
+            builder.add(classObject.getName());
+        }
+        return builder.build();
+    }
+}
diff --git a/services/robotests/src/com/android/server/testing/SystemLoaderClasses.java b/services/robotests/src/com/android/server/testing/SystemLoaderClasses.java
new file mode 100644
index 0000000..646a413c
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/SystemLoaderClasses.java
@@ -0,0 +1,35 @@
+/*
+ * 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.testing;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation to be used in test classes that run with {@link FrameworkRobolectricTestRunner}.
+ * This will make the classes specified be loaded from the system class loader, NOT from the
+ * Robolectric android jar.
+ *
+ * @see FrameworkRobolectricTestRunner
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SystemLoaderClasses {
+    Class<?>[] value() default {};
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
index 0d03863..f384044 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
@@ -22,6 +22,7 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
 import static android.view.Display.DEFAULT_DISPLAY;
 
@@ -36,6 +37,7 @@
 
 import static java.lang.Integer.MAX_VALUE;
 
+import android.app.ActivityManager;
 import android.app.ActivityManager.RecentTaskInfo;
 import android.app.ActivityManager.RunningTaskInfo;
 import android.content.ComponentName;
@@ -181,18 +183,6 @@
         assertTrue(mCallbacksRecorder.removed.contains(mTasks.get(1)));
         mCallbacksRecorder.clear();
 
-        // Add a task which will trigger the trimming of another
-        TaskRecord documentTask1 = createDocumentTask(".DocumentTask1");
-        documentTask1.maxRecents = 1;
-        TaskRecord documentTask2 = createDocumentTask(".DocumentTask1");
-        mRecentTasks.add(documentTask1);
-        mRecentTasks.add(documentTask2);
-        assertTrue(mCallbacksRecorder.added.contains(documentTask1));
-        assertTrue(mCallbacksRecorder.added.contains(documentTask2));
-        assertTrue(mCallbacksRecorder.trimmed.contains(documentTask1));
-        assertTrue(mCallbacksRecorder.removed.contains(documentTask1));
-        mCallbacksRecorder.clear();
-
         // Remove the callback, ensure we don't get any calls
         mRecentTasks.unregisterCallback(mCallbacksRecorder);
         mRecentTasks.add(mTasks.get(0));
@@ -203,6 +193,65 @@
     }
 
     @Test
+    public void testAddTasksNoMultiple_expectNoTrim() throws Exception {
+        // Add same non-multiple-task document tasks will remove the task (to re-add it) but not
+        // trim it
+        TaskRecord documentTask1 = createDocumentTask(".DocumentTask1");
+        TaskRecord documentTask2 = createDocumentTask(".DocumentTask1");
+        mRecentTasks.add(documentTask1);
+        mRecentTasks.add(documentTask2);
+        assertTrue(mCallbacksRecorder.added.contains(documentTask1));
+        assertTrue(mCallbacksRecorder.added.contains(documentTask2));
+        assertTrue(mCallbacksRecorder.trimmed.isEmpty());
+        assertTrue(mCallbacksRecorder.removed.contains(documentTask1));
+    }
+
+    @Test
+    public void testAddTasksMaxTaskRecents_expectNoTrim() throws Exception {
+        // Add a task hitting max-recents for that app will remove the task (to add the next one)
+        // but not trim it
+        TaskRecord documentTask1 = createDocumentTask(".DocumentTask1");
+        TaskRecord documentTask2 = createDocumentTask(".DocumentTask1");
+        documentTask1.maxRecents = 1;
+        documentTask2.maxRecents = 1;
+        mRecentTasks.add(documentTask1);
+        mRecentTasks.add(documentTask2);
+        assertTrue(mCallbacksRecorder.added.contains(documentTask1));
+        assertTrue(mCallbacksRecorder.added.contains(documentTask2));
+        assertTrue(mCallbacksRecorder.trimmed.isEmpty());
+        assertTrue(mCallbacksRecorder.removed.contains(documentTask1));
+    }
+
+    @Test
+    public void testAddTasksSameTask_expectNoTrim() throws Exception {
+        // Add a task that is already in the task list does not trigger any callbacks, it just
+        // moves in the list
+        TaskRecord documentTask1 = createDocumentTask(".DocumentTask1");
+        mRecentTasks.add(documentTask1);
+        mRecentTasks.add(documentTask1);
+        assertTrue(mCallbacksRecorder.added.size() == 1);
+        assertTrue(mCallbacksRecorder.added.contains(documentTask1));
+        assertTrue(mCallbacksRecorder.trimmed.isEmpty());
+        assertTrue(mCallbacksRecorder.removed.isEmpty());
+    }
+
+    @Test
+    public void testAddTasksMultipleTasks_expectNoTrim() throws Exception {
+        // Add same multiple-task document tasks does not trim the first tasks
+        TaskRecord documentTask1 = createDocumentTask(".DocumentTask1",
+                FLAG_ACTIVITY_MULTIPLE_TASK);
+        TaskRecord documentTask2 = createDocumentTask(".DocumentTask1",
+                FLAG_ACTIVITY_MULTIPLE_TASK);
+        mRecentTasks.add(documentTask1);
+        mRecentTasks.add(documentTask2);
+        assertTrue(mCallbacksRecorder.added.size() == 2);
+        assertTrue(mCallbacksRecorder.added.contains(documentTask1));
+        assertTrue(mCallbacksRecorder.added.contains(documentTask2));
+        assertTrue(mCallbacksRecorder.trimmed.isEmpty());
+        assertTrue(mCallbacksRecorder.removed.isEmpty());
+    }
+
+    @Test
     public void testUsersTasks() throws Exception {
         mRecentTasks.setOnlyTestVisibleRange();
 
@@ -549,10 +598,15 @@
     }
 
     private TaskRecord createDocumentTask(String className) {
+        return createDocumentTask(className, 0);
+    }
+
+    private TaskRecord createDocumentTask(String className, int flags) {
         TaskRecord task = createTaskBuilder(className)
-                .setFlags(FLAG_ACTIVITY_NEW_DOCUMENT)
+                .setFlags(FLAG_ACTIVITY_NEW_DOCUMENT | flags)
                 .build();
         task.affinity = null;
+        task.maxRecents = ActivityManager.getMaxAppRecentsLimitStatic();
         return task;
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
index 5520bd7..c91e22f 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
@@ -17,33 +17,46 @@
 
 package com.android.server.am;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 
 import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
+import android.content.res.XmlResourceParser;
+import android.graphics.Rect;
 import android.platform.test.annotations.Presubmit;
 import android.service.voice.IVoiceInteractionSession;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.util.Xml;
 
+import com.android.frameworks.servicestests.R;
 import com.android.internal.app.IVoiceInteractor;
 import com.android.server.am.TaskRecord.TaskRecordFactory;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.Comparator;
 
 /**
  * Tests for exercising {@link TaskRecord}.
@@ -54,11 +67,33 @@
 @MediumTest
 @Presubmit
 @RunWith(AndroidJUnit4.class)
-public class TaskRecordTests {
+public class TaskRecordTests extends ActivityTestsBase {
+
+    private static final String TASK_TAG = "task";
+
+    private ActivityManagerService mService;
 
     @Before
     public void setUp() throws Exception {
+        super.setUp();
         TaskRecord.setTaskRecordFactory(null);
+        mService = createActivityManagerService();
+    }
+
+    @Test
+    public void testRestoreWindowedTask() throws Exception {
+        final TaskRecord expected = createTaskRecord(64);
+        expected.mLastNonFullscreenBounds = new Rect(50, 50, 100, 100);
+
+        final File serializedFile = serializeToFile(expected);
+
+        try {
+            final TaskRecord actual = restoreFromFile(serializedFile);
+            assertEquals(expected.taskId, actual.taskId);
+            assertEquals(expected.mLastNonFullscreenBounds, actual.mLastNonFullscreenBounds);
+        } finally {
+            serializedFile.delete();
+        }
     }
 
     @Test
@@ -78,6 +113,38 @@
         assertTrue(factory.mCreated);
     }
 
+    private File serializeToFile(TaskRecord r) throws IOException, XmlPullParserException {
+        final File tmpFile = File.createTempFile(r.taskId + "_task_", "xml");
+
+        try (final OutputStream os = new FileOutputStream(tmpFile)) {
+            final XmlSerializer serializer = Xml.newSerializer();
+            serializer.setOutput(os, "UTF-8");
+            serializer.startDocument(null, true);
+            serializer.startTag(null, TASK_TAG);
+            r.saveToXml(serializer);
+            serializer.endTag(null, TASK_TAG);
+            serializer.endDocument();
+        }
+
+        return tmpFile;
+    }
+
+    private TaskRecord restoreFromFile(File file) throws IOException, XmlPullParserException {
+        try (final Reader reader = new BufferedReader(new FileReader(file))) {
+            final XmlPullParser parser = Xml.newPullParser();
+            parser.setInput(reader);
+            assertEquals(XmlPullParser.START_TAG, parser.next());
+            assertEquals(TASK_TAG, parser.getName());
+            return TaskRecord.restoreFromXml(parser, mService.mStackSupervisor);
+        }
+    }
+
+    private TaskRecord createTaskRecord(int taskId) {
+        return new TaskRecord(mService, taskId, new Intent(), null, null, null, null, null, false,
+                false, false, 0, 10050, null, new ArrayList<>(), 0, false, null, 0, 0, 0, 0, 0,
+                null, 0, false, false, false, 0, 0);
+    }
+
     private static class TestTaskRecordFactory extends TaskRecordFactory {
         private boolean mCreated = false;
 
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
new file mode 100644
index 0000000..c918e8c
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncUtilsTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.locksettings.recoverablekeystore;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.util.Arrays;
+
+import javax.crypto.SecretKey;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class KeySyncUtilsTest {
+    private static final int RECOVERY_KEY_LENGTH_BITS = 256;
+    private static final int THM_KF_HASH_SIZE = 256;
+    private static final String SHA_256_ALGORITHM = "SHA-256";
+
+    @Test
+    public void calculateThmKfHash_isShaOfLockScreenHashWithPrefix() throws Exception {
+        byte[] lockScreenHash = utf8Bytes("012345678910");
+
+        byte[] thmKfHash = KeySyncUtils.calculateThmKfHash(lockScreenHash);
+
+        assertArrayEquals(calculateSha256(utf8Bytes("THM_KF_hash012345678910")), thmKfHash);
+    }
+
+    @Test
+    public void calculateThmKfHash_is256BitsLong() throws Exception {
+        byte[] thmKfHash = KeySyncUtils.calculateThmKfHash(utf8Bytes("1234"));
+
+        assertEquals(THM_KF_HASH_SIZE / Byte.SIZE, thmKfHash.length);
+    }
+
+    @Test
+    public void generateRecoveryKey_returnsA256BitKey() throws Exception {
+        SecretKey key = KeySyncUtils.generateRecoveryKey();
+
+        assertEquals(RECOVERY_KEY_LENGTH_BITS / Byte.SIZE, key.getEncoded().length);
+    }
+
+    @Test
+    public void generateRecoveryKey_generatesANewKeyEachTime() throws Exception {
+        SecretKey a = KeySyncUtils.generateRecoveryKey();
+        SecretKey b = KeySyncUtils.generateRecoveryKey();
+
+        assertFalse(Arrays.equals(a.getEncoded(), b.getEncoded()));
+    }
+
+    private static byte[] utf8Bytes(String s) {
+        return s.getBytes(StandardCharsets.UTF_8);
+    }
+
+    private static byte[] calculateSha256(byte[] bytes) throws Exception {
+        MessageDigest messageDigest = MessageDigest.getInstance(SHA_256_ALGORITHM);
+        messageDigest.update(bytes);
+        return messageDigest.digest();
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
index 4cd5631..fa73722 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/WrappedKeyTest.java
@@ -16,7 +16,9 @@
 
 package com.android.server.locksettings.recoverablekeystore;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import android.security.keystore.AndroidKeyStoreSecretKey;
 import android.security.keystore.KeyGenParameterSpec;
@@ -29,6 +31,8 @@
 import org.junit.runner.RunWith;
 
 import java.security.KeyStore;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.crypto.Cipher;
 import javax.crypto.KeyGenerator;
@@ -70,6 +74,36 @@
         assertEquals(rawKey, unwrappedKey);
     }
 
+    @Test
+    public void decryptWrappedKeys_decryptsWrappedKeys() throws Exception {
+        String alias = "karlin";
+        SecretKey platformKey = generateAndroidKeyStoreKey();
+        SecretKey appKey = generateKey();
+        WrappedKey wrappedKey = WrappedKey.fromSecretKey(platformKey, appKey);
+        HashMap<String, WrappedKey> keysByAlias = new HashMap<>();
+        keysByAlias.put(alias, wrappedKey);
+
+        Map<String, SecretKey> unwrappedKeys = WrappedKey.unwrapKeys(platformKey, keysByAlias);
+
+        assertEquals(1, unwrappedKeys.size());
+        assertTrue(unwrappedKeys.containsKey(alias));
+        assertArrayEquals(appKey.getEncoded(), unwrappedKeys.get(alias).getEncoded());
+    }
+
+    @Test
+    public void decryptWrappedKeys_doesNotDieIfSomeKeysAreUnwrappable() throws Exception {
+        String alias = "karlin";
+        SecretKey appKey = generateKey();
+        WrappedKey wrappedKey = WrappedKey.fromSecretKey(generateKey(), appKey);
+        HashMap<String, WrappedKey> keysByAlias = new HashMap<>();
+        keysByAlias.put(alias, wrappedKey);
+
+        Map<String, SecretKey> unwrappedKeys = WrappedKey.unwrapKeys(
+                generateAndroidKeyStoreKey(), keysByAlias);
+
+        assertEquals(0, unwrappedKeys.size());
+    }
+
     private SecretKey generateKey() throws Exception {
         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
         keyGenerator.init(/*keySize=*/ 256);
@@ -81,7 +115,8 @@
                 KEY_ALGORITHM,
                 ANDROID_KEY_STORE_PROVIDER);
         keyGenerator.init(new KeyGenParameterSpec.Builder(
-                WRAPPING_KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
+                WRAPPING_KEY_ALIAS,
+                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                 .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                 .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                 .build());
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 86ce90c..b792d82 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -18,9 +18,14 @@
 
 import static android.app.usage.UsageEvents.Event.NOTIFICATION_SEEN;
 import static android.app.usage.UsageEvents.Event.USER_INTERACTION;
+import static android.app.usage.UsageStatsManager.REASON_DEFAULT;
+import static android.app.usage.UsageStatsManager.REASON_FORCED;
 import static android.app.usage.UsageStatsManager.REASON_PREDICTED;
+import static android.app.usage.UsageStatsManager.REASON_TIMEOUT;
+import static android.app.usage.UsageStatsManager.REASON_USAGE;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
+import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
 
@@ -79,6 +84,7 @@
     private static final long RARE_THRESHOLD = 48 * HOUR_MS;
 
     private MyInjector mInjector;
+    private AppStandbyController mController;
 
     static class MyContextWrapper extends ContextWrapper {
         PackageManager mockPm = mock(PackageManager.class);
@@ -237,24 +243,23 @@
     public void setUp() throws Exception {
         MyContextWrapper myContext = new MyContextWrapper(InstrumentationRegistry.getContext());
         mInjector = new MyInjector(myContext, Looper.getMainLooper());
+        mController = setupController();
     }
 
     @Test
     public void testCharging() throws Exception {
-        AppStandbyController controller = setupController();
-
-        setChargingState(controller, true);
+        setChargingState(mController, true);
         mInjector.mElapsedRealtime = RARE_THRESHOLD + 1;
-        assertFalse(controller.isAppIdleFilteredOrParoled(PACKAGE_1, USER_ID,
+        assertFalse(mController.isAppIdleFilteredOrParoled(PACKAGE_1, USER_ID,
                 mInjector.mElapsedRealtime, false));
 
-        setChargingState(controller, false);
+        setChargingState(mController, false);
         mInjector.mElapsedRealtime = 2 * RARE_THRESHOLD + 2;
-        controller.checkIdleStates(USER_ID);
-        assertTrue(controller.isAppIdleFilteredOrParoled(PACKAGE_1, USER_ID,
+        mController.checkIdleStates(USER_ID);
+        assertTrue(mController.isAppIdleFilteredOrParoled(PACKAGE_1, USER_ID,
                 mInjector.mElapsedRealtime, false));
-        setChargingState(controller, true);
-        assertFalse(controller.isAppIdleFilteredOrParoled(PACKAGE_1,USER_ID,
+        setChargingState(mController, true);
+        assertFalse(mController.isAppIdleFilteredOrParoled(PACKAGE_1,USER_ID,
                 mInjector.mElapsedRealtime, false));
     }
 
@@ -282,112 +287,142 @@
 
     @Test
     public void testBuckets() throws Exception {
-        AppStandbyController controller = setupController();
+        assertTimeout(mController, 0, STANDBY_BUCKET_NEVER);
 
-        assertTimeout(controller, 0, UsageStatsManager.STANDBY_BUCKET_NEVER);
-
-        reportEvent(controller, USER_INTERACTION, 0);
+        reportEvent(mController, USER_INTERACTION, 0);
 
         // ACTIVE bucket
-        assertTimeout(controller, WORKING_SET_THRESHOLD - 1, STANDBY_BUCKET_ACTIVE);
+        assertTimeout(mController, WORKING_SET_THRESHOLD - 1, STANDBY_BUCKET_ACTIVE);
 
         // WORKING_SET bucket
-        assertTimeout(controller, WORKING_SET_THRESHOLD + 1, STANDBY_BUCKET_WORKING_SET);
+        assertTimeout(mController, WORKING_SET_THRESHOLD + 1, STANDBY_BUCKET_WORKING_SET);
 
         // WORKING_SET bucket
-        assertTimeout(controller, FREQUENT_THRESHOLD - 1, STANDBY_BUCKET_WORKING_SET);
+        assertTimeout(mController, FREQUENT_THRESHOLD - 1, STANDBY_BUCKET_WORKING_SET);
 
         // FREQUENT bucket
-        assertTimeout(controller, FREQUENT_THRESHOLD + 1, STANDBY_BUCKET_FREQUENT);
+        assertTimeout(mController, FREQUENT_THRESHOLD + 1, STANDBY_BUCKET_FREQUENT);
 
         // RARE bucket
-        assertTimeout(controller, RARE_THRESHOLD + 1, STANDBY_BUCKET_RARE);
+        assertTimeout(mController, RARE_THRESHOLD + 1, STANDBY_BUCKET_RARE);
 
-        reportEvent(controller, USER_INTERACTION, RARE_THRESHOLD + 1);
+        reportEvent(mController, USER_INTERACTION, RARE_THRESHOLD + 1);
 
-        assertTimeout(controller, RARE_THRESHOLD + 1, STANDBY_BUCKET_ACTIVE);
+        assertTimeout(mController, RARE_THRESHOLD + 1, STANDBY_BUCKET_ACTIVE);
 
         // RARE bucket
-        assertTimeout(controller, RARE_THRESHOLD * 2 + 2, STANDBY_BUCKET_RARE);
+        assertTimeout(mController, RARE_THRESHOLD * 2 + 2, STANDBY_BUCKET_RARE);
     }
 
     @Test
     public void testScreenTimeAndBuckets() throws Exception {
-        AppStandbyController controller = setupController();
         mInjector.setDisplayOn(false);
 
-        assertTimeout(controller, 0, UsageStatsManager.STANDBY_BUCKET_NEVER);
+        assertTimeout(mController, 0, STANDBY_BUCKET_NEVER);
 
-        reportEvent(controller, USER_INTERACTION, 0);
+        reportEvent(mController, USER_INTERACTION, 0);
 
         // ACTIVE bucket
-        assertTimeout(controller, WORKING_SET_THRESHOLD - 1, STANDBY_BUCKET_ACTIVE);
+        assertTimeout(mController, WORKING_SET_THRESHOLD - 1, STANDBY_BUCKET_ACTIVE);
 
         // WORKING_SET bucket
-        assertTimeout(controller, WORKING_SET_THRESHOLD + 1, STANDBY_BUCKET_WORKING_SET);
+        assertTimeout(mController, WORKING_SET_THRESHOLD + 1, STANDBY_BUCKET_WORKING_SET);
 
         // RARE bucket, should fail because the screen wasn't ON.
         mInjector.mElapsedRealtime = RARE_THRESHOLD + 1;
-        controller.checkIdleStates(USER_ID);
-        assertNotEquals(STANDBY_BUCKET_RARE, getStandbyBucket(controller));
+        mController.checkIdleStates(USER_ID);
+        assertNotEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController));
 
         mInjector.setDisplayOn(true);
-        assertTimeout(controller, RARE_THRESHOLD * 2 + 2, STANDBY_BUCKET_RARE);
+        assertTimeout(mController, RARE_THRESHOLD * 2 + 2, STANDBY_BUCKET_RARE);
     }
 
     @Test
     public void testForcedIdle() throws Exception {
-        AppStandbyController controller = setupController();
-        setChargingState(controller, false);
+        setChargingState(mController, false);
 
-        controller.forceIdleState(PACKAGE_1, USER_ID, true);
-        assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(controller));
-        assertTrue(controller.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0));
+        mController.forceIdleState(PACKAGE_1, USER_ID, true);
+        assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController));
+        assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0));
 
-        controller.forceIdleState(PACKAGE_1, USER_ID, false);
-        assertEquals(STANDBY_BUCKET_ACTIVE, controller.getAppStandbyBucket(PACKAGE_1, USER_ID, 0,
+        mController.forceIdleState(PACKAGE_1, USER_ID, false);
+        assertEquals(STANDBY_BUCKET_ACTIVE, mController.getAppStandbyBucket(PACKAGE_1, USER_ID, 0,
                 true));
-        assertFalse(controller.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0));
+        assertFalse(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0));
     }
 
     @Test
     public void testNotificationEvent() throws Exception {
-        AppStandbyController controller = setupController();
-        setChargingState(controller, false);
+        setChargingState(mController, false);
 
-        reportEvent(controller, USER_INTERACTION, 0);
-        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(controller));
+        reportEvent(mController, USER_INTERACTION, 0);
+        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
         mInjector.mElapsedRealtime = 1;
-        reportEvent(controller, NOTIFICATION_SEEN, mInjector.mElapsedRealtime);
-        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(controller));
+        reportEvent(mController, NOTIFICATION_SEEN, mInjector.mElapsedRealtime);
+        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
 
-        controller.forceIdleState(PACKAGE_1, USER_ID, true);
-        reportEvent(controller, NOTIFICATION_SEEN, mInjector.mElapsedRealtime);
-        assertEquals(STANDBY_BUCKET_WORKING_SET, getStandbyBucket(controller));
+        mController.forceIdleState(PACKAGE_1, USER_ID, true);
+        reportEvent(mController, NOTIFICATION_SEEN, mInjector.mElapsedRealtime);
+        assertEquals(STANDBY_BUCKET_WORKING_SET, getStandbyBucket(mController));
     }
 
     @Test
     public void testPredictionTimedout() throws Exception {
-        AppStandbyController controller = setupController();
-        setChargingState(controller, false);
-        controller.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
-                REASON_PREDICTED + "CTS", 1 * HOUR_MS);
+        setChargingState(mController, false);
+        // Set it to timeout or usage, so that prediction can override it
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE,
+                REASON_TIMEOUT, 1 * HOUR_MS);
+        assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController));
+
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
+                REASON_PREDICTED + ":CTS", 1 * HOUR_MS);
+        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
 
         // Fast forward 12 hours
         mInjector.mElapsedRealtime += WORKING_SET_THRESHOLD;
-        controller.checkIdleStates(USER_ID);
+        mController.checkIdleStates(USER_ID);
         // Should still be in predicted bucket, since prediction timeout is 1 day since prediction
-        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(controller));
+        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
         // Fast forward two more hours
         mInjector.mElapsedRealtime += 2 * HOUR_MS;
-        controller.checkIdleStates(USER_ID);
+        mController.checkIdleStates(USER_ID);
         // Should have now applied prediction timeout
-        assertEquals(STANDBY_BUCKET_WORKING_SET, getStandbyBucket(controller));
+        assertEquals(STANDBY_BUCKET_WORKING_SET, getStandbyBucket(mController));
 
         // Fast forward RARE bucket
         mInjector.mElapsedRealtime += RARE_THRESHOLD;
-        controller.checkIdleStates(USER_ID);
+        mController.checkIdleStates(USER_ID);
         // Should continue to apply prediction timeout
-        assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(controller));
+        assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController));
+    }
+
+    @Test
+    public void testOverrides() throws Exception {
+        setChargingState(mController, false);
+        // Can force to NEVER
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER,
+                REASON_FORCED, 1 * HOUR_MS);
+        assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController));
+
+        // Prediction can't override FORCED reason
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
+                REASON_FORCED, 1 * HOUR_MS);
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET,
+                REASON_PREDICTED, 1 * HOUR_MS);
+        assertEquals(STANDBY_BUCKET_FREQUENT, getStandbyBucket(mController));
+
+        // Prediction can't override NEVER
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER,
+                REASON_DEFAULT, 2 * HOUR_MS);
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
+                REASON_PREDICTED, 2 * HOUR_MS);
+        assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController));
+
+        // Prediction can't set to NEVER
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
+                REASON_USAGE, 2 * HOUR_MS);
+        mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER,
+                REASON_PREDICTED, 2 * HOUR_MS);
+        assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
index 4dd51eb..70906df 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java
@@ -53,12 +53,12 @@
         }
 
         @Override
-        SurfaceControl getSurfaceControl() {
+        public SurfaceControl getSurfaceControl() {
             return mControl;
         }
 
         @Override
-        SurfaceControl.Transaction getPendingTransaction() {
+        public SurfaceControl.Transaction getPendingTransaction() {
             return mTransaction;
         }
     }
@@ -93,12 +93,12 @@
         }
 
         @Override
-        SurfaceControl getSurfaceControl() {
+        public SurfaceControl getSurfaceControl() {
             return mHostControl;
         }
 
         @Override
-        SurfaceControl.Transaction getPendingTransaction() {
+        public SurfaceControl.Transaction getPendingTransaction() {
             return mHostTransaction;
         }
     }
@@ -110,8 +110,8 @@
     @Before
     public void setUp() throws Exception {
         super.setUp();
-
         mHost = new MockSurfaceBuildingContainer();
+
         mTransaction = mock(SurfaceControl.Transaction.class);
         mDimmer = new Dimmer(mHost);
     }
diff --git a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
index 9ecf51e..c309611 100644
--- a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
@@ -24,9 +24,13 @@
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
+import android.animation.AnimationHandler;
 import android.animation.AnimationHandler.AnimationFrameCallbackProvider;
+import android.animation.ValueAnimator;
 import android.graphics.Matrix;
 import android.graphics.Point;
 import android.platform.test.annotations.Presubmit;
@@ -40,6 +44,7 @@
 import android.view.animation.TranslateAnimation;
 
 import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
+import com.android.server.wm.SurfaceAnimationRunner.AnimatorFactory;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -54,7 +59,7 @@
 /**
  * Test class for {@link SurfaceAnimationRunner}.
  *
- * runtest frameworks-services -c com.android.server.wm.SurfaceAnimationRunnerTest
+ * atest FrameworksServicesTests:com.android.server.wm.SurfaceAnimationRunnerTest
  */
 @SmallTest
 @Presubmit
@@ -63,6 +68,7 @@
 
     @Mock SurfaceControl mMockSurface;
     @Mock Transaction mMockTransaction;
+    @Mock AnimationSpec mMockAnimationSpec;
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
 
     private SurfaceAnimationRunner mSurfaceAnimationRunner;
@@ -72,7 +78,7 @@
     public void setUp() throws Exception {
         super.setUp();
         mFinishCallbackLatch = new CountDownLatch(1);
-        mSurfaceAnimationRunner = new SurfaceAnimationRunner(null /* callbackProvider */,
+        mSurfaceAnimationRunner = new SurfaceAnimationRunner(null /* callbackProvider */, null,
                 mMockTransaction);
     }
 
@@ -104,7 +110,8 @@
 
     @Test
     public void testCancel_notStarted() throws Exception {
-        mSurfaceAnimationRunner = new SurfaceAnimationRunner(new NoOpFrameCallbackProvider(), mMockTransaction);
+        mSurfaceAnimationRunner = new SurfaceAnimationRunner(new NoOpFrameCallbackProvider(), null,
+                mMockTransaction);
         mSurfaceAnimationRunner
                 .startAnimation(createTranslateAnimation(), mMockSurface, mMockTransaction,
                 this::finishedCallback);
@@ -112,22 +119,47 @@
         waitUntilHandlersIdle();
         assertTrue(mSurfaceAnimationRunner.mPendingAnimations.isEmpty());
         assertFinishCallbackNotCalled();
-        //verify(mMockSurface).release();
     }
 
     @Test
     public void testCancel_running() throws Exception {
-        mSurfaceAnimationRunner = new SurfaceAnimationRunner(new NoOpFrameCallbackProvider(), mMockTransaction);
-        mSurfaceAnimationRunner
-                .startAnimation(createTranslateAnimation(), mMockSurface, mMockTransaction,
-                this::finishedCallback);
+        mSurfaceAnimationRunner = new SurfaceAnimationRunner(new NoOpFrameCallbackProvider(), null,
+                mMockTransaction);
+        mSurfaceAnimationRunner.startAnimation(createTranslateAnimation(), mMockSurface,
+                mMockTransaction, this::finishedCallback);
         waitUntilNextFrame();
         assertFalse(mSurfaceAnimationRunner.mRunningAnimations.isEmpty());
         mSurfaceAnimationRunner.onAnimationCancelled(mMockSurface);
         assertTrue(mSurfaceAnimationRunner.mRunningAnimations.isEmpty());
         waitUntilHandlersIdle();
         assertFinishCallbackNotCalled();
-        //verify(mMockSurface).release();
+    }
+
+    @Test
+    public void testCancel_sneakyCancelBeforeUpdate() throws Exception {
+        mSurfaceAnimationRunner = new SurfaceAnimationRunner(null, () -> new ValueAnimator() {
+            {
+                setFloatValues(0f, 1f);
+            }
+
+            @Override
+            public void addUpdateListener(AnimatorUpdateListener listener) {
+                super.addUpdateListener(animation -> {
+                    // Sneaky test cancels animation just before applying frame to simulate
+                    // interleaving of multiple threads. Muahahaha
+                    if (animation.getCurrentPlayTime() > 0) {
+                        mSurfaceAnimationRunner.onAnimationCancelled(mMockSurface);
+                    }
+                    listener.onAnimationUpdate(animation);
+                });
+            }
+        }, mMockTransaction);
+        when(mMockAnimationSpec.getDuration()).thenReturn(200L);
+        mSurfaceAnimationRunner.startAnimation(mMockAnimationSpec, mMockSurface, mMockTransaction,
+                this::finishedCallback);
+        waitUntilNextFrame();
+        assertFalse(mSurfaceAnimationRunner.mRunningAnimations.isEmpty());
+        verify(mMockAnimationSpec, atLeastOnce()).apply(any(), any(), eq(0L));
     }
 
     private void waitUntilNextFrame() throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
index 9a52042..6f739ca 100644
--- a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimatorTest.java
@@ -33,8 +33,6 @@
 import android.view.SurfaceControl.Transaction;
 import android.view.SurfaceSession;
 
-import com.google.android.collect.Lists;
-
 import com.android.server.wm.SurfaceAnimator.Animatable;
 import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
 
@@ -50,27 +48,127 @@
 /**
  * Test class for {@link SurfaceAnimatorTest}.
  *
- * runtest frameworks-services -c com.android.server.wm.SurfaceAnimatorTest
+ * atest FrameworksServicesTests:com.android.server.wm.SurfaceAnimatorTest
  */
 @SmallTest
 @Presubmit
 @RunWith(AndroidJUnit4.class)
 public class SurfaceAnimatorTest extends WindowTestsBase {
 
-    @Mock
-    AnimationAdapter mSpec;
-    @Mock
-    AnimationAdapter mSpec2;
+    @Mock AnimationAdapter mSpec;
+    @Mock AnimationAdapter mSpec2;
     @Mock Transaction mTransaction;
 
-    private SurfaceAnimator mSurfaceAnimator;
-    private SurfaceControl mParent;
-    private SurfaceControl mSurface;
-    private boolean mFinishedCallbackCalled;
-    private SurfaceControl mLeash;
     private SurfaceSession mSession = new SurfaceSession();
+    private MyAnimatable mAnimatable;
 
-    private final Animatable mAnimatable = new Animatable() {
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        MockitoAnnotations.initMocks(this);
+        mAnimatable = new MyAnimatable();
+    }
+
+    @Test
+    public void testRunAnimation() throws Exception {
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
+        final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
+                OnAnimationFinishedCallback.class);
+
+        assertTrue(mAnimatable.mSurfaceAnimator.isAnimating());
+        assertNotNull(mAnimatable.mSurfaceAnimator.getAnimation());
+        verify(mTransaction).reparent(eq(mAnimatable.mSurface), eq(mAnimatable.mLeash.getHandle()));
+        verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture());
+
+        callbackCaptor.getValue().onAnimationFinished(mSpec);
+        assertFalse(mAnimatable.mSurfaceAnimator.isAnimating());
+        assertNull(mAnimatable.mSurfaceAnimator.getAnimation());
+        assertTrue(mAnimatable.mFinishedCallbackCalled);
+        assertTrue(mAnimatable.mPendingDestroySurfaces.contains(mAnimatable.mLeash));
+        // TODO: Verify reparenting once we use mPendingTransaction to reparent it back
+    }
+
+    @Test
+    public void testOverrideAnimation() throws Exception {
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
+        final SurfaceControl firstLeash = mAnimatable.mLeash;
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec2, true /* hidden */);
+
+        assertTrue(mAnimatable.mPendingDestroySurfaces.contains(firstLeash));
+        assertFalse(mAnimatable.mFinishedCallbackCalled);
+
+        final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
+                OnAnimationFinishedCallback.class);
+        assertTrue(mAnimatable.mSurfaceAnimator.isAnimating());
+        assertNotNull(mAnimatable.mSurfaceAnimator.getAnimation());
+        verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture());
+
+        // First animation was finished, but this shouldn't cancel the second animation
+        callbackCaptor.getValue().onAnimationFinished(mSpec);
+        assertTrue(mAnimatable.mSurfaceAnimator.isAnimating());
+
+        // Second animation was finished
+        verify(mSpec2).startAnimation(any(), any(), callbackCaptor.capture());
+        callbackCaptor.getValue().onAnimationFinished(mSpec2);
+        assertFalse(mAnimatable.mSurfaceAnimator.isAnimating());
+        assertTrue(mAnimatable.mFinishedCallbackCalled);
+    }
+
+    @Test
+    public void testCancelAnimation() throws Exception {
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
+        assertTrue(mAnimatable.mSurfaceAnimator.isAnimating());
+        mAnimatable.mSurfaceAnimator.cancelAnimation();
+        assertFalse(mAnimatable.mSurfaceAnimator.isAnimating());
+        verify(mSpec).onAnimationCancelled(any());
+        assertTrue(mAnimatable.mFinishedCallbackCalled);
+        assertTrue(mAnimatable.mPendingDestroySurfaces.contains(mAnimatable.mLeash));
+    }
+
+    @Test
+    public void testDelayingAnimationStart() throws Exception {
+        mAnimatable.mSurfaceAnimator.startDelayingAnimationStart();
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
+        verifyZeroInteractions(mSpec);
+        assertTrue(mAnimatable.mSurfaceAnimator.isAnimating());
+        mAnimatable.mSurfaceAnimator.endDelayingAnimationStart();
+        verify(mSpec).startAnimation(any(), any(), any());
+    }
+
+    @Test
+    public void testDelayingAnimationStartAndCancelled() throws Exception {
+        mAnimatable.mSurfaceAnimator.startDelayingAnimationStart();
+        mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
+        mAnimatable.mSurfaceAnimator.cancelAnimation();
+        verifyZeroInteractions(mSpec);
+        assertFalse(mAnimatable.mSurfaceAnimator.isAnimating());
+        assertTrue(mAnimatable.mFinishedCallbackCalled);
+        assertTrue(mAnimatable.mPendingDestroySurfaces.contains(mAnimatable.mLeash));
+    }
+
+    private class MyAnimatable implements Animatable {
+
+        final SurfaceControl mParent;
+        final SurfaceControl mSurface;
+        final ArrayList<SurfaceControl> mPendingDestroySurfaces = new ArrayList<>();
+        final SurfaceAnimator mSurfaceAnimator;
+        SurfaceControl mLeash;
+        boolean mFinishedCallbackCalled;
+
+        MyAnimatable() {
+            mParent = sWm.makeSurfaceBuilder(mSession)
+                    .setName("test surface parent")
+                    .setSize(3000, 3000)
+                    .build();
+            mSurface = sWm.makeSurfaceBuilder(mSession)
+                    .setName("test surface")
+                    .setSize(1, 1)
+                    .build();
+            mFinishedCallbackCalled = false;
+            mLeash = null;
+            mSurfaceAnimator = new SurfaceAnimator(this, mFinishedCallback, sWm);
+        }
+
         @Override
         public Transaction getPendingTransaction() {
             return mTransaction;
@@ -81,15 +179,20 @@
         }
 
         @Override
-        public void onLeashCreated(Transaction t, SurfaceControl leash) {
+        public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
         }
 
         @Override
-        public void onLeashDestroyed(Transaction t) {
+        public void onAnimationLeashDestroyed(Transaction t) {
         }
 
         @Override
-        public Builder makeLeash() {
+        public void destroyAfterPendingTransaction(SurfaceControl surface) {
+            mPendingDestroySurfaces.add(surface);
+        }
+
+        @Override
+        public Builder makeAnimationLeash() {
             return new SurfaceControl.Builder(mSession) {
 
                 @Override
@@ -101,12 +204,12 @@
         }
 
         @Override
-        public SurfaceControl getSurface() {
+        public SurfaceControl getSurfaceControl() {
             return mSurface;
         }
 
         @Override
-        public SurfaceControl getParentSurface() {
+        public SurfaceControl getParentSurfaceControl() {
             return mParent;
         }
 
@@ -119,99 +222,9 @@
         public int getSurfaceHeight() {
             return 1;
         }
-    };
 
-    private final Runnable mFinishedCallback = () -> {
-        mFinishedCallbackCalled = true;
-    };
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-        MockitoAnnotations.initMocks(this);
-        mParent = sWm.makeSurfaceBuilder(mSession)
-                .setName("test surface parent")
-                .setSize(3000, 3000)
-                .build();
-        mSurface = sWm.makeSurfaceBuilder(mSession)
-                .setName("test surface")
-                .setSize(1, 1)
-                .build();
-        mFinishedCallbackCalled = false;
-        mLeash = null;
-        mSurfaceAnimator = new SurfaceAnimator(mAnimatable, mFinishedCallback, sWm);
-    }
-
-    @Test
-    public void testRunAnimation() throws Exception {
-        mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
-        final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
-                OnAnimationFinishedCallback.class);
-
-        assertTrue(mSurfaceAnimator.isAnimating());
-        assertNotNull(mSurfaceAnimator.getAnimation());
-        verify(mTransaction).reparent(eq(mSurface), eq(mLeash.getHandle()));
-        verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture());
-
-        callbackCaptor.getValue().onAnimationFinished(mSpec);
-        assertFalse(mSurfaceAnimator.isAnimating());
-        assertNull(mSurfaceAnimator.getAnimation());
-        assertTrue(mFinishedCallbackCalled);
-
-        // TODO: Verify reparenting once we use mPendingTransaction to reparent it back
-    }
-
-    @Test
-    public void testOverrideAnimation() throws Exception {
-        mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
-        mSurfaceAnimator.startAnimation(mTransaction, mSpec2, true /* hidden */);
-
-        assertFalse(mFinishedCallbackCalled);
-
-        final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
-                OnAnimationFinishedCallback.class);
-        assertTrue(mSurfaceAnimator.isAnimating());
-        assertNotNull(mSurfaceAnimator.getAnimation());
-        verify(mSpec).startAnimation(any(), any(), callbackCaptor.capture());
-
-        // First animation was finished, but this shouldn't cancel the second animation
-        callbackCaptor.getValue().onAnimationFinished(mSpec);
-        assertTrue(mSurfaceAnimator.isAnimating());
-
-        // Second animation was finished
-        verify(mSpec2).startAnimation(any(), any(), callbackCaptor.capture());
-        callbackCaptor.getValue().onAnimationFinished(mSpec2);
-        assertFalse(mSurfaceAnimator.isAnimating());
-        assertTrue(mFinishedCallbackCalled);
-    }
-
-    @Test
-    public void testCancelAnimation() throws Exception {
-        mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
-        assertTrue(mSurfaceAnimator.isAnimating());
-        mSurfaceAnimator.cancelAnimation();
-        assertFalse(mSurfaceAnimator.isAnimating());
-        verify(mSpec).onAnimationCancelled(any());
-        assertTrue(mFinishedCallbackCalled);
-    }
-
-    @Test
-    public void testDelayingAnimationStart() throws Exception {
-        mSurfaceAnimator.startDelayingAnimationStart();
-        mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
-        verifyZeroInteractions(mSpec);
-        assertTrue(mSurfaceAnimator.isAnimating());
-        mSurfaceAnimator.endDelayingAnimationStart();
-        verify(mSpec).startAnimation(any(), any(), any());
-    }
-
-    @Test
-    public void testDelayingAnimationStartAndCancelled() throws Exception {
-        mSurfaceAnimator.startDelayingAnimationStart();
-        mSurfaceAnimator.startAnimation(mTransaction, mSpec, true /* hidden */);
-        mSurfaceAnimator.cancelAnimation();
-        verifyZeroInteractions(mSpec);
-        assertFalse(mSurfaceAnimator.isAnimating());
-        assertTrue(mFinishedCallbackCalled);
+        private final Runnable mFinishedCallback = () -> {
+            mFinishedCallbackCalled = true;
+        };
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java
index 89447a9..6070516 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskPositioningControllerTests.java
@@ -33,6 +33,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+
 /**
  * Tests for the {@link TaskPositioningController} class.
  *
@@ -78,9 +79,9 @@
             assertNotNull(mTarget.getDragWindowHandleLocked());
         }
 
-        assertTrue(sWm.mH.runWithScissors(() -> {
-            mTarget.finishPositioning();
-        }, TIMEOUT_MS));
+        mTarget.finishTaskPositioning();
+        // Wait until the looper processes finishTaskPositioning.
+        assertTrue(sWm.mH.runWithScissors(() -> {}, TIMEOUT_MS));
 
         assertFalse(mTarget.isPositioningLocked());
         assertNull(mTarget.getDragWindowHandleLocked());
@@ -99,15 +100,17 @@
         assertNotNull(mWindow.getTask().getTopVisibleAppMainWindow());
 
         mTarget.handleTapOutsideTask(content, 0, 0);
+        // Wait until the looper processes finishTaskPositioning.
+        assertTrue(sWm.mH.runWithScissors(() -> {}, TIMEOUT_MS));
 
         synchronized (sWm.mWindowMap) {
             assertTrue(mTarget.isPositioningLocked());
             assertNotNull(mTarget.getDragWindowHandleLocked());
         }
 
-        assertTrue(sWm.mH.runWithScissors(() -> {
-            mTarget.finishPositioning();
-        }, TIMEOUT_MS));
+        mTarget.finishTaskPositioning();
+        // Wait until the looper processes finishTaskPositioning.
+        assertTrue(sWm.mH.runWithScissors(() -> {}, TIMEOUT_MS));
 
         assertFalse(mTarget.isPositioningLocked());
         assertNull(mTarget.getDragWindowHandleLocked());
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 481c898..c735341 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -411,6 +411,11 @@
     }
 
     @Override
+    public boolean inKeyguardRestrictedKeyInputMode() {
+        return false;
+    }
+
+    @Override
     public void dismissKeyguardLw(@Nullable IKeyguardDismissCallback callback) {
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
index 5cb9467..307deb4 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
@@ -29,8 +29,6 @@
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
 import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
 
@@ -333,12 +331,19 @@
         final TestWindowContainer child12 = child1.addChildWindow(builder.setIsAnimating(true));
         final TestWindowContainer child21 = child2.addChildWindow();
 
-        assertTrue(root.isAnimating());
+        assertFalse(root.isAnimating());
         assertTrue(child1.isAnimating());
-        assertFalse(child11.isAnimating());
+        assertTrue(child11.isAnimating());
         assertTrue(child12.isAnimating());
         assertFalse(child2.isAnimating());
         assertFalse(child21.isAnimating());
+
+        assertTrue(root.isSelfOrChildAnimating());
+        assertTrue(child1.isSelfOrChildAnimating());
+        assertFalse(child11.isSelfOrChildAnimating());
+        assertTrue(child12.isSelfOrChildAnimating());
+        assertFalse(child2.isSelfOrChildAnimating());
+        assertFalse(child21.isSelfOrChildAnimating());
     }
 
     @Test
@@ -630,8 +635,8 @@
         }
 
         @Override
-        boolean isAnimating() {
-            return mIsAnimating || super.isAnimating();
+        boolean isSelfAnimating() {
+            return mIsAnimating;
         }
 
         @Override
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
index b2334e8..5f58744 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
@@ -189,7 +189,6 @@
     public static class TestTask extends Task {
         boolean mShouldDeferRemoval = false;
         boolean mOnDisplayChangedCalled = false;
-        private boolean mUseLocalIsAnimating = false;
         private boolean mIsAnimating = false;
 
         TestTask(int taskId, TaskStack stack, int userId, WindowManagerService service,
@@ -214,12 +213,11 @@
         }
 
         @Override
-        boolean isAnimating() {
-            return mUseLocalIsAnimating ? mIsAnimating : super.isAnimating();
+        boolean isSelfAnimating() {
+            return mIsAnimating;
         }
 
         void setLocalIsAnimating(boolean isAnimating) {
-            mUseLocalIsAnimating = true;
             mIsAnimating = isAnimating;
         }
     }
diff --git a/services/tests/uiservicestests/Android.mk b/services/tests/uiservicestests/Android.mk
index 40e7878..d8e14ec 100644
--- a/services/tests/uiservicestests/Android.mk
+++ b/services/tests/uiservicestests/Android.mk
@@ -10,7 +10,8 @@
 
 # Include test java files and source from notifications package.
 LOCAL_SRC_FILES := $(call all-java-files-under, src) \
-	$(call all-java-files-under, ../../core/java/com/android/server/notification)
+	$(call all-java-files-under, ../../core/java/com/android/server/notification) \
+	$(call all-java-files-under, ../../core/java/com/android/server/slice) \
 
 LOCAL_STATIC_JAVA_LIBRARIES := \
     frameworks-base-testutils \
diff --git a/services/tests/uiservicestests/AndroidManifest.xml b/services/tests/uiservicestests/AndroidManifest.xml
index 621b457..f022dcf 100644
--- a/services/tests/uiservicestests/AndroidManifest.xml
+++ b/services/tests/uiservicestests/AndroidManifest.xml
@@ -28,6 +28,9 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+
+        <provider android:name=".DummyProvider"
+            android:authorities="com.android.services.uitests" />
     </application>
 
     <instrumentation
diff --git a/services/tests/uiservicestests/src/com/android/frameworks/tests/uiservices/DummyProvider.java b/services/tests/uiservicestests/src/com/android/frameworks/tests/uiservices/DummyProvider.java
new file mode 100644
index 0000000..574c226
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/frameworks/tests/uiservices/DummyProvider.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.frameworks.tests.uiservices;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class DummyProvider extends ContentProvider {
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        return null;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        return null;
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        return null;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        return 0;
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        return 0;
+    }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
new file mode 100644
index 0000000..f534b5c
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
@@ -0,0 +1,38 @@
+/*
+ * 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;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.testing.TestableContext;
+
+import org.junit.Before;
+import org.junit.Rule;
+
+
+public class UiServiceTestCase {
+    @Rule
+    public final TestableContext mContext =
+            new TestableContext(InstrumentationRegistry.getContext(), null);
+
+    protected TestableContext getContext() {
+        return mContext;
+    }
+
+    @Before
+    public void setup() {
+        // Share classloader to allow package access.
+        System.setProperty("dexmaker.share_classloader", "true");
+    }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java b/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java
index faf6a9b..d4c41e0 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/AlertRateLimiterTest.java
@@ -22,13 +22,16 @@
 
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class AlertRateLimiterTest extends NotificationTestCase {
+public class AlertRateLimiterTest extends UiServiceTestCase {
 
     private long mTestStartTime;
     private
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java
index 262516d..142041a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BadgeExtractorTest.java
@@ -27,13 +27,13 @@
 import android.app.Notification;
 import android.app.Notification.Builder;
 import android.app.NotificationChannel;
-import android.app.NotificationManager;
 import android.os.UserHandle;
-import android.provider.Settings.Secure;
 import android.service.notification.StatusBarNotification;
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -42,7 +42,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class BadgeExtractorTest extends NotificationTestCase {
+public class BadgeExtractorTest extends UiServiceTestCase {
 
     @Mock RankingConfig mConfig;
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
index 0b4d61f..a92f7e7 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -58,13 +58,13 @@
 import android.service.notification.StatusBarNotification;
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Slog;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.IAccessibilityManager;
 import android.view.accessibility.IAccessibilityManagerClient;
 
 import com.android.internal.util.IntPair;
+import com.android.server.UiServiceTestCase;
 import com.android.server.lights.Light;
 
 import org.junit.Before;
@@ -74,12 +74,10 @@
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class BuzzBeepBlinkTest extends NotificationTestCase {
+public class BuzzBeepBlinkTest extends UiServiceTestCase {
 
     @Mock AudioManager mAudioManager;
     @Mock Vibrator mVibrator;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
index f92bd84..97f2104 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/GlobalSortKeyComparatorTest.java
@@ -28,6 +28,8 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -37,7 +39,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class GlobalSortKeyComparatorTest extends NotificationTestCase {
+public class GlobalSortKeyComparatorTest extends UiServiceTestCase {
 
     private final String PKG = "PKG";
     private final int UID = 1111111;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
index f75c648..8d4c5b1 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
@@ -38,6 +38,8 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.server.UiServiceTestCase;
+
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -45,7 +47,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class GroupHelperTest extends NotificationTestCase {
+public class GroupHelperTest extends UiServiceTestCase {
     private @Mock GroupHelper.Callback mCallback;
 
     private GroupHelper mGroupHelper;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
index d325e10..73d5961 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ImportanceExtractorTest.java
@@ -30,7 +30,6 @@
 import android.test.suitebuilder.annotation.SmallTest;
 
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 import static org.mockito.Matchers.anyInt;
@@ -39,9 +38,11 @@
 
 import static org.junit.Assert.assertEquals;
 
+import com.android.server.UiServiceTestCase;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class ImportanceExtractorTest extends NotificationTestCase {
+public class ImportanceExtractorTest extends UiServiceTestCase {
 
     @Mock RankingConfig mConfig;
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
index a4b9b25..9ef0ec7 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java
@@ -49,6 +49,7 @@
 import android.util.Xml;
 
 import com.android.internal.util.FastXmlSerializer;
+import com.android.server.UiServiceTestCase;
 
 import com.google.android.collect.Lists;
 
@@ -68,7 +69,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class ManagedServicesTest extends NotificationTestCase {
+public class ManagedServicesTest extends UiServiceTestCase {
 
     @Mock
     private IPackageManager mIpm;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
index e527644..fd674f0 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
@@ -31,12 +31,14 @@
 import android.service.notification.SnoozeCriterion;
 import android.service.notification.StatusBarNotification;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Test;
 
 import java.util.ArrayList;
 import java.util.Objects;
 
-public class NotificationAdjustmentExtractorTest extends NotificationTestCase {
+public class NotificationAdjustmentExtractorTest extends UiServiceTestCase {
 
     @Test
     public void testExtractsAdjustment() {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java
index d75213c..eb45960 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelExtractorTest.java
@@ -16,7 +16,6 @@
 
 package com.android.server.notification;
 
-import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
 import static android.app.NotificationManager.IMPORTANCE_HIGH;
 import static android.app.NotificationManager.IMPORTANCE_LOW;
 
@@ -31,17 +30,17 @@
 
 import android.app.Notification;
 import android.app.NotificationChannel;
-import android.app.PendingIntent;
-import android.content.Intent;
 import android.os.UserHandle;
 import android.service.notification.StatusBarNotification;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
-public class NotificationChannelExtractorTest extends NotificationTestCase {
+public class NotificationChannelExtractorTest extends UiServiceTestCase {
 
     @Mock RankingConfig mConfig;
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
index f457f6a..2241047 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
@@ -26,6 +26,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.internal.util.FastXmlSerializer;
+import com.android.server.UiServiceTestCase;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -36,7 +37,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class NotificationChannelTest extends NotificationTestCase {
+public class NotificationChannelTest extends UiServiceTestCase {
 
     @Test
     public void testWriteToParcel() {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
index 1e5f96f..3dcd5b9 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationComparatorTest.java
@@ -38,6 +38,8 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -50,7 +52,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class NotificationComparatorTest extends NotificationTestCase {
+public class NotificationComparatorTest extends UiServiceTestCase {
     @Mock Context mContext;
     @Mock TelecomManager mTm;
     @Mock RankingHandler handler;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
index 85852f9..00d93de 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationIntrusivenessExtractorTest.java
@@ -32,9 +32,11 @@
 import android.os.UserHandle;
 import android.service.notification.StatusBarNotification;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Test;
 
-public class NotificationIntrusivenessExtractorTest extends NotificationTestCase {
+public class NotificationIntrusivenessExtractorTest extends UiServiceTestCase {
 
     @Test
     public void testNonIntrusive() {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
index d767ba2..f4313b8 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
@@ -37,6 +37,8 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -45,7 +47,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class NotificationListenerServiceTest extends NotificationTestCase {
+public class NotificationListenerServiceTest extends UiServiceTestCase {
 
     private String[] mKeys = new String[] { "key", "key1", "key2", "key3"};
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 0343ab2..ad3fecf 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -83,6 +83,7 @@
 import android.util.AtomicFile;
 
 import com.android.internal.statusbar.NotificationVisibility;
+import com.android.server.UiServiceTestCase;
 import com.android.server.lights.Light;
 import com.android.server.lights.LightsManager;
 import com.android.server.notification.NotificationManagerService.NotificationAssistants;
@@ -110,7 +111,7 @@
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 @RunWithLooper
-public class NotificationManagerServiceTest extends NotificationTestCase {
+public class NotificationManagerServiceTest extends UiServiceTestCase {
     private static final String TEST_CHANNEL_ID = "NotificationManagerServiceTestChannelId";
     private final int mUid = Binder.getCallingUid();
     private NotificationManagerService mService;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index ef26705a..a5fa903 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -53,6 +53,7 @@
 
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.server.UiServiceTestCase;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -65,7 +66,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class NotificationRecordTest extends NotificationTestCase {
+public class NotificationRecordTest extends UiServiceTestCase {
 
     private final Context mMockContext = Mockito.mock(Context.class);
     @Mock PackageManager mPm;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java
index fec2811..4f153ee 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationStatsTest.java
@@ -11,12 +11,14 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class NotificationStatsTest extends NotificationTestCase {
+public class NotificationStatsTest extends UiServiceTestCase {
 
     @Test
     public void testConstructor() {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
index 4165e9e..4bfb236 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
@@ -33,6 +33,8 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,7 +43,7 @@
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
-public class NotificationTest extends NotificationTestCase {
+public class NotificationTest extends UiServiceTestCase {
 
     @Mock
     ActivityManager mAm;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTestCase.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTestCase.java
deleted file mode 100644
index 1ee3412..0000000
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTestCase.java
+++ /dev/null
@@ -1,33 +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.server.notification;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.testing.TestableContext;
-
-import org.junit.Rule;
-
-
-public class NotificationTestCase {
-    @Rule
-    public final TestableContext mContext =
-            new TestableContext(InstrumentationRegistry.getContext(), null);
-
-    protected TestableContext getContext() {
-        return mContext;
-    }
-}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 2d03f11..abfc54d 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -65,6 +65,7 @@
 import android.util.Xml;
 
 import com.android.internal.util.FastXmlSerializer;
+import com.android.server.UiServiceTestCase;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
@@ -90,7 +91,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class RankingHelperTest extends NotificationTestCase {
+public class RankingHelperTest extends UiServiceTestCase {
     private static final String PKG = "com.android.server.notification";
     private static final int UID = 0;
     private static final UserHandle USER = UserHandle.of(0);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
index e354267..5d8d48f1 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RateEstimatorTest.java
@@ -24,9 +24,11 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertFalse;
 
+import com.android.server.UiServiceTestCase;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class RateEstimatorTest extends NotificationTestCase {
+public class RateEstimatorTest extends UiServiceTestCase {
     private long mTestStartTime;
     private RateEstimator mEstimator;
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
index 5ebfd48..9564ab9 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
@@ -27,6 +27,8 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -36,7 +38,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class ScheduleCalendarTest extends NotificationTestCase {
+public class ScheduleCalendarTest extends UiServiceTestCase {
 
     private ScheduleCalendar mScheduleCalendar;
     private ZenModeConfig.ScheduleInfo mScheduleInfo;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
index 610592f..17fed83 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
@@ -13,6 +13,8 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -23,7 +25,7 @@
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
-public class ScheduleConditionProviderTest extends NotificationTestCase {
+public class ScheduleConditionProviderTest extends UiServiceTestCase {
 
     ScheduleConditionProvider mService;
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
index 07b21fb..88c6fcf 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
@@ -32,7 +32,6 @@
 import android.service.notification.StatusBarNotification;
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Slog;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
@@ -46,10 +45,12 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.android.server.UiServiceTestCase;
+
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class SnoozeHelperTest extends NotificationTestCase {
+public class SnoozeHelperTest extends UiServiceTestCase {
     private static final String TEST_CHANNEL_ID = "test_channel_id";
 
     @Mock SnoozeHelper.Callback mCallback;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
index 4ac0c65..58f0ded 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
@@ -30,9 +30,11 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertEquals;
 
+import com.android.server.UiServiceTestCase;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class ValidateNotificationPeopleTest extends NotificationTestCase {
+public class ValidateNotificationPeopleTest extends UiServiceTestCase {
 
     @Test
     public void testNoExtra() throws Exception {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index 8ac6481..0c7397a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -32,6 +32,8 @@
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 
+import com.android.server.UiServiceTestCase;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,7 +43,7 @@
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
-public class ZenModeHelperTest extends NotificationTestCase {
+public class ZenModeHelperTest extends UiServiceTestCase {
 
     @Mock ConditionProviders mConditionProviders;
     private TestableLooper mTestableLooper;
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
new file mode 100644
index 0000000..ce328c2
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
@@ -0,0 +1,214 @@
+package com.android.server.slice;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.slice.ISliceListener;
+import android.app.slice.Slice;
+import android.app.slice.SliceProvider;
+import android.app.slice.SliceSpec;
+import android.content.ContentProvider;
+import android.content.IContentProvider;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
+
+import com.android.server.UiServiceTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class PinnedSliceStateTest extends UiServiceTestCase {
+
+    private static final String AUTH = "my.authority";
+    private static final Uri TEST_URI = Uri.parse("content://" + AUTH + "/path");
+
+    private static final SliceSpec[] FIRST_SPECS = new SliceSpec[]{
+            new SliceSpec("spec1", 3),
+            new SliceSpec("spec2", 3),
+            new SliceSpec("spec3", 2),
+            new SliceSpec("spec4", 1),
+    };
+
+    private static final SliceSpec[] SECOND_SPECS = new SliceSpec[]{
+            new SliceSpec("spec2", 1),
+            new SliceSpec("spec3", 2),
+            new SliceSpec("spec4", 3),
+            new SliceSpec("spec5", 4),
+    };
+
+    private SliceManagerService mSliceService;
+    private PinnedSliceState mPinnedSliceManager;
+    private IContentProvider mIContentProvider;
+    private ContentProvider mContentProvider;
+
+    @Before
+    public void setup() {
+        mSliceService = mock(SliceManagerService.class);
+        when(mSliceService.getLock()).thenReturn(new Object());
+        when(mSliceService.getContext()).thenReturn(mContext);
+        when(mSliceService.getHandler()).thenReturn(new Handler(TestableLooper.get(this).getLooper()));
+        mContentProvider = mock(ContentProvider.class);
+        mIContentProvider = mock(IContentProvider.class);
+        when(mContentProvider.getIContentProvider()).thenReturn(mIContentProvider);
+        mContext.getContentResolver().addProvider(AUTH, mContentProvider);
+        mPinnedSliceManager = new PinnedSliceState(mSliceService, TEST_URI);
+    }
+
+    @Test
+    public void testMergeSpecs() {
+        // No annotations to start.
+        assertNull(mPinnedSliceManager.getSpecs());
+
+        mPinnedSliceManager.mergeSpecs(FIRST_SPECS);
+        assertArrayEquals(FIRST_SPECS, mPinnedSliceManager.getSpecs());
+
+        mPinnedSliceManager.mergeSpecs(SECOND_SPECS);
+        assertArrayEquals(new SliceSpec[]{
+                // spec1 is gone because it's not in the second set.
+                new SliceSpec("spec2", 1), // spec2 is 1 because it's smaller in the second set.
+                new SliceSpec("spec3", 2), // spec3 is the same in both sets
+                new SliceSpec("spec4", 1), // spec4 is 1 because it's smaller in the first set.
+                // spec5 is gone because it's not in the first set.
+        }, mPinnedSliceManager.getSpecs());
+    }
+
+    @Test
+    public void testSendPinnedOnCreate() throws RemoteException {
+        // When created, a pinned message should be sent.
+        TestableLooper.get(this).processAllMessages();
+
+        verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null),
+                argThat(b -> {
+                    assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI));
+                    return true;
+                }));
+    }
+
+    @Test
+    public void testSendUnpinnedOnDestroy() throws RemoteException {
+        TestableLooper.get(this).processAllMessages();
+        clearInvocations(mIContentProvider);
+
+        mPinnedSliceManager.destroy();
+        TestableLooper.get(this).processAllMessages();
+
+        verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_UNPIN), eq(null),
+                argThat(b -> {
+                    assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI));
+                    return true;
+                }));
+    }
+
+    @Test
+    public void testPkgPin() {
+        assertFalse(mPinnedSliceManager.isPinned());
+
+        mPinnedSliceManager.pin("pkg", FIRST_SPECS);
+        assertTrue(mPinnedSliceManager.isPinned());
+
+        assertTrue(mPinnedSliceManager.unpin("pkg"));
+        assertFalse(mPinnedSliceManager.isPinned());
+    }
+
+    @Test
+    public void testMultiPkgPin() {
+        assertFalse(mPinnedSliceManager.isPinned());
+
+        mPinnedSliceManager.pin("pkg", FIRST_SPECS);
+        assertTrue(mPinnedSliceManager.isPinned());
+        mPinnedSliceManager.pin("pkg2", FIRST_SPECS);
+
+        assertFalse(mPinnedSliceManager.unpin("pkg"));
+        assertTrue(mPinnedSliceManager.unpin("pkg2"));
+        assertFalse(mPinnedSliceManager.isPinned());
+    }
+
+    @Test
+    public void testListenerPin() {
+        ISliceListener listener = mock(ISliceListener.class);
+        assertFalse(mPinnedSliceManager.isPinned());
+
+        mPinnedSliceManager.addSliceListener(listener, FIRST_SPECS);
+        assertTrue(mPinnedSliceManager.isPinned());
+
+        assertTrue(mPinnedSliceManager.removeSliceListener(listener));
+        assertFalse(mPinnedSliceManager.isPinned());
+    }
+
+    @Test
+    public void testMultiListenerPin() {
+        ISliceListener listener = mock(ISliceListener.class);
+        ISliceListener listener2 = mock(ISliceListener.class);
+        assertFalse(mPinnedSliceManager.isPinned());
+
+        mPinnedSliceManager.addSliceListener(listener, FIRST_SPECS);
+        assertTrue(mPinnedSliceManager.isPinned());
+        mPinnedSliceManager.addSliceListener(listener2, FIRST_SPECS);
+
+        assertFalse(mPinnedSliceManager.removeSliceListener(listener));
+        assertTrue(mPinnedSliceManager.removeSliceListener(listener2));
+        assertFalse(mPinnedSliceManager.isPinned());
+    }
+
+    @Test
+    public void testPkgListenerPin() {
+        ISliceListener listener = mock(ISliceListener.class);
+        assertFalse(mPinnedSliceManager.isPinned());
+
+        mPinnedSliceManager.addSliceListener(listener, FIRST_SPECS);
+        assertTrue(mPinnedSliceManager.isPinned());
+        mPinnedSliceManager.pin("pkg", FIRST_SPECS);
+
+        assertFalse(mPinnedSliceManager.removeSliceListener(listener));
+        assertTrue(mPinnedSliceManager.unpin("pkg"));
+        assertFalse(mPinnedSliceManager.isPinned());
+    }
+
+    @Test
+    public void testBind() throws RemoteException {
+        TestableLooper.get(this).processAllMessages();
+        clearInvocations(mIContentProvider);
+
+        ISliceListener listener = mock(ISliceListener.class);
+        Slice s = new Slice.Builder(TEST_URI).build();
+        Bundle b = new Bundle();
+        b.putParcelable(SliceProvider.EXTRA_SLICE, s);
+        when(mIContentProvider.call(anyString(), eq(SliceProvider.METHOD_SLICE), eq(null),
+                any())).thenReturn(b);
+
+        assertFalse(mPinnedSliceManager.isPinned());
+
+        mPinnedSliceManager.addSliceListener(listener, FIRST_SPECS);
+
+        mPinnedSliceManager.onChange();
+        TestableLooper.get(this).processAllMessages();
+
+        verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_SLICE), eq(null),
+                argThat(bundle -> {
+                    assertEquals(TEST_URI, bundle.getParcelable(SliceProvider.EXTRA_BIND_URI));
+                    return true;
+                }));
+        verify(listener).onSliceUpdated(eq(s));
+    }
+}
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
new file mode 100644
index 0000000..fe9ea7a
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
@@ -0,0 +1,135 @@
+/*
+ * 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.slice;
+
+import static android.content.ContentProvider.maybeAddUserId;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.AppOpsManager;
+import android.app.slice.ISliceListener;
+import android.app.slice.SliceSpec;
+import android.content.pm.PackageManagerInternal;
+import android.net.Uri;
+import android.os.RemoteException;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
+
+import com.android.server.LocalServices;
+import com.android.server.UiServiceTestCase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class SliceManagerServiceTest extends UiServiceTestCase {
+
+    private static final String AUTH = "com.android.services.uitests";
+    private static final Uri TEST_URI = maybeAddUserId(Uri.parse("content://" + AUTH + "/path"), 0);
+
+    private static final SliceSpec[] EMPTY_SPECS = new SliceSpec[]{
+    };
+
+    private SliceManagerService mService;
+    private PinnedSliceState mCreatedSliceState;
+
+    @Before
+    public void setup() {
+        LocalServices.addService(PackageManagerInternal.class, mock(PackageManagerInternal.class));
+        mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
+        mContext.getTestablePermissions().setPermission(TEST_URI, PERMISSION_GRANTED);
+
+        mService = spy(new SliceManagerService(mContext, TestableLooper.get(this).getLooper()));
+        mCreatedSliceState = mock(PinnedSliceState.class);
+        doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI));
+    }
+
+    @After
+    public void teardown() {
+        LocalServices.removeServiceForTest(PackageManagerInternal.class);
+    }
+
+    @Test
+    public void testAddListenerCreatesPinned() throws RemoteException {
+        mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS);
+        verify(mService, times(1)).createPinnedSlice(eq(TEST_URI));
+    }
+
+    @Test
+    public void testAddListenerCreatesOnePinned() throws RemoteException {
+        mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS);
+        mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS);
+        verify(mService, times(1)).createPinnedSlice(eq(TEST_URI));
+    }
+
+    @Test
+    public void testRemoveListenerDestroysPinned() throws RemoteException {
+        ISliceListener listener = mock(ISliceListener.class);
+        mService.addSliceListener(TEST_URI, "pkg", listener, EMPTY_SPECS);
+
+        when(mCreatedSliceState.removeSliceListener(eq(listener))).thenReturn(false);
+        mService.removeSliceListener(TEST_URI, "pkg", listener);
+        verify(mCreatedSliceState, never()).destroy();
+
+        when(mCreatedSliceState.removeSliceListener(eq(listener))).thenReturn(true);
+        mService.removeSliceListener(TEST_URI, "pkg", listener);
+        verify(mCreatedSliceState).destroy();
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testUnrecognizedThrows() throws RemoteException {
+        mService.removeSliceListener(TEST_URI, "pkg", mock(ISliceListener.class));
+    }
+
+    @Test
+    public void testAddPinCreatesPinned() throws RemoteException {
+        doReturn("pkg").when(mService).getDefaultHome(anyInt());
+
+        mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS);
+        mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS);
+        verify(mService, times(1)).createPinnedSlice(eq(TEST_URI));
+    }
+
+    @Test
+    public void testRemovePinDestroysPinned() throws RemoteException {
+        doReturn("pkg").when(mService).getDefaultHome(anyInt());
+
+        mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS);
+
+        when(mCreatedSliceState.unpin(eq("pkg"))).thenReturn(false);
+        mService.unpinSlice("pkg", TEST_URI);
+        verify(mCreatedSliceState, never()).destroy();
+
+        when(mCreatedSliceState.unpin(eq("pkg"))).thenReturn(true);
+        mService.unpinSlice("pkg", TEST_URI);
+        verify(mCreatedSliceState).destroy();
+    }
+
+}
\ No newline at end of file
diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java
index 46efbd0..cc0259d 100644
--- a/services/usage/java/com/android/server/usage/AppStandbyController.java
+++ b/services/usage/java/com/android/server/usage/AppStandbyController.java
@@ -24,6 +24,7 @@
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
+import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
 
@@ -133,7 +134,7 @@
     @GuardedBy("mAppIdleLock")
     private AppIdleHistory mAppIdleHistory;
 
-    @GuardedBy("mAppIdleLock")
+    @GuardedBy("mPackageAccessListeners")
     private ArrayList<AppIdleStateChangeListener>
             mPackageAccessListeners = new ArrayList<>();
 
@@ -592,7 +593,7 @@
     }
 
     void addListener(AppIdleStateChangeListener listener) {
-        synchronized (mAppIdleLock) {
+        synchronized (mPackageAccessListeners) {
             if (!mPackageAccessListeners.contains(listener)) {
                 mPackageAccessListeners.add(listener);
             }
@@ -600,7 +601,7 @@
     }
 
     void removeListener(AppIdleStateChangeListener listener) {
-        synchronized (mAppIdleLock) {
+        synchronized (mPackageAccessListeners) {
             mPackageAccessListeners.remove(listener);
         }
     }
@@ -789,6 +790,19 @@
     void setAppStandbyBucket(String packageName, int userId, @StandbyBuckets int newBucket,
             String reason, long elapsedRealtime) {
         synchronized (mAppIdleLock) {
+            AppIdleHistory.AppUsageHistory app = mAppIdleHistory.getAppUsageHistory(packageName,
+                    userId, elapsedRealtime);
+            boolean predicted = reason != null && reason.startsWith(REASON_PREDICTED);
+            // Don't allow changing bucket if higher than ACTIVE
+            if (app.currentBucket < STANDBY_BUCKET_ACTIVE) return;
+            // Don't allow prediction to change from or to NEVER
+            if ((app.currentBucket == STANDBY_BUCKET_NEVER
+                    || newBucket == STANDBY_BUCKET_NEVER)
+                    && predicted) {
+                return;
+            }
+            // If the bucket was forced, don't allow prediction to override
+            if (app.bucketingReason.equals(REASON_FORCED) && predicted) return;
             mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, newBucket,
                     reason);
         }
@@ -852,15 +866,19 @@
 
     void informListeners(String packageName, int userId, int bucket) {
         final boolean idle = bucket >= STANDBY_BUCKET_RARE;
-        for (AppIdleStateChangeListener listener : mPackageAccessListeners) {
-            listener.onAppIdleStateChanged(packageName, userId, idle, bucket);
+        synchronized (mPackageAccessListeners) {
+            for (AppIdleStateChangeListener listener : mPackageAccessListeners) {
+                listener.onAppIdleStateChanged(packageName, userId, idle, bucket);
+            }
         }
     }
 
     void informParoleStateChanged() {
         final boolean paroled = isParoledOrCharging();
-        for (AppIdleStateChangeListener listener : mPackageAccessListeners) {
-            listener.onParoleStateChanged(paroled);
+        synchronized (mPackageAccessListeners) {
+            for (AppIdleStateChangeListener listener : mPackageAccessListeners) {
+                listener.onParoleStateChanged(paroled);
+            }
         }
     }
 
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 15284d5..07c860b 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -728,6 +728,10 @@
             } catch (RemoteException re) {
                 throw re.rethrowFromSystemServer();
             }
+            final boolean shellCaller = callingUid == 0 || callingUid == Process.SHELL_UID;
+            final String reason = shellCaller
+                    ? UsageStatsManager.REASON_FORCED
+                    : UsageStatsManager.REASON_PREDICTED + ":" + callingUid;
             final long token = Binder.clearCallingIdentity();
             try {
                 // Caller cannot set their own standby state
@@ -735,8 +739,7 @@
                         PackageManager.MATCH_ANY_USER, userId) == callingUid) {
                     throw new IllegalArgumentException("Cannot set your own standby bucket");
                 }
-                mAppStandby.setAppStandbyBucket(packageName, userId, bucket,
-                        UsageStatsManager.REASON_PREDICTED + ":" + callingUid,
+                mAppStandby.setAppStandbyBucket(packageName, userId, bucket, reason,
                         SystemClock.elapsedRealtime());
             } finally {
                 Binder.restoreCallingIdentity(token);
@@ -779,6 +782,10 @@
             } catch (RemoteException re) {
                 throw re.rethrowFromSystemServer();
             }
+            final boolean shellCaller = callingUid == 0 || callingUid == Process.SHELL_UID;
+            final String reason = shellCaller
+                    ? UsageStatsManager.REASON_FORCED
+                    : UsageStatsManager.REASON_PREDICTED + ":" + callingUid;
             final long token = Binder.clearCallingIdentity();
             try {
                 final long elapsedRealtime = SystemClock.elapsedRealtime();
@@ -796,8 +803,7 @@
                             PackageManager.MATCH_ANY_USER, userId) == callingUid) {
                         throw new IllegalArgumentException("Cannot set your own standby bucket");
                     }
-                    mAppStandby.setAppStandbyBucket(packageName, userId, bucket,
-                            UsageStatsManager.REASON_PREDICTED + ":" + callingUid,
+                    mAppStandby.setAppStandbyBucket(packageName, userId, bucket, reason,
                             elapsedRealtime);
                 }
             } finally {
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index e76d211..7a352a4 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -28,6 +28,7 @@
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.usb.descriptors.UsbDescriptor;
 import com.android.server.usb.descriptors.UsbDescriptorParser;
 import com.android.server.usb.descriptors.UsbDeviceDescriptor;
 import com.android.server.usb.descriptors.report.TextReportCanvas;
@@ -84,7 +85,10 @@
         String mDeviceAddress;
 
         static final int CONNECT = 0;
-        static final int DISCONNECT = 1;
+        static final int CONNECT_BADPARSE = 1;
+        static final int CONNECT_BADDEVICE = 2;
+        static final int DISCONNECT = -1;
+
         final int mMode;
         final byte[] mDescriptors;
 
@@ -100,8 +104,8 @@
         }
 
         void dumpShort(IndentingPrintWriter pw) {
-            if (mMode == CONNECT) {
-                pw.println(formatTime() + " Connect " + mDeviceAddress);
+            if (mMode != DISCONNECT) {
+                pw.println(formatTime() + " Connect " + mDeviceAddress + " mode:" + mMode);
                 UsbDescriptorParser parser = new UsbDescriptorParser(mDeviceAddress, mDescriptors);
 
                 UsbDeviceDescriptor deviceDescriptor = parser.getDeviceDescriptor();
@@ -115,9 +119,9 @@
             }
         }
 
-        void dumpLong(IndentingPrintWriter pw) {
-            if (mMode == CONNECT) {
-                pw.println(formatTime() + " Connect " + mDeviceAddress);
+        void dumpTree(IndentingPrintWriter pw) {
+            if (mMode != DISCONNECT) {
+                pw.println(formatTime() + " Connect " + mDeviceAddress + " mode:" + mMode);
                 UsbDescriptorParser parser = new UsbDescriptorParser(mDeviceAddress, mDescriptors);
                 StringBuilder stringBuilder = new StringBuilder();
                 UsbDescriptorsTree descriptorTree = new UsbDescriptorsTree();
@@ -131,6 +135,55 @@
                 pw.println(formatTime() + " Disconnect " + mDeviceAddress);
             }
         }
+
+        void dumpList(IndentingPrintWriter pw) {
+            if (mMode != DISCONNECT) {
+                pw.println(formatTime() + " Connect " + mDeviceAddress + " mode:" + mMode);
+                UsbDescriptorParser parser = new UsbDescriptorParser(mDeviceAddress, mDescriptors);
+                StringBuilder stringBuilder = new StringBuilder();
+                TextReportCanvas canvas = new TextReportCanvas(parser, stringBuilder);
+                for (UsbDescriptor descriptor : parser.getDescriptors()) {
+                    descriptor.report(canvas);
+                }
+                pw.println(stringBuilder.toString());
+
+                pw.println("isHeadset[in: " + parser.isInputHeadset()
+                        + " , out: " + parser.isOutputHeadset() + "]");
+            } else {
+                pw.println(formatTime() + " Disconnect " + mDeviceAddress);
+            }
+        }
+
+        private static final int kDumpBytesPerLine = 16;
+
+        void dumpRaw(IndentingPrintWriter pw) {
+            if (mMode != DISCONNECT) {
+                pw.println(formatTime() + " Connect " + mDeviceAddress + " mode:" + mMode);
+                int length = mDescriptors.length;
+                pw.println("Raw Descriptors " + length + " bytes");
+                int dataOffset = 0;
+                for (int line = 0; line < length / kDumpBytesPerLine; line++) {
+                    StringBuilder sb = new StringBuilder();
+                    for (int offset = 0; offset < kDumpBytesPerLine; offset++) {
+                        sb.append("0x")
+                            .append(String.format("0x%02X", mDescriptors[dataOffset++]))
+                            .append(" ");
+                    }
+                    pw.println(sb.toString());
+                }
+
+                // remainder
+                StringBuilder sb = new StringBuilder();
+                while (dataOffset < length) {
+                    sb.append("0x")
+                        .append(String.format("0x%02X", mDescriptors[dataOffset++]))
+                        .append(" ");
+                }
+                pw.println(sb.toString());
+            } else {
+                pw.println(formatTime() + " Disconnect " + mDeviceAddress);
+            }
+        }
     }
 
     /*
@@ -205,7 +258,7 @@
         ConnectionRecord rec =
                 new ConnectionRecord(deviceAddress, mode, rawDescriptors);
         mConnections.add(rec);
-        if (mode == ConnectionRecord.CONNECT) {
+        if (mode != ConnectionRecord.DISCONNECT) {
             mLastConnect = rec;
         }
     }
@@ -241,31 +294,41 @@
             if (parser.parseDescriptors(descriptors)) {
 
                 UsbDevice newDevice = parser.toAndroidUsbDevice();
-                mDevices.put(deviceAddress, newDevice);
-
-                // It is fine to call this only for the current user as all broadcasts are sent to
-                // all profiles of the user and the dialogs should only show once.
-                ComponentName usbDeviceConnectionHandler = getUsbDeviceConnectionHandler();
-                if (usbDeviceConnectionHandler == null) {
-                    getCurrentUserSettings().deviceAttached(newDevice);
+                if (newDevice == null) {
+                    Slog.e(TAG, "Couldn't create UsbDevice object.");
+                    // Tracking
+                    addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT_BADDEVICE,
+                            parser.getRawDescriptors());
                 } else {
-                    getCurrentUserSettings().deviceAttachedForFixedHandler(newDevice,
-                            usbDeviceConnectionHandler);
+                    mDevices.put(deviceAddress, newDevice);
+
+                    // It is fine to call this only for the current user as all broadcasts are
+                    // sent to all profiles of the user and the dialogs should only show once.
+                    ComponentName usbDeviceConnectionHandler = getUsbDeviceConnectionHandler();
+                    if (usbDeviceConnectionHandler == null) {
+                        getCurrentUserSettings().deviceAttached(newDevice);
+                    } else {
+                        getCurrentUserSettings().deviceAttachedForFixedHandler(newDevice,
+                                usbDeviceConnectionHandler);
+                    }
+
+                    // Headset?
+                    boolean isInputHeadset = parser.isInputHeadset();
+                    boolean isOutputHeadset = parser.isOutputHeadset();
+                    Slog.i(TAG, "---- isHeadset[in: " + isInputHeadset
+                            + " , out: " + isOutputHeadset + "]");
+
+                    mUsbAlsaManager.usbDeviceAdded(newDevice, isInputHeadset, isOutputHeadset);
+
+                    // Tracking
+                    addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT,
+                            parser.getRawDescriptors());
                 }
-
-                // Headset?
-                boolean isInputHeadset = parser.isInputHeadset();
-                boolean isOutputHeadset = parser.isOutputHeadset();
-                Slog.i(TAG, "---- isHeadset[in: " + isInputHeadset
-                        + " , out: " + isOutputHeadset + "]");
-
-                mUsbAlsaManager.usbDeviceAdded(newDevice, isInputHeadset, isOutputHeadset);
-
-                // Tracking
-                addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT,
-                        parser.getRawDescriptors());
             } else {
                 Slog.e(TAG, "Error parsing USB device descriptors for " + deviceAddress);
+                // Tracking
+                addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT_BADPARSE,
+                        parser.getRawDescriptors());
                 return false;
             }
         }
@@ -330,7 +393,11 @@
         }
     }
 
-    public void dump(IndentingPrintWriter pw) {
+    /**
+     * Dump out various information about the state of USB device connections.
+     *
+     */
+    public void dump(IndentingPrintWriter pw, String[] args) {
         pw.println("USB Host State:");
         synchronized (mHandlerLock) {
             if (mUsbDeviceConnectionHandler != null) {
@@ -342,21 +409,38 @@
                 pw.println("  " + name + ": " + mDevices.get(name));
             }
 
+            // Connections
             pw.println("" + mNumConnects + " total connects/disconnects");
             pw.println("Last " + mConnections.size() + " connections/disconnections");
             for (ConnectionRecord rec : mConnections) {
                 rec.dumpShort(pw);
             }
 
-            if (mLastConnect != null) {
-                pw.println("Last Connected USB Device:");
-                mLastConnect.dumpLong(pw);
-            }
         }
 
         mUsbAlsaManager.dump(pw);
     }
 
+    /**
+     * Dump various descriptor data.
+     */
+    public void dumpDescriptors(IndentingPrintWriter pw, String[] args) {
+        if (mLastConnect != null) {
+            pw.println("Last Connected USB Device:");
+            if (args.length <= 1 || args[1].equals("-dump-short")) {
+                mLastConnect.dumpShort(pw);
+            } else if (args[1].equals("-dump-tree")) {
+                mLastConnect.dumpTree(pw);
+            } else if (args[1].equals("-dump-list")) {
+                mLastConnect.dumpList(pw);
+            }  else if (args[1].equals("-dump-raw")) {
+                mLastConnect.dumpRaw(pw);
+            }
+        } else {
+            pw.println("No USB Devices have been connected.");
+        }
+    }
+
     private native void monitorUsbHostBus();
     private native ParcelFileDescriptor nativeOpenDevice(String deviceAddress);
 }
diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java
index 17de83f..8554cf7 100644
--- a/services/usb/java/com/android/server/usb/UsbService.java
+++ b/services/usb/java/com/android/server/usb/UsbService.java
@@ -496,7 +496,7 @@
                     mDeviceManager.dump(pw);
                 }
                 if (mHostManager != null) {
-                    mHostManager.dump(pw);
+                    mHostManager.dump(pw, args);
                 }
                 if (mPortManager != null) {
                     mPortManager.dump(pw);
@@ -504,7 +504,7 @@
                 mAlsaManager.dump(pw);
 
                 mSettingsManager.dump(pw);
-            } else if (args.length == 4 && "set-port-roles".equals(args[0])) {
+            } else if ("set-port-roles".equals(args[0]) && args.length == 4) {
                 final String portId = args[1];
                 final int powerRole;
                 switch (args[2]) {
@@ -546,7 +546,7 @@
                     pw.println();
                     mPortManager.dump(pw);
                 }
-            } else if (args.length == 3 && "add-port".equals(args[0])) {
+            } else if ("add-port".equals(args[0]) && args.length == 3) {
                 final String portId = args[1];
                 final int supportedModes;
                 switch (args[2]) {
@@ -571,7 +571,7 @@
                     pw.println();
                     mPortManager.dump(pw);
                 }
-            } else if (args.length == 5 && "connect-port".equals(args[0])) {
+            } else if ("connect-port".equals(args[0]) && args.length == 5) {
                 final String portId = args[1];
                 final int mode;
                 final boolean canChangeMode = args[2].endsWith("?");
@@ -618,30 +618,32 @@
                     pw.println();
                     mPortManager.dump(pw);
                 }
-            } else if (args.length == 2 && "disconnect-port".equals(args[0])) {
+            } else if ("disconnect-port".equals(args[0]) && args.length == 2) {
                 final String portId = args[1];
                 if (mPortManager != null) {
                     mPortManager.disconnectSimulatedPort(portId, pw);
                     pw.println();
                     mPortManager.dump(pw);
                 }
-            } else if (args.length == 2 && "remove-port".equals(args[0])) {
+            } else if ("remove-port".equals(args[0]) && args.length == 2) {
                 final String portId = args[1];
                 if (mPortManager != null) {
                     mPortManager.removeSimulatedPort(portId, pw);
                     pw.println();
                     mPortManager.dump(pw);
                 }
-            } else if (args.length == 1 && "reset".equals(args[0])) {
+            } else if ("reset".equals(args[0]) && args.length == 1) {
                 if (mPortManager != null) {
                     mPortManager.resetSimulation(pw);
                     pw.println();
                     mPortManager.dump(pw);
                 }
-            } else if (args.length == 1 && "ports".equals(args[0])) {
+            } else if ("ports".equals(args[0]) && args.length == 1) {
                 if (mPortManager != null) {
                     mPortManager.dump(pw);
                 }
+            } else if ("dump-descriptors".equals(args[0])) {
+                mHostManager.dumpDescriptors(pw, args);
             } else {
                 pw.println("Dump current USB state or issue command:");
                 pw.println("  ports");
@@ -678,6 +680,12 @@
                 pw.println("  dumpsys usb add-port \"matrix\" ufp");
                 pw.println("  dumpsys usb connect-port \"matrix\" ufp sink device");
                 pw.println("  dumpsys usb reset");
+                pw.println();
+                pw.println("Example USB device descriptors:");
+                pw.println("  dumpsys usb dump-descriptors -dump-short");
+                pw.println("  dumpsys usb dump-descriptors -dump-tree");
+                pw.println("  dumpsys usb dump-descriptors -dump-list");
+                pw.println("  dumpsys usb dump-descriptors -dump-raw");
             }
         } finally {
             Binder.restoreCallingIdentity(ident);
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java
index 993778f..639aa4e 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbConfigDescriptor.java
@@ -17,6 +17,7 @@
 
 import android.hardware.usb.UsbConfiguration;
 import android.hardware.usb.UsbInterface;
+import android.util.Log;
 
 import com.android.server.usb.descriptors.report.ReportCanvas;
 
@@ -29,6 +30,7 @@
  */
 public final class UsbConfigDescriptor extends UsbDescriptor {
     private static final String TAG = "UsbConfigDescriptor";
+    private static final boolean DEBUG = false;
 
     private int mTotalLength;    // 2:2 Total length in bytes of data returned
     private byte mNumInterfaces; // 4:1 Number of Interfaces
@@ -77,10 +79,16 @@
     }
 
     UsbConfiguration toAndroid(UsbDescriptorParser parser) {
+        if (DEBUG) {
+            Log.d(TAG, "  toAndroid()");
+        }
         String name = parser.getDescriptorString(mConfigIndex);
         UsbConfiguration config = new
                 UsbConfiguration(mConfigValue, name, mAttribs, mMaxPower);
         UsbInterface[] interfaces = new UsbInterface[mInterfaceDescriptors.size()];
+        if (DEBUG) {
+            Log.d(TAG, "    " + mInterfaceDescriptors.size() + " interfaces.");
+        }
         for (int index = 0; index < mInterfaceDescriptors.size(); index++) {
             interfaces[index] = mInterfaceDescriptors.get(index).toAndroid(parser);
         }
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java
index 78c7fdc..7a1e9e2 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java
@@ -26,7 +26,7 @@
  */
 public final class UsbDescriptorParser {
     private static final String TAG = "UsbDescriptorParser";
-    private static final boolean DEBUG = false;
+    private static final boolean DEBUG = true;
 
     private final String mDeviceAddr;
 
@@ -289,10 +289,15 @@
      */
     public UsbDevice toAndroidUsbDevice() {
         if (mDeviceDescriptor == null) {
+            Log.e(TAG, "toAndroidUsbDevice() ERROR - No Device Descriptor");
             return null;
         }
 
-        return mDeviceDescriptor.toAndroid(this);
+        UsbDevice device = mDeviceDescriptor.toAndroid(this);
+        if (device == null) {
+            Log.e(TAG, "toAndroidUsbDevice() ERROR Creating Device");
+        }
+        return device;
     }
 
     /**
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java
index 8e7f0fd..e31e3a3 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbDeviceDescriptor.java
@@ -17,6 +17,7 @@
 
 import android.hardware.usb.UsbConfiguration;
 import android.hardware.usb.UsbDevice;
+import android.util.Log;
 
 import com.android.server.usb.descriptors.report.ReportCanvas;
 import com.android.server.usb.descriptors.report.UsbStrings;
@@ -30,6 +31,7 @@
  */
 public final class UsbDeviceDescriptor extends UsbDescriptor {
     private static final String TAG = "UsbDeviceDescriptor";
+    private static final boolean DEBUG = false;
 
     public static final int USBSPEC_1_0 = 0x0100;
     public static final int USBSPEC_1_1 = 0x0110;
@@ -113,19 +115,30 @@
      * @hide
      */
     public UsbDevice toAndroid(UsbDescriptorParser parser) {
+        if (DEBUG) {
+            Log.d(TAG, "toAndroid()");
+        }
+
         String mfgName = parser.getDescriptorString(mMfgIndex);
         String prodName = parser.getDescriptorString(mProductIndex);
+        if (DEBUG) {
+            Log.d(TAG, "  mfgName:" + mfgName + " prodName:" + prodName);
+        }
 
         // Create version string in "%.%" format
         String versionString =
                 Integer.toString(mDeviceRelease >> 8) + "." + (mDeviceRelease & 0xFF);
         String serialStr = parser.getDescriptorString(mSerialNum);
+        if (DEBUG) {
+            Log.d(TAG, "  versionString:" + versionString + " serialStr:" + serialStr);
+        }
 
         UsbDevice device = new UsbDevice(parser.getDeviceAddr(), mVendorID, mProductID,
                 mDevClass, mDevSubClass,
                 mProtocol, mfgName, prodName,
                 versionString, serialStr);
         UsbConfiguration[] configs = new UsbConfiguration[mConfigDescriptors.size()];
+        Log.d(TAG, "  " + configs.length + " configs");
         for (int index = 0; index < mConfigDescriptors.size(); index++) {
             configs[index] = mConfigDescriptors.get(index).toAndroid(parser);
         }
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java
index 1130238..4da31ea 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbEndpointDescriptor.java
@@ -16,6 +16,7 @@
 package com.android.server.usb.descriptors;
 
 import android.hardware.usb.UsbEndpoint;
+import android.util.Log;
 
 import com.android.server.usb.descriptors.report.ReportCanvas;
 
@@ -26,6 +27,7 @@
  */
 public class UsbEndpointDescriptor extends UsbDescriptor {
     private static final String TAG = "UsbEndpointDescriptor";
+    private static final boolean DEBUG = false;
 
     public static final int MASK_ENDPOINT_ADDRESS = 0b000000000001111;
     public static final int MASK_ENDPOINT_DIRECTION = (byte) 0b0000000010000000;
@@ -108,6 +110,12 @@
     }
 
     /* package */ UsbEndpoint toAndroid(UsbDescriptorParser parser) {
+        if (DEBUG) {
+            Log.d(TAG, "toAndroid() type:"
+                    + Integer.toHexString(mAttributes & MASK_ATTRIBS_TRANSTYPE)
+                    + " sync:" + Integer.toHexString(mAttributes & MASK_ATTRIBS_SYNCTYPE)
+                    + " usage:" + Integer.toHexString(mAttributes & MASK_ATTRIBS_USEAGE));
+        }
         return new UsbEndpoint(mEndpointAddress, mAttributes, mPacketSize, mInterval);
     }
 
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java
index d87b1af..632e3dc 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbInterfaceDescriptor.java
@@ -17,6 +17,7 @@
 
 import android.hardware.usb.UsbEndpoint;
 import android.hardware.usb.UsbInterface;
+import android.util.Log;
 
 import com.android.server.usb.descriptors.report.ReportCanvas;
 import com.android.server.usb.descriptors.report.UsbStrings;
@@ -30,6 +31,7 @@
  */
 public class UsbInterfaceDescriptor extends UsbDescriptor {
     private static final String TAG = "UsbInterfaceDescriptor";
+    private static final boolean DEBUG = false;
 
     protected int mInterfaceNumber;   // 2:1 Number of Interface
     protected byte mAlternateSetting; // 3:1 Value used to select alternative setting
@@ -93,6 +95,11 @@
     }
 
     UsbInterface toAndroid(UsbDescriptorParser parser) {
+        if (DEBUG) {
+            Log.d(TAG, "toAndroid() class:" + Integer.toHexString(mUsbClass)
+                    + " subclass:" + Integer.toHexString(mUsbSubclass)
+                    + " " + mEndpointDescriptors.size() + " endpoints.");
+        }
         String name = parser.getDescriptorString(mDescrIndex);
         UsbInterface ntrface = new UsbInterface(
                 mInterfaceNumber, mAlternateSetting, name, mUsbClass, mUsbSubclass, mProtocol);
diff --git a/tests/net/java/android/net/IpSecManagerTest.java b/tests/net/java/android/net/IpSecManagerTest.java
index ccb0f3b..0f40b45 100644
--- a/tests/net/java/android/net/IpSecManagerTest.java
+++ b/tests/net/java/android/net/IpSecManagerTest.java
@@ -80,7 +80,7 @@
         int resourceId = 1;
         IpSecSpiResponse spiResp =
                 new IpSecSpiResponse(IpSecManager.Status.OK, resourceId, DROID_SPI);
-        when(mMockIpSecService.reserveSecurityParameterIndex(
+        when(mMockIpSecService.allocateSecurityParameterIndex(
                         eq(IpSecTransform.DIRECTION_IN),
                         eq(GOOGLE_DNS_4.getHostAddress()),
                         eq(DROID_SPI),
@@ -88,7 +88,7 @@
                 .thenReturn(spiResp);
 
         IpSecManager.SecurityParameterIndex droidSpi =
-                mIpSecManager.reserveSecurityParameterIndex(
+                mIpSecManager.allocateSecurityParameterIndex(
                         IpSecTransform.DIRECTION_IN, GOOGLE_DNS_4, DROID_SPI);
         assertEquals(DROID_SPI, droidSpi.getSpi());
 
@@ -102,7 +102,7 @@
         int resourceId = 1;
         IpSecSpiResponse spiResp =
                 new IpSecSpiResponse(IpSecManager.Status.OK, resourceId, DROID_SPI);
-        when(mMockIpSecService.reserveSecurityParameterIndex(
+        when(mMockIpSecService.allocateSecurityParameterIndex(
                         eq(IpSecTransform.DIRECTION_OUT),
                         eq(GOOGLE_DNS_4.getHostAddress()),
                         eq(IpSecManager.INVALID_SECURITY_PARAMETER_INDEX),
@@ -110,7 +110,7 @@
                 .thenReturn(spiResp);
 
         IpSecManager.SecurityParameterIndex randomSpi =
-                mIpSecManager.reserveSecurityParameterIndex(
+                mIpSecManager.allocateSecurityParameterIndex(
                         IpSecTransform.DIRECTION_OUT, GOOGLE_DNS_4);
 
         assertEquals(DROID_SPI, randomSpi.getSpi());
@@ -127,12 +127,13 @@
     public void testAllocSpiResUnavaiableExeption() throws Exception {
         IpSecSpiResponse spiResp =
                 new IpSecSpiResponse(IpSecManager.Status.RESOURCE_UNAVAILABLE, 0, 0);
-        when(mMockIpSecService.reserveSecurityParameterIndex(
+        when(mMockIpSecService.allocateSecurityParameterIndex(
                         anyInt(), anyString(), anyInt(), anyObject()))
                 .thenReturn(spiResp);
 
         try {
-            mIpSecManager.reserveSecurityParameterIndex(IpSecTransform.DIRECTION_OUT, GOOGLE_DNS_4);
+            mIpSecManager.allocateSecurityParameterIndex(
+                    IpSecTransform.DIRECTION_OUT, GOOGLE_DNS_4);
             fail("ResourceUnavailableException was not thrown");
         } catch (IpSecManager.ResourceUnavailableException e) {
         }
@@ -144,12 +145,13 @@
     @Test
     public void testAllocSpiSpiUnavaiableExeption() throws Exception {
         IpSecSpiResponse spiResp = new IpSecSpiResponse(IpSecManager.Status.SPI_UNAVAILABLE, 0, 0);
-        when(mMockIpSecService.reserveSecurityParameterIndex(
+        when(mMockIpSecService.allocateSecurityParameterIndex(
                         anyInt(), anyString(), anyInt(), anyObject()))
                 .thenReturn(spiResp);
 
         try {
-            mIpSecManager.reserveSecurityParameterIndex(IpSecTransform.DIRECTION_OUT, GOOGLE_DNS_4);
+            mIpSecManager.allocateSecurityParameterIndex(
+                    IpSecTransform.DIRECTION_OUT, GOOGLE_DNS_4);
             fail("ResourceUnavailableException was not thrown");
         } catch (IpSecManager.ResourceUnavailableException e) {
         }
@@ -161,7 +163,7 @@
     @Test
     public void testRequestAllocInvalidSpi() throws Exception {
         try {
-            mIpSecManager.reserveSecurityParameterIndex(
+            mIpSecManager.allocateSecurityParameterIndex(
                     IpSecTransform.DIRECTION_OUT, GOOGLE_DNS_4, 0);
             fail("Able to allocate invalid spi");
         } catch (IllegalArgumentException e) {
diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
index 20a4897..80e42a3 100644
--- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
@@ -125,7 +125,7 @@
                 .thenReturn(TEST_SPI_OUT);
 
         IpSecSpiResponse spiResp =
-                mIpSecService.reserveSecurityParameterIndex(
+                mIpSecService.allocateSecurityParameterIndex(
                         IpSecTransform.DIRECTION_OUT, mRemoteAddr, TEST_SPI_OUT, new Binder());
         assertEquals(IpSecManager.Status.OK, spiResp.status);
         assertEquals(TEST_SPI_OUT, spiResp.spi);
@@ -142,7 +142,7 @@
                 .thenReturn(TEST_SPI_OUT);
 
         IpSecSpiResponse spiResp =
-                mIpSecService.reserveSecurityParameterIndex(
+                mIpSecService.allocateSecurityParameterIndex(
                         IpSecTransform.DIRECTION_OUT, mRemoteAddr, TEST_SPI_OUT, new Binder());
 
         mIpSecService.releaseSecurityParameterIndex(spiResp.resourceId);
@@ -178,7 +178,7 @@
                 .thenReturn(TEST_SPI_OUT);
 
         IpSecSpiResponse spiResp =
-                mIpSecService.reserveSecurityParameterIndex(
+                mIpSecService.allocateSecurityParameterIndex(
                         IpSecTransform.DIRECTION_OUT, mRemoteAddr, TEST_SPI_OUT, new Binder());
 
         IpSecService.UserRecord userRecord =
@@ -212,7 +212,7 @@
                 .thenReturn(returnSpi);
 
         IpSecSpiResponse spi =
-                mIpSecService.reserveSecurityParameterIndex(
+                mIpSecService.allocateSecurityParameterIndex(
                         direction,
                         NetworkUtils.numericToInetAddress(remoteAddress).getHostAddress(),
                         IpSecManager.INVALID_SECURITY_PARAMETER_INDEX,
diff --git a/tests/net/java/com/android/server/IpSecServiceTest.java b/tests/net/java/com/android/server/IpSecServiceTest.java
index 354ad2a..8683c12 100644
--- a/tests/net/java/com/android/server/IpSecServiceTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceTest.java
@@ -287,7 +287,7 @@
         for (String address : invalidAddresses) {
             try {
                 IpSecSpiResponse spiResp =
-                        mIpSecService.reserveSecurityParameterIndex(
+                        mIpSecService.allocateSecurityParameterIndex(
                                 IpSecTransform.DIRECTION_OUT, address, DROID_SPI, new Binder());
                 fail("Invalid address was passed through IpSecService validation: " + address);
             } catch (IllegalArgumentException e) {
@@ -368,7 +368,7 @@
         // Reserve spis until it fails.
         for (int i = 0; i < MAX_NUM_SPIS; i++) {
             IpSecSpiResponse newSpi =
-                    mIpSecService.reserveSecurityParameterIndex(
+                    mIpSecService.allocateSecurityParameterIndex(
                             0x1,
                             InetAddress.getLoopbackAddress().getHostAddress(),
                             DROID_SPI + i,
@@ -384,7 +384,7 @@
 
         // Try to reserve one more SPI, and should fail.
         IpSecSpiResponse extraSpi =
-                mIpSecService.reserveSecurityParameterIndex(
+                mIpSecService.allocateSecurityParameterIndex(
                         0x1,
                         InetAddress.getLoopbackAddress().getHostAddress(),
                         DROID_SPI + MAX_NUM_SPIS,
@@ -398,7 +398,7 @@
 
         // Should successfully reserve one more spi.
         extraSpi =
-                mIpSecService.reserveSecurityParameterIndex(
+                mIpSecService.allocateSecurityParameterIndex(
                         0x1,
                         InetAddress.getLoopbackAddress().getHostAddress(),
                         DROID_SPI + MAX_NUM_SPIS,
diff --git a/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk
index 94686c0..2da294c 100644
--- a/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk
+++ b/tools/aapt2/integration-tests/NamespaceTest/App/Android.mk
@@ -20,6 +20,7 @@
 LOCAL_USE_AAPT2 := true
 LOCAL_AAPT_NAMESPACES := true
 LOCAL_PACKAGE_NAME := AaptTestNamespace_App
+LOCAL_EXPORT_PACKAGE_RESOURCES := true
 LOCAL_MODULE_TAGS := tests
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 LOCAL_STATIC_ANDROID_LIBRARIES := \
diff --git a/tools/aapt2/integration-tests/NamespaceTest/App/res/values/values.xml b/tools/aapt2/integration-tests/NamespaceTest/App/res/values/values.xml
index 1b80d95..174e746 100644
--- a/tools/aapt2/integration-tests/NamespaceTest/App/res/values/values.xml
+++ b/tools/aapt2/integration-tests/NamespaceTest/App/res/values/values.xml
@@ -26,4 +26,4 @@
             @com.android.aapt.namespace.libtwo:string/public_string
         </item>
     </style>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/tools/aapt2/integration-tests/NamespaceTest/Split/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/Split/Android.mk
new file mode 100644
index 0000000..a35f6ed
--- /dev/null
+++ b/tools/aapt2/integration-tests/NamespaceTest/Split/Android.mk
@@ -0,0 +1,28 @@
+#
+# 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_AAPT_NAMESPACES := true
+LOCAL_PACKAGE_NAME := AaptTestNamespace_Split
+LOCAL_MODULE_TAGS := tests
+LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_APK_LIBRARIES := AaptTestNamespace_App
+LOCAL_RES_LIBRARIES := AaptTestNamespace_App
+LOCAL_AAPT_FLAGS := --package-id 0x80 --rename-manifest-package com.android.aapt.namespace.app
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/NamespaceTest/Split/AndroidManifest.xml b/tools/aapt2/integration-tests/NamespaceTest/Split/AndroidManifest.xml
new file mode 100644
index 0000000..bc9583b
--- /dev/null
+++ b/tools/aapt2/integration-tests/NamespaceTest/Split/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?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.namespace.split"
+    featureSplit="split">
+
+    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26"/>
+
+    <application>
+        <activity android:name=".SplitActivity" android:theme="@style/ActivityTheme">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tools/aapt2/integration-tests/NamespaceTest/Split/res/values/values.xml b/tools/aapt2/integration-tests/NamespaceTest/Split/res/values/values.xml
new file mode 100644
index 0000000..63da552
--- /dev/null
+++ b/tools/aapt2/integration-tests/NamespaceTest/Split/res/values/values.xml
@@ -0,0 +1,25 @@
+<?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>
+    <string name="activity_name">Namespace Split</string>
+
+    <style name="ActivityTheme" parent="com.android.aapt.namespace.libone:style/Theme">
+        <item name="android:colorPrimary">#FF9800</item>
+        <item name="android:colorPrimaryDark">#E65100</item>
+        <item name="android:colorAccent">#FFD180</item>
+    </style>
+</resources>
diff --git a/tools/aapt2/integration-tests/NamespaceTest/Split/src/com/android/aapt/namespace/split/SplitActivity.java b/tools/aapt2/integration-tests/NamespaceTest/Split/src/com/android/aapt/namespace/split/SplitActivity.java
new file mode 100644
index 0000000..3fff3cf
--- /dev/null
+++ b/tools/aapt2/integration-tests/NamespaceTest/Split/src/com/android/aapt/namespace/split/SplitActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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.aapt.namespace.split;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SplitActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 2d517c7..0cfc0bd 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -30,7 +30,8 @@
 #include "ValueVisitor.h"
 #include "util/Util.h"
 
-using android::StringPiece;
+using ::android::StringPiece;
+using ::android::StringPiece16;
 
 namespace aapt {
 
@@ -291,11 +292,34 @@
   const std::u16string package16 = util::Utf8ToUtf16(name.package);
   const std::u16string type16 = util::Utf8ToUtf16(to_string(name.type));
   const std::u16string entry16 = util::Utf8ToUtf16(name.entry);
+  const std::u16string mangled_entry16 =
+      util::Utf8ToUtf16(NameMangler::MangleEntry(name.package, name.entry));
 
-  uint32_t type_spec_flags = 0;
-  ResourceId res_id = table.identifierForName(
-      entry16.data(), entry16.size(), type16.data(), type16.size(),
-      package16.data(), package16.size(), &type_spec_flags);
+  uint32_t type_spec_flags;
+  ResourceId res_id;
+
+  // There can be mangled resources embedded within other packages. Here we will
+  // look into each package and look-up the mangled name until we find the resource.
+  const size_t count = table.getBasePackageCount();
+  for (size_t i = 0; i < count; i++) {
+    const android::String16 package_name = table.getBasePackageName(i);
+    StringPiece16 real_package16 = package16;
+    StringPiece16 real_entry16 = entry16;
+    std::u16string scratch_entry16;
+    if (StringPiece16(package_name) != package16) {
+      real_entry16 = mangled_entry16;
+      real_package16 = package_name.string();
+    }
+
+    type_spec_flags = 0;
+    res_id = table.identifierForName(real_entry16.data(), real_entry16.size(), type16.data(),
+                                     type16.size(), real_package16.data(), real_package16.size(),
+                                     &type_spec_flags);
+    if (res_id.is_valid()) {
+      break;
+    }
+  }
+
   if (!res_id.is_valid()) {
     return {};
   }
diff --git a/tools/aapt2/process/SymbolTable_test.cpp b/tools/aapt2/process/SymbolTable_test.cpp
index fd8a508..1f59d70 100644
--- a/tools/aapt2/process/SymbolTable_test.cpp
+++ b/tools/aapt2/process/SymbolTable_test.cpp
@@ -16,7 +16,15 @@
 
 #include "process/SymbolTable.h"
 
+#include "SdkConstants.h"
+#include "format/binary/TableFlattener.h"
 #include "test/Test.h"
+#include "util/BigBuffer.h"
+
+using ::testing::Eq;
+using ::testing::IsNull;
+using ::testing::Ne;
+using ::testing::NotNull;
 
 namespace aapt {
 
@@ -30,13 +38,13 @@
           .Build();
 
   ResourceTableSymbolSource symbol_source(table.get());
-  EXPECT_NE(nullptr, symbol_source.FindByName(test::ParseNameOrDie("android:id/foo")));
-  EXPECT_NE(nullptr, symbol_source.FindByName(test::ParseNameOrDie("android:id/bar")));
+  EXPECT_THAT(symbol_source.FindByName(test::ParseNameOrDie("android:id/foo")), NotNull());
+  EXPECT_THAT(symbol_source.FindByName(test::ParseNameOrDie("android:id/bar")), NotNull());
 
   std::unique_ptr<SymbolTable::Symbol> s =
       symbol_source.FindByName(test::ParseNameOrDie("android:attr/foo"));
-  ASSERT_NE(nullptr, s);
-  EXPECT_NE(nullptr, s->attribute);
+  ASSERT_THAT(s, NotNull());
+  EXPECT_THAT(s->attribute, NotNull());
 }
 
 TEST(ResourceTableSymbolSourceTest, FindPrivateAttrSymbol) {
@@ -49,8 +57,8 @@
   ResourceTableSymbolSource symbol_source(table.get());
   std::unique_ptr<SymbolTable::Symbol> s =
       symbol_source.FindByName(test::ParseNameOrDie("android:attr/foo"));
-  ASSERT_NE(nullptr, s);
-  EXPECT_NE(nullptr, s->attribute);
+  ASSERT_THAT(s, NotNull());
+  EXPECT_THAT(s->attribute, NotNull());
 }
 
 TEST(SymbolTableTest, FindByName) {
@@ -64,8 +72,52 @@
   SymbolTable symbol_table(&mangler);
   symbol_table.AppendSource(util::make_unique<ResourceTableSymbolSource>(table.get()));
 
-  EXPECT_NE(nullptr, symbol_table.FindByName(test::ParseNameOrDie("id/foo")));
-  EXPECT_NE(nullptr, symbol_table.FindByName(test::ParseNameOrDie("com.android.lib:id/foo")));
+  EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("id/foo")), NotNull());
+  EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("com.android.lib:id/foo")), NotNull());
+}
+
+TEST(SymbolTableTest, FindByNameWhenSymbolIsMangledInResTable) {
+  using namespace android;
+
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .SetCompilationPackage("com.android.app")
+          .SetPackageId(0x7f)
+          .SetPackageType(PackageType::kApp)
+          .SetMinSdkVersion(SDK_LOLLIPOP_MR1)
+          .SetNameManglerPolicy(NameManglerPolicy{"com.android.app"})
+          .Build();
+
+  // Create a ResourceTable with a mangled resource, simulating a static library being merged into
+  // the main application package.
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .AddSimple("com.android.app:id/" + NameMangler::MangleEntry("com.android.lib", "foo"),
+                     ResourceId(0x7f020000))
+          .AddSimple("com.android.app:id/bar", ResourceId(0x7f020001))
+          .Build();
+
+  BigBuffer buffer(1024u);
+  TableFlattener flattener({}, &buffer);
+  ASSERT_TRUE(flattener.Consume(context.get(), table.get()));
+
+  std::unique_ptr<uint8_t[]> data = util::Copy(buffer);
+
+  // Construct the test AssetManager.
+  auto asset_manager_source = util::make_unique<AssetManagerSymbolSource>();
+  ResTable& res_table = const_cast<ResTable&>(
+      asset_manager_source->GetAssetManager()->getResources(false /*required*/));
+  ASSERT_THAT(res_table.add(data.get(), buffer.size()), Eq(NO_ERROR));
+
+  SymbolTable symbol_table(context->GetNameMangler());
+  symbol_table.AppendSource(std::move(asset_manager_source));
+
+  EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("com.android.lib:id/foo")), NotNull());
+  EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("com.android.app:id/bar")), NotNull());
+
+  EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("com.android.app:id/foo")), IsNull());
+  EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("com.android.lib:id/bar")), IsNull());
+  EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("com.android.other:id/foo")), IsNull());
 }
 
 }  // namespace aapt
diff --git a/tools/streaming_proto/cpp/main.cpp b/tools/streaming_proto/cpp/main.cpp
index 4779020..745b3dc 100644
--- a/tools/streaming_proto/cpp/main.cpp
+++ b/tools/streaming_proto/cpp/main.cpp
@@ -85,11 +85,17 @@
     return message.options().GetExtension(stream_msg).enable_fields_mapping();
 }
 
+static inline bool
+should_generate_fields_mapping_recursively(const DescriptorProto& message) {
+    return message.options().GetExtension(stream_msg).enable_fields_mapping_recursively();
+}
+
 static void
-write_message(stringstream& text, const DescriptorProto& message, const string& indent)
+write_message(stringstream& text, const DescriptorProto& message, const string& indent, bool genMapping)
 {
     int N;
     const string indented = indent + INDENT;
+    genMapping |= should_generate_fields_mapping_recursively(message);
 
     text << indent << "// message " << message.name() << endl;
     text << indent << "namespace " << message.name() << " {" << endl;
@@ -103,7 +109,7 @@
     // Nested classes
     N = message.nested_type_size();
     for (int i=0; i<N; i++) {
-        write_message(text, message.nested_type(i), indented);
+        write_message(text, message.nested_type(i), indented, genMapping);
     }
 
     // Fields
@@ -112,7 +118,7 @@
         write_field(text, message.field(i), indented);
     }
 
-    if (should_generate_fields_mapping(message)) {
+    if (genMapping | should_generate_fields_mapping(message)) {
         N = message.field_size();
         text << indented << "const int _FIELD_COUNT = " << N << ";" << endl;
         text << indented << "const char* _FIELD_NAMES[" << N << "] = {" << endl;
@@ -161,7 +167,7 @@
 
     N = file_descriptor.message_type_size();
     for (size_t i=0; i<N; i++) {
-        write_message(text, file_descriptor.message_type(i), "");
+        write_message(text, file_descriptor.message_type(i), "", false);
     }
 
     for (vector<string>::iterator it = namespaces.begin(); it != namespaces.end(); it++) {
diff --git a/tools/streaming_proto/stream.proto b/tools/streaming_proto/stream.proto
index c081209..e9b24a8 100644
--- a/tools/streaming_proto/stream.proto
+++ b/tools/streaming_proto/stream.proto
@@ -24,6 +24,9 @@
 message MessageOptions {
   // creates a mapping of field names of the message to its field ids
   optional bool enable_fields_mapping = 1;
+
+  // creates mapping between field names to its field ids and recursively for its submessages.
+  optional bool enable_fields_mapping_recursively = 2;
 }
 
 extend google.protobuf.MessageOptions {
diff --git a/wifi/java/android/net/wifi/aware/PublishConfig.java b/wifi/java/android/net/wifi/aware/PublishConfig.java
index e60f52f..7a5049d 100644
--- a/wifi/java/android/net/wifi/aware/PublishConfig.java
+++ b/wifi/java/android/net/wifi/aware/PublishConfig.java
@@ -182,7 +182,7 @@
      *
      * @hide
      */
-    public void assertValid(Characteristics characteristics)
+    public void assertValid(Characteristics characteristics, boolean rttSupported)
             throws IllegalArgumentException {
         WifiAwareUtils.validateServiceName(mServiceName);
 
@@ -216,6 +216,10 @@
                         "Match filter longer than supported by device characteristics");
             }
         }
+
+        if (!rttSupported && mEnableRanging) {
+            throw new IllegalArgumentException("Ranging is not supported");
+        }
     }
 
     /**
@@ -364,6 +368,9 @@
          * Optional. Disabled by default - i.e. any peer which attempts to measure distance to this
          * device will be refused. If the peer has ranging enabled (using the
          * {@link SubscribeConfig} APIs listed above, it will never discover this device.
+         * <p>
+         * The device must support Wi-Fi RTT for this feature to be used. Feature support is checked
+         * as described in {@link android.net.wifi.rtt}.
          *
          * @param enable If true, ranging is supported on request of the peer.
          *
diff --git a/wifi/java/android/net/wifi/aware/SubscribeConfig.java b/wifi/java/android/net/wifi/aware/SubscribeConfig.java
index f6552a7..91f8e520 100644
--- a/wifi/java/android/net/wifi/aware/SubscribeConfig.java
+++ b/wifi/java/android/net/wifi/aware/SubscribeConfig.java
@@ -224,7 +224,7 @@
      *
      * @hide
      */
-    public void assertValid(Characteristics characteristics)
+    public void assertValid(Characteristics characteristics, boolean rttSupported)
             throws IllegalArgumentException {
         WifiAwareUtils.validateServiceName(mServiceName);
 
@@ -269,6 +269,10 @@
             throw new IllegalArgumentException(
                     "Maximum distance must be greater than minimum distance");
         }
+
+        if (!rttSupported && (mMinDistanceMmSet || mMaxDistanceMmSet)) {
+            throw new IllegalArgumentException("Ranging is not supported");
+        }
     }
 
     /**
@@ -422,6 +426,9 @@
          * peer must enable ranging using
          * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. Otherwise discovery will
          * never be triggered.
+         * <p>
+         * The device must support Wi-Fi RTT for this feature to be used. Feature support is checked
+         * as described in {@link android.net.wifi.rtt}.
          *
          * @param minDistanceMm Minimum distance, in mm, to the publisher above which to trigger
          *                      discovery.
@@ -450,6 +457,9 @@
          * peer must enable ranging using
          * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. Otherwise discovery will
          * never be triggered.
+         * <p>
+         * The device must support Wi-Fi RTT for this feature to be used. Feature support is checked
+         * as described in {@link android.net.wifi.rtt}.
          *
          * @param maxDistanceMm Maximum distance, in mm, to the publisher below which to trigger
          *                      discovery.