Status Update
Comments
mn...@google.com <mn...@google.com> #3
Thanks for taking the time to file this issue!
Would you be able to provide more details about the scene and this error? I tried the following code:
@Preview
@Composable
fun AutofillTextField3() {
var password by remember { mutableStateOf("") }
val focusRequester = remember { FocusRequester() }
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
Column(Modifier.fillMaxWidth()) {
Text("Enter password")
TextField(
value = password,
onValueChange = { password = it },
modifier = Modifier
.fillMaxWidth()
.focusRequester(focusRequester)
.semantics { contentType = ContentType.Password },
label = { Text("password") },
placeholder = { Text("type your password here") }
)
}
}
but upon the app starting, Autofill displayed the suggestion chips along the keyboard for me. Verified that this is the case for BTF
as well.
Were you specifically using the Password
content type? The only way I was able to reproduce this was if the same code above instead had ContentType.NewUsername
set. In that case, you’re right—when the app starts, no suggestions are displayed. Only long-pressing and triggering autofill from the textbar menu displays the suggestions. I believe that is working as intended (as that is a field marked for new users and thus should not display previously saved data).
Are there any other details in the sample above that are missing?
mi...@37signals.com <mi...@37signals.com> #4
I think what I need to add to clarify is that the password fails to autocomplete when it's on another screen than the username field is. That seems to be the culprit.
I created a minimal example project which demonstrates this and also captured a video of the app running. From it you can see that the autofill chips appear briefly when navigating to the password screen. However, they disappear a moment after when the focus is requested.
Let me know if I can help providing any other information.
mn...@google.com <mn...@google.com> #5
Ah, I see what you're saying — thanks for the video and code! It seems like there’s two parts to this.
You mean that in a multi-page login, you would expect after selecting a credential chip, Autofill should fill in not only the first “username” on the first screen, but also “password” on the next screen. I believe this is working as intended. On the Compose side, it looks like we’re properly calling the autofill APIs. Looping in Kate from the autofill team to check: Kate, I double checked this with FormGen, and there’s the same behavior
The second part is that even if the password field is not immediately filled, the chips disappear after a second of being displayed. Unfortunately I was not able to reproduce this even running the sample code locally ― but I do notice that clicking the displayed chips on the password page does not autofill. Only after clicking autofill
in the text toolbar does selecting the chip actually invoke autofill. If the focusRequester
is removed from the code, then autofill works fine.
Seems like Compose is still properly sending the requested information over and calling the right APIs. I see that in both instances (in the working version without focusRequester
plus the one without it), Compose is calling notifyViewEntered
for the password screen, and then populateViewStructure
is called. But tapping onto the chip in the version with focusRequester
does not trigger autofill
(whereas it does without focusRequester
). I glanced over the semantic properties we send, and they look identical between both text fields.
I’m attaching some logs for the working version
mi...@37signals.com <mi...@37signals.com> #6
Correct, without focusRequester, tapping into the input field correctly populates the suggestion chips. With the focusRequester in place however, autofill chips appear but are immediately removed as shown on the video (probably due to the requested focus).
Thanks for looking into this.
so...@google.com <so...@google.com> #7
Triage: this P1 is nearly out of SLO.
mn...@google.com <mn...@google.com> #8
Thanks
ap...@google.com <ap...@google.com> #9
Project: platform/frameworks/support
Branch: androidx-main
Author: Melba Nuzen <
Link:
Only trigger commit
when no autofillable components onscreen
Expand for full commit details
Only trigger `commit` when no autofillable components onscreen
Fixes: 392539099
Test: `autofillManager_doNotCallCommit_partialRemoval` and others
Autocommit will only be invoked when there are no autofillable components currently displayed and when there were previously autofillable components onscreen. This prevents overeagerly calling `commit` in scenarios such as multipage logins. If developers need a session to be committed, they can still explicitly call `autofillManager.commit()` where needed.
Change-Id: Ic9ed6f9951163da3c39f31a771435eca14a8859a
Files:
- M
compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
- A
compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/autofill/MultiPageLoginDemo.kt
- M
compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/autofill/AndroidAutofillManagerTest.kt
- M
compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AndroidAutofillManager.android.kt
- M
compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/autofill/AutofillUtils.android.kt
Hash: df2e791d1f2e01554961745cbb5cfcfb23b699a9
Date: Mon Feb 24 10:12:52 2025
na...@google.com <na...@google.com> #10
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.compose.ui:ui:1.8.0-rc01
androidx.compose.ui:ui-android:1.8.0-rc01
androidx.compose.ui:ui-jvmstubs:1.8.0-rc01
androidx.compose.ui:ui-linuxx64stubs:1.8.0-rc01
Description
Jetpack Compose component(s) used:
Android Studio Build: Meerkat | 2024.3.1 Beta 1
Kotlin version: 2.1.0
Steps to Reproduce or Code Sample to Reproduce:
Using the new Autofill support in 1.8.0 works well:
TextField(modifier = Modifier.semantics { contentType = ContentType.Password }, ... )
However, when auto-focus is added to the field, the autofill hints fail to show automatically. The only way to show them again is to long-press on the field and select Autofill menu item.
Requesting autofill after focus request does nothing (either in LaunchedEffect or onFocusChanged modifier).
```
val focusRequester = remember { FocusRequester() }
LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
TextField(
modifier = Modifier
.focusRequester(focusRequester)
.semantics { contentType = ContentType.Password },
...
```
Stack trace (if applicable):
```
startInputInner - Id : 0
startInputInner - IInputMethodManagerGlobalInvoker.startInputOrWindowGainedFocus
startInputInner - Id : 0
startInputInner - IInputMethodManagerGlobalInvoker.startInputOrWindowGainedFocus
com.xxx: onRequestShow at ORIGIN_CLIENT_SHOW_SOFT_INPUT reason SHOW_SOFT_INPUT_BY_INSETS_API
show(ime(), fromIme=false)
setRequestedVisibleTypes: visible=true, mask=ime, host=com.xxx.StartActivity, from=android.view.InsetsController.controlAnimationUnchecked:1445 android.view.InsetsController.applyAnimation:2005 android.view.InsetsController.applyAnimation:1968 android.view.InsetsController.show:1309 android.view.InsetsController.show:1237 androidx.core.view.SoftwareKeyboardControllerCompat$Impl30.show:194 androidx.core.view.SoftwareKeyboardControllerCompat.show:71 androidx.compose.ui.text.input.InputMethodManagerImpl.showSoftInput:81 androidx.compose.ui.text.input.TextInputServiceAndroid.setKeyboardVisibleImmediately:475 androidx.compose.ui.text.input.TextInputServiceAndroid.processInputCommands:359
ris()
ssi(): flags=0 view=com.xxx reason = SHOW_SOFT_INPUT_BY_INSETS_API
ssi() view is not EditText
showSoftInput() view=androidx.compose.ui.platform.AndroidComposeView{3c95fa5 VFED..... .F....ID 0,0-1080,2400 aid=1073741846} flags=0 reason=SHOW_SOFT_INPUT_BY_INSETS_API
setRequestedVisibleTypes: visible=false, mask=ime, host=com.xxx.StartActivity, from=android.view.InsetsController.controlAnimationUncheckedInner:1546 android.view.InsetsController.controlAnimationUnchecked:1449 android.view.InsetsController.applyAnimation:2005 android.view.InsetsController.applyAnimation:1968 android.view.InsetsController.show:1309 android.view.InsetsController.show:1237 androidx.core.view.SoftwareKeyboardControllerCompat$Impl30.show:194 androidx.core.view.SoftwareKeyboardControllerCompat.show:71 androidx.compose.ui.text.input.InputMethodManagerImpl.showSoftInput:81 androidx.compose.ui.text.input.TextInputServiceAndroid.setKeyboardVisibleImmediately:475
Flattened final assist data: 1148 bytes, containing 1 windows, 9 views
Flattened final assist data: 1544 bytes, containing 1 windows, 15 views
showSoftInput(View,I)
com.xxx:803fa14f: onRequestShow at ORIGIN_CLIENT_SHOW_SOFT_INPUT reason SHOW_SOFT_INPUT
ssi(): flags=0 view=com.xxx reason = SHOW_SOFT_INPUT
ssi() view is not EditText
showSoftInput() view=androidx.compose.ui.platform.AndroidComposeView{3c95fa5 VFED..... .F....ID 0,0-1080,2400 aid=1073741846} flags=0 reason=SHOW_SOFT_INPUT
Resizing android.view.ViewRootImpl@ec80947: frame = [0,0][1080,2400] reportDraw = false forceLayout = false syncSeqId = -1
Resizing android.view.ViewRootImpl@ec80947: frame = [0,0][1080,2400] reportDraw = false forceLayout = false syncSeqId = -1
Autofill popup was shown.
onStateChanged: host=com.xxxx.StartActivity, from=android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl:7209, state=InsetsState: {mDisplayFrame=Rect(0, 0 - 1080, 2400), mDisplayCutout=DisplayCutout{insets=Rect(0, 88 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(512, 0 - 568, 88), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.8125} cutoutSpec={M 0,0 M 0,11.43427858034597 a 9.899054752987353,9.899054752987353 0 1,0 0,19.79810950597471 a 9.899054752987353,9.899054752987353 0 1,0 0,-19.79810950597471 Z @dp} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}}}, mRoundedCorners=RoundedCorners{[RoundedCorner{position=TopLeft, radius=0, center=Point(0, 0)}, RoundedCorner{position=TopRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomLeft, radius=0, center=Point(0, 0)}]} mRoundedCornerFrame=Rect(0, 0 - 1080, 2400), mPrivacyIndicatorBounds=PrivacyIndicatorBounds {static bounds=Rect(956, 0 - 1080, 88) rotation=0}, mDisplayShape=DisplayShape{ spec=-311912193 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}, mSources= { InsetsSource: {3 mType=ime mFrame=[0,2265][1080,2400] mVisible=false mFlags=[]}, InsetsSource: {27 mType=displayCutout mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60000 mType=statusBars mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60005 mType=mandatorySystemGestures mFrame=[0,0][1080,122] mVisible=true mFlags=[]}, InsetsSource: {3cd60006 mType=tappableElement mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3e2d0001 mType=navigationBars mFrame=[0,2358][1080,2400] mVisible=true mFlags=[SUPPRESS_SCRIM]}, InsetsSource: {3e2d0004 mType=systemGestures mFrame=[0,0][84,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0005 mType=mandatorySystemGestures mFrame=[0,2310][1080,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0006 mType=tappableElement mFrame=[0,0][0,0] mVisible=true mFlags=[]}, InsetsSource: {3e2d0024 mType=systemGestures mFrame=[996,0][1080,2400] mVisible=true mFlags=[]} }
applyRequestedVisibilityToControl: visible=false, type=ime, host=com.xxx.StartActivity
handleResized, msg = 4 frames=ClientWindowFrames{frame=[0,0][1080,2400] display=[0,0][1080,2400] parentFrame=[0,0][0,0]} forceNextWindowRelayout=false displayId=0 dragResizing=false compatScale=1.0 frameChanged=false attachedFrameChanged=false configChanged=false displayChanged=false compatScaleChanged=false
onStateChanged: host=com.xxx.StartActivity, from=android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl:7209, state=InsetsState: {mDisplayFrame=Rect(0, 0 - 1080, 2400), mDisplayCutout=DisplayCutout{insets=Rect(0, 88 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(512, 0 - 568, 88), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.8125} cutoutSpec={M 0,0 M 0,11.43427858034597 a 9.899054752987353,9.899054752987353 0 1,0 0,19.79810950597471 a 9.899054752987353,9.899054752987353 0 1,0 0,-19.79810950597471 Z @dp} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}}}, mRoundedCorners=RoundedCorners{[RoundedCorner{position=TopLeft, radius=0, center=Point(0, 0)}, RoundedCorner{position=TopRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomLeft, radius=0, center=Point(0, 0)}]} mRoundedCornerFrame=Rect(0, 0 - 1080, 2400), mPrivacyIndicatorBounds=PrivacyIndicatorBounds {static bounds=Rect(956, 0 - 1080, 88) rotation=0}, mDisplayShape=DisplayShape{ spec=-311912193 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}, mSources= { InsetsSource: {3 mType=ime mFrame=[0,1548][1080,2400] mVisible=false mFlags=[]}, InsetsSource: {27 mType=displayCutout mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60000 mType=statusBars mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60005 mType=mandatorySystemGestures mFrame=[0,0][1080,122] mVisible=true mFlags=[]}, InsetsSource: {3cd60006 mType=tappableElement mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3e2d0001 mType=navigationBars mFrame=[0,2358][1080,2400] mVisible=true mFlags=[SUPPRESS_SCRIM]}, InsetsSource: {3e2d0004 mType=systemGestures mFrame=[0,0][84,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0005 mType=mandatorySystemGestures mFrame=[0,2310][1080,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0006 mType=tappableElement mFrame=[0,0][0,0] mVisible=true mFlags=[]}, InsetsSource: {3e2d0024 mType=systemGestures mFrame=[996,0][1080,2400] mVisible=true mFlags=[]} }
applyRequestedVisibilityToControl: visible=false, type=ime, host=com.xxx.StartActivity
handleResized, msg = 4 frames=ClientWindowFrames{frame=[0,0][1080,2400] display=[0,0][1080,2400] parentFrame=[0,0][0,0]} forceNextWindowRelayout=false displayId=0 dragResizing=false compatScale=1.0 frameChanged=false attachedFrameChanged=false configChanged=false displayChanged=false compatScaleChanged=false
show(ime(), fromIme=true)
setRequestedVisibleTypes: visible=true, mask=ime, host=com.xxx.StartActivity, from=android.view.InsetsController.controlAnimationUnchecked:1445 android.view.InsetsController.handlePendingControlRequest:1324 android.view.InsetsController.show:1260 android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl:7233 android.view.ViewRootImpl$ViewRootHandler.handleMessage:7166 android.os.Handler.dispatchMessage:106 android.os.Looper.loopOnce:230 android.os.Looper.loop:319 android.app.ActivityThread.main:8919 java.lang.reflect.Method.invoke:-2
controlAnimationUncheckedInner: Added types=ime, animType=0, host=com.xxx.StartActivity, from=android.view.InsetsController.controlAnimationUnchecked:1449 android.view.InsetsController.handlePendingControlRequest:1324 android.view.InsetsController.show:1260
show(ime(), fromIme=true)
com.xxx:803fa14f: onCancelled at PHASE_CLIENT_APPLY_ANIMATION
Resizing android.view.ViewRootImpl@ec80947: frame = [0,0][1080,2400] reportDraw = false forceLayout = false syncSeqId = -1
mWNT: t=0xb4000072fa938ab0 mBlastBufferQueue=0xb4000072ea933d70 fn= 52905 mRenderHdrSdrRatio=1.0 caller= android.view.SyncRtSurfaceTransactionApplier.applyTransaction:96 android.view.SyncRtSurfaceTransactionApplier.lambda$scheduleApply$0:69 android.view.SyncRtSurfaceTransactionApplier.$r8$lambda$SgowXC58rj3PR958kHUfRgLZmvE:0
onStateChanged: host=com.xxx.StartActivity, from=android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl:7209, state=InsetsState: {mDisplayFrame=Rect(0, 0 - 1080, 2400), mDisplayCutout=DisplayCutout{insets=Rect(0, 88 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(512, 0 - 568, 88), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.8125} cutoutSpec={M 0,0 M 0,11.43427858034597 a 9.899054752987353,9.899054752987353 0 1,0 0,19.79810950597471 a 9.899054752987353,9.899054752987353 0 1,0 0,-19.79810950597471 Z @dp} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}}}, mRoundedCorners=RoundedCorners{[RoundedCorner{position=TopLeft, radius=0, center=Point(0, 0)}, RoundedCorner{position=TopRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomLeft, radius=0, center=Point(0, 0)}]} mRoundedCornerFrame=Rect(0, 0 - 1080, 2400), mPrivacyIndicatorBounds=PrivacyIndicatorBounds {static bounds=Rect(956, 0 - 1080, 88) rotation=0}, mDisplayShape=DisplayShape{ spec=-311912193 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}, mSources= { InsetsSource: {3 mType=ime mFrame=[0,1548][1080,2400] mVisible=false mFlags=[]}, InsetsSource: {27 mType=displayCutout mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60000 mType=statusBars mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60005 mType=mandatorySystemGestures mFrame=[0,0][1080,122] mVisible=true mFlags=[]}, InsetsSource: {3cd60006 mType=tappableElement mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3e2d0001 mType=navigationBars mFrame=[0,2358][1080,2400] mVisible=true mFlags=[SUPPRESS_SCRIM]}, InsetsSource: {3e2d0004 mType=systemGestures mFrame=[0,0][84,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0005 mType=mandatorySystemGestures mFrame=[0,2310][1080,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0006 mType=tappableElement mFrame=[0,0][0,0] mVisible=true mFlags=[]}, InsetsSource: {3e2d0024 mType=systemGestures mFrame=[996,0][1080,2400] mVisible=true mFlags=[]} }
onStateChanged: host=com.xxx.StartActivity, from=android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl:7196, state=InsetsState: {mDisplayFrame=Rect(0, 0 - 1080, 2400), mDisplayCutout=DisplayCutout{insets=Rect(0, 88 - 0, 0) waterfall=Insets{left=0, top=0, right=0, bottom=0} boundingRect={Bounds=[Rect(0, 0 - 0, 0), Rect(512, 0 - 568, 88), Rect(0, 0 - 0, 0), Rect(0, 0 - 0, 0)]} cutoutPathParserInfo={CutoutPathParserInfo{displayWidth=1080 displayHeight=2400 physicalDisplayWidth=1080 physicalDisplayHeight=2400 density={2.8125} cutoutSpec={M 0,0 M 0,11.43427858034597 a 9.899054752987353,9.899054752987353 0 1,0 0,19.79810950597471 a 9.899054752987353,9.899054752987353 0 1,0 0,-19.79810950597471 Z @dp} rotation={0} scale={1.0} physicalPixelDisplaySizeRatio={1.0}}}}, mRoundedCorners=RoundedCorners{[RoundedCorner{position=TopLeft, radius=0, center=Point(0, 0)}, RoundedCorner{position=TopRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomRight, radius=0, center=Point(0, 0)}, RoundedCorner{position=BottomLeft, radius=0, center=Point(0, 0)}]} mRoundedCornerFrame=Rect(0, 0 - 1080, 2400), mPrivacyIndicatorBounds=PrivacyIndicatorBounds {static bounds=Rect(956, 0 - 1080, 88) rotation=0}, mDisplayShape=DisplayShape{ spec=-311912193 displayWidth=1080 displayHeight=2400 physicalPixelDisplaySizeRatio=1.0 rotation=0 offsetX=0 offsetY=0 scale=1.0}, mSources= { InsetsSource: {3 mType=ime mFrame=[0,1548][1080,2400] mVisible=true mFlags=[]}, InsetsSource: {27 mType=displayCutout mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60000 mType=statusBars mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3cd60005 mType=mandatorySystemGestures mFrame=[0,0][1080,122] mVisible=true mFlags=[]}, InsetsSource: {3cd60006 mType=tappableElement mFrame=[0,0][1080,88] mVisible=true mFlags=[]}, InsetsSource: {3e2d0001 mType=navigationBars mFrame=[0,2358][1080,2400] mVisible=true mFlags=[SUPPRESS_SCRIM]}, InsetsSource: {3e2d0004 mType=systemGestures mFrame=[0,0][84,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0005 mType=mandatorySystemGestures mFrame=[0,2310][1080,2400] mVisible=true mFlags=[]}, InsetsSource: {3e2d0006 mType=tappableElement mFrame=[0,0][0,0] mVisible=true mFlags=[]}, InsetsSource: {3e2d0024 mType=systemGestures mFrame=[996,0][1080,2400] mVisible=true mFlags=[]} }
handleResized, msg = 4 frames=ClientWindowFrames{frame=[0,0][1080,2400] display=[0,0][1080,2400] parentFrame=[0,0][0,0]} forceNextWindowRelayout=false displayId=0 dragResizing=false compatScale=1.0 frameChanged=false attachedFrameChanged=false configChanged=false displayChanged=false compatScaleChanged=false
mWNT: t=0xb4000072fa921cf0 mBlastBufferQueue=0xb4000072ea933d70 fn= 52906 mRenderHdrSdrRatio=1.0 caller= android.view.SyncRtSurfaceTransactionApplier.applyTransaction:96 android.view.SyncRtSurfaceTransactionApplier.lambda$scheduleApply$0:69 android.view.SyncRtSurfaceTransactionApplier.$r8$lambda$SgowXC58rj3PR958kHUfRgLZmvE:0
mWNT: t=0xb4000072fa9530d0 mBlastBufferQueue=0xb4000072ea933d70 fn= 52907 mRenderHdrSdrRatio=1.0 caller= android.view.SyncRtSurfaceTransactionApplier.applyTransaction:96 android.view.SyncRtSurfaceTransactionApplier.lambda$scheduleApply$0:69 android.view.SyncRtSurfaceTransactionApplier.$r8$lambda$SgowXC58rj3PR958kHUfRgLZmvE:0
handleWindowFocusChanged: 0 0 call from android.view.ViewRootImpl.-$$Nest$mhandleWindowFocusChanged:0
mWNT: t=0xb4000072fa940930 mBlastBufferQueue=0xb4000072ea933d70 fn= 52908 mRenderHdrSdrRatio=1.0 caller= android.view.SyncRtSurfaceTransactionApplier.applyTransaction:96 android.view.SyncRtSurfaceTransactionApplier.lambda$scheduleApply$0:69 android.view.SyncRtSurfaceTransactionApplier.$r8$lambda$SgowXC58rj3PR958kHUfRgLZmvE:0
onPreWindowFocus: skipped, hasWindowFocus=false mHasImeFocus=true
onPostWindowFocus: skipped, hasWindowFocus=false mHasImeFocus=true
```