Merge "Delete framework-updatable-sources filegroup" into sc-dev
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index bf01612..4ee5383 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -941,7 +941,7 @@
     }
 
     private void setImeWindowStatus(int visibilityFlags, int backDisposition) {
-        mPrivOps.setImeWindowStatus(visibilityFlags, backDisposition);
+        mPrivOps.setImeWindowStatusAsync(visibilityFlags, backDisposition);
     }
 
     /** Set region of the keyboard to be avoided from back gesture */
diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java
index 5e0579d..25dda5b 100644
--- a/core/java/android/view/InputEventReceiver.java
+++ b/core/java/android/view/InputEventReceiver.java
@@ -54,6 +54,8 @@
             InputChannel inputChannel, MessageQueue messageQueue);
     private static native void nativeDispose(long receiverPtr);
     private static native void nativeFinishInputEvent(long receiverPtr, int seq, boolean handled);
+    private static native void nativeReportTimeline(long receiverPtr, int inputEventId,
+            long gpuCompletedTime, long presentTime);
     private static native boolean nativeConsumeBatchedInputEvents(long receiverPtr,
             long frameTimeNanos);
     private static native String nativeDump(long receiverPtr, String prefix);
@@ -209,11 +211,11 @@
     }
 
     /**
-     * Report the latency information for a specific input event.
+     * Report the timing / latency information for a specific input event.
      */
-    public final void reportLatencyInfo(int inputEventId, long gpuCompletedTime, long presentTime) {
-        Trace.traceBegin(Trace.TRACE_TAG_INPUT, "reportLatencyInfo");
-        // TODO(b/169866723) : send this data to InputDispatcher via InputChannel
+    public final void reportTimeline(int inputEventId, long gpuCompletedTime, long presentTime) {
+        Trace.traceBegin(Trace.TRACE_TAG_INPUT, "reportTimeline");
+        nativeReportTimeline(mReceiverPtr, inputEventId, gpuCompletedTime, presentTime);
         Trace.traceEnd(Trace.TRACE_TAG_INPUT);
     }
 
diff --git a/core/java/android/view/InputEventSender.java b/core/java/android/view/InputEventSender.java
index 40eb438..d144218 100644
--- a/core/java/android/view/InputEventSender.java
+++ b/core/java/android/view/InputEventSender.java
@@ -112,6 +112,16 @@
     }
 
     /**
+     * Called when timeline is sent to the publisher.
+     *
+     * @param inputEventId The id of the input event that caused the frame being reported
+     * @param gpuCompletedTime The time when the frame left the app process
+     * @param presentTime The time when the frame was presented on screen
+     */
+    public void onTimelineReported(int inputEventId, long gpuCompletedTime, long presentTime) {
+    }
+
+    /**
      * Sends an input event.
      * Must be called on the same Looper thread to which the sender is attached.
      *
@@ -143,4 +153,11 @@
     private void dispatchInputEventFinished(int seq, boolean handled) {
         onInputEventFinished(seq, handled);
     }
+
+    // Called from native code.
+    @SuppressWarnings("unused")
+    private void dispatchTimelineReported(
+            int inputEventId, long gpuCompletedTime, long presentTime) {
+        onTimelineReported(inputEventId, gpuCompletedTime, presentTime);
+    }
 }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index c3770f0..e2cf962 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -8601,7 +8601,7 @@
                 return;
             }
             final long gpuCompletedTime = data[FrameMetrics.Index.GPU_COMPLETED];
-            mReceiver.reportLatencyInfo(inputEventId, gpuCompletedTime, presentTime);
+            mReceiver.reportTimeline(inputEventId, gpuCompletedTime, presentTime);
         }
     }
     HardwareRendererObserver mHardwareRendererObserver;
diff --git a/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl b/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
index e4dd7b0..20e520e 100644
--- a/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
+++ b/core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl
@@ -29,7 +29,7 @@
  * Actual operations are implemented and handled by InputMethodManagerService.
  */
 oneway interface IInputMethodPrivilegedOperations {
-    void setImeWindowStatus(int vis, int backDisposition, in IVoidResultCallback resultCallback);
+    void setImeWindowStatusAsync(int vis, int backDisposition);
     void reportStartInput(in IBinder startInputToken, in IVoidResultCallback resultCallback);
     void createInputContentUriToken(in Uri contentUri, in String packageName,
             in IIInputContentUriTokenResultCallback resultCallback);
diff --git a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
index 04cf3f3..98c75b9 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
@@ -95,8 +95,7 @@
     }
 
     /**
-     * Calls {@link IInputMethodPrivilegedOperations#setImeWindowStatus(int, int,
-     * IVoidResultCallback)}.
+     * Calls {@link IInputMethodPrivilegedOperations#setImeWindowStatusAsync(int, int}.
      *
      * @param vis visibility flags
      * @param backDisposition disposition flags
@@ -107,15 +106,13 @@
      * @see android.inputmethodservice.InputMethodService#BACK_DISPOSITION_ADJUST_NOTHING
      */
     @AnyThread
-    public void setImeWindowStatus(int vis, int backDisposition) {
+    public void setImeWindowStatusAsync(int vis, int backDisposition) {
         final IInputMethodPrivilegedOperations ops = mOps.getAndWarnIfNull();
         if (ops == null) {
             return;
         }
         try {
-            final Completable.Void value = Completable.createVoid();
-            ops.setImeWindowStatus(vis, backDisposition, ResultCallbacks.of(value));
-            Completable.getResult(value);
+            ops.setImeWindowStatusAsync(vis, backDisposition);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp
index bfeb01d..44597cc 100644
--- a/core/jni/android_view_InputEventReceiver.cpp
+++ b/core/jni/android_view_InputEventReceiver.cpp
@@ -27,6 +27,7 @@
 #include <input/InputTransport.h>
 #include <log/log.h>
 #include <utils/Looper.h>
+#include <variant>
 #include <vector>
 #include "android_os_MessageQueue.h"
 #include "android_view_InputChannel.h"
@@ -80,6 +81,7 @@
     status_t initialize();
     void dispose();
     status_t finishInputEvent(uint32_t seq, bool handled);
+    status_t reportTimeline(int32_t inputEventId, nsecs_t gpuCompletedTime, nsecs_t presentTime);
     status_t consumeEvents(JNIEnv* env, bool consumeBatches, nsecs_t frameTime,
             bool* outConsumedBatch);
     std::string dump(const char* prefix);
@@ -93,13 +95,19 @@
         bool handled;
     };
 
+    struct Timeline {
+        int32_t inputEventId;
+        std::array<nsecs_t, GraphicsTimeline::SIZE> timeline;
+    };
+    typedef std::variant<Finish, Timeline> OutboundEvent;
+
     jobject mReceiverWeakGlobal;
     InputConsumer mInputConsumer;
     sp<MessageQueue> mMessageQueue;
     PreallocatedInputEventFactory mInputEventFactory;
     bool mBatchedInputEventPending;
     int mFdEvents;
-    std::vector<Finish> mFinishQueue;
+    std::vector<OutboundEvent> mOutboundQueue;
 
     void setFdEvents(int events);
 
@@ -152,7 +160,23 @@
             .seq = seq,
             .handled = handled,
     };
-    mFinishQueue.push_back(finish);
+    mOutboundQueue.push_back(finish);
+    return processOutboundEvents();
+}
+
+status_t NativeInputEventReceiver::reportTimeline(int32_t inputEventId, nsecs_t gpuCompletedTime,
+                                                  nsecs_t presentTime) {
+    if (kDebugDispatchCycle) {
+        ALOGD("channel '%s' ~ %s", getInputChannelName().c_str(), __func__);
+    }
+    std::array<nsecs_t, GraphicsTimeline::SIZE> graphicsTimeline;
+    graphicsTimeline[GraphicsTimeline::GPU_COMPLETED_TIME] = gpuCompletedTime;
+    graphicsTimeline[GraphicsTimeline::PRESENT_TIME] = presentTime;
+    Timeline timeline{
+            .inputEventId = inputEventId,
+            .timeline = graphicsTimeline,
+    };
+    mOutboundQueue.push_back(timeline);
     return processOutboundEvents();
 }
 
@@ -170,7 +194,7 @@
 
 /**
  * Receiver's primary role is to receive input events, but it has an additional duty of sending
- * 'ack' for events (using the call 'finishInputEvent').
+ * 'ack' for events (using the call 'finishInputEvent') and reporting input event timeline.
  *
  * If we are looking at the communication between InputPublisher and InputConsumer, we can say that
  * from the InputConsumer's perspective, InputMessage's that are sent from publisher to consumer are
@@ -178,19 +202,31 @@
  * InputPublisher are 'outbound / outgoing' events.
  *
  * NativeInputEventReceiver owns (and acts like) an InputConsumer. So the finish events are outbound
- * from InputEventReceiver (and will be sent to the InputPublisher).
+ * from InputEventReceiver (and will be sent to the InputPublisher). Likewise, timeline events are
+ * outbound events.
  *
- * In this function, send as many events from 'mFinishQueue' as possible across the socket to the
+ * In this function, send as many events from 'mOutboundQueue' as possible across the socket to the
  * InputPublisher. If no events are remaining, let the looper know so that it doesn't wake up
  * unnecessarily.
  */
 status_t NativeInputEventReceiver::processOutboundEvents() {
-    while (!mFinishQueue.empty()) {
-        const Finish& finish = *mFinishQueue.begin();
-        status_t status = mInputConsumer.sendFinishedSignal(finish.seq, finish.handled);
+    while (!mOutboundQueue.empty()) {
+        OutboundEvent& outbound = *mOutboundQueue.begin();
+        status_t status;
+
+        if (std::holds_alternative<Finish>(outbound)) {
+            const Finish& finish = std::get<Finish>(outbound);
+            status = mInputConsumer.sendFinishedSignal(finish.seq, finish.handled);
+        } else if (std::holds_alternative<Timeline>(outbound)) {
+            const Timeline& timeline = std::get<Timeline>(outbound);
+            status = mInputConsumer.sendTimeline(timeline.inputEventId, timeline.timeline);
+        } else {
+            LOG_ALWAYS_FATAL("Unexpected event type in std::variant");
+            status = BAD_VALUE;
+        }
         if (status == OK) {
             // Successful send. Erase the entry and keep trying to send more
-            mFinishQueue.erase(mFinishQueue.begin());
+            mOutboundQueue.erase(mOutboundQueue.begin());
             continue;
         }
 
@@ -198,7 +234,7 @@
         if (status == WOULD_BLOCK) {
             if (kDebugDispatchCycle) {
                 ALOGD("channel '%s' ~ Remaining outbound events: %zu.",
-                      getInputChannelName().c_str(), mFinishQueue.size());
+                      getInputChannelName().c_str(), mOutboundQueue.size());
             }
             setFdEvents(ALOOPER_EVENT_INPUT | ALOOPER_EVENT_OUTPUT);
             return WOULD_BLOCK; // try again later
@@ -425,12 +461,23 @@
 
     out += android::base::StringPrintf("mBatchedInputEventPending: %s\n",
                                        toString(mBatchedInputEventPending));
-    out = out + "mFinishQueue:\n";
-    for (const Finish& finish : mFinishQueue) {
-        out += android::base::StringPrintf("  seq=%" PRIu32 " handled=%s\n", finish.seq,
-                                           toString(finish.handled));
+    out = out + "mOutboundQueue:\n";
+    for (const OutboundEvent& outbound : mOutboundQueue) {
+        if (std::holds_alternative<Finish>(outbound)) {
+            const Finish& finish = std::get<Finish>(outbound);
+            out += android::base::StringPrintf("  Finish: seq=%" PRIu32 " handled=%s\n", finish.seq,
+                                               toString(finish.handled));
+        } else if (std::holds_alternative<Timeline>(outbound)) {
+            const Timeline& timeline = std::get<Timeline>(outbound);
+            out += android::base::
+                    StringPrintf("  Timeline: inputEventId=%" PRId32 " gpuCompletedTime=%" PRId64
+                                 ", presentTime=%" PRId64 "\n",
+                                 timeline.inputEventId,
+                                 timeline.timeline[GraphicsTimeline::GPU_COMPLETED_TIME],
+                                 timeline.timeline[GraphicsTimeline::PRESENT_TIME]);
+        }
     }
-    if (mFinishQueue.empty()) {
+    if (mOutboundQueue.empty()) {
         out = out + "  <empty>\n";
     }
     return addPrefix(out, prefix);
@@ -489,6 +536,25 @@
     }
 }
 
+static void nativeReportTimeline(JNIEnv* env, jclass clazz, jlong receiverPtr, jint inputEventId,
+                                 jlong gpuCompletedTime, jlong presentTime) {
+    if (IdGenerator::getSource(inputEventId) != IdGenerator::Source::INPUT_READER) {
+        // skip this event, it did not originate from hardware
+        return;
+    }
+    sp<NativeInputEventReceiver> receiver =
+            reinterpret_cast<NativeInputEventReceiver*>(receiverPtr);
+    status_t status = receiver->reportTimeline(inputEventId, gpuCompletedTime, presentTime);
+    if (status == OK || status == WOULD_BLOCK) {
+        return; // normal operation
+    }
+    if (status != DEAD_OBJECT) {
+        std::string message = android::base::StringPrintf("Failed to send timeline.  status=%s(%d)",
+                                                          strerror(-status), status);
+        jniThrowRuntimeException(env, message.c_str());
+    }
+}
+
 static jboolean nativeConsumeBatchedInputEvents(JNIEnv* env, jclass clazz, jlong receiverPtr,
         jlong frameTimeNanos) {
     sp<NativeInputEventReceiver> receiver =
@@ -520,6 +586,7 @@
          (void*)nativeInit},
         {"nativeDispose", "(J)V", (void*)nativeDispose},
         {"nativeFinishInputEvent", "(JIZ)V", (void*)nativeFinishInputEvent},
+        {"nativeReportTimeline", "(JIJJ)V", (void*)nativeReportTimeline},
         {"nativeConsumeBatchedInputEvents", "(JJ)Z", (void*)nativeConsumeBatchedInputEvents},
         {"nativeDump", "(JLjava/lang/String;)Ljava/lang/String;", (void*)nativeDump},
 };
diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp
index 10927b9..fd1b998 100644
--- a/core/jni/android_view_InputEventSender.cpp
+++ b/core/jni/android_view_InputEventSender.cpp
@@ -45,6 +45,7 @@
     jclass clazz;
 
     jmethodID dispatchInputEventFinished;
+    jmethodID dispatchTimelineReported;
 } gInputEventSenderClassInfo;
 
 
@@ -75,9 +76,10 @@
     }
 
     int handleEvent(int receiveFd, int events, void* data) override;
-    status_t receiveFinishedSignals(JNIEnv* env);
-    bool notifyFinishedSignal(JNIEnv* env, jobject sender, const InputPublisher::Finished& finished,
-                              bool skipCallbacks);
+    status_t processConsumerResponse(JNIEnv* env);
+    bool notifyConsumerResponse(JNIEnv* env, jobject sender,
+                                const InputPublisher::ConsumerResponse& response,
+                                bool skipCallbacks);
 };
 
 NativeInputEventSender::NativeInputEventSender(JNIEnv* env, jobject senderWeak,
@@ -188,12 +190,12 @@
     }
 
     JNIEnv* env = AndroidRuntime::getJNIEnv();
-    status_t status = receiveFinishedSignals(env);
+    status_t status = processConsumerResponse(env);
     mMessageQueue->raiseAndClearException(env, "handleReceiveCallback");
     return status == OK || status == NO_MEMORY ? 1 : 0;
 }
 
-status_t NativeInputEventSender::receiveFinishedSignals(JNIEnv* env) {
+status_t NativeInputEventSender::processConsumerResponse(JNIEnv* env) {
     if (kDebugDispatchCycle) {
         ALOGD("channel '%s' ~ Receiving finished signals.", getInputChannelName().c_str());
     }
@@ -206,18 +208,18 @@
     }
     bool skipCallbacks = false; // stop calling Java functions after an exception occurs
     for (;;) {
-        Result<InputPublisher::Finished> result = mInputPublisher.receiveFinishedSignal();
+        Result<InputPublisher::ConsumerResponse> result = mInputPublisher.receiveConsumerResponse();
         if (!result.ok()) {
             const status_t status = result.error().code();
             if (status == WOULD_BLOCK) {
                 return OK;
             }
-            ALOGE("channel '%s' ~ Failed to consume finished signals.  status=%d",
+            ALOGE("channel '%s' ~ Failed to process consumer response.  status=%d",
                   getInputChannelName().c_str(), status);
             return status;
         }
 
-        const bool notified = notifyFinishedSignal(env, senderObj.get(), *result, skipCallbacks);
+        const bool notified = notifyConsumerResponse(env, senderObj.get(), *result, skipCallbacks);
         if (!notified) {
             skipCallbacks = true;
         }
@@ -225,16 +227,49 @@
 }
 
 /**
- * Invoke the Java function dispatchInputEventFinished for the received "Finished" signal.
- * Set the variable 'skipCallbacks' to 'true' if a Java exception occurred.
+ * Invoke the corresponding Java function for the different variants of response.
+ * If the response is a Finished object, invoke dispatchInputEventFinished.
+ * If the response is a Timeline object, invoke dispatchTimelineReported.
+ * Set 'skipCallbacks' to 'true' if a Java exception occurred.
  * Java function will only be called if 'skipCallbacks' is originally 'false'.
  *
  * Return "false" if an exception occurred while calling the Java function
  *        "true" otherwise
  */
-bool NativeInputEventSender::notifyFinishedSignal(JNIEnv* env, jobject sender,
-                                                  const InputPublisher::Finished& finished,
-                                                  bool skipCallbacks) {
+bool NativeInputEventSender::notifyConsumerResponse(
+        JNIEnv* env, jobject sender, const InputPublisher::ConsumerResponse& response,
+        bool skipCallbacks) {
+    if (std::holds_alternative<InputPublisher::Timeline>(response)) {
+        const InputPublisher::Timeline& timeline = std::get<InputPublisher::Timeline>(response);
+
+        if (kDebugDispatchCycle) {
+            ALOGD("channel '%s' ~ Received timeline, inputEventId=%" PRId32
+                  ", gpuCompletedTime=%" PRId64 ", presentTime=%" PRId64,
+                  getInputChannelName().c_str(), timeline.inputEventId,
+                  timeline.graphicsTimeline[GraphicsTimeline::GPU_COMPLETED_TIME],
+                  timeline.graphicsTimeline[GraphicsTimeline::PRESENT_TIME]);
+        }
+
+        if (skipCallbacks) {
+            ALOGW("Java exception occurred. Skipping dispatchTimelineReported for "
+                  "inputEventId=%" PRId32,
+                  timeline.inputEventId);
+            return true;
+        }
+
+        env->CallVoidMethod(sender, gInputEventSenderClassInfo.dispatchTimelineReported,
+                            timeline.inputEventId, timeline.graphicsTimeline);
+        if (env->ExceptionCheck()) {
+            ALOGE("Exception dispatching timeline, inputEventId=%" PRId32, timeline.inputEventId);
+            return false;
+        }
+
+        return true;
+    }
+
+    // Must be a Finished event
+    const InputPublisher::Finished& finished = std::get<InputPublisher::Finished>(response);
+
     auto it = mPublishedSeqMap.find(finished.seq);
     if (it == mPublishedSeqMap.end()) {
         ALOGW("Received 'finished' signal for unknown seq number = %" PRIu32, finished.seq);
@@ -340,6 +375,9 @@
 
     gInputEventSenderClassInfo.dispatchInputEventFinished = GetMethodIDOrDie(
             env, gInputEventSenderClassInfo.clazz, "dispatchInputEventFinished", "(IZ)V");
+    gInputEventSenderClassInfo.dispatchTimelineReported =
+            GetMethodIDOrDie(env, gInputEventSenderClassInfo.clazz, "dispatchTimelineReported",
+                             "(IJJ)V");
 
     return res;
 }
diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml
index 2c2b404..0e78377 100644
--- a/libs/WindowManager/Shell/res/values/config.xml
+++ b/libs/WindowManager/Shell/res/values/config.xml
@@ -49,12 +49,6 @@
      when the PIP menu is shown in center. -->
     <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string>
 
-    <!-- one handed background panel default color RGB -->
-    <item name="config_one_handed_background_rgb" format="float" type="dimen">0.5</item>
-
-    <!-- one handed background panel default alpha -->
-    <item name="config_one_handed_background_alpha" format="float" type="dimen">0.5</item>
-
     <!-- maximum animation duration for the icon when entering the starting window -->
     <integer name="max_starting_window_intro_icon_anim_duration">1000</integer>
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java
index c7dbe88..703eba9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedBackgroundPanelOrganizer.java
@@ -17,7 +17,7 @@
 package com.android.wm.shell.onehanded;
 
 import android.content.Context;
-import android.content.res.Resources;
+import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.util.Log;
@@ -30,6 +30,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.core.content.ContextCompat;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.wm.shell.R;
@@ -50,8 +51,7 @@
 
     private final Object mLock = new Object();
     private final SurfaceSession mSurfaceSession = new SurfaceSession();
-    private final float[] mColor;
-    private final float mAlpha;
+    private final float[] mDefaultColor;
     private final Executor mMainExecutor;
     private final OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
             mSurfaceControlTransactionFactory;
@@ -88,16 +88,15 @@
     public OneHandedBackgroundPanelOrganizer(Context context, DisplayLayout displayLayout,
             Executor executor) {
         super(executor);
-        final Resources res = context.getResources();
-        final float defaultRGB = res.getFloat(R.dimen.config_one_handed_background_rgb);
-        mColor = new float[]{defaultRGB, defaultRGB, defaultRGB};
-        mAlpha = res.getFloat(R.dimen.config_one_handed_background_alpha);
         // Ensure the mBkgBounds is portrait, due to OHM only support on portrait
         if (displayLayout.height() > displayLayout.width()) {
             mBkgBounds = new Rect(0, 0, displayLayout.width(), displayLayout.height());
         } else {
             mBkgBounds = new Rect(0, 0, displayLayout.height(), displayLayout.width());
         }
+        final int defaultColor = ContextCompat.getColor(context, R.color.GM2_grey_800);
+        mDefaultColor = new float[]{Color.red(defaultColor) / 255.0f,
+                Color.green(defaultColor) / 255.0f, Color.blue(defaultColor) / 255.0f};
         mMainExecutor = executor;
         mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
     }
@@ -153,8 +152,8 @@
                         .setParent(mParentLeash)
                         .setBufferSize(mBkgBounds.width(), mBkgBounds.height())
                         .setColorLayer()
-                        .setFormat(PixelFormat.RGBA_8888)
-                        .setOpaque(false)
+                        .setFormat(PixelFormat.RGB_888)
+                        .setOpaque(true)
                         .setName("one-handed-background-panel")
                         .setCallsite("OneHandedBackgroundPanelOrganizer")
                         .build();
@@ -178,8 +177,7 @@
             SurfaceControl.Transaction transaction =
                     mSurfaceControlTransactionFactory.getTransaction();
             transaction.setLayer(mBackgroundSurface, -1 /* at bottom-most layer */)
-                    .setColor(mBackgroundSurface, mColor)
-                    .setAlpha(mBackgroundSurface, mAlpha)
+                    .setColor(mBackgroundSurface, mDefaultColor)
                     .show(mBackgroundSurface)
                     .apply();
             transaction.close();
@@ -210,5 +208,7 @@
         pw.println(mIsShowing);
         pw.print(innerPrefix + "mBkgBounds=");
         pw.println(mBkgBounds);
+        pw.print(innerPrefix + "mDefaultColor=");
+        pw.println(mDefaultColor);
     }
 }
diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml
index 5dcd7f2..1850233 100644
--- a/packages/PrintSpooler/res/values-iw/strings.xml
+++ b/packages/PrintSpooler/res/values-iw/strings.xml
@@ -27,7 +27,7 @@
     <string name="label_duplex" msgid="5370037254347072243">"דו-צדדי"</string>
     <string name="label_orientation" msgid="2853142581990496477">"כיוון"</string>
     <string name="label_pages" msgid="7768589729282182230">"עמודים"</string>
-    <string name="destination_default_text" msgid="5422708056807065710">"בחר מדפסת"</string>
+    <string name="destination_default_text" msgid="5422708056807065710">"בחירת מדפסת"</string>
     <string name="template_all_pages" msgid="3322235982020148762">"הכל <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
     <string name="template_page_range" msgid="428638530038286328">"טווח של <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
     <string name="pages_range_example" msgid="8558694453556945172">"למשל 1–5‏,8,‏11–13"</string>
@@ -41,7 +41,7 @@
     <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
     <string name="page_description_template" msgid="6831239682256197161">"עמוד <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> מתוך <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
     <string name="summary_template" msgid="8899734908625669193">"סיכום, עותקים <xliff:g id="COPIES">%1$s</xliff:g>, גודל נייר <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
-    <string name="expand_handle" msgid="7282974448109280522">"ידית הרחבה"</string>
+    <string name="expand_handle" msgid="7282974448109280522">"נקודת אחיזה להרחבה"</string>
     <string name="collapse_handle" msgid="6886637989442507451">"ידית כיווץ"</string>
     <string name="print_button" msgid="645164566271246268">"הדפס"</string>
     <string name="savetopdf_button" msgid="2976186791686924743">"‏שמירה כ-PDF"</string>
@@ -72,7 +72,7 @@
     <string name="print_no_printers" msgid="4869403323900054866">"לא נמצאו מדפסות"</string>
     <string name="cannot_add_printer" msgid="7840348733668023106">"לא ניתן להוסיף מדפסות"</string>
     <string name="select_to_add_printers" msgid="3800709038689830974">"בחר כדי להוסיף מדפסת"</string>
-    <string name="enable_print_service" msgid="3482815747043533842">"בחר כדי להפעיל"</string>
+    <string name="enable_print_service" msgid="3482815747043533842">"צריך לבחור כדי להפעיל"</string>
     <string name="enabled_services_title" msgid="7036986099096582296">"שירותים מופעלים"</string>
     <string name="recommended_services_title" msgid="3799434882937956924">"שירותים מומלצים"</string>
     <string name="disabled_services_title" msgid="7313253167968363211">"שירותים מושבתים"</string>
@@ -84,7 +84,7 @@
       <item quantity="one">התקן כדי לגלות מדפסת <xliff:g id="COUNT_0">%1$s</xliff:g></item>
     </plurals>
     <string name="printing_notification_title_template" msgid="295903957762447362">"מדפיס את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
-    <string name="cancelling_notification_title_template" msgid="1821759594704703197">"מבטל את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+    <string name="cancelling_notification_title_template" msgid="1821759594704703197">"המערכת מבטלת את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="failed_notification_title_template" msgid="2256217208186530973">"שגיאת מדפסת ב-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="blocked_notification_title_template" msgid="1175435827331588646">"המדפסת חסמה את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
     <string name="cancel" msgid="4373674107267141885">"ביטול"</string>
@@ -111,5 +111,5 @@
     <string name="print_error_retry" msgid="1426421728784259538">"כדאי לנסות שוב"</string>
     <string name="print_error_printer_unavailable" msgid="8985614415253203381">"המדפסת הזו אינה זמינה כעת."</string>
     <string name="print_cannot_load_page" msgid="6179560924492912009">"לא ניתן להציג תצוגה מקדימה"</string>
-    <string name="print_preparing_preview" msgid="3939930735671364712">"מכין תצוגה מקדימה…"</string>
+    <string name="print_preparing_preview" msgid="3939930735671364712">"בתהליך יצירת תצוגה מקדימה…"</string>
 </resources>
diff --git a/packages/PrintSpooler/res/values-ml/strings.xml b/packages/PrintSpooler/res/values-ml/strings.xml
deleted file mode 100644
index 73af95d..0000000
--- a/packages/PrintSpooler/res/values-ml/strings.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2013 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string>
-    <string name="more_options_button" msgid="2243228396432556771">"കൂടുതൽ ഓപ്‌ഷനുകൾ"</string>
-    <string name="label_destination" msgid="9132510997381599275">"ലക്ഷ്യസ്ഥാനം"</string>
-    <string name="label_copies" msgid="3634531042822968308">"പകർപ്പുകൾ"</string>
-    <string name="label_copies_summary" msgid="3861966063536529540">"പകർപ്പുകൾ:"</string>
-    <string name="label_paper_size" msgid="908654383827777759">"പേപ്പർ വലുപ്പം"</string>
-    <string name="label_paper_size_summary" msgid="5668204981332138168">"പേപ്പർ വലുപ്പം:"</string>
-    <string name="label_color" msgid="1108690305218188969">"നിറം"</string>
-    <string name="label_duplex" msgid="5370037254347072243">"രണ്ട് വശങ്ങളുള്ളത്"</string>
-    <string name="label_orientation" msgid="2853142581990496477">"ഓറിയന്‍റേഷന്‍‌"</string>
-    <string name="label_pages" msgid="7768589729282182230">"പേജുകൾ"</string>
-    <string name="destination_default_text" msgid="5422708056807065710">"ഒരു പ്രിന്റർ തിരഞ്ഞെടുക്കുക"</string>
-    <string name="template_all_pages" msgid="3322235982020148762">"എല്ലാ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
-    <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> എന്നതിന്റെ പരിധി"</string>
-    <string name="pages_range_example" msgid="8558694453556945172">"ഉദാ. 1—5,8,11—13"</string>
-    <string name="print_preview" msgid="8010217796057763343">"പ്രിന്റ് പ്രിവ്യൂ"</string>
-    <string name="install_for_print_preview" msgid="6366303997385509332">"പ്രിവ്യൂ കാണിക്കുന്നതിന് PDF വ്യൂവർ ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
-    <string name="printing_app_crashed" msgid="854477616686566398">"പ്രിന്റുചെയ്യൽ അപ്ലിക്കേഷൻ ക്രാഷായി"</string>
-    <string name="generating_print_job" msgid="3119608742651698916">"പ്രിന്റ് ജോലി സൃഷ്‌ടിക്കുന്നു"</string>
-    <string name="save_as_pdf" msgid="5718454119847596853">"PDF-ആയി സംരക്ഷിക്കൂ"</string>
-    <string name="all_printers" msgid="5018829726861876202">"എല്ലാ പ്രിന്ററുകളും..."</string>
-    <string name="print_dialog" msgid="32628687461331979">"പ്രിന്റ് സംഭാഷണം"</string>
-    <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
-    <string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> / <xliff:g id="PAGE_COUNT">%2$d</xliff:g> പേജ്"</string>
-    <string name="summary_template" msgid="8899734908625669193">"സംഗ്രഹം, പകർപ്പുകൾ <xliff:g id="COPIES">%1$s</xliff:g>, പേപ്പർ വലുപ്പം <xliff:g id="PAPER_SIZE">%2$s</xliff:g> എന്നിവ"</string>
-    <string name="expand_handle" msgid="7282974448109280522">"വിപുലീകരണം കൈകാര്യം ചെയ്യുക"</string>
-    <string name="collapse_handle" msgid="6886637989442507451">"ചുരുക്കുന്നത് കൈകാര്യം ചെയ്യുക"</string>
-    <string name="print_button" msgid="645164566271246268">"പ്രിന്റുചെയ്യുക"</string>
-    <string name="savetopdf_button" msgid="2976186791686924743">"PDF-ൽ സംരക്ഷിക്കുക"</string>
-    <string name="print_options_expanded" msgid="6944679157471691859">"പ്രിന്റ് ചെയ്യാനുള്ള ഓപ്‌ഷനുകൾ വിപുലീകരിച്ചു"</string>
-    <string name="print_options_collapsed" msgid="7455930445670414332">"പ്രിന്റ് ചെയ്യാനുള്ള ഓപ്‌ഷനുകൾ ചുരുക്കി"</string>
-    <string name="search" msgid="5421724265322228497">"Search"</string>
-    <string name="all_printers_label" msgid="3178848870161526399">"എല്ലാ പ്രിന്ററുകളും"</string>
-    <string name="add_print_service_label" msgid="5356702546188981940">"സേവനം ചേർക്കുക"</string>
-    <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"തിരയൽ ബോക്‌സ് ദൃശ്യമാക്കിയിരിക്കുന്നു"</string>
-    <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"തിരയൽ ബോക്‌സ് മറച്ചിരിക്കുന്നു"</string>
-    <string name="print_add_printer" msgid="1088656468360653455">"പ്രിന്റർ ചേർക്കുക"</string>
-    <string name="print_select_printer" msgid="7388760939873368698">"പ്രിന്റർ തിരഞ്ഞെടുക്കുക"</string>
-    <string name="print_forget_printer" msgid="5035287497291910766">"പ്രിന്റർ മറന്നു"</string>
-    <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
-      <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> പ്രിന്ററുകൾ കണ്ടെത്തി</item>
-      <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> പ്രിന്റർ കണ്ടെത്തി</item>
-    </plurals>
-    <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
-    <string name="printer_info_desc" msgid="7181988788991581654">"ഈ പ്രിന്ററിനെ കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ"</string>
-    <string name="notification_channel_progress" msgid="872788690775721436">"നടന്നുകൊണ്ടിരിക്കുന്ന പ്രിന്റ് ജോലികൾ"</string>
-    <string name="notification_channel_failure" msgid="9042250774797916414">"പരാജയപ്പെട്ട പ്രിന്റ് ജോലികൾ"</string>
-    <string name="could_not_create_file" msgid="3425025039427448443">"ഫയൽ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല"</string>
-    <string name="print_services_disabled_toast" msgid="9089060734685174685">"ചില പ്രിന്റ് സേവനങ്ങൾ പ്രവർത്തനരഹിതമാക്കി"</string>
-    <string name="print_searching_for_printers" msgid="6550424555079932867">"പ്രിന്ററുകൾക്കായി തിരയുന്നു"</string>
-    <string name="print_no_print_services" msgid="8561247706423327966">"പ്രിന്റ് സേവനങ്ങളൊന്നും പ്രവർത്തനക്ഷമാക്കിയിട്ടില്ല"</string>
-    <string name="print_no_printers" msgid="4869403323900054866">"പ്രിന്ററുകളൊന്നും കണ്ടെത്തിയില്ല"</string>
-    <string name="cannot_add_printer" msgid="7840348733668023106">"പ്രിന്ററുകൾ ചേർക്കാൻ കഴിയില്ല"</string>
-    <string name="select_to_add_printers" msgid="3800709038689830974">"പ്രിന്റർ ചേർക്കാൻ തിരഞ്ഞെടുക്കുക"</string>
-    <string name="enable_print_service" msgid="3482815747043533842">"പ്രവർത്തനക്ഷമമാക്കാൻ തിരഞ്ഞെടുക്കുക"</string>
-    <string name="enabled_services_title" msgid="7036986099096582296">"പ്രവർത്തനക്ഷമമാക്കിയ സേവനങ്ങൾ"</string>
-    <string name="recommended_services_title" msgid="3799434882937956924">"ശുപാർശ ചെയ്യപ്പെടുന്ന സേവനങ്ങൾ"</string>
-    <string name="disabled_services_title" msgid="7313253167968363211">"പ്രവർത്തനരഹിതമാക്കിയ സേവനങ്ങൾ"</string>
-    <string name="all_services_title" msgid="5578662754874906455">"എല്ലാ സേവനങ്ങളും"</string>
-    <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
-      <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> പ്രിന്ററുകൾ കണ്ടെത്തുന്നതിന് ഇൻസ്റ്റാൾ ചെയ്യുക</item>
-      <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> പ്രിന്റർ കണ്ടെത്തുന്നതിന് ഇൻസ്റ്റാൾ ചെയ്യുക</item>
-    </plurals>
-    <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> പ്രിന്റുചെയ്യുന്നു"</string>
-    <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> റദ്ദാക്കുന്നു"</string>
-    <string name="failed_notification_title_template" msgid="2256217208186530973">"പ്രിന്റർ പിശക് <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
-    <string name="blocked_notification_title_template" msgid="1175435827331588646">"പ്രിന്റർ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> തടഞ്ഞു"</string>
-    <string name="cancel" msgid="4373674107267141885">"റദ്ദാക്കുക"</string>
-    <string name="restart" msgid="2472034227037808749">"പുനരാരംഭിക്കുക"</string>
-    <string name="no_connection_to_printer" msgid="2159246915977282728">"പ്രിന്ററിൽ കണക്ഷനൊന്നുമില്ല"</string>
-    <string name="reason_unknown" msgid="5507940196503246139">"അജ്ഞാതം"</string>
-    <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> ഉപയോഗിക്കണോ?"</string>
-    <string name="print_service_security_warning_summary" msgid="1427434625361692006">"നിങ്ങളുടെ പ്രമാണം പ്രിന്ററിലേക്ക് പോകുന്നതിനിടെ അത് ഒന്നോ അതിലധികമോ സെർവറുകളിലൂടെ കടന്നുപോകാനിടയുണ്ട്."</string>
-  <string-array name="color_mode_labels">
-    <item msgid="7602948745415174937">"കറുപ്പ് &amp; വെള്ള"</item>
-    <item msgid="2762241247228983754">"നിറം"</item>
-  </string-array>
-  <string-array name="duplex_mode_labels">
-    <item msgid="3882302912790928315">"ഒന്നുമില്ല"</item>
-    <item msgid="7296563835355641719">"നീളമുള്ള അരിക്"</item>
-    <item msgid="79513688117503758">"ഹ്രസ്വ അരിക്"</item>
-  </string-array>
-  <string-array name="orientation_labels">
-    <item msgid="4061931020926489228">"പോർട്രെയ്‌റ്റ്"</item>
-    <item msgid="3199660090246166812">"ലാൻഡ്‌സ്‌കേപ്പ്"</item>
-  </string-array>
-    <string name="print_write_error_message" msgid="5787642615179572543">"ഫയലിൽ റൈറ്റുചെയ്യാനായില്ല"</string>
-    <string name="print_error_default_message" msgid="8602678405502922346">"ക്ഷമിക്കണം, അത് പ്രവർത്തിച്ചില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
-    <string name="print_error_retry" msgid="1426421728784259538">"വീണ്ടും ശ്രമിക്കുക"</string>
-    <string name="print_error_printer_unavailable" msgid="8985614415253203381">"ഈ പ്രിന്ററർ ഇപ്പോൾ ലഭ്യമല്ല."</string>
-    <string name="print_cannot_load_page" msgid="6179560924492912009">"പ്രിവ്യൂ കാണിക്കാൻ കഴിയില്ല"</string>
-    <string name="print_preparing_preview" msgid="3939930735671364712">"പ്രിവ്യൂ തയ്യാറാക്കുന്നു…"</string>
-</resources>
diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml
index 2cd8d9b..79cb1ae 100644
--- a/packages/PrintSpooler/res/values-nl/strings.xml
+++ b/packages/PrintSpooler/res/values-nl/strings.xml
@@ -64,9 +64,9 @@
     <string name="notification_channel_progress" msgid="872788690775721436">"Actieve afdruktaken"</string>
     <string name="notification_channel_failure" msgid="9042250774797916414">"Mislukte afdruktaken"</string>
     <string name="could_not_create_file" msgid="3425025039427448443">"Kan bestand niet maken"</string>
-    <string name="print_services_disabled_toast" msgid="9089060734685174685">"Sommige afdrukservices zijn uitgeschakeld"</string>
+    <string name="print_services_disabled_toast" msgid="9089060734685174685">"Sommige afdrukservices zijn uitgezet"</string>
     <string name="print_searching_for_printers" msgid="6550424555079932867">"Printers zoeken"</string>
-    <string name="print_no_print_services" msgid="8561247706423327966">"Geen afdrukservices ingeschakeld"</string>
+    <string name="print_no_print_services" msgid="8561247706423327966">"Geen afdrukservices aangezet"</string>
     <string name="print_no_printers" msgid="4869403323900054866">"Geen printers gevonden"</string>
     <string name="cannot_add_printer" msgid="7840348733668023106">"Kan geen printers toevoegen"</string>
     <string name="select_to_add_printers" msgid="3800709038689830974">"Selecteer om printer toe te voegen"</string>
diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
index e9c8389..7aca9f8 100644
--- a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
+++ b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl
@@ -46,7 +46,7 @@
     // Transform it using the S curve created by the smoothstep. This will increase the contrast.
     lum = smoothstep(0., 1., lum) + 0.001;
 
-    lum = relativeExposureCompensation(lum, mix(-15., 10., uExposure));
+    lum = relativeExposureCompensation(lum, mix(-5., 10., uExposure));
     lum = mix(clamp(lum, 0.0, 1.0), 1.0, normalizedRange(uExposure, 0.55, 1.0));
     color.rgb *= lum;
 
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 52401cf..3ac11da 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -5975,10 +5975,8 @@
 
         @BinderThread
         @Override
-        public void setImeWindowStatus(int vis, int backDisposition,
-                IVoidResultCallback resultCallback) {
-            CallbackUtils.onResult(resultCallback,
-                    () -> mImms.setImeWindowStatus(mToken, vis, backDisposition));
+        public void setImeWindowStatusAsync(int vis, int backDisposition) {
+            mImms.setImeWindowStatus(mToken, vis, backDisposition);
         }
 
         @BinderThread
diff --git a/services/core/java/com/android/server/os/NativeTombstoneManager.java b/services/core/java/com/android/server/os/NativeTombstoneManager.java
index cc6a824..ed1f5f5 100644
--- a/services/core/java/com/android/server/os/NativeTombstoneManager.java
+++ b/services/core/java/com/android/server/os/NativeTombstoneManager.java
@@ -392,7 +392,7 @@
 
             int pid = 0;
             int uid = 0;
-            String processName = "";
+            String processName = null;
             String crashReason = "";
             String selinuxLabel = "";
 
@@ -407,8 +407,10 @@
                             uid = stream.readInt(Tombstone.UID);
                             break;
 
-                        case (int) Tombstone.PROCESS_NAME:
-                            processName = stream.readString(Tombstone.PROCESS_NAME);
+                        case (int) Tombstone.COMMAND_LINE:
+                            if (processName == null) {
+                                processName = stream.readString(Tombstone.COMMAND_LINE);
+                            }
                             break;
 
                         case (int) Tombstone.CAUSES:
@@ -472,7 +474,7 @@
             result.mAppId = appId;
             result.mPid = pid;
             result.mUid = uid;
-            result.mProcessName = processName;
+            result.mProcessName = processName == null ? "" : processName;
             result.mTimestampMs = timestampMs;
             result.mCrashReason = crashReason;
 
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index a4a0866..b36c25c 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -6060,12 +6060,10 @@
                 int idx = mChildren.size() - 1;
                 while (idx >= 0) {
                     final Task child = (Task) getChildAt(idx--);
-                    if (!child.isFocusableAndVisible()) {
-                        break;
+                    if (!child.isTopActivityFocusable()) {
+                        continue;
                     }
-
-                    // Only allow one activity to be resumed among sibling tasks in split-screen.
-                    if (inSplitScreenWindowingMode() && someActivityResumed) {
+                    if (child.getVisibility(null /* starting */) != TASK_VISIBILITY_VISIBLE) {
                         break;
                     }
 
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 88e9ae9..3799067 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -346,6 +346,12 @@
         position = findPositionForRootTask(position, task, true /* adding */);
 
         super.addChild(task, position);
+        if (mPreferredTopFocusableRootTask != null
+                && task.isFocusable()
+                && mPreferredTopFocusableRootTask.compareTo(task) < 0) {
+            // Clear preferred top because the adding focusable task has a higher z-order.
+            mPreferredTopFocusableRootTask = null;
+        }
         mAtmService.updateSleepIfNeededLocked();
         onRootTaskOrderChanged(task);
     }
@@ -439,6 +445,11 @@
         // Update the top resumed activity because the preferred top focusable task may be changed.
         mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded();
 
+        final ActivityRecord r = child.getResumedActivity();
+        if (r != null && r == mRootWindowContainer.getTopResumedActivity()) {
+            mAtmService.setResumedActivityUncheckLocked(r, "positionChildAt");
+        }
+
         if (mChildren.indexOf(child) != oldPosition) {
             onRootTaskOrderChanged(child);
         }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 1858712..807edca 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -16975,18 +16975,13 @@
 
         final long identity = Binder.clearCallingIdentity();
         try {
-            // TODO(b/178187130): This check fails silent provisioning, uncomment once silent
-            //  provisioning is no longer used.
-            if (false) {
-                int result = checkProvisioningPreConditionSkipPermission(
-                        ACTION_PROVISION_MANAGED_DEVICE, deviceAdmin.getPackageName());
-                if (result != CODE_OK) {
-                    throw new ServiceSpecificException(
-                            PROVISIONING_RESULT_PRE_CONDITION_FAILED,
-                            "Provisioning preconditions failed with result: " + result);
-                }
+            int result = checkProvisioningPreConditionSkipPermission(
+                    ACTION_PROVISION_MANAGED_DEVICE, deviceAdmin.getPackageName());
+            if (result != CODE_OK) {
+                throw new ServiceSpecificException(
+                        PROVISIONING_RESULT_PRE_CONDITION_FAILED,
+                        "Provisioning preconditions failed with result: " + result);
             }
-
             setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime());
             setLocale(provisioningParams.getLocale());
 
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 027c2f7..ab9aa26 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -2157,6 +2157,8 @@
         attrs.setTitle("AppWindow");
         final TestWindowState appWindow = createWindowState(attrs, activity);
         activity.addWindow(appWindow);
+        spyOn(appWindow);
+        doNothing().when(appWindow).onStartFreezingScreen();
 
         // Set initial orientation and update.
         activity.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
@@ -2193,6 +2195,8 @@
         attrs.setTitle("RotationByPolicy");
         final TestWindowState appWindow = createWindowState(attrs, activity);
         activity.addWindow(appWindow);
+        spyOn(appWindow);
+        doNothing().when(appWindow).onStartFreezingScreen();
 
         // Set initial orientation and update.
         performRotation(displayRotation, Surface.ROTATION_90);
diff --git a/tests/Input/src/com/android/test/input/InputEventSenderAndReceiverTest.kt b/tests/Input/src/com/android/test/input/InputEventSenderAndReceiverTest.kt
index b134fe7..fc1d839 100644
--- a/tests/Input/src/com/android/test/input/InputEventSenderAndReceiverTest.kt
+++ b/tests/Input/src/com/android/test/input/InputEventSenderAndReceiverTest.kt
@@ -75,16 +75,26 @@
 class TestInputEventSender(channel: InputChannel, looper: Looper) :
         InputEventSender(channel, looper) {
     data class FinishedSignal(val seq: Int, val handled: Boolean)
+    data class Timeline(val inputEventId: Int, val gpuCompletedTime: Long, val presentTime: Long)
 
     private val mFinishedSignals = LinkedBlockingQueue<FinishedSignal>()
+    private val mTimelines = LinkedBlockingQueue<Timeline>()
 
     override fun onInputEventFinished(seq: Int, handled: Boolean) {
         mFinishedSignals.put(FinishedSignal(seq, handled))
     }
 
+    override fun onTimelineReported(inputEventId: Int, gpuCompletedTime: Long, presentTime: Long) {
+        mTimelines.put(Timeline(inputEventId, gpuCompletedTime, presentTime))
+    }
+
     fun getFinishedSignal(): FinishedSignal {
         return getEvent(mFinishedSignals)
     }
+
+    fun getTimeline(): Timeline {
+        return getEvent(mTimelines)
+    }
 }
 
 class InputEventSenderAndReceiverTest {
@@ -125,4 +135,14 @@
         // Check sender
         assertEquals(TestInputEventSender.FinishedSignal(seq, handled = true), finishedSignal)
     }
+
+    // The timeline case is slightly unusual because it goes from InputConsumer to InputPublisher.
+    @Test
+    fun testSendAndReceiveTimeline() {
+        val sent = TestInputEventSender.Timeline(
+            inputEventId = 1, gpuCompletedTime = 2, presentTime = 3)
+        mReceiver.reportTimeline(sent.inputEventId, sent.gpuCompletedTime, sent.presentTime)
+        val received = mSender.getTimeline()
+        assertEquals(sent, received)
+    }
 }