Refactor InkWindow lifetime

Refactor InkWindow instance to live longer with a timer.
This should help with faster handwritiing intiiaiton if handwriting is
intiiated again shortly after the new window gets bound to IME.

Also refactored to finish handwriting on idle timeout rather than just
removing the window.

Bug: 291946496
Test: atest StylusHandwritingTest
Change-Id: I29a1eec9502b9558f8a7992308ec894f160dd4b7
This commit is contained in:
Taran Singh
2023-07-19 18:12:01 +00:00
parent 7b41e4d736
commit 2bcf7edb86

View File

@@ -806,9 +806,11 @@ public class InputMethodService extends AbstractInputMethodService {
onUnbindInput();
mInputBinding = null;
mInputConnection = null;
// free-up cached InkWindow surface on detaching from current client.
if (mInkWindow != null) {
removeHandwritingInkWindow();
finishStylusHandwriting();
// free-up InkWindow surface after timeout.
scheduleStylusWindowIdleTimeout();
}
}
@@ -1018,6 +1020,7 @@ public class InputMethodService extends AbstractInputMethodService {
mOnPreparedStylusHwCalled = true;
}
if (onStartStylusHandwriting()) {
cancelStylusWindowIdleTimeout();
mPrivOps.onStylusHandwritingReady(requestId, Process.myPid());
} else {
Log.i(TAG, "IME is not ready. Can't start Stylus Handwriting");
@@ -1107,7 +1110,7 @@ public class InputMethodService extends AbstractInputMethodService {
*/
@Override
public void removeStylusHandwritingWindow() {
InputMethodService.this.removeStylusHandwritingWindow();
InputMethodService.this.finishAndRemoveStylusHandwritingWindow();
}
/**
@@ -2664,21 +2667,15 @@ public class InputMethodService extends AbstractInputMethodService {
* Typically, this is called when {@link InkWindow} should no longer be holding a surface in
* memory.
*/
private void removeStylusHandwritingWindow() {
private void finishAndRemoveStylusHandwritingWindow() {
cancelStylusWindowIdleTimeout();
mOnPreparedStylusHwCalled = false;
mStylusWindowIdleTimeoutRunnable = null;
if (mInkWindow != null) {
if (mHandwritingRequestId.isPresent()) {
// if handwriting session is still ongoing. This shouldn't happen.
finishStylusHandwriting();
}
removeHandwritingInkWindow();
}
}
private void removeHandwritingInkWindow() {
cancelStylusWindowIdleTimeout();
mOnPreparedStylusHwCalled = false;
mStylusWindowIdleTimeoutRunnable = null;
if (mInkWindow != null) {
mInkWindow.hide(true /* remove */);
mInkWindow.destroy();
mInkWindow = null;
@@ -2704,7 +2701,7 @@ public class InputMethodService extends AbstractInputMethodService {
private Runnable getStylusWindowIdleTimeoutRunnable() {
if (mStylusWindowIdleTimeoutRunnable == null) {
mStylusWindowIdleTimeoutRunnable = () -> {
removeHandwritingInkWindow();
finishAndRemoveStylusHandwritingWindow();
mStylusWindowIdleTimeoutRunnable = null;
};
}