Merge "Disallow safe boot when in demo mode" into nyc-mr1-dev
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
index 8692336..9fa8a5d 100644
--- a/core/java/android/app/ApplicationErrorReport.java
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -345,7 +345,7 @@
             PrintWriter pw = new FastPrintWriter(sw, false, 256);
             tr.printStackTrace(pw);
             pw.flush();
-            stackTrace = sw.toString();
+            stackTrace = sanitizeString(sw.toString());
             exceptionMessage = tr.getMessage();
 
             // Populate fields with the "root cause" exception
@@ -374,6 +374,29 @@
                 throwMethodName = "unknown";
                 throwLineNumber = 0;
             }
+
+            exceptionMessage = sanitizeString(exceptionMessage);
+        }
+
+        /**
+         * Ensure that the string is of reasonable size, truncating from the middle if needed.
+         */
+        private String sanitizeString(String s) {
+            int prefixLength = 10 * 1024;
+            int suffixLength = 10 * 1024;
+            int acceptableLength = prefixLength + suffixLength;
+
+            if (s != null && s.length() > acceptableLength) {
+                String replacement =
+                        "\n[TRUNCATED " + (s.length() - acceptableLength) + " CHARS]\n";
+
+                StringBuilder sb = new StringBuilder(acceptableLength + replacement.length());
+                sb.append(s.substring(0, prefixLength));
+                sb.append(replacement);
+                sb.append(s.substring(s.length() - suffixLength));
+                return sb.toString();
+            }
+            return s;
         }
 
         /**
diff --git a/core/java/android/hardware/location/ContextHubService.java b/core/java/android/hardware/location/ContextHubService.java
index 43e596f..fcbc962 100644
--- a/core/java/android/hardware/location/ContextHubService.java
+++ b/core/java/android/hardware/location/ContextHubService.java
@@ -16,6 +16,11 @@
 
 package android.hardware.location;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+
 import android.Manifest;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -53,10 +58,14 @@
     private static final int PRE_LOADED_APP_MEM_REQ = 0;
 
     private static final int MSG_HEADER_SIZE = 4;
-    private static final int MSG_FIELD_TYPE = 0;
-    private static final int MSG_FIELD_VERSION = 1;
-    private static final int MSG_FIELD_HUB_HANDLE = 2;
-    private static final int MSG_FIELD_APP_INSTANCE = 3;
+    private static final int HEADER_FIELD_MSG_TYPE = 0;
+    private static final int HEADER_FIELD_MSG_VERSION = 1;
+    private static final int HEADER_FIELD_HUB_HANDLE = 2;
+    private static final int HEADER_FIELD_APP_INSTANCE = 3;
+
+    private static final int HEADER_FIELD_LOAD_APP_ID_LO = MSG_HEADER_SIZE;
+    private static final int HEADER_FIELD_LOAD_APP_ID_HI = MSG_HEADER_SIZE + 1;
+    private static final int MSG_LOAD_APP_HEADER_SIZE = MSG_HEADER_SIZE + 2;
 
     private static final int OS_APP_INSTANCE = -1;
 
@@ -146,11 +155,16 @@
             return -1;
         }
 
-        int[] msgHeader = new int[MSG_HEADER_SIZE];
-        msgHeader[MSG_FIELD_HUB_HANDLE] = contextHubHandle;
-        msgHeader[MSG_FIELD_APP_INSTANCE] = OS_APP_INSTANCE;
-        msgHeader[MSG_FIELD_VERSION] = 0;
-        msgHeader[MSG_FIELD_TYPE] = MSG_LOAD_NANO_APP;
+        int[] msgHeader = new int[MSG_LOAD_APP_HEADER_SIZE];
+        msgHeader[HEADER_FIELD_HUB_HANDLE] = contextHubHandle;
+        msgHeader[HEADER_FIELD_APP_INSTANCE] = OS_APP_INSTANCE;
+        msgHeader[HEADER_FIELD_MSG_VERSION] = 0;
+        msgHeader[HEADER_FIELD_MSG_TYPE] = MSG_LOAD_NANO_APP;
+
+        long appId = app.getAppId();
+
+        msgHeader[HEADER_FIELD_LOAD_APP_ID_LO] = (int)(appId & 0xFFFFFFFF);
+        msgHeader[HEADER_FIELD_LOAD_APP_ID_HI] = (int)((appId >> 32) & 0xFFFFFFFF);
 
         if (nativeSendMessage(msgHeader, app.getAppBinary()) != 0) {
             return -1;
@@ -169,12 +183,14 @@
 
         // Call Native interface here
         int[] msgHeader = new int[MSG_HEADER_SIZE];
-        msgHeader[MSG_FIELD_HUB_HANDLE] = ANY_HUB;
-        msgHeader[MSG_FIELD_APP_INSTANCE] = OS_APP_INSTANCE;
-        msgHeader[MSG_FIELD_VERSION] = 0;
-        msgHeader[MSG_FIELD_TYPE] = MSG_UNLOAD_NANO_APP;
+        msgHeader[HEADER_FIELD_HUB_HANDLE] = ANY_HUB;
+        msgHeader[HEADER_FIELD_APP_INSTANCE] = nanoAppInstanceHandle;
+        msgHeader[HEADER_FIELD_MSG_VERSION] = 0;
+        msgHeader[HEADER_FIELD_MSG_TYPE] = MSG_UNLOAD_NANO_APP;
 
-        if (nativeSendMessage(msgHeader, null) != 0) {
+        byte msg[] = new byte[0];
+
+        if (nativeSendMessage(msgHeader, msg) != 0) {
             return -1;
         }
 
@@ -222,10 +238,10 @@
         checkPermissions();
 
         int[] msgHeader = new int[MSG_HEADER_SIZE];
-        msgHeader[MSG_FIELD_HUB_HANDLE] = hubHandle;
-        msgHeader[MSG_FIELD_APP_INSTANCE] = nanoAppHandle;
-        msgHeader[MSG_FIELD_VERSION] = msg.getVersion();
-        msgHeader[MSG_FIELD_TYPE] = msg.getMsgType();
+        msgHeader[HEADER_FIELD_HUB_HANDLE] = hubHandle;
+        msgHeader[HEADER_FIELD_APP_INSTANCE] = nanoAppHandle;
+        msgHeader[HEADER_FIELD_MSG_VERSION] = msg.getVersion();
+        msgHeader[HEADER_FIELD_MSG_TYPE] = msg.getMsgType();
 
         return nativeSendMessage(msgHeader, msg.getData());
     }
@@ -269,15 +285,17 @@
             Log.v(TAG, "No message callbacks registered.");
             return 0;
         }
-        ContextHubMessage message =
-                new ContextHubMessage(header[MSG_FIELD_TYPE], header[MSG_FIELD_VERSION], data);
+
+        ContextHubMessage msg = new ContextHubMessage(header[HEADER_FIELD_MSG_TYPE],
+                                                      header[HEADER_FIELD_MSG_VERSION],
+                                                      data);
         for (int i = 0; i < callbacksCount; ++i) {
             IContextHubCallback callback = mCallbacksList.getBroadcastItem(i);
             try {
                 callback.onMessageReceipt(
-                        header[MSG_FIELD_HUB_HANDLE],
-                        header[MSG_FIELD_APP_INSTANCE],
-                        message);
+                        header[HEADER_FIELD_HUB_HANDLE],
+                        header[HEADER_FIELD_APP_INSTANCE],
+                        msg);
             } catch (RemoteException e) {
                 Log.i(TAG, "Exception (" + e + ") calling remote callback (" + callback + ").");
                 continue;
@@ -308,12 +326,20 @@
         return 0;
     }
 
+    private int deleteAppInstance(int appInstanceHandle) {
+        if (mNanoAppHash.remove(appInstanceHandle) == null) {
+            return -1;
+        }
+
+        return 0;
+    }
+
     private void sendVrStateChangeMessageToApp(NanoAppInstanceInfo app, boolean vrModeEnabled) {
         int[] msgHeader = new int[MSG_HEADER_SIZE];
-        msgHeader[MSG_FIELD_TYPE] = 0;
-        msgHeader[MSG_FIELD_VERSION] = 0;
-        msgHeader[MSG_FIELD_HUB_HANDLE] = ANY_HUB;
-        msgHeader[MSG_FIELD_APP_INSTANCE] = app.getHandle();
+        msgHeader[HEADER_FIELD_MSG_TYPE] = 0;
+        msgHeader[HEADER_FIELD_MSG_VERSION] = 0;
+        msgHeader[HEADER_FIELD_HUB_HANDLE] = ANY_HUB;
+        msgHeader[HEADER_FIELD_APP_INSTANCE] = app.getHandle();
 
         byte[] data = new byte[1];
         data[0] = (byte) ((vrModeEnabled) ? 1 : 0);
diff --git a/core/jni/android_hardware_location_ContextHubService.cpp b/core/jni/android_hardware_location_ContextHubService.cpp
index a56eba6..46f76de 100644
--- a/core/jni/android_hardware_location_ContextHubService.cpp
+++ b/core/jni/android_hardware_location_ContextHubService.cpp
@@ -21,28 +21,34 @@
 
 #include <inttypes.h>
 #include <jni.h>
-#include <queue>
-#include <unordered_map>
+#include <mutex>
 #include <string.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <unordered_map>
+#include <queue>
 
 #include <cutils/log.h>
 
 #include "JNIHelp.h"
 #include "core_jni_helpers.h"
 
-static constexpr int OS_APP_ID=-1;
+static constexpr int OS_APP_ID = -1;
+static constexpr uint64_t ALL_APPS = UINT64_C(0xFFFFFFFFFFFFFFFF);
 
-static constexpr int MIN_APP_ID=1;
-static constexpr int MAX_APP_ID=128;
+static constexpr int MIN_APP_ID = 1;
+static constexpr int MAX_APP_ID = 128;
 
-static constexpr size_t MSG_HEADER_SIZE=4;
-static constexpr int HEADER_FIELD_MSG_TYPE=0;
-//static constexpr int HEADER_FIELD_MSG_VERSION=1;
-static constexpr int HEADER_FIELD_HUB_HANDLE=2;
-static constexpr int HEADER_FIELD_APP_INSTANCE=3;
+static constexpr size_t MSG_HEADER_SIZE = 4;
+static constexpr size_t HEADER_FIELD_MSG_TYPE = 0;
+static constexpr size_t HEADER_FIELD_MSG_VERSION = 1;
+static constexpr size_t HEADER_FIELD_HUB_HANDLE = 2;
+static constexpr size_t HEADER_FIELD_APP_INSTANCE = 3;
+
+static constexpr size_t HEADER_FIELD_LOAD_APP_ID_LO = MSG_HEADER_SIZE;
+static constexpr size_t HEADER_FIELD_LOAD_APP_ID_HI = MSG_HEADER_SIZE + 1;
+static constexpr size_t MSG_HEADER_SIZE_LOAD_APP = MSG_HEADER_SIZE + 2;
 
 namespace android {
 
@@ -83,6 +89,7 @@
 
     jmethodID contextHubServiceMsgReceiptCallback;
     jmethodID contextHubServiceAddAppInstance;
+    jmethodID contextHubServiceDeleteAppInstance;
 };
 
 struct context_hub_info_s {
@@ -93,10 +100,53 @@
 };
 
 struct app_instance_info_s {
-    uint32_t hubHandle; // Id of the hub this app is on
-    int instanceId; // systemwide unique instance id - assigned
+    uint64_t truncName;          // Possibly truncated name for logging
+    uint32_t hubHandle;          // Id of the hub this app is on
+    int instanceId;              // system wide unique instance id - assigned
     struct hub_app_info appInfo; // returned from the HAL
-    uint64_t truncName; // Possibly truncated name - logging
+};
+
+/*
+ * TODO(ashutoshj): From original code review:
+ *
+ * So, I feel like we could possible do a better job of organizing this code,
+ * and being more C++-y.  Consider something like this:
+ * class TxnManager {
+ *  public:
+ *   TxnManager();
+ *   ~TxnManager();
+ *   int add(hub_message_e identifier, void *data);
+ *   int close();
+ *   bool isPending() const;
+ *   int fetchData(hub_message_e *identifier, void **data) const;
+ *
+ *  private:
+ *   bool mPending;
+ *   mutable std::mutex mLock;
+ *   hub_message_e mIdentifier;
+ *   void *mData;
+ * };
+ *
+ * And then, for example, we'd have things like:
+ * TxnManager::TxnManager() : mPending(false), mLock(), mIdentifier(), mData(nullptr) {}
+ * int TxnManager::add(hub_message_e identifier, void *data) {
+ *    std::lock_guard<std::mutex> lock(mLock);
+ *    mPending = true;
+ *    mData = txnData;
+ *    mIdentifier = txnIdentifier;
+ *    return 0;
+ *  }
+ * And then calling code would look like:
+ *    if (!db.txnManager.add(CONTEXT_HUB_LOAD_APP, txnInfo)) {
+ *
+ * This would make it clearer the nothing is manipulating any state within TxnManager
+ * unsafely and outside of these couple of calls.
+ */
+struct txnManager_s {
+    bool txnPending;              // Is a transaction pending
+    std::mutex m;                 // mutex for manager
+    hub_messages_e txnIdentifier; // What are we doing
+    void *txnData;                // Details
 };
 
 struct contextHubServiceDb_s {
@@ -105,12 +155,69 @@
     jniInfo_s jniInfo;
     std::queue<int> freeIds;
     std::unordered_map<int, app_instance_info_s> appInstances;
+    txnManager_s txnManager;
 };
 
 }  // unnamed namespace
 
 static contextHubServiceDb_s db;
 
+static bool initTxnManager() {
+    txnManager_s *mgr = &db.txnManager;
+
+    mgr->txnData = nullptr;
+    mgr->txnPending = false;
+    return true;
+}
+
+static int addTxn(hub_messages_e txnIdentifier, void *txnData) {
+    txnManager_s *mgr = &db.txnManager;
+
+    std::lock_guard<std::mutex>lock(mgr->m);
+
+    mgr->txnPending = true;
+    mgr->txnData = txnData;
+    mgr->txnIdentifier = txnIdentifier;
+
+    return 0;
+}
+
+static int closeTxn() {
+    txnManager_s *mgr = &db.txnManager;
+    std::lock_guard<std::mutex>lock(mgr->m);
+    mgr->txnPending = false;
+    free(mgr->txnData);
+    mgr->txnData = nullptr;
+
+    return 0;
+}
+
+static bool isTxnPending() {
+    txnManager_s *mgr = &db.txnManager;
+    std::lock_guard<std::mutex>lock(mgr->m);
+    return mgr->txnPending;
+}
+
+static int fetchTxnData(hub_messages_e *id, void **data) {
+    txnManager_s *mgr = &db.txnManager;
+
+    if (!id || !data) {
+        ALOGW("Null params id %p, data %p", id, data);
+        return -1;
+    }
+
+    std::lock_guard<std::mutex>lock(mgr->m);
+    if (!mgr->txnPending) {
+        ALOGW("No Transactions pending");
+        return -1;
+    }
+
+    // else
+    *id = mgr->txnIdentifier;
+    *data = mgr->txnData;
+    return 0;
+}
+
 int context_hub_callback(uint32_t hubId, const struct hub_message_t *msg,
                          void *cookie);
 
@@ -152,13 +259,21 @@
     }
 }
 
-static int get_hub_id_for_app_instance(int id) {
+static int get_hub_handle_for_app_instance(int id) {
     if (!db.appInstances.count(id)) {
         ALOGD("%s: Cannot find app for app instance %d", __FUNCTION__, id);
         return -1;
     }
 
-    int hubHandle = db.appInstances[id].hubHandle;
+    return db.appInstances[id].hubHandle;
+}
+
+static int get_hub_id_for_app_instance(int id) {
+    int hubHandle = get_hub_handle_for_app_instance(id);
+
+    if (hubHandle < 0) {
+        return -1;
+    }
 
     return db.hubInfo.hubs[hubHandle].hub_id;
 }
@@ -184,7 +299,7 @@
     return 0;
 }
 
-static void send_query_for_apps() {
+static void query_hub_for_apps(uint64_t appId, uint32_t hubHandle) {
     hub_message_t msg;
     query_apps_request_t queryMsg;
 
@@ -194,23 +309,31 @@
     msg.message_len  = sizeof(queryMsg);
     msg.message = &queryMsg;
 
+    ALOGD("Sending query for apps to hub %" PRIu32, hubHandle);
+    set_os_app_as_destination(&msg, hubHandle);
+    if (send_msg_to_hub(&msg, hubHandle) != 0) {
+        ALOGW("Could not query hub %" PRIu32 " for apps", hubHandle);
+    }
+}
+
+static void sendQueryForApps(uint64_t appId) {
     for (int i = 0; i < db.hubInfo.numHubs; i++ ) {
-        ALOGD("Sending query for apps to hub %d", i);
-        set_os_app_as_destination(&msg, i);
-        if (send_msg_to_hub(&msg, i) != 0) {
-          ALOGW("Could not query hub %i for apps", i);
-        }
+        query_hub_for_apps(appId, i);
     }
 }
 
 static int return_id(int id) {
     // Note : This method is not thread safe.
-    // id returned is guarenteed to be in use
-    db.freeIds.push(id);
-    return 0;
+    // id returned is guaranteed to be in use
+    if (id >= 0) {
+        db.freeIds.push(id);
+        return 0;
+    }
+
+    return -1;
 }
 
-static int generate_id(void) {
+static int generate_id() {
     // Note : This method is not thread safe.
     int retVal = -1;
 
@@ -222,23 +345,31 @@
     return retVal;
 }
 
-int add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle, JNIEnv *env) {
+
+static int add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle,
+        int appInstanceHandle, JNIEnv *env) {
+
+    ALOGI("Loading App");
+
     // Not checking if the apps are indeed distinct
     app_instance_info_s entry;
-    int appInstanceHandle = generate_id();
-
     assert(appInfo);
 
-    if (appInstanceHandle < 0) {
-        ALOGE("Cannot find resources to add app instance %d",
-              appInstanceHandle);
-        return -1;
+    if (db.appInstances.count(appInstanceHandle) == 0) {
+        appInstanceHandle = generate_id();
+        if (appInstanceHandle < 0) {
+            ALOGE("Cannot find resources to add app instance %d",
+                  appInstanceHandle);
+            return -1;
+        }
     }
 
     entry.appInfo = *appInfo;
+
     entry.instanceId = appInstanceHandle;
     entry.truncName = appInfo->app_name.id;
     entry.hubHandle = hubHandle;
+
     db.appInstances[appInstanceHandle] = entry;
 
     // Finally - let the service know of this app instance
@@ -254,17 +385,70 @@
     return appInstanceHandle;
 }
 
-int delete_app_instance(int id) {
+int delete_app_instance(int id, JNIEnv *env) {
     if (!db.appInstances.count(id)) {
+        ALOGW("Cannot find App id : %d", id);
         return -1;
     }
 
     return_id(id);
     db.appInstances.erase(id);
+    if (env->CallIntMethod(db.jniInfo.jContextHubService,
+                       db.jniInfo.contextHubServiceDeleteAppInstance,
+                       id) != 0) {
+        ALOGW("Could not delete App id : %d", id);
+        return -1;
+    }
+
+    ALOGI("Deleted App id : %d", id);
 
     return 0;
 }
 
+static int startLoadAppTxn(uint64_t appId, int hubHandle) {
+    app_instance_info_s *txnInfo = (app_instance_info_s *)malloc(sizeof(app_instance_info_s));
+    int instanceId = generate_id();
+
+    if (!txnInfo || instanceId < 0) {
+        return_id(instanceId);
+        free(txnInfo);
+        return -1;
+    }
+
+    txnInfo->truncName = appId;
+    txnInfo->hubHandle = hubHandle;
+    txnInfo->instanceId = instanceId;
+
+    txnInfo->appInfo.app_name.id = appId;
+    txnInfo->appInfo.num_mem_ranges = 0;
+    txnInfo->appInfo.version = -1; // Awaited
+
+    if (!addTxn(CONTEXT_HUB_LOAD_APP, txnInfo)) {
+        return_id(instanceId);
+        free(txnInfo);
+        return -1;
+    }
+
+    return 0;
+}
+
+static int startUnloadAppTxn(uint32_t appInstanceHandle) {
+    uint32_t *txnData = (uint32_t *) malloc(sizeof(uint32_t));
+    if (!txnData) {
+        ALOGW("Cannot allocate memory to start unload transaction");
+        return -1;
+    }
+
+    *txnData = appInstanceHandle;
+
+    if (addTxn(CONTEXT_HUB_UNLOAD_APP, txnData) != 0) {
+        free(txnData);
+        ALOGW("Cannot start transaction to unload app");
+        return -1;
+    }
+
+    return 0;
+}
 
 static void initContextHubService() {
     int err = 0;
@@ -285,6 +469,7 @@
         db.freeIds.push(i);
     }
 
+    initTxnManager();
     if (db.hubInfo.contextHubModule) {
         int retNumHubs = db.hubInfo.contextHubModule->get_hubs(db.hubInfo.contextHubModule,
                                                                  &db.hubInfo.hubs);
@@ -302,6 +487,7 @@
 
             for (i = 0; i < db.hubInfo.numHubs; i++) {
                 db.hubInfo.cookies[i] = db.hubInfo.hubs[i].hub_id;
+                ALOGI("Subscribing to hubHandle %d with OS App name %" PRIu64, i, db.hubInfo.hubs[i].os_app_name.id);
                 if (db.hubInfo.contextHubModule->subscribe_messages(db.hubInfo.hubs[i].hub_id,
                                                                     context_hub_callback,
                                                                     &db.hubInfo.cookies[i]) == 0) {
@@ -309,7 +495,7 @@
             }
         }
 
-        send_query_for_apps();
+        sendQueryForApps(ALL_APPS);
     } else {
         ALOGW("No Context Hub Module present");
     }
@@ -346,7 +532,8 @@
     return ret;
 }
 
-int handle_query_apps_response(char *msg, int msgLen, uint32_t hubHandle) {
+int handle_query_apps_response(const uint8_t *msg, int msgLen,
+                               uint32_t hubHandle) {
     JNIEnv *env;
     if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) {
             return -1;
@@ -354,53 +541,201 @@
 
     int numApps = msgLen/sizeof(hub_app_info);
     hub_app_info info;
-    hub_app_info *unalignedInfoAddr = (hub_app_info*)msg;
+    const hub_app_info *unalignedInfoAddr = (const hub_app_info*)msg;
 
     for (int i = 0; i < numApps; i++, unalignedInfoAddr++) {
         memcpy(&info, unalignedInfoAddr, sizeof(info));
-        add_app_instance(&info, hubHandle, env);
+        // We will only have one instance of the app
+        // TODO : Change this logic once we support multiple instances of the same app
+        int appInstance = get_app_instance_for_app_id(info.app_name.id);
+        add_app_instance(&info, hubHandle, appInstance, env);
     }
 
     return 0;
 }
 
+static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType,
+                             status_response_t *rsp, int8_t *additionalData,
+                             size_t additionalDataLen) {
+    JNIEnv *env;
 
-int handle_os_message(uint32_t msgType, uint32_t hubHandle,
-                      char *msg, int msgLen) {
-    int retVal;
+    if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) {
+        ALOGW("Cannot latch to JNI env, dropping OS response %" PRIu32, msgType);
+        return;
+    }
 
-    //ALOGD("Rcd OS message from hubHandle %" PRIu32 " type %" PRIu32 " length %d",
-    //      hubHandle, msgType, msgLen);
+    uint32_t header[MSG_HEADER_SIZE];
+    memset(header, 0, sizeof(header));
+
+    if (!additionalData) {
+        additionalDataLen = 0; // clamp
+    }
+    int msgLen = 1 + additionalDataLen;
+
+    int8_t *msg = new int8_t[msgLen];
+
+    if (!msg) {
+        ALOGW("Unexpected : Ran out of memory, cannot send response");
+        return;
+    }
+
+    header[HEADER_FIELD_MSG_TYPE] = msgType;
+    header[HEADER_FIELD_MSG_VERSION] = 0;
+    header[HEADER_FIELD_HUB_HANDLE] = hubHandle;
+    header[HEADER_FIELD_APP_INSTANCE] = OS_APP_ID;
+
+    msg[0] = rsp->result;
+
+    if (additionalData) {
+        memcpy(&msg[1], additionalData, additionalDataLen);
+    }
+
+    jbyteArray jmsg = env->NewByteArray(msgLen);
+    jintArray jheader = env->NewIntArray(sizeof(header));
+
+    env->SetByteArrayRegion(jmsg, 0, msgLen, (jbyte *)msg);
+    env->SetIntArrayRegion(jheader, 0, sizeof(header), (jint *)header);
+
+    ALOGI("Passing msg type %" PRIu32 " from app %" PRIu32 " from hub %" PRIu32,
+          header[HEADER_FIELD_MSG_TYPE], header[HEADER_FIELD_APP_INSTANCE],
+          header[HEADER_FIELD_HUB_HANDLE]);
+
+    env->CallIntMethod(db.jniInfo.jContextHubService,
+                       db.jniInfo.contextHubServiceMsgReceiptCallback,
+                       jheader, jmsg);
+
+    delete[] msg;
+}
+
+void closeUnloadTxn(bool success) {
+    void *txnData = nullptr;
+    hub_messages_e txnId;
+
+    if (success && fetchTxnData(&txnId, &txnData) == 0 &&
+        txnId == CONTEXT_HUB_UNLOAD_APP) {
+        db.appInstances.erase(*(uint32_t *)txnData);
+    } else {
+        ALOGW("Could not unload the app successfully ! success %d, txnData %p", success, txnData);
+    }
+
+    closeTxn();
+}
+
+void closeLoadTxn(bool success, int *appInstanceHandle) {
+    void *txnData;
+    hub_messages_e txnId;
+
+    if (success && fetchTxnData(&txnId, &txnData) == 0 &&
+        txnId == CONTEXT_HUB_LOAD_APP) {
+        app_instance_info_s *info = (app_instance_info_s *)txnData;
+        *appInstanceHandle = info->instanceId;
+
+        JNIEnv *env;
+        if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) == JNI_OK) {
+            add_app_instance(&info->appInfo, info->hubHandle, info->instanceId, env);
+        } else {
+            ALOGW("Could not attach to JVM !");
+        }
+        sendQueryForApps(info->appInfo.app_name.id);
+    } else {
+        ALOGW("Could not load the app successfully ! Unexpected failure");
+    }
+
+    closeTxn();
+}
+
+static bool isValidOsStatus(const uint8_t *msg, size_t msgLen,
+                            status_response_t *rsp) {
+    // Workaround a bug in some HALs
+    if (msgLen == 1) {
+        rsp->result = msg[0];
+        return true;
+    }
+
+    if (!msg || msgLen != sizeof(*rsp)) {
+        ALOGW("Received invalid response %p of size %zu", msg, msgLen);
+        return false;
+    }
+
+    memcpy(rsp, msg, sizeof(*rsp));
+
+    // No sanity checks on return values
+    return true;
+}
+
+static void invalidateNanoApps(uint32_t hubHandle) {
+    JNIEnv *env;
+
+    if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) {
+        ALOGW("Could not attach to JVM !");
+    }
+
+    auto end = db.appInstances.end();
+    for (auto current = db.appInstances.begin(); current != end; ) {
+        app_instance_info_s info = current->second;
+        current++;
+        if (info.hubHandle == hubHandle) {
+             delete_app_instance(info.instanceId, env);
+        }
+    }
+}
+
+static int handle_os_message(uint32_t msgType, uint32_t hubHandle,
+                             const uint8_t *msg, int msgLen) {
+    int retVal = -1;
+
+    ALOGD("Rcd OS message from hubHandle %" PRIu32 " type %" PRIu32 " length %d",
+          hubHandle, msgType, msgLen);
+
+    struct status_response_t rsp;
 
     switch(msgType) {
-        case CONTEXT_HUB_APPS_ENABLE:
-            retVal = 0;
-            break;
 
-        case CONTEXT_HUB_APPS_DISABLE:
-            retVal = 0;
-            break;
+      case CONTEXT_HUB_APPS_ENABLE:
+      case CONTEXT_HUB_APPS_DISABLE:
+      case CONTEXT_HUB_LOAD_APP:
+      case CONTEXT_HUB_UNLOAD_APP:
+          if (isValidOsStatus(msg, msgLen, &rsp)) {
+              if (msgType == CONTEXT_HUB_LOAD_APP) {
+                  int appInstanceHandle;
+                  closeLoadTxn(rsp.result == 0, &appInstanceHandle);
+                  passOnOsResponse(hubHandle, msgType, &rsp, (int8_t *)(&appInstanceHandle),
+                                   sizeof(appInstanceHandle));
+              } else if (msgType == CONTEXT_HUB_UNLOAD_APP) {
+                  closeUnloadTxn(rsp.result == 0);
+                  passOnOsResponse(hubHandle, msgType, &rsp, nullptr, 0);
+              } else {
+                  passOnOsResponse(hubHandle, msgType, &rsp, nullptr, 0);
+              }
+              retVal = 0;
+          }
+          break;
 
-        case CONTEXT_HUB_LOAD_APP:
-            retVal = 0;
-            break;
+      case CONTEXT_HUB_QUERY_APPS:
+          rsp.result = 0;
+          retVal = handle_query_apps_response(msg, msgLen, hubHandle);
+          passOnOsResponse(hubHandle, msgType, &rsp, nullptr, 0);
+          break;
 
-        case CONTEXT_HUB_UNLOAD_APP:
-            retVal = 0;
-            break;
+      case CONTEXT_HUB_QUERY_MEMORY:
+          // Deferring this use
+          retVal = 0;
+          break;
 
-        case CONTEXT_HUB_QUERY_APPS:
-            retVal = handle_query_apps_response(msg, msgLen, hubHandle);
-            break;
+      case CONTEXT_HUB_OS_REBOOT:
+          if (isValidOsStatus(msg, msgLen, &rsp)) {
+              rsp.result = 0;
+              ALOGW("Context Hub handle %d restarted", hubHandle);
+              passOnOsResponse(hubHandle, msgType, &rsp, nullptr, 0);
+              invalidateNanoApps(hubHandle);
+              query_hub_for_apps(ALL_APPS, hubHandle);
+              retVal = 0;
+          }
+          break;
 
-        case CONTEXT_HUB_QUERY_MEMORY:
-            retVal = 0;
-            break;
-
-        default:
-            retVal = -1;
-            break;
-
+      default:
+          retVal = -1;
+          break;
     }
 
     return retVal;
@@ -420,10 +755,12 @@
     }
 }
 
+
 int context_hub_callback(uint32_t hubId,
                          const struct hub_message_t *msg,
                          void *cookie) {
     if (!msg) {
+        ALOGW("NULL message");
         return -1;
     }
     if (!sanity_check_cookie(cookie, hubId)) {
@@ -433,11 +770,12 @@
         return -1;
     }
 
+
     uint32_t messageType = msg->message_type;
     uint32_t hubHandle = *(uint32_t*) cookie;
 
     if (messageType < CONTEXT_HUB_TYPE_PRIVATE_MSG_BASE) {
-        handle_os_message(messageType, hubHandle, (char*) msg->message, msg->message_len);
+        handle_os_message(messageType, hubHandle, (uint8_t*) msg->message, msg->message_len);
     } else {
         int appHandle = get_app_instance_for_app_id(msg->app_name.id);
         if (appHandle < 0) {
@@ -528,7 +866,9 @@
                  env->GetMethodID(db.jniInfo.contextHubServiceClass,
                                     "addAppInstance", "(IIJI)I");
 
-
+    db.jniInfo.contextHubServiceDeleteAppInstance =
+                 env->GetMethodID(db.jniInfo.contextHubServiceClass,
+                                    "deleteAppInstance", "(I)I");
 
     return 0;
 }
@@ -538,8 +878,6 @@
     jintArray jintBuf;
     jobjectArray jmemBuf;
 
-    int dummyConnectedSensors[] = {1, 2, 3, 4, 5};
-
     jobject jHub = env->NewObject(db.jniInfo.contextHubInfoClass,
                                   db.jniInfo.contextHubInfoCtor);
     env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetId, hub->hub_id);
@@ -569,11 +907,21 @@
                         hub->max_supported_msg_len);
 
 
-    // TODO : jintBuf = env->NewIntArray(hub->num_connected_sensors);
-    // TODO : env->SetIntArrayRegion(jintBuf, 0, hub->num_connected_sensors,
-    //                               hub->connected_sensors);
-    jintBuf = env->NewIntArray(array_length(dummyConnectedSensors));
-    env->SetIntArrayRegion(jintBuf, 0, hub->num_connected_sensors, dummyConnectedSensors);
+    jintBuf = env->NewIntArray(hub->num_connected_sensors);
+    int *connectedSensors = new int[hub->num_connected_sensors];
+
+    if (!connectedSensors) {
+      ALOGW("Cannot allocate memory! Unexpected");
+      assert(false);
+    } else {
+      for (unsigned int i = 0; i < hub->num_connected_sensors; i++) {
+        connectedSensors[i] = hub->connected_sensors[i].sensor_id;
+      }
+    }
+
+    env->SetIntArrayRegion(jintBuf, 0, hub->num_connected_sensors,
+                           connectedSensors);
+
     env->CallVoidMethod(jHub, db.jniInfo.contextHubInfoSetSupportedSensors, jintBuf);
     env->DeleteLocalRef(jintBuf);
 
@@ -584,6 +932,7 @@
     env->DeleteLocalRef(jmemBuf);
 
 
+    delete[] connectedSensors;
     return jHub;
 }
 
@@ -622,33 +971,96 @@
     jbyte *data = env->GetByteArrayElements(data_, 0);
     int dataBufferLength = env->GetArrayLength(data_);
 
+    if (numHeaderElements < MSG_HEADER_SIZE) {
+        ALOGW("Malformed header len");
+        return -1;
+    }
 
-    if (numHeaderElements >= MSG_HEADER_SIZE) {
-        bool setAddressSuccess;
-        int hubId;
-        hub_message_t msg;
+    uint32_t appInstanceHandle = header[HEADER_FIELD_APP_INSTANCE];
+    uint32_t msgType = header[HEADER_FIELD_MSG_TYPE];
+    int hubHandle = -1;
+    int hubId;
+    uint64_t appId;
+
+    if (msgType == CONTEXT_HUB_UNLOAD_APP) {
+        hubHandle = get_hub_handle_for_app_instance(appInstanceHandle);
+    } else if (msgType == CONTEXT_HUB_LOAD_APP) {
+        if (numHeaderElements < MSG_HEADER_SIZE_LOAD_APP) {
+            return -1;
+        }
+        uint64_t appIdLo = header[HEADER_FIELD_LOAD_APP_ID_LO];
+        uint64_t appIdHi = header[HEADER_FIELD_LOAD_APP_ID_HI];
+        appId = appIdHi << 32 | appIdLo;
+
+        hubHandle = header[HEADER_FIELD_HUB_HANDLE];
+    } else {
+        hubHandle = header[HEADER_FIELD_HUB_HANDLE];
+    }
+
+    if (hubHandle < 0) {
+        ALOGD("Invalid hub Handle %d", hubHandle);
+        return -1;
+    }
+
+    if (msgType == CONTEXT_HUB_LOAD_APP ||
+        msgType == CONTEXT_HUB_UNLOAD_APP) {
+
+        if (isTxnPending()) {
+            ALOGW("Cannot load or unload app while a transaction is pending !");
+            return -1;
+        }
+
+        if (msgType == CONTEXT_HUB_LOAD_APP) {
+            if (startLoadAppTxn(appId, hubHandle) != 0) {
+                return -1;
+            }
+        } else if (msgType == CONTEXT_HUB_UNLOAD_APP) {
+            if (startUnloadAppTxn(appInstanceHandle) != 0) {
+                return -1;
+            }
+        }
+    }
+
+    bool setAddressSuccess = false;
+    hub_message_t msg;
+
+    msg.message_type = msgType;
+
+    if (msgType == CONTEXT_HUB_UNLOAD_APP) {
+        msg.message_len = sizeof(db.appInstances[appInstanceHandle].appInfo.app_name);
+        msg.message = &db.appInstances[appInstanceHandle].appInfo.app_name;
+        setAddressSuccess = (set_os_app_as_destination(&msg, hubHandle) == 0);
+        hubId = get_hub_id_for_hub_handle(hubHandle);
+    } else {
+        msg.message_len = dataBufferLength;
+        msg.message = data;
 
         if (header[HEADER_FIELD_APP_INSTANCE] == OS_APP_ID) {
-            setAddressSuccess = (set_os_app_as_destination(&msg, header[HEADER_FIELD_HUB_HANDLE]) == 0);
-            hubId = get_hub_id_for_hub_handle(header[HEADER_FIELD_HUB_HANDLE]);
+            setAddressSuccess = (set_os_app_as_destination(&msg, hubHandle) == 0);
+            hubId = get_hub_id_for_hub_handle(hubHandle);
         } else {
             setAddressSuccess = (set_dest_app(&msg, header[HEADER_FIELD_APP_INSTANCE]) == 0);
             hubId = get_hub_id_for_app_instance(header[HEADER_FIELD_APP_INSTANCE]);
         }
+    }
 
-        if (setAddressSuccess && hubId >= 0) {
-            msg.message_type = header[HEADER_FIELD_MSG_TYPE];
-            msg.message_len = dataBufferLength;
-            msg.message = data;
-            retVal = db.hubInfo.contextHubModule->send_message(hubId, &msg);
-        } else {
-          ALOGD("Could not find app instance %d on hubHandle %d, setAddress %d",
-                header[HEADER_FIELD_APP_INSTANCE],
-                header[HEADER_FIELD_HUB_HANDLE],
-                (int)setAddressSuccess);
-        }
+    if (setAddressSuccess && hubId >= 0) {
+        ALOGD("Asking HAL to remove app");
+        retVal = db.hubInfo.contextHubModule->send_message(hubId, &msg);
     } else {
-        ALOGD("Malformed header len");
+      ALOGD("Could not find app instance %d on hubHandle %d, setAddress %d",
+            header[HEADER_FIELD_APP_INSTANCE],
+            header[HEADER_FIELD_HUB_HANDLE],
+            (int)setAddressSuccess);
+    }
+
+    if (retVal != 0) {
+        ALOGD("Send Message failure - %d", retVal);
+        if (msgType == CONTEXT_HUB_LOAD_APP) {
+            closeLoadTxn(false, nullptr);
+        } else if (msgType == CONTEXT_HUB_UNLOAD_APP) {
+            closeUnloadTxn(false);
+        }
     }
 
     env->ReleaseIntArrayElements(header_, header, 0);
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index d4732f8..48aca28 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -1193,3 +1193,5 @@
   to: http://tools.android.com/tech-docs/new-build-system/gradle-experimental/experimental-to-stable-gradle
 - from: /r/studio-ui/sdk-manager.html
   to: https://developer.android.com/studio/intro/update.html#sdk-manager
+- from: /r/studio-ui/newjclass.html
+  to: /studio/write/index.html
diff --git a/docs/html/topic/performance/index.jd b/docs/html/topic/performance/index.jd
index 08c610f..e08db15 100644
--- a/docs/html/topic/performance/index.jd
+++ b/docs/html/topic/performance/index.jd
@@ -1,6 +1,6 @@
 page.title=Performance
 page.article=true
-page.metaDescription=Android Performance does nice things. Details to come.
+page.metaDescription=Improve your app's performance by learning how to optimize power consumption, launch times, and other important areas of performance.
 
 meta.tags="performance"
 page.tags="performance"
diff --git a/docs/html/topic/performance/launch-time.jd b/docs/html/topic/performance/launch-time.jd
index c9ce1d5..84d5fab 100644
--- a/docs/html/topic/performance/launch-time.jd
+++ b/docs/html/topic/performance/launch-time.jd
@@ -112,7 +112,7 @@
 </p>
 <br/>
 
-  <img src="{@docRoot}performance/images/cold-launch.png">
+  <img src="{@docRoot}topic/performance/images/cold-launch.png">
   <p class="img-caption">
     <strong>Figure 1.</strong> A visual representation of the important parts of
     a cold application launch.
@@ -262,7 +262,7 @@
 </p>
 <br/>
 
-  <img src="{@docRoot}performance/images/displayed-logcat.png">
+  <img src="{@docRoot}topic/performance/images/displayed-logcat.png">
   <p class="img-caption">
     <strong>Figure 2.</strong> Disabling filters, and
     finding the {@code Displayed} value in logcat.
diff --git a/libs/hwui/PropertyValuesAnimatorSet.h b/libs/hwui/PropertyValuesAnimatorSet.h
index 49021bc..f9274e1 100644
--- a/libs/hwui/PropertyValuesAnimatorSet.h
+++ b/libs/hwui/PropertyValuesAnimatorSet.h
@@ -60,7 +60,7 @@
     virtual uint32_t dirtyMask();
     bool isInfinite() { return mIsInfinite; }
     void setVectorDrawable(VectorDrawableRoot* vd) { mVectorDrawable = vd; }
-    VectorDrawableRoot* getVectorDrawable() const { return mVectorDrawable; }
+    VectorDrawableRoot* getVectorDrawable() const { return mVectorDrawable.get(); }
     AnimationListener* getOneShotListener() { return mOneShotListener.get(); }
     void clearOneShotListener() { mOneShotListener = nullptr; }
     uint32_t getRequestId() const { return mRequestId; }
@@ -78,7 +78,7 @@
     std::vector< std::unique_ptr<PropertyAnimator> > mAnimators;
     float mLastFraction = 0.0f;
     bool mInitialized = false;
-    VectorDrawableRoot* mVectorDrawable = nullptr;
+    sp<VectorDrawableRoot> mVectorDrawable;
     bool mIsInfinite = false;
     // This request id gets incremented (on UI thread only) when a new request to modfiy the
     // lifecycle of an animation happens, namely when start/end/reset/reverse is called.
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 8d4a151..31c7a32 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -3498,7 +3498,7 @@
          * @param extra an extra code, specific to the info. Typically
          * implementation dependent.
          * @return True if the method handled the info, false if it didn't.
-         * Returning false, or not having an OnErrorListener at all, will
+         * Returning false, or not having an OnInfoListener at all, will
          * cause the info to be discarded.
          */
         boolean onInfo(MediaPlayer mp, int what, int extra);
diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java
index 0f7dc9a..b262d97 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -181,10 +181,15 @@
      * @return
      */
     boolean isRestricted_sync() {
+        // check app ops
+        if (mHasAppOpsPlayAudio) {
+            return false;
+        }
+        // check bypass flag
         if ((mAttributes.getAllFlags() & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY) != 0) {
             return false;
         }
-        return !mHasAppOpsPlayAudio;
+        return true;
     }
 
     // Abstract methods a subclass needs to implement
diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java
index 5ede1d5..9fafda4 100644
--- a/media/java/android/media/SoundPool.java
+++ b/media/java/android/media/SoundPool.java
@@ -505,27 +505,31 @@
     }
 
     private boolean isRestricted() {
-        IAudioService service = getService();
-        boolean cameraSoundForced = false;
-
-        try {
-            cameraSoundForced = service.isCameraSoundForced();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot access AudioService in isRestricted()");
-        }
-
-        if (cameraSoundForced &&
-                ((mAttributes.getAllFlags() & AudioAttributes.FLAG_AUDIBILITY_ENFORCED) != 0)
-// FIXME: should also check usage when set properly by camera app
-//                && (mAttributes.getUsage() == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
-                ) {
+        // check app ops
+        if (mHasAppOpsPlayAudio) {
             return false;
         }
-
+        // check bypass flag
         if ((mAttributes.getAllFlags() & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY) != 0) {
             return false;
         }
-        return !mHasAppOpsPlayAudio;
+        // check force audibility flag and camera restriction
+        if ((mAttributes.getAllFlags() & AudioAttributes.FLAG_AUDIBILITY_ENFORCED) != 0) {
+// FIXME: should also check usage when set properly by camera app
+//          && (mAttributes.getUsage() == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+            boolean cameraSoundForced = false;
+            try {
+                cameraSoundForced = getService().isCameraSoundForced();
+            } catch (RemoteException e) {
+                Log.e(TAG, "Cannot access AudioService in isRestricted()");
+            } catch (NullPointerException e) {
+                Log.e(TAG, "Null AudioService in isRestricted()");
+            }
+            if (cameraSoundForced) {
+                return false;
+            }
+        }
+        return true;
     }
 
     private void updateAppOpsPlayAudio() {
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index 3b8b909..6673d6e 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -111,7 +111,7 @@
         android:layout_alignParentTop="true"
         android:paddingStart="16dp"
         android:paddingEnd="16dp"
-        android:paddingTop="2dp"
+        android:paddingTop="6dp"
         android:visibility="gone"
         android:textAppearance="@style/TextAppearance.StatusBar.Expanded.EmergencyCallsOnly"
         android:text="@*android:string/emergency_calls_only"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index e1cbbc5..ae4f3cf 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -375,6 +375,8 @@
 
     <!-- The font size of the date in QS -->
     <dimen name="qs_date_collapsed_size">14sp</dimen>
+    <!-- Amount the date/time move when emergency calls only is present -->
+    <dimen name="qs_date_time_translation">8dp</dimen>
 
     <!-- Battery level text padding end when in expanded QS and on Keyguard -->
     <dimen name="battery_level_padding_end">2dp</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index af2a286..9eceeac 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -47,7 +47,7 @@
     private static final long TIMEOUT_SERVICE = 2500;
     private static final long TIMEOUT_ACTIVITY = 1000;
 
-    private final Context mContext;
+    protected final Context mContext;
     private final WindowManager mWindowManager;
     private final AssistDisclosure mAssistDisclosure;
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
index b53a999..63f726b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
@@ -49,6 +49,13 @@
         mViews.clear();
     }
 
+    void addView(View view, boolean landscape) {
+        addView(view);
+        if (view instanceof ButtonInterface) {
+            ((ButtonInterface) view).setLandscape(landscape);
+        }
+    }
+
     void addView(View view) {
         mViews.add(view);
         view.setOnClickListener(mClickListener);
@@ -178,5 +185,7 @@
         void setImageDrawable(@Nullable Drawable drawable);
 
         void abortCurrentGesture();
+
+        void setLandscape(boolean landscape);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index 67699737..06c8b68 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -280,7 +280,7 @@
             params.width = (int) (params.width * size);
         }
         parent.addView(v);
-        addToDispatchers(v);
+        addToDispatchers(v, landscape);
         View lastView = landscape ? mLastRot90 : mLastRot0;
         if (lastView != null) {
             v.setAccessibilityTraversalAfter(lastView.getId());
@@ -327,16 +327,16 @@
         return buttonSpec.substring(0, buttonSpec.indexOf(SIZE_MOD_START));
     }
 
-    private void addToDispatchers(View v) {
+    private void addToDispatchers(View v, boolean landscape) {
         if (mButtonDispatchers != null) {
             final int indexOfKey = mButtonDispatchers.indexOfKey(v.getId());
             if (indexOfKey >= 0) {
-                mButtonDispatchers.valueAt(indexOfKey).addView(v);
+                mButtonDispatchers.valueAt(indexOfKey).addView(v, landscape);
             } else if (v instanceof ViewGroup) {
                 final ViewGroup viewGroup = (ViewGroup)v;
                 final int N = viewGroup.getChildCount();
                 for (int i = 0; i < N; i++) {
-                    addToDispatchers(viewGroup.getChildAt(i));
+                    addToDispatchers(viewGroup.getChildAt(i), landscape);
                 }
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 9bc5426..fb7afc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -883,9 +883,9 @@
         mLightStatusBarController = new LightStatusBarController(mIconController,
                 mBatteryController);
         mKeyguardMonitor = new KeyguardMonitor(mContext);
+        mUserSwitcherController = new UserSwitcherController(mContext, mKeyguardMonitor,
+                mHandler, this);
         if (UserManager.get(mContext).isUserSwitcherEnabled()) {
-            mUserSwitcherController = new UserSwitcherController(mContext, mKeyguardMonitor,
-                    mHandler, this);
             createUserSwitcher();
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
index 85303f4..21db64f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
@@ -37,11 +37,11 @@
 import com.android.keyguard.KeyguardStatusView;
 import com.android.systemui.FontSizeUtils;
 import com.android.systemui.R;
-import com.android.systemui.qs.QSAnimator;
 import com.android.systemui.qs.QSPanel;
 import com.android.systemui.qs.QSPanel.Callback;
 import com.android.systemui.qs.QuickQSPanel;
 import com.android.systemui.qs.TouchAnimator;
+import com.android.systemui.qs.TouchAnimator.Builder;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.NextAlarmController;
 import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback;
@@ -84,13 +84,13 @@
     private ImageView mMultiUserAvatar;
 
 
-    private TouchAnimator mSecondHalfAnimator;
-    private TouchAnimator mFirstHalfAnimator;
+    private TouchAnimator mAnimator;
     protected TouchAnimator mSettingsAlpha;
     private float mExpansionAmount;
     private QSTileHost mHost;
     private View mEdit;
     private boolean mShowFullAlarm;
+    private float mDateTimeTranslation;
 
     public QuickStatusBarHeader(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -111,6 +111,7 @@
         mDateTimeGroup = (ViewGroup) findViewById(R.id.date_time_group);
         mDateTimeGroup.setPivotX(0);
         mDateTimeGroup.setPivotY(0);
+        mDateTimeTranslation = getResources().getDimension(R.dimen.qs_date_time_translation);
         mShowFullAlarm = getResources().getBoolean(R.bool.quick_settings_show_full_alarm);
 
         mExpandIndicator = (ExpandableIndicator) findViewById(R.id.expand_indicator);
@@ -152,15 +153,13 @@
         FontSizeUtils.updateFontSize(mAlarmStatus, R.dimen.qs_date_collapsed_size);
         FontSizeUtils.updateFontSize(mEmergencyOnly, R.dimen.qs_emergency_calls_only_text_size);
 
-        mSecondHalfAnimator = new TouchAnimator.Builder()
+        Builder builder = new Builder()
                 .addFloat(mShowFullAlarm ? mAlarmStatus : findViewById(R.id.date), "alpha", 0, 1)
-                .addFloat(mEmergencyOnly, "alpha", 0, 1)
-                .build();
+                .addFloat(mEmergencyOnly, "alpha", 0, 1);
         if (mShowFullAlarm) {
-            mFirstHalfAnimator = new TouchAnimator.Builder()
-                    .addFloat(mAlarmStatusCollapsed, "alpha", 1, 0)
-                    .build();
+            builder.addFloat(mAlarmStatusCollapsed, "alpha", 1, 0);
         }
+        mAnimator = builder.build();
 
         updateSettingsAnimator();
     }
@@ -223,10 +222,8 @@
     @Override
     public void setExpansion(float headerExpansionFraction) {
         mExpansionAmount = headerExpansionFraction;
-        mSecondHalfAnimator.setPosition(headerExpansionFraction);
-        if (mShowFullAlarm) {
-            mFirstHalfAnimator.setPosition(headerExpansionFraction);
-        }
+        updateDateTimePosition();
+        mAnimator.setPosition(headerExpansionFraction);
         mSettingsAlpha.setPosition(headerExpansionFraction);
 
         updateAlarmVisibilities();
@@ -264,6 +261,7 @@
 
     protected void updateVisibilities() {
         updateAlarmVisibilities();
+        updateDateTimePosition();
         mEmergencyOnly.setVisibility(mExpanded && mShowEmergencyCallsOnly
                 ? View.VISIBLE : View.INVISIBLE);
         mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
@@ -274,6 +272,11 @@
         mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
     }
 
+    private void updateDateTimePosition() {
+        mDateTimeAlarmGroup.setTranslationY(mShowEmergencyCallsOnly
+                ? mExpansionAmount * mDateTimeTranslation : 0);
+    }
+
     private void updateListeners() {
         if (mListening) {
             mNextAlarmController.addStateChangedCallback(this);
@@ -315,7 +318,8 @@
     public void onClick(View v) {
         if (v == mSettingsButton) {
             MetricsLogger.action(mContext,
-                    MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH);
+                    mExpanded ? MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH
+                            : MetricsProto.MetricsEvent.ACTION_QS_COLLAPSED_SETTINGS_LAUNCH);
             if (mSettingsButton.isTunerClick()) {
                 if (TunerService.isTunerEnabled(mContext)) {
                     TunerService.showResetRequest(mContext, new Runnable() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index d8b1a62..3df7590 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -265,6 +265,11 @@
     public void setImageDrawable(@Nullable Drawable drawable) {
         super.setImageDrawable(drawable);
     }
+
+    @Override
+    public void setLandscape(boolean landscape) {
+        //no op
+    }
 }
 
 
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 64b30d9..966d0ec 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -33,73 +33,61 @@
     // OPEN: Settings > Accessibility
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCESSIBILITY = 2;
 
     // OPEN: Settings > Accessibility > Captions
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCESSIBILITY_CAPTION_PROPERTIES = 3;
 
     // OPEN: Settings > Accessibility > [Service]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCESSIBILITY_SERVICE = 4;
 
     // OPEN: Settings > Accessibility > Color correction
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCESSIBILITY_TOGGLE_DALTONIZER = 5;
 
     // OPEN: Settings > Accessibility > Accessibility shortcut
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCESSIBILITY_TOGGLE_GLOBAL_GESTURE = 6;
 
     // OPEN: Settings > Accessibility > Magnification gestures
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION = 7;
 
     // OPEN: Settings > Accounts
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCOUNT = 8;
 
     // OPEN: Settings > Accounts > [Single Account Sync Settings]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCOUNTS_ACCOUNT_SYNC = 9;
 
     // OPEN: Settings > Accounts > Add an account
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY = 10;
 
     // OPEN: Settings > Accounts > [List of accounts when more than one]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACCOUNTS_MANAGE_ACCOUNTS = 11;
 
     // OPEN: Settings > Cellular network settings > APNs
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APN = 12;
 
     // OPEN: Settings > More > Cellular network settings > APNs > [Edit APN]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APN_EDITOR = 13;
 
     // OBSOLETE
@@ -114,7 +102,6 @@
     // OPEN: Settings > Apps > Configure apps > App links > [App]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_APP_LAUNCH = 17;
 
     // OBSOLETE
@@ -123,19 +110,16 @@
     // OPEN: Settings > Internal storage > Apps storage > [App]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_APP_STORAGE = 19;
 
     // OPEN: Settings > Apps > [App info]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_INSTALLED_APP_DETAILS = 20;
 
     // OPEN: Settings > Memory > App usage > [App Memory usage]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_PROCESS_STATS_DETAIL = 21;
 
     // OBSOLETE
@@ -144,19 +128,16 @@
     // OPEN: Settings > Memory > App usage
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_PROCESS_STATS_UI = 23;
 
     // OPEN: Settings > Bluetooth
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     BLUETOOTH = 24;
 
     // OPEN: Choose Bluetooth device (ex: when sharing)
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     BLUETOOTH_DEVICE_PICKER = 25;
 
     // OBSOLETE
@@ -165,55 +146,46 @@
     // OPEN: Settings > Security > Choose screen lock
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     CHOOSE_LOCK_GENERIC = 27;
 
     // OPEN: Settings > Security > Choose screen lock > Choose your password
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     CHOOSE_LOCK_PASSWORD = 28;
 
     // OPEN: Settings > Security > Choose screen lock > Choose your pattern
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     CHOOSE_LOCK_PATTERN = 29;
 
     // OPEN: Settings > Security > Choose screen lock > Confirm your password
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     CONFIRM_LOCK_PASSWORD = 30;
 
     // OPEN: Settings > Security > Choose screen lock > Confirm your pattern
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     CONFIRM_LOCK_PATTERN = 31;
 
     // OPEN: Settings > Security > Encrypt phone
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     CRYPT_KEEPER = 32;
 
     // OPEN: Settings > Security > Encrypt phone > Confirm
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     CRYPT_KEEPER_CONFIRM = 33;
 
     // OPEN: Settings > Search results
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DASHBOARD_SEARCH_RESULTS = 34;
 
     // OPEN: Settings (Root page)
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DASHBOARD_SUMMARY = 35;
 
     // OBSOLETE
@@ -222,49 +194,41 @@
     // OPEN: Settings > Data usage
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DATA_USAGE_SUMMARY = 37;
 
     // OPEN: Settings > Date & time
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DATE_TIME = 38;
 
     // OPEN: Settings > Developer options
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DEVELOPMENT = 39;
 
     // OPEN: Settings > About phone
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DEVICEINFO = 40;
 
     // OPEN: Settings > About phone > Status > IMEI information
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DEVICEINFO_IMEI_INFORMATION = 41;
 
     // OPEN: Settings > Internal storage
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DEVICEINFO_STORAGE = 42;
 
     // OPEN: Settings > About phone > Status > SIM status
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DEVICEINFO_SIM_STATUS = 43;
 
     // OPEN: Settings > About phone > Status
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DEVICEINFO_STATUS = 44;
 
     // OBSOLETE
@@ -273,25 +237,21 @@
     // OPEN: Settings > Display
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DISPLAY = 46;
 
     // OPEN: Settings > Display > Daydream
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     DREAM = 47;
 
     // OPEN: Settings > Security > Screen lock > Secure start-up
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ENCRYPTION = 48;
 
     // OPEN: Settings > Security > Nexus Imprint
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     FINGERPRINT = 49;
 
     // OBSOLETE
@@ -300,55 +260,46 @@
     // OPEN: Settings > Battery > History details
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     FUELGAUGE_BATTERY_HISTORY_DETAIL = 51;
 
     // OPEN: Settings > Battery > Battery saver
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     FUELGAUGE_BATTERY_SAVER = 52;
 
     // OPEN: Settings > Battery > [App Use details]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     FUELGAUGE_POWER_USAGE_DETAIL = 53;
 
     // OPEN: Settings > Battery
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     FUELGAUGE_POWER_USAGE_SUMMARY = 54;
 
     // OPEN: Settings > Home
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     HOME = 55;
 
     // OPEN: Settings > Security > SIM card lock settings
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ICC_LOCK = 56;
 
     // OPEN: Settings > Language & input
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     INPUTMETHOD_LANGUAGE = 57;
 
     // OPEN: Settings > Language & input > Physical keyboard
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     INPUTMETHOD_KEYBOARD = 58;
 
     // OPEN: Settings > Language & input > Spell checker
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     INPUTMETHOD_SPELL_CHECKERS = 59;
 
     // OBSOLETE
@@ -357,79 +308,66 @@
     // OPEN: Settings > Language & input > Personal dictionary
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     INPUTMETHOD_USER_DICTIONARY = 61;
 
     // OPEN: Settings > Language & input > Add word
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     INPUTMETHOD_USER_DICTIONARY_ADD_WORD = 62;
 
     // OPEN: Settings > Location
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     LOCATION = 63;
 
     // OPEN: Settings > Location > Location mode
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     LOCATION_MODE = 64;
 
     // OPEN: Settings > Apps
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     MANAGE_APPLICATIONS = 65;
 
     // OPEN: Settings > Backup & reset > Factory data reset
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     MASTER_CLEAR = 66;
 
     // OPEN: Settings > Backup & reset > Factory data reset > Confirm
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     MASTER_CLEAR_CONFIRM = 67;
 
     // OPEN: Settings > Data usage > Network restrictions
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NET_DATA_USAGE_METERED = 68;
 
     // OPEN: Settings > More > Android Beam
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NFC_BEAM = 69;
 
     // OPEN: Settings > Tap & pay
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NFC_PAYMENT = 70;
 
     // OPEN: Settings > Sound & notification
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION = 71;
 
     // OPEN: Settings > Sound & notification > App notifications > [App]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_APP_NOTIFICATION = 72;
 
     // OPEN: Settings > Sound & notification > Other sounds
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_OTHER_SOUND = 73;
 
     // OBSOLETE
@@ -438,13 +376,11 @@
     // OPEN: Settings Widget > Notification log
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_STATION = 75;
 
     // OPEN: Settings > Sound & notification > Do not disturb
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ZEN_MODE = 76;
 
     // OPEN: OBSOLETE
@@ -453,25 +389,21 @@
     // OPEN: Print job notification > Print job settings
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     PRINT_JOB_SETTINGS = 78;
 
     // OPEN: Settings > Printing > [Print Service]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     PRINT_SERVICE_SETTINGS = 79;
 
     // OPEN: Settings > Printing
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     PRINT_SETTINGS = 80;
 
     // OPEN: Settings > Backup & reset
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     PRIVACY = 81;
 
     //OBSOLETE
@@ -480,37 +412,31 @@
     // OPEN: Settings > Backup & reset > Network settings reset
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     RESET_NETWORK = 83;
 
     // OPEN: Settings > Backup & reset > Network settings reset > Confirm
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     RESET_NETWORK_CONFIRM = 84;
 
     // OPEN: Settings > Developer Options > Running Services
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     RUNNING_SERVICE_DETAILS = 85;
 
     // OPEN: Settings > Security > Screen pinning
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     SCREEN_PINNING = 86;
 
     // OPEN: Settings > Security
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     SECURITY = 87;
 
     // OPEN: Settings > SIM cards
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     SIM = 88;
 
     // OBSOLETE
@@ -519,55 +445,46 @@
     // OPEN: Settings > More > Tethering & portable hotspot
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TETHER = 90;
 
     // OPEN: Settings > Security > Trust agents
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TRUST_AGENT = 91;
 
     // OPEN: Settings > Security > Trusted credentials
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TRUSTED_CREDENTIALS = 92;
 
     // OPEN: Settings > Language & input > TTS output > [Engine] > Settings
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TTS_ENGINE_SETTINGS = 93;
 
     // OPEN: Settings > Language & input > Text-to-speech output
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TTS_TEXT_TO_SPEECH = 94;
 
     // OPEN: Settings > Security > Apps with usage access
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     USAGE_ACCESS = 95;
 
     // OPEN: Settings > Users
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     USER = 96;
 
     // OPEN: Settings > Users > [Restricted profile app & content access]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     USERS_APP_RESTRICTIONS = 97;
 
     // OPEN: Settings > Users > [User settings]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     USER_DETAILS = 98;
 
     // OBSOLETE
@@ -576,43 +493,36 @@
     // OPEN: Settings > More > VPN
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     VPN = 100;
 
     // OPEN: Settings > Display > Choose wallpaper from
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WALLPAPER_TYPE = 101;
 
     // OPEN: Settings > Display > Cast
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WFD_WIFI_DISPLAY = 102;
 
     // OPEN: Settings > Wi-Fi
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WIFI = 103;
 
     // OPEN: Settings > Wi-Fi > Advanced Wi-Fi
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WIFI_ADVANCED = 104;
 
     // OPEN: Settings > More > Wi-Fi Calling
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WIFI_CALLING = 105;
 
     // OPEN: Settings > Wi-Fi > Saved networks
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WIFI_SAVED_ACCESS_POINTS = 106;
 
     // OBSOLETE
@@ -624,19 +534,16 @@
     // OPEN: Settings > Wi-Fi > Advanced Wi-Fi > Wi-Fi Direct
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WIFI_P2P = 109;
 
     // OPEN: Settings > More
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     WIRELESS = 110;
 
     // OPEN: Quick Settings Panel
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_PANEL = 111;
 
     // OPEN: QS Airplane mode tile shown
@@ -644,7 +551,6 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_AIRPLANEMODE = 112;
 
     // OPEN: QS Bluetooth tile shown
@@ -652,21 +558,18 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_BLUETOOTH = 113;
 
     // OPEN: QS Cast tile shown
     // ACTION: QS Cast tile tapped
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_CAST = 114;
 
     // OPEN: QS Cellular tile shown
     // ACTION: QS Cellular tile tapped
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_CELLULAR = 115;
 
     // OPEN: QS Color inversion tile shown
@@ -674,13 +577,11 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_COLORINVERSION = 116;
 
     // OPEN: QS Cellular tile > Cellular detail panel
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_DATAUSAGEDETAIL = 117;
 
     // OPEN: QS Do not disturb tile shown
@@ -688,7 +589,6 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_DND = 118;
 
     // OPEN: QS Flashlight tile shown
@@ -696,7 +596,6 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_FLASHLIGHT = 119;
 
     // OPEN: QS Hotspot tile shown
@@ -704,14 +603,12 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_HOTSPOT = 120;
 
     // OPEN: QS 3P tile shown
     // ACTION: QS 3P tile tapped
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_INTENT = 121;
 
     // OPEN: QS Location tile shown
@@ -719,7 +616,6 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_LOCATION = 122;
 
     // OPEN: QS Rotation tile shown
@@ -727,7 +623,6 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_ROTATIONLOCK = 123;
 
     // OBSOLETE
@@ -736,7 +631,6 @@
     // OPEN: QS User list panel
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_USERDETAIL = 125;
 
     // OPEN: QS WiFi tile shown
@@ -744,13 +638,11 @@
     //  SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.46
     QS_WIFI = 126;
 
     // OPEN: Notification Panel (including lockscreen)
     // CATEGORY: NOTIFICATION
     // OS: 5.1.1
-    // GMS: 7.5.26
     NOTIFICATION_PANEL = 127;
 
     // OPEN: Notification in panel became visible.
@@ -764,7 +656,6 @@
     //   SUBTYPE: Dismiss reason from NotificationManagerService.java
     // CATEGORY: NOTIFICATION
     // OS: 5.1.1
-    // GMS: 7.5.26
     NOTIFICATION_ITEM = 128;
 
     // ACTION: User tapped notification action
@@ -772,19 +663,16 @@
     //   SUBTYPE: Index of action on notification
     // CATEGORY: NOTIFICATION
     // OS: 5.0
-    // GMS: 7.5.26
     NOTIFICATION_ITEM_ACTION = 129;
 
     // OPEN: Settings > Apps > Configure apps > App permissions
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_ADVANCED = 130;
 
     // OPEN: Settings > Location > Scanning
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     LOCATION_SCANNING = 131;
 
     // OBSOLETE
@@ -793,43 +681,36 @@
     // OPEN: Settings > Sound & notification > App notifications
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     MANAGE_APPLICATIONS_NOTIFICATIONS = 133;
 
     // ACTION: Settings > Wi-Fi > Overflow > Add Network
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_WIFI_ADD_NETWORK = 134;
 
     // ACTION: Settings > Wi-Fi > [Long press network] > Connect to network
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_WIFI_CONNECT = 135;
 
     // ACTION: Settings > Wi-Fi > Overflow > Refresh
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_WIFI_FORCE_SCAN = 136;
 
     // ACTION: Settings > Wi-Fi > [Long press network] > Forget network
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_WIFI_FORGET = 137;
 
     // ACTION: Settings > Wi-Fi > Toggle off
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_WIFI_OFF = 138;
 
     // ACTION: Settings > Wi-Fi > Toggle on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_WIFI_ON = 139;
 
     // OBSOLETE
@@ -838,280 +719,236 @@
     // OPEN: Settings > Sound & notification > DND > Priority only allows
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ZEN_MODE_PRIORITY = 141;
 
     // OPEN: Settings > Sound & notification > DND > Automatic rules
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ZEN_MODE_AUTOMATION = 142;
 
     // OPEN: Settings > Apps > Configure apps > App links
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     MANAGE_DOMAIN_URLS = 143;
 
     // OPEN: Settings > Sound & notification > DND > [Time based rule]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ZEN_MODE_SCHEDULE_RULE = 144;
 
     // OPEN: Settings > Sound & notification > DND > [External rule]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ZEN_MODE_EXTERNAL_RULE = 145;
 
     // OPEN: Settings > Sound & notification > DND > [Event rule]
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ZEN_MODE_EVENT_RULE = 146;
 
     // ACTION: App notification settings > Block Notifications
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_BAN_APP_NOTES = 147;
 
     // ACTION: Notification shade > Dismiss all button
     // CATEGORY: NOTIFICATION
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_DISMISS_ALL_NOTES = 148;
 
     // OPEN: QS Do Not Disturb detail panel
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_DND_DETAILS = 149;
 
     // OPEN: QS Bluetooth detail panel
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_BLUETOOTH_DETAILS = 150;
 
     // OPEN: QS Cast detail panel
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_CAST_DETAILS = 151;
 
     // OPEN: QS Wi-Fi detail panel
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_WIFI_DETAILS = 152;
 
     // ACTION: QS Wi-Fi detail panel > Wi-Fi toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_WIFI_TOGGLE = 153;
 
     // ACTION: QS Bluetooth detail panel > Bluetooth toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_BLUETOOTH_TOGGLE = 154;
 
     // ACTION: QS Cellular detail panel > Cellular toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_CELLULAR_TOGGLE = 155;
 
     // ACTION: QS User list panel > Select different user
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_SWITCH_USER = 156;
 
     // ACTION: QS Cast detail panel > Select cast device
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_CAST_SELECT = 157;
 
     // ACTION: QS Cast detail panel > Disconnect cast device
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_CAST_DISCONNECT = 158;
 
     // ACTION: Settings > Bluetooth > Toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_BLUETOOTH_TOGGLE = 159;
 
     // ACTION: Settings > Bluetooth > Overflow > Refresh
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_BLUETOOTH_SCAN = 160;
 
     // ACTION: Settings > Bluetooth > Overflow > Rename this device
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_BLUETOOTH_RENAME = 161;
 
     // ACTION: Settings > Bluetooth > Overflow > Show received files
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_BLUETOOTH_FILES = 162;
 
     // ACTION: QS DND details panel > Increase / Decrease exit time
     //   SUBTYPE: true is increase, false is decrease
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_DND_TIME = 163;
 
     // ACTION: QS DND details panel > [Exit condition]
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_DND_CONDITION_SELECT = 164;
 
     // ACTION: QS DND details panel > [DND mode]
     //  SUBTYPE: 1 is priority, 2 is silence, 3 is alarms only
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_DND_ZEN_SELECT = 165;
 
     // ACTION: QS DND detail panel > DND toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     QS_DND_TOGGLE = 166;
 
     // ACTION: DND Settings > Priority only allows > Reminder toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ALLOW_REMINDERS = 167;
 
     // ACTION: DND Settings > Priority only allows > Event toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ALLOW_EVENTS = 168;
 
     // ACTION: DND Settings > Priority only allows > Messages
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ALLOW_MESSAGES = 169;
 
     // ACTION: DND Settings > Priority only allows > Calls
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ALLOW_CALLS = 170;
 
     // ACTION: DND Settings > Priority only allows > Repeat callers toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ALLOW_REPEAT_CALLS = 171;
 
     // ACTION: DND Settings > Automatic rules > Add rule
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ADD_RULE = 172;
 
     // ACTION: DND Settings > Automatic rules > Add rule > OK
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ADD_RULE_OK = 173;
 
     // ACTION: DND Settings > Automatic rules > [Rule] > Delete rule
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_DELETE_RULE = 174;
 
     // ACTION: DND Settings > Automatic rules > [Rule] > Delete rule > Delete
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_DELETE_RULE_OK = 175;
 
     // ACTION: DND Settings > Automatic rules > [Rule] > Toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ZEN_ENABLE_RULE = 176;
 
     // ACTION: Settings > More > Airplane mode toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_AIRPLANE_TOGGLE = 177;
 
     // ACTION: Settings > Data usage > Cellular data toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_CELL_DATA_TOGGLE = 178;
 
     // OPEN: Settings > Sound & notification > Notification access
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ACCESS = 179;
 
     // OPEN: Settings > Sound & notification > Do Not Disturb access
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     NOTIFICATION_ZEN_MODE_ACCESS = 180;
 
     // OPEN: Settings > Apps > Configure apps > Default Apps
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_DEFAULT_APPS = 181;
 
     // OPEN: Settings > Internal storage > Apps storage
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_STORAGE_APPS = 182;
 
     // OPEN: Settings > Security > Usage access
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_USAGE_ACCESS_DETAIL = 183;
 
     // OPEN: Settings > Battery > Battery optimization
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_HIGH_POWER_APPS = 184;
 
     // OBSOLETE
@@ -1120,448 +957,377 @@
     // ACTION: Lockscreen > Unlock gesture
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     ACTION_LS_UNLOCK = 186;
 
     // ACTION: Lockscreen > Pull shade open
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     ACTION_LS_SHADE = 187;
 
     // ACTION: Lockscreen > Tap on lock, shows hint
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     ACTION_LS_HINT = 188;
 
     // ACTION: Lockscreen > Camera
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     ACTION_LS_CAMERA = 189;
 
     // ACTION: Lockscreen > Dialer
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     ACTION_LS_DIALER = 190;
 
     // ACTION: Lockscreen > Tap on lock, locks phone
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     ACTION_LS_LOCK = 191;
 
     // ACTION: Lockscreen > Tap on notification, false touch rejection
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     ACTION_LS_NOTE = 192;
 
     // ACTION: Lockscreen > Swipe down to open quick settings
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.8.22
     ACTION_LS_QS = 193;
 
     // ACTION: Swipe down to open quick settings when unlocked
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.8.22
     ACTION_SHADE_QS_PULL = 194;
 
     // ACTION: Notification shade > Tap to open quick settings
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.8.22
     ACTION_SHADE_QS_TAP = 195;
 
     // OPEN: Lockscreen
     //   SUBTYPE: 0 is unsecure, 1 is secured by password / pattern / PIN
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     LOCKSCREEN = 196;
 
     // OPEN: Lockscreen > Screen to enter password / pattern / PIN
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     BOUNCER = 197;
 
     // OPEN: Screen turned on
     //   SUBTYPE: 2 is user action
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.8.22
     SCREEN = 198;
 
     // OPEN: Notification caused sound, vibration, and/or LED blink
     //   SUBTYPE: 1 is buzz, 2 is beep, blink is 4, or'd together
     // CATEGORY: NOTIFICATION
     // OS: 5.1.1
-    // GMS: 7.8.53
     NOTIFICATION_ALERT = 199;
 
     // ACTION: Lockscreen > Emergency Call button
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 5.1.1
-    // GMS: 7.5.26
     ACTION_EMERGENCY_CALL = 200;
 
     // OPEN: Settings > Apps > Configure > Default apps > Assist & voice input
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     APPLICATIONS_MANAGE_ASSIST = 201;
 
     // OPEN: Settings > Memory
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     PROCESS_STATS_SUMMARY = 202;
 
     // ACTION: Settings > Display > When device is rotated
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ROTATION_LOCK = 203;
 
     // ACTION: Long press on notification to view controls
     // CATEGORY: NOTIFICATION
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_NOTE_CONTROLS = 204;
 
     // ACTION: Notificatoin controls > Info button
     // CATEGORY: NOTIFICATION
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_NOTE_INFO = 205;
 
     // ACTION: Notification controls > Settings button
     // CATEGORY: NOTIFICATION
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_APP_NOTE_SETTINGS = 206;
 
     // OPEN: Volume Dialog (with hardware buttons)
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     VOLUME_DIALOG = 207;
 
     // OPEN: Volume dialog > Expanded volume dialog (multiple sliders)
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     VOLUME_DIALOG_DETAILS = 208;
 
     // ACTION: Volume dialog > Adjust volume slider
     //   SUBTYPE: volume level (0-7)
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_VOLUME_SLIDER = 209;
 
     // ACTION: Volume dialog > Select non-active stream
     //   SUBTYPE: stream (defined in AudioSystem.java)
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_VOLUME_STREAM = 210;
 
     // ACTION: Adjust volume with hardware key
     //   SUBTYPE: volume level (0-7)
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_VOLUME_KEY = 211;
 
     // ACTION: Volume dialog > Mute a stream by tapping icon
     //   SUBTYPE: mute is 1, audible is 2
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_VOLUME_ICON = 212;
 
     // ACTION: Volume dialog > Change ringer mode by tapping icon
     //   SUBTYPE: 2 is audible, 3 is vibrate
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_RINGER_MODE = 213;
 
     // ACTION: Chooser shown (share target, file open, etc.)
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ACTIVITY_CHOOSER_SHOWN = 214;
 
     // ACTION: Chooser > User taps an app target
     //   SUBTYPE: Index of target
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ACTIVITY_CHOOSER_PICKED_APP_TARGET = 215;
 
     // ACTION: Chooser > User taps a service target
     //   SUBTYPE: Index of target
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ACTIVITY_CHOOSER_PICKED_SERVICE_TARGET = 216;
 
     // ACTION: Chooser > User taps a standard target
     //   SUBTYPE: Index of target
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ACTIVITY_CHOOSER_PICKED_STANDARD_TARGET = 217;
 
     // ACTION: QS Brightness Slider (with auto brightness disabled)
     //   SUBTYPE: slider value
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_BRIGHTNESS = 218;
 
     // ACTION: QS Brightness Slider (with auto brightness enabled)
     //   SUBTYPE: slider value
     // CATEGORY: QUICK_SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_BRIGHTNESS_AUTO = 219;
 
     // OPEN: Settings > Display > Brightness Slider
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     BRIGHTNESS_DIALOG = 220;
 
     // OPEN: Settings > Apps > Configure Apps > Draw over other apps
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     SYSTEM_ALERT_WINDOW_APPS = 221;
 
     // OPEN: Display has entered dream mode
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     DREAMING = 222;
 
     // OPEN: Display has entered ambient notification mode
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     DOZING = 223;
 
     // OPEN: Overview
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     OVERVIEW_ACTIVITY = 224;
 
     // OPEN: Settings > About phone > Legal information
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ABOUT_LEGAL_SETTINGS = 225;
 
     // OPEN: Settings > Search > Perform search
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_SEARCH_RESULTS = 226;
 
     // OPEN: Settings > System UI Tuner
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER = 227;
 
     // OPEN: Settings > System UI Tuner > Quick Settings
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_QS = 228;
 
     // OPEN: Settings > System UI Tuner > Demo mode
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_DEMO_MODE = 229;
 
     // ACTION: Settings > System UI Tuner > Quick Settings > Move tile
     //   PACKAGE: Tile
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_QS_REORDER = 230;
 
     // ACTION: Settings > System UI Tuner > Quick Settings > Add tile
     //   PACKAGE: Tile
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_QS_ADD = 231;
 
     // ACTION: Settings > System UI Tuner > Quick Settings > Remove tile
     //   PACKAGE: Tile
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_QS_REMOVE = 232;
 
     // ACTION: Settings > System UI Tuner > Status bar > Enable icon
     //   PACKAGE: Icon
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_STATUS_BAR_ENABLE = 233;
 
     // ACTION: Settings > System UI Tuner > Status bar > Disable icon
     //   PACKAGE: Icon
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_STATUS_BAR_DISABLE = 234;
 
     // ACTION: Settings > System UI Tuner > Demo mode > Enable demo mode
     //   SUBTYPE: false is disabled, true is enabled
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_DEMO_MODE_ENABLED = 235;
 
     // ACTION: Settings > System UI Tuner > Demo mode > Show demo mode
     //   SUBTYPE: false is disabled, true is enabled
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_DEMO_MODE_ON = 236;
 
     // ACTION: Settings > System UI Tuner > Show embedded battery percentage
     //   SUBTYPE: 0 is disabled, 1 is enabled
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     TUNER_BATTERY_PERCENTAGE = 237;
 
     // OPEN: Settings > Developer options > Inactive apps
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.5.26
     FUELGAUGE_INACTIVE_APPS = 238;
 
     // ACTION: Long press home to bring up assistant
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.5.26
     ACTION_ASSIST_LONG_PRESS = 239;
 
     // OPEN: Settings > Security > Nexus Imprint > Add Fingerprint
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLLING = 240;
 
     // OPEN: Fingerprint Enroll > Find Sensor
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_FIND_SENSOR = 241;
 
     // OPEN: Fingerprint Enroll > Fingerprint Enrolled!
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLL_FINISH = 242;
 
     // OPEN: Fingerprint Enroll introduction
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLL_INTRO = 243;
 
     // OPEN: Fingerprint Enroll onboarding
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLL_ONBOARD = 244;
 
     // OPEN: Fingerprint Enroll > Let's Start!
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLL_SIDECAR = 245;
 
     // OPEN: Fingerprint Enroll SUW > Let's Start!
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLLING_SETUP = 246;
 
     // OPEN: Fingerprint Enroll SUW > Find Sensor
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_FIND_SENSOR_SETUP = 247;
 
     // OPEN: Fingerprint Enroll SUW > Fingerprint Enrolled!
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLL_FINISH_SETUP = 248;
 
     // OPEN: Fingerprint Enroll SUW introduction
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLL_INTRO_SETUP = 249;
 
     // OPEN: Fingerprint Enroll SUW onboarding
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     FINGERPRINT_ENROLL_ONBOARD_SETUP = 250;
 
     // ACTION: Add fingerprint > Enroll fingerprint
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     ACTION_FINGERPRINT_ENROLL = 251;
 
     // ACTION: Authenticate using fingerprint
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     ACTION_FINGERPRINT_AUTH = 252;
 
     // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Delete
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     ACTION_FINGERPRINT_DELETE = 253;
 
     // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Rename
     // CATEGORY: SETTINGS
     // OS: 6.0
-    // GMS: 7.8.99
     ACTION_FINGERPRINT_RENAME = 254;
 
     // ACTION: Double tap camera shortcut
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.8.99
     ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE = 255;
 
     // ACTION: Double twist camera shortcut
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: 6.0
-    // GMS: 7.8.99
     ACTION_WIGGLE_CAMERA_GESTURE = 256;
 
     // OPEN: QS Work Mode tile shown
@@ -1569,13 +1335,11 @@
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: N
-    // GMS: 7.8.99
     QS_WORKMODE = 257;
 
     // OPEN: Settings > Developer Options > Background Check
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     BACKGROUND_CHECK_SUMMARY = 258;
 
     // OPEN: QS Lock tile shown
@@ -1583,52 +1347,44 @@
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: N
-    // GMS: 7.8.99
     QS_LOCK_TILE = 259;
 
     // OPEN: QS User Tile shown
     // CATEGORY: QUICK_SETTINGS
     // OS: N
-    // GMS: 7.8.99
     QS_USER_TILE = 260;
 
     // OPEN: QS Battery tile shown
     // CATEGORY: QUICK_SETTINGS
     // OS: N
-    // GMS: 7.8.99
     QS_BATTERY_TILE = 261;
 
     // OPEN: Settings > Sound > Do not disturb > Visual interruptions
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     NOTIFICATION_ZEN_MODE_VISUAL_INTERRUPTIONS = 262;
 
     // ACTION: Visual interruptions > No screen interuptions toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_ZEN_ALLOW_WHEN_SCREEN_OFF = 263;
 
     // ACTION: Visual interruptions > No notification light toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_ZEN_ALLOW_LIGHTS = 264;
 
     // OPEN: Settings > Notifications > [App] > Topic Notifications
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     NOTIFICATION_TOPIC_NOTIFICATION = 265;
 
     // ACTION: Settings > Apps > Default Apps > Select different SMS app
     //   PACKAGE: Selected SMS app
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_DEFAULT_SMS_APP_CHANGED = 266;
 
     // OPEN: QS Color modification tile shown
@@ -1636,105 +1392,88 @@
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: QUICK_SETTINGS
     // OS: N
-    // GMS: 7.8.99
     QS_COLOR_MATRIX = 267;
 
     // OPEN: QS Custom tile shown
     // ACTION: QS Work Mode tile tapped
     // CATEGORY: QUICK_SETTINGS
     // OS: N
-    // GMS: 7.8.99
     QS_CUSTOM = 268;
 
     // ACTION: Visual interruptions > Never turn off the screen toggle
     //   SUBTYPE: 0 is off, 1 is on
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_ZEN_ALLOW_WHEN_SCREEN_ON = 269;
 
     // ACTION: Overview > Long-press task, drag to enter split-screen
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_WINDOW_DOCK_DRAG_DROP = 270;
 
     // ACTION: In App > Long-press Overview button to enter split-screen
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_WINDOW_DOCK_LONGPRESS = 271;
 
     // ACTION: In App > Swipe Overview button to enter split-screen
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_WINDOW_DOCK_SWIPE = 272;
 
     // ACTION: Launch profile-specific app > Confirm credentials
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     PROFILE_CHALLENGE = 273;
 
     // OPEN: QS Battery detail panel
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     QS_BATTERY_DETAIL = 274;
 
     // OPEN: Overview > History
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     OVERVIEW_HISTORY = 275;
 
     // ACTION: Overview > Page by tapping Overview button
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_OVERVIEW_PAGE = 276;
 
     // ACTION: Overview > Select app
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_OVERVIEW_SELECT = 277;
 
     // ACTION: View emergency info
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_VIEW_EMERGENCY_INFO = 278;
 
     // ACTION: Edit emergency info activity
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_EDIT_EMERGENCY_INFO = 279;
 
     // ACTION: Edit emergency info field
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_EDIT_EMERGENCY_INFO_FIELD = 280;
 
     // ACTION: Add emergency contact
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_ADD_EMERGENCY_CONTACT = 281;
 
     // ACTION: Delete emergency contact
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_DELETE_EMERGENCY_CONTACT = 282;
 
     // ACTION: Call emergency contact
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     ACTION_CALL_EMERGENCY_CONTACT = 283;
 
     // OPEN: QS Data Saver tile shown
@@ -1745,13 +1484,11 @@
     // OPEN: Settings > Security > User credentials
     // CATEGORY: Settings
     // OS: N
-    // GMS: 7.8.99
     USER_CREDENTIALS = 285;
 
     // ACTION: In App (splitscreen) > Long-press Overview to exit split-screen
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_WINDOW_UNDOCK_LONGPRESS = 286;
 
     // Logged when the user scrolls through overview manually
@@ -1773,81 +1510,68 @@
     // ACTION: Long-press power button, then tap "Take bug report" option.
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_FROM_POWER_MENU_INTERACTIVE = 292;
 
     // ACTION: Long-press power button, then long-press "Take bug report" option.
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_FROM_POWER_MENU_FULL = 293;
 
     // ACTION: Settings -> Developer Options -> Take bug report -> Interactive report
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     // Interactive bug report initiated from Settings.
     ACTION_BUGREPORT_FROM_SETTINGS_INTERACTIVE = 294;
 
     // ACTION: Settings -> Developer Options -> Take bug report -> Full report
     // CATEGORY: SETTINGS
     // OS: N
-    // GMS: 7.8.99
     // Interactive bug report initiated from Settings.
     ACTION_BUGREPORT_FROM_SETTINGS_FULL = 295;
 
     // ACTION: User tapped notification action to cancel a bug report
     // CATEGORY: NOTIFICATION
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_NOTIFICATION_ACTION_CANCEL = 296;
 
     // ACTION: User tapped notification action to launch bug report details screen
     // CATEGORY: NOTIFICATION
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_NOTIFICATION_ACTION_DETAILS = 297;
 
     // ACTION: User tapped notification action to take adition screenshot on bug report
     // CATEGORY: NOTIFICATION
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_NOTIFICATION_ACTION_SCREENSHOT = 298;
 
     // ACTION: User tapped notification to share bug report
     // CATEGORY: NOTIFICATION
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_NOTIFICATION_ACTION_SHARE = 299;
 
     // ACTION: User changed bug report name using the details screen
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_DETAILS_NAME_CHANGED = 300;
 
     // ACTION: User changed bug report title using the details screen
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_DETAILS_TITLE_CHANGED = 301;
 
     // ACTION: User changed bug report description using the details screen
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_DETAILS_DESCRIPTION_CHANGED = 302;
 
     // ACTION: User tapped Save in the bug report details screen.
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_DETAILS_SAVED = 303;
 
     // ACTION: User tapped Cancel in the bug report details screen.
     // CATEGORY: GLOBAL_SYSTEM_UI
     // OS: N
-    // GMS: 7.8.99
     ACTION_BUGREPORT_DETAILS_CANCELED = 304;
 
     // Tuner: Open/close calibrate dialog.
@@ -1920,79 +1644,140 @@
     // the transition was executed.
     APP_TRANSITION_DEVICE_UPTIME_SECONDS = 325;
 
-    // User granted access to the request folder; action takes an integer
-    // representing the folder's index on Environment.STANDARD_DIRECTORIES
-    // (or -2 for root access, or -1 or unknown directory).
+    // ACTION: app requested access to a scoped directory, user granted it.
+    //   SUBTYPE: directory's index on Environment.STANDARD_DIRECTORIES
+    // CATEGORY: GLOBAL_SYSTEM_UI
+    // OS: N
     ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_FOLDER = 326;
 
-    // User denied access to the request folder; action takes an integer
-    // representing the folder's index on Environment.STANDARD_DIRECTORIES
-    // (or -2 for root access, or -1 or unknown directory).
+    // ACTION: app requested access to a scoped directory, user denied it.
+    //   SUBTYPE: directory's index on Environment.STANDARD_DIRECTORIES
+    // CATEGORY: GLOBAL_SYSTEM_UI
+    // OS: N
     ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_FOLDER = 327;
 
-    // User granted access to the request folder; action pass package name
-    // of calling package.
+    // ACTION: app requested access to a scoped directory, user granted it.
+    //   PACKAGE: app that requested access
+    // CATEGORY: GLOBAL_SYSTEM_UI
+    // OS: N
     ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_PACKAGE = 328;
 
-    // User denied access to the request folder; action pass package name
-    // of calling package.
+    // ACTION: app requested access to a scoped directory, user denied it.
+    //   PACKAGE: app that requested access.
+    // CATEGORY: GLOBAL_SYSTEM_UI
+    // OS: N
     ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_PACKAGE = 329;
 
-    // App requested access to a directory it has already been granted
-    // access before; action takes an integer representing the folder's
-    // index on Environment.STANDARD_DIRECTORIES
-    // (or -2 for root access, or -1 or unknown directory).
+    // ACTION: app requested access to a directory user has already been granted
+    // access before.
+    //   SUBTYPE: directory's index on Environment.STANDARD_DIRECTORIES.
+    // CATEGORY: GLOBAL_SYSTEM_UI
+    // OS: N
     ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_FOLDER = 330;
 
-    // App requested access to a directory it has already been granted
-    // access before; action pass package name of calling package.
+    // ACTION: app requested access to a directory user has already been granted
+    // access before.
+    //   PACKAGE: app that requested access.
+    // CATEGORY: GLOBAL_SYSTEM_UI
+    // OS: N
     ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_PACKAGE = 331;
 
-    // Logged when the user slides a notification and
-    // reveals the gear beneath it.
+    // ACTION: Logged when the user slides a notification and reveals the gear
+    // beneath it.
+    // CATEGORY: NOTIFICATION
+    // OS: N
     ACTION_REVEAL_GEAR = 332;
 
-    // Logged when the user taps on the gear beneath
-    // a notification.
+    // ACTION: Logged when the user taps on the gear beneath a notification.
+    // CATEGORY: NOTIFICATION
+    // OS: N
     ACTION_TOUCH_GEAR = 333;
 
     // Logs that the user has edited the enabled VR listeners.
+    // CATEGORY: SETTINGS
+    // OS: N
     VR_MANAGE_LISTENERS = 334;
 
     // Settings -> Accessibility -> Click after pointer stops moving
+    // CATEGORY: SETTINGS
+    // OS: N
     ACCESSIBILITY_TOGGLE_AUTOCLICK = 335;
+
     // Settings -> Sound
+    // CATEGORY: SETTINGS
+    // OS: N
     SOUND = 336;
+
     // Settings -> Notifications -> Gear
+    // CATEGORY: SETTINGS
+    // OS: N
     CONFIGURE_NOTIFICATION = 337;
+
     // Settings -> Wi-Fi -> Gear
+    // CATEGORY: SETTINGS
+    // OS: N
     CONFIGURE_WIFI = 338;
+
     // Settings -> Display -> Display size
+    // OS: N
     DISPLAY_SCREEN_ZOOM = 339;
+
     // Settings -> Display -> Font size
+    // CATEGORY: SETTINGS
+    // OS: N
     ACCESSIBILITY_FONT_SIZE = 340;
+
     // Settings -> Data usage -> Cellular/Wi-Fi data usage
+    // CATEGORY: SETTINGS
+    // OS: N
     DATA_USAGE_LIST = 341;
+
     // Settings -> Data usage -> Billing cycle or DATA_USAGE_LIST -> Gear
+    // CATEGORY: SETTINGS
+    // OS: N
     BILLING_CYCLE = 342;
+
     // DATA_USAGE_LIST -> Any item or App info -> Data usage
+    // CATEGORY: SETTINGS
+    // OS: N
     APP_DATA_USAGE = 343;
+
     // Settings -> Language & input -> Language
+    // CATEGORY: SETTINGS
+    // OS: N
     USER_LOCALE_LIST = 344;
+
     // Settings -> Language & input -> Virtual keyboard
+    // CATEGORY: SETTINGS
+    // OS: N
     VIRTUAL_KEYBOARDS = 345;
+
     // Settings -> Language & input -> Physical keyboard
+    // CATEGORY: SETTINGS
+    // OS: N
     PHYSICAL_KEYBOARDS = 346;
+
     // Settings -> Language & input -> Virtual keyboard -> Add a virtual keyboard
+    // CATEGORY: SETTINGS
+    // OS: N
     ENABLE_VIRTUAL_KEYBOARDS = 347;
+
     // Settings -> Data usage -> Data Saver
+    // CATEGORY: SETTINGS
+    // OS: N
     DATA_SAVER_SUMMARY = 348;
+
     // Settings -> Data usage -> Data Saver -> Unrestricted data access
+    // CATEGORY: SETTINGS
+    // OS: N
     DATA_USAGE_UNRESTRICTED_ACCESS = 349;
 
     // Used for generic logging of Settings Preference Persistence, should not be used
     // outside SharedPreferencesLogger.
+    // CATEGORY: SETTINGS
+    // OS: N
     ACTION_GENERIC_PACKAGE = 350;
+
     // Settings -> Apps -> Gear -> Special access
     SPECIAL_ACCESS = 351;
 
@@ -2158,15 +1943,28 @@
     // System UI Tuner > Other > Power notification controls > Toggle on/off
     ACTION_TUNER_POWER_NOTIFICATION_CONTROLS = 393;
 
-    // Action: user enable / disabled data saver using Settings. Arguments:
-    // 0: Data Saver mode is disabled.
-    // 1: Data Saver mode is enabled.
+    // Action: user enable / disabled data saver using Settings
+    // OPEN: Settings -> Data Usage -> Data saver -> On/off toggle
+    // VALUE: 1 for enabled, 0 for disabled
+    // CATEGORY: SETTINGS
+    // OS: N
     ACTION_DATA_SAVER_MODE = 394;
 
-    // User whitelisted an app for Data Saver mode; action pass package name of app.
+    // User whitelisted an app for Data Saver mode; action pass package name of app
+    // Action: user enable / disabled data saver using Settings
+    // OPEN: Settings -> Data Usage -> Data saver -> Unrestricted data access > APP toggle turned on
+    //       or
+    //       Settings -> Apps -> APP -> Data usage -> Unrestricted data usage toggle turned on
+    // VALUE: package name of APP
+    // CATEGORY: SETTINGS
+    // OS: N
     ACTION_DATA_SAVER_WHITELIST = 395;
 
-    // User blacklisted an app for Data Saver mode; action pass package name of app.
+    // User blacklisted an app for Data Saver mode; action pass package name of app
+    // OPEN: Settings -> Apps -> APP -> Data usage -> Background data toggle turned off
+    // VALUE: package name of APP
+    // CATEGORY: SETTINGS
+    // OS: N
     ACTION_DATA_SAVER_BLACKLIST = 396;
 
     // User opened a remote input view associated with a notification. Passes package name of app
@@ -2332,39 +2130,51 @@
     SUPPORT_FRAGMENT = 475;
 
     // ACTION: Settings -> Select summary tab.
+    // CATEGORY: SETTINGS
     ACTION_SELECT_SUMMARY=476;
 
     // ACTION: Settings -> Select support tab.
+    // CATEGORY: SETTINGS
     ACTION_SELECT_SUPPORT_FRAGMENT = 477;
 
     // ACTION: Settings -> Support -> Tips & tricks
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_TIPS_AND_TRICKS = 478;
 
     // ACTION: Settings -> Support -> Help & feedback
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_HELP_AND_FEEDBACK = 479;
 
     // ACTION: Settings -> Support -> Sign in
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_SIGN_IN = 480;
 
     // ACTION: Settings -> Support -> Phone
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_PHONE = 481;
 
     // ACTION: Settings -> Support -> Chat
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_CHAT = 482;
 
     // ACTION: Settings -> Support -> Phone/Chat -> Disclaimer Cancel
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_DISCLAIMER_CANCEL = 483;
 
     // ACTION: Settings -> Support -> Phone/Chat -> Disclaimer OK
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_DISCLAIMER_OK = 484;
 
     // ACTION: Settings -> Support -> Toll-Free Phone
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_DAIL_TOLLFREE = 485;
 
     // ACTION: Settings -> Support -> "Travel Abroad" Button
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_VIEW_TRAVEL_ABROAD_DIALOG = 486;
 
     // ACTION: Settings -> Support -> "Travel Abroad" Button -> Tolled Phone
+    // CATEGORY: SETTINGS
     ACTION_SUPPORT_DIAL_TOLLED = 487;
 
     // OPEN: Settings > Display > Night display
@@ -2375,6 +2185,9 @@
         //   SUBTYPE: false is off, true is on
     ACTION_TOGGLE_STORAGE_MANAGER = 489;
 
+    // Settings launched from collapsed quick settings.
+    ACTION_QS_COLLAPSED_SETTINGS_LAUNCH = 490;
+
     // ---- End N-MR1 Constants, all N-MR1 constants go above this line ----
     // Add new aosp constants above this line.
     // END OF AOSP CONSTANTS
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index a3cf9c8..6a56fa6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -182,6 +182,10 @@
      */
     private final Random mRandom = new SecureRandom();
 
+    /** All sessions allocated */
+    @GuardedBy("mSessions")
+    private final SparseBooleanArray mAllocatedSessions = new SparseBooleanArray();
+
     @GuardedBy("mSessions")
     private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>();
 
@@ -365,6 +369,7 @@
                             // keep details around for dumpsys.
                             mHistoricalSessions.put(session.sessionId, session);
                         }
+                        mAllocatedSessions.put(session.sessionId, true);
                     }
                 }
             }
@@ -768,8 +773,8 @@
         int sessionId;
         do {
             sessionId = mRandom.nextInt(Integer.MAX_VALUE - 1) + 1;
-            if (mSessions.get(sessionId) == null && mHistoricalSessions.get(sessionId) == null
-                    && !mLegacySessions.get(sessionId, false)) {
+            if (!mAllocatedSessions.get(sessionId, false)) {
+                mAllocatedSessions.put(sessionId, true);
                 return sessionId;
             }
         } while (n++ < 32);
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 2b58156..3aefc08 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -604,7 +604,7 @@
             float scaleH = mTmpRect.height() / (float) appHeight;
             Animation scale = new ScaleAnimation(scaleW, 1, scaleH, 1,
                     computePivot(mTmpRect.left, scaleW),
-                    computePivot(mTmpRect.right, scaleH));
+                    computePivot(mTmpRect.top, scaleH));
             scale.setInterpolator(mDecelerateInterpolator);
 
             Animation alpha = new AlphaAnimation(0, 1);
@@ -1615,8 +1615,7 @@
         if (isTransitionSet()) {
             clear();
             mNextAppTransitionType = NEXT_TRANSIT_TYPE_SCALE_UP;
-            putDefaultNextAppTransitionCoordinates(startX, startY, startX + startWidth,
-                    startY + startHeight, null);
+            putDefaultNextAppTransitionCoordinates(startX, startY, startWidth, startHeight, null);
             postAnimationCallback();
         }
     }
diff --git a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java
index 7ec2097..c351e73 100644
--- a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java
+++ b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java
@@ -321,8 +321,6 @@
     private void setupDemoUser(UserInfo userInfo) {
         UserManager um = getUserManager();
         UserHandle user = UserHandle.of(userInfo.id);
-        LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext());
-        lockPatternUtils.setLockScreenDisabled(true, userInfo.id);
         um.setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user);
         um.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user);
         um.setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user);
@@ -500,6 +498,9 @@
         mAmi.updatePersistentConfigurationForUser(getSystemUsersConfiguration(), userId);
         turnOffAllFlashLights();
         muteVolumeStreams();
+        // Disable lock screen for demo users.
+        LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext());
+        lockPatternUtils.setLockScreenDisabled(true, userId);
         mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId));
 
         synchronized (mActivityLock) {