Merge "Only update native InputApplicationHandle once" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
274863f9d5
@@ -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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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>");
|
||||
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -67,10 +67,8 @@ class InputConsumerImpl implements IBinder.DeathRecipient {
|
||||
}
|
||||
mService.mInputManager.registerInputChannel(mServerChannel);
|
||||
|
||||
mApplicationHandle = new InputApplicationHandle(new Binder());
|
||||
mApplicationHandle.name = name;
|
||||
mApplicationHandle.dispatchingTimeoutNanos =
|
||||
WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
|
||||
mApplicationHandle = new InputApplicationHandle(new Binder(), name,
|
||||
WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS);
|
||||
|
||||
mWindowHandle = new InputWindowHandle(mApplicationHandle, displayId);
|
||||
mWindowHandle.name = name;
|
||||
|
||||
@@ -43,7 +43,6 @@ import android.os.Trace;
|
||||
import android.os.UserHandle;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Slog;
|
||||
import android.view.InputApplicationHandle;
|
||||
import android.view.InputChannel;
|
||||
import android.view.InputEventReceiver;
|
||||
import android.view.InputWindowHandle;
|
||||
@@ -258,6 +257,8 @@ final class InputMonitor {
|
||||
final boolean hasFocus, final boolean hasWallpaper) {
|
||||
// Add a window to our list of input windows.
|
||||
inputWindowHandle.name = child.toString();
|
||||
inputWindowHandle.inputApplicationHandle = child.mActivityRecord != null
|
||||
? child.mActivityRecord.getInputApplicationHandle(false /* update */) : null;
|
||||
flags = child.getSurfaceTouchableRegion(inputWindowHandle, flags);
|
||||
inputWindowHandle.layoutParamsFlags = flags;
|
||||
inputWindowHandle.layoutParamsType = type;
|
||||
@@ -376,15 +377,8 @@ final class InputMonitor {
|
||||
|
||||
public void setFocusedAppLw(ActivityRecord newApp) {
|
||||
// Focused app has changed.
|
||||
if (newApp == null) {
|
||||
mService.mInputManager.setFocusedApplication(mDisplayId, null);
|
||||
} else {
|
||||
final InputApplicationHandle handle = newApp.mInputApplicationHandle;
|
||||
handle.name = newApp.toString();
|
||||
handle.dispatchingTimeoutNanos = newApp.mInputDispatchingTimeoutNanos;
|
||||
|
||||
mService.mInputManager.setFocusedApplication(mDisplayId, handle);
|
||||
}
|
||||
mService.mInputManager.setFocusedApplication(mDisplayId,
|
||||
newApp != null ? newApp.getInputApplicationHandle(true /* update */) : null);
|
||||
}
|
||||
|
||||
public void pauseDispatchingLw(WindowToken window) {
|
||||
|
||||
@@ -228,10 +228,8 @@ class TaskPositioner implements IBinder.DeathRecipient {
|
||||
mClientChannel, mService.mAnimationHandler.getLooper(),
|
||||
mService.mAnimator.getChoreographer());
|
||||
|
||||
mDragApplicationHandle = new InputApplicationHandle(new Binder());
|
||||
mDragApplicationHandle.name = TAG;
|
||||
mDragApplicationHandle.dispatchingTimeoutNanos =
|
||||
WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
|
||||
mDragApplicationHandle = new InputApplicationHandle(new Binder(), TAG,
|
||||
WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS);
|
||||
|
||||
mDragWindowHandle = new InputWindowHandle(mDragApplicationHandle,
|
||||
displayContent.getDisplayId());
|
||||
|
||||
@@ -942,7 +942,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
mLastRequestedHeight = 0;
|
||||
mLayer = 0;
|
||||
mInputWindowHandle = new InputWindowHandle(
|
||||
mActivityRecord != null ? mActivityRecord.mInputApplicationHandle : null,
|
||||
mActivityRecord != null
|
||||
? mActivityRecord.getInputApplicationHandle(false /* update */) : null,
|
||||
getDisplayId());
|
||||
|
||||
// Make sure we initial all fields before adding to parentWindow, to prevent exception
|
||||
|
||||
Reference in New Issue
Block a user