Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a68473ce authored by Riddle Hsu's avatar Riddle Hsu Committed by Siarhei Vishniakou
Browse files

Only update native InputApplicationHandle once

This makes sure the write operation (NativeInputApplicationHandle
::updateInfo) is always called from window manager side once when
calling SurfaceControl.Transaction#setInputWindowInfo or
InputManagerService#setFocusedApplication. If the info of input
application handle is changed, a new instance will be created.
That avoids the race condition of reading the fields of the same
InputApplicationInfo instance from input dispatcher.

Bug: 171857140
Bug: 161334769
Bug: 174768985
Test: WindowInputTests

Merged-In: Ief84bbe6e6fa4da5309912059904932ccf775b75
Merged-In: I70de9835c7699fe6f56fc3655b0fee5c317ecc3a
Change-Id: I70de9835c7699fe6f56fc3655b0fee5c317ecc3a
parent 0d8b71b1
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.view;

import android.annotation.NonNull;
import android.os.IBinder;

/**
@@ -31,17 +32,20 @@ public final class InputApplicationHandle {
    private long ptr;

    // Application name.
    public String name;
    public final @NonNull String name;

    // Dispatching timeout.
    public long dispatchingTimeoutNanos;
    public final long dispatchingTimeoutNanos;

    public final IBinder token;

    private native void nativeDispose();

    public InputApplicationHandle(IBinder token) {
    public InputApplicationHandle(@NonNull IBinder token, @NonNull String name,
            long dispatchingTimeoutNanos) {
        this.token = token;
        this.name = name;
        this.dispatchingTimeoutNanos = dispatchingTimeoutNanos;
    }

    public InputApplicationHandle(InputApplicationHandle handle) {
+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ public final class InputWindowHandle {
    private long ptr;

    // The input application handle.
    public final InputApplicationHandle inputApplicationHandle;
    public InputApplicationHandle inputApplicationHandle;

    // The token associates input data with a window and its input channel. The client input
    // channel and the server input channel will both contain this token.
+5 −0
Original line number Diff line number Diff line
@@ -58,6 +58,11 @@ bool NativeInputApplicationHandle::updateInfo() {
    if (!obj) {
        return false;
    }
    if (mInfo.token.get() != nullptr) {
        // The java fields are immutable, so it doesn't need to update again.
        env->DeleteLocalRef(obj);
        return true;
    }

    mInfo.name = getStringField(env, obj, gInputApplicationHandleClassInfo.name, "<null>");

+16 −2
Original line number Diff line number Diff line
@@ -416,7 +416,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    // mOccludesParent field.
    final boolean hasWallpaper;
    // Input application handle used by the input dispatcher.
    final InputApplicationHandle mInputApplicationHandle;
    private InputApplicationHandle mInputApplicationHandle;

    final int launchedFromPid; // always the pid who started the activity.
    final int launchedFromUid; // always the uid who started the activity.
@@ -1501,7 +1501,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        info = aInfo;
        mUserId = UserHandle.getUserId(info.applicationInfo.uid);
        packageName = info.applicationInfo.packageName;
        mInputApplicationHandle = new InputApplicationHandle(appToken);
        intent = _intent;

        // If the class name in the intent doesn't match that of the target, this is probably an
@@ -1685,6 +1684,21 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        return lockTaskLaunchMode;
    }

    @NonNull InputApplicationHandle getInputApplicationHandle(boolean update) {
        if (mInputApplicationHandle == null) {
            mInputApplicationHandle = new InputApplicationHandle(appToken, toString(),
                    mInputDispatchingTimeoutNanos);
        } else if (update) {
            final String name = toString();
            if (mInputDispatchingTimeoutNanos != mInputApplicationHandle.dispatchingTimeoutNanos
                    || !name.equals(mInputApplicationHandle.name)) {
                mInputApplicationHandle = new InputApplicationHandle(appToken, name,
                        mInputDispatchingTimeoutNanos);
            }
        }
        return mInputApplicationHandle;
    }

    @Override
    ActivityRecord asActivityRecord() {
        // I am an activity record!
+2 −4
Original line number Diff line number Diff line
@@ -269,10 +269,8 @@ class DragState {
            mInputEventReceiver = new DragInputEventReceiver(mClientChannel,
                    mService.mH.getLooper(), mDragDropController);

            mDragApplicationHandle = new InputApplicationHandle(new Binder());
            mDragApplicationHandle.name = "drag";
            mDragApplicationHandle.dispatchingTimeoutNanos =
                    WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
            mDragApplicationHandle = new InputApplicationHandle(new Binder(), "drag",
                    WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS);

            mDragWindowHandle = new InputWindowHandle(mDragApplicationHandle,
                    display.getDisplayId());
Loading