We're using the Keyboard overlay with Unity 2020.3.14 / Oculus XR Plugin 1.10.0pre2 / XR Plugin 4.0.7.
We have two related issues:
Both these issues happen with Unity UI InputFields & TMP versions.
Solved! Go to Solution.
Ok, so after a lot more digging, the keyboard close button bug is an issue with Unity's TouchScreenKeyboard implementation.
The status property of this doesn't change when pressing the keyboard close button. You'd expect this to change to Canceled or LostFocus or even Done, but it just doesn't change from Visible.
Both the Unity UI & TMP Input field code rely on this property and so explains why they both fail / do nothing in the same way.
The Java code for Unity's TouchScreenKeyboard native implementation for Android isn't easily available / readable / replaceable but luckily I had already developed our own replacement for this in our standard Android app. For some reason I thought this wouldn't work on Quest, but the Quest keyboard is actually a standard Input Method Editor so works with my implementation too 🙂
To be fair to Unity, detecting the Android keyboard closing is not as simple as it sounds, but after lots of failed attempts, I've got a working solution by polling InputMethodManager.isActive passing in the EditText field as the view.
Are you getting InputFocusLost/Acquired events when you press the Oculus button on the controller? If not, you need to either use the OVRCameraRig provided in the Oculus Integration, or have an instance of OVRManager in the scene.
Unity's XR input implementations (LegacyXR or "new" Input System) don't handle input focus gain/loss, and the InputFocus* events are invoked in the Update() method of OVRManager, so they won't work unless there's and enabled instance of OVRManager in the scene.
I am getting InputFocusLost/Acquired events with the Oculus Button and when the user presses the tick button on the overlay keyboard with single line input fields. (I do have an OVRManager instance in the scene)
But if the input field is multi-line or the user presses the keyboard close button in the bottom right there isn't an InputFocusAcquired event.
This is literally the first time I've heard of someone using multiline input in VR. This is a puzzler. Wish I could help more.
I think you're going to have to dig through the TMP_InputField code. Look for TouchScreenKeyboard.Open (which passes in a multiLine bool) and TouchScreenKeyboard.Status.Done, which I think is where the keyboard has closed and should return focus to Unity.
I think you're right that Unity/TextMeshPro is expecting a multiline input keyboard to have a "return" button and to go through a different close procedure, and either Unity or the system keyboard isn't handling that properly.
Sorry, one more thing (I find this issue pretty interesting). I'm guessing the reason you never get the InputFocusAcquired event is because TextMeshPro runs before OVRManager in the default Script Execution Order.
So TMPro resummons the keyboard before OVRManager has a chance to invoke the InputFocusAcquired event?