Commit Graph

503 Commits

Author SHA1 Message Date
Adrian Roos
ad5bd08354 Merge "Fix IMS window visibility" 2022-02-07 17:14:39 +00:00
Robin Lee
a246b947d4 Add null check for mNavigationBarFrame
This may not exist at this point (or at all depending on the device
configuration)

Change-Id: Ida9b5f4eadfd2620d7b74171268cf266f77f7b3d
Test: manual - bring up the keyboard on a TV
Fix: 218228687
2022-02-07 11:41:05 +00:00
Yohei Yukawa
f21d211559 Enable IMS#canImeRenderGesturalNavButtons() by default (2nd try)
This is the second attempt to enable

  IMS#canImeRenderGesturalNavButtons()

by default.  The first attempt [1] was reverted due to Bug 217668258.

With this CL, the back button and IME switcher button on the
navigation bar are rendered by the IME when gestural navigation mode
is enabled.

The new behavior can still be manually disabled as follows

  adb root
  adb shell setprop  \
        persist.sys.ime.can_render_gestural_nav_buttons false
  adb reboot

The only observable behavior change we are aware of is that now those
buttons are included in the task screenshot in Recents.

Other than that, there should be no observable behavior change.

 [1]: I45e511f5cfec93cdd002d23c091b4fe735b28227
      793e152713

Fix: 215545985
Test: Manually tested with ThemedNavBarKeyboard sample
  1. Build aosp_coral-userdebug and flash it
  2. Enable gesture navigation mode.
  3. make -j ThemedNavBarKeyboard
  4. adb install -r \
      $OUT/system/app/ThemedNavBarKeyboard/ThemedNavBarKeyboard.apk
  5. adb shell ime enable \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  6. adb shell ime set \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  7. Open the Dialer app
  8. Tap "EXTENDED LIGHT NAVIGARION BAR" mode
  9. Make sure that the navigation button color is optimized for light
     navigation bar.
 10. Tap "STANDARD LIGHT NAVIGARION BAR" mode
 11. Make sure that the navigation button color is optimized for light
     navigation bar.
 12. Tap "FLOATING MODE" mode
 13. Make sure that the navigation buttons are visible.
Test: Manually verified as follows.
  1. Build coral-userdebug and flash it
  2. Make sure that the back button is shown on the setup wizard.
Change-Id: I39f454a2d41d7d5255b8cc4f7d9a3f7a7642b2f3
2022-02-04 12:50:07 -08:00
Yohei Yukawa
bf122b9f94 Have both NAVIGATION_HINT_IME{,_SWITCHER}_SHOWN
This is a mechanical renaming CL with no behavior change.

Somehow NAVIGATION_HINT_IME_SHOWN was set when the IME switcher needs
to be shown, not when the IME is shown.  This CL aims to avoid future
confusions by also introducing

  NAVIGATION_HINT_IME_SWITCHER_SHOWN

then setting NAVIGATION_HINT_IME_SHOWN when the IME is actually shown.

This CL also updates NavigationBarTest to verify those flags.

Bug: 192412909
Bug: 217755059
Test: atest SystemUITests:NavigationBarTest
Change-Id: I8bdd58d040689953072c7f384ece2bca677265e1
2022-02-04 12:49:21 -08:00
Yohei Yukawa
8b70de55fa Merge "Revert "Enable IMS#canImeRenderGesturalNavButtons() by default"" 2022-02-04 00:01:55 +00:00
Yohei Yukawa
4d3ddb067c Add a missing "=" in dumpsys input_method
My previous CL [1] lacked "=" when dumping

  NavigationBarController#mShouldShowImeSwitcherWhenImeIsShown

into dumpsys.  This CL fixes that typo.

 [1]: I5de9ac0dc8670842edf66306bb4c281c77cea376
      75b935a12b

Bug: 215551357
Test: adb shell dumpsys input_method | grep NavigationBarController
Change-Id: Ifa2f5d2abcbe982b0afa5a6dad1573a86123485e
2022-02-03 11:59:37 -08:00
Yohei Yukawa
c35df2f1ec Revert "Enable IMS#canImeRenderGesturalNavButtons() by default"
This reverts commit 793e152713 [1].

Reason for revert:
No back button on the setup wizard.

 [1]: I45e511f5cfec93cdd002d23c091b4fe735b28227

Bug: 215545985
Fix: 217668258
Change-Id: Iac77c5bfafc5d208a1d3f3b56f0f7ee81d51031b
2022-02-03 16:07:54 +00:00
Adrian Roos
92fbace14b Fix IMS window visibility
Fixes an issue with IMS window visibility, where an unfortunate timing
of removeImeSurface() and showWindow() could result in the window being
hidden without resetting mDecorViewVisible.

Root cause is the scheduled removeImeSurface() not being cancelled in
all code paths that end up calling showWindow().

To avoid this we
- consolidate calls to cancelImeSurfaceRemoval
  and applyVisibilityInInsetsConsumerIfNecessary into showWindow()
- inline the now unnecessary doHideWindow
- unconditionally call mWindow.show() in showWindow, since View.java
  already avoids unnecessary work if the decor visibility won't change

Fixes: 203137087
Test: manual
Change-Id: Iaef9efd4f1a89fe6da27fc6396b62ff3b4ca11f4
2022-02-03 14:08:56 +00:00
Yohei Yukawa
793e152713 Enable IMS#canImeRenderGesturalNavButtons() by default
With this CL, the back button and IME switcher button on the
navigation bar are rendered by the IME when gestural navigation mode
is enabled.

The new behavior can still be manually disabled as follows

  adb root
  adb shell setprop  \
        persist.sys.ime.can_render_gestural_nav_buttons false
  adb reboot

The only observable behavior change we are aware of is that now those
buttons are included in the task screenshot in Recents.

Other than that, there should be no observable behavior change.

Fix: 215545985
Test: Manually tested with ThemedNavBarKeyboard sample
  1. Build aosp_coral-userdebug and flash it
  2. Enable gesture navigation mode.
  3. make -j ThemedNavBarKeyboard
  4. adb install -r \
      $OUT/system/app/ThemedNavBarKeyboard/ThemedNavBarKeyboard.apk
  5. adb shell ime enable \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  6. adb shell ime set \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  7. Open the Dialer app
  8. Tap "EXTENDED LIGHT NAVIGARION BAR" mode
  9. Make sure that the navigation button color is optimized for light
     navigation bar.
 10. Tap "STANDARD LIGHT NAVIGARION BAR" mode
 11. Make sure that the navigation button color is optimized for light
     navigation bar.
 12. Tap "FLOATING MODE" mode
 13. Make sure that the navigation buttons are visible.
Change-Id: I45e511f5cfec93cdd002d23c091b4fe735b28227
2022-02-01 11:25:32 -08:00
Yohei Yukawa
c98b9c8f40 Support floating IMEs even when IMEs render the nav buttons
As discussed in Bug 201375975, the nevigation bar handling for
floating IMEs is a bit tricky.

This CL tweaks DecorView behabior only when

  InputMethodService#canImeRenderGesturalNavButtons(),

is true and the IME is floating in the gestural navigation mode.

Fix: 215550296
Test: Manually tested with ThemedNavBarKeyboard sample
  1. Build aosp_coral-userdebug and flash it
  2. adb root
  3. adb shell setprop \
      persist.sys.ime.can_render_gestural_nav_buttons true
  4. adb reboot
  5. make -j ThemedNavBarKeyboard
  6. adb install -r \
      $OUT/system/app/ThemedNavBarKeyboard/ThemedNavBarKeyboard.apk
  7. adb shell ime enable \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  8. adb shell ime set \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  9. Open the Dialer app
 10. Focus in the top edit field.
 11. Tap "FLOATING MODE" mode
 12. Make sure that the navigation buttons are visible.
Change-Id: Ia54499a3c2ac6e33e72f625eba3477fd81649d32
2022-01-31 18:56:59 -08:00
Yohei Yukawa
af1695a78a Introduce Window.DecorCallback
This is a follow up CL to my previous CL [1], which introduced a
hidden callback method into Window.Callback.

This CL does not change any observable behavior but consolidate that
hidden callback into a newly introduced Window.DecorCallback
interface.  In this approach, we no longer need to worry about
accidental method name collision in Window.Callback implementations
classes.

Here is the new callback chain.

 ViewRootImpl#performTraversals()
  -> DecorView#onSystemBarAppearanceChanged()
   -> Window.dispatchOnSystemBarAppearanceChanged()
    -> NavigationBarController.Impl#onSystemBarAppearanceChanged()

 [1]: I08566034bebfafff6777ce0152cd6ca1f66f6cad
      678ddce11c

Bug: 215549533
Test: Manually tested with ThemedNavBarKeyboard sample
  1. Build aosp_coral-userdebug and flash it
  2. adb root
  3. adb shell setprop \
      persist.sys.ime.can_render_gestural_nav_buttons true
  4. adb reboot
  5. make -j ThemedNavBarKeyboard
  6. adb install -r \
      $OUT/system/app/ThemedNavBarKeyboard/ThemedNavBarKeyboard.apk
  7. adb shell ime enable \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  8. adb shell ime set \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  9. Open the Dialer app
 10. Focus in the top edit field.
 11. Tap "EXTENDED LIGHT NAVIGARION BAR" mode
 12. Make sure that the navigation button color is optimized for light
     navigation bar.
 13. Tap "STANDARD LIGHT NAVIGARION BAR" mode
 14. Make sure that the navigation button color is optimized for light
     navigation bar.
Change-Id: I5168f76dfc9526e925c565dbfa87597b5543fcdc
2022-01-31 18:56:50 -08:00
Yohei Yukawa
75b935a12b Support IME switcher icon visibility update
With this CL, the IME switcher icon becomes visible only when
necessary, even if InputMethodService renders the back button and the
IME switcher button in the gestural navigation mode.

Implementation idea:

InputMethodManagerService#shouldShowImeSwitcherLocked() is the source
of truth about whether the IME switcher visibility should be shown or
not, and it internally depends on the following conditions:

 A. com.android.internal.R.bool.show_ongoing_ime_switcher
 B. Whether the IME switcher is already shown or not.
 C. Whether the IME is perceptible or not.
 D. Whether one or more hardware keyboards are attached or not.
 E. Keyguard state.
 F. What IMEs and their subtypes are enabled.

Here are what those conditions would mean for this project.

 * A is considered to be a per-device constant value.
 * B, D, and F can happen at any time outside of the IME lifecycle
   events such as startInput().
 * C is no longer relevant if those buttons are rendered by the IME.
 * E is considered to be constant throughout each startInput() cycle.

This CL uses the following 3 IPCs to notify when the IME switcher
visibility is changing.

 1. IInputMethod#initializeInternal()
 2. IInputMethod#startInput()
 3. IInputMethod#onShouldShowImeSwitcherWhenImeIsShownChanged()

1 and 2 will be used to provide the "initial" value to avoid potential
flickers.  3 is still necessary to take care of async changes
triggered by B, D, and F.

Fix: 215551357
Test: Manually verified with for the following scenarios:
 * Enabling/disabling multiple IMEs
 * Attaching/detaching a hardware keyboard
 * Showing/hinding the IME switcher
 * Showing an IME on the lock screen
Change-Id: I5de9ac0dc8670842edf66306bb4c281c77cea376
2022-01-28 10:04:32 -08:00
Yohei Yukawa
dec2c21955 Support nav button color transitions
With this CL, the back and IME switcher buttons on the navigation bar
have the same color transition even when they are rendered by the IME.

Note that the behavior is still behind a flag

  persist.sys.ime.can_render_gestural_nav_buttons,

which is still off by default.  There should be no observable changes
no matter whether the flag is enabled or disabled though.

Fix: 215549533
Test: Manually tested with ThemedNavBarKeyboard sample
  1. Build aosp_coral-userdebug and flash it
  2. adb root
  3. adb shell setprop \
      persist.sys.ime.can_render_gestural_nav_buttons true
  4. adb reboot
  5. make -j ThemedNavBarKeyboard
  6. adb install -r \
      $OUT/system/app/ThemedNavBarKeyboard/ThemedNavBarKeyboard.apk
  7. adb shell ime enable \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  8. adb shell ime set \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  9. Open the Dialer app
 10. Focus in the top edit field.
 11. Tap "EXTENDED LIGHT NAVIGARION BAR" mode
 12. Make sure that the navigation button color changes from light
     to dark with animation.
 13. Tap "EXTENDED DARK NAVIGARION BAR" mode
 12. Make sure that the navigation button color changes from dark
     to light with animation.
Change-Id: I41a3478a97d67b238c4424d93acbcad646aee0d2
2022-01-28 09:15:24 -08:00
Jared Duke
5ff99b87c5 Merge "Avoid reflection with ObjectAnimator" 2022-01-27 22:45:47 +00:00
TreeHugger Robot
b8319503a2 Merge "Make IME extract text fields public" 2022-01-27 21:56:20 +00:00
Jared Duke
912b87abee Avoid reflection with ObjectAnimator
Use explicit FloatProperty proxies for routing ObjectAnimator updates.
This prevents issues with Proguard-related shrinking/optimization for
custom class types.

Test: atest SystemUITests + manual validation of error logs
Bug: 203472868
Change-Id: Ie0889101f1063a929d2052756b1f4008f2b84a92
2022-01-27 19:29:23 +00:00
Yohei Yukawa
678ddce11c Support light navigation bar
In order to propagate the information about whether the IME is using
light navigation bar or not from

  android.view.ViewRootImpl

to

  android.inputmethodservice.NavigationBarController

within the same process, this CL adds a new @hide method to

  Window.Callback

as follows.

 ViewRootImpl#performTraversals()
  -> DecorView#onSystemBarAppearanceChanged()
   -> Window.Callback#onSystemBarAppearanceChanged()
    -> SoftInputWindow#onSystemBarAppearanceChanged()
     -> NavigationBarController#onSystemBarAppearanceChanged()

Button color transition will be implemented in a subsequent CL.

Bug: 215549533
Test: Manually tested with ThemedNavBarKeyboard sample
  1. Build aosp_coral-userdebug and flash it
  2. adb root
  3. adb shell setprop \
      persist.sys.ime.can_render_gestural_nav_buttons true
  4. adb reboot
  5. make -j ThemedNavBarKeyboard
  6. adb install -r \
      $OUT/system/app/ThemedNavBarKeyboard/ThemedNavBarKeyboard.apk
  7. adb shell ime enable \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  8. adb shell ime set \
      com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
  9. Open the Dialer app
 10. Focus in the top edit field.
 11. Tap "EXTENDED LIGHT NAVIGARION BAR" mode
 12. Make sure that the navigation button color is optimized for light
     navigation bar.
 13. Tap "STANDARD LIGHT NAVIGARION BAR" mode
 14. Make sure that the navigation button color is optimized for light
     navigation bar.
Change-Id: I08566034bebfafff6777ce0152cd6ca1f66f6cad
2022-01-27 10:29:33 -08:00
TreeHugger Robot
4c4cd6f670 Merge changes from topics "CAI-filters", "onPrepareStylusHandwriting"
* changes:
  Scribe in IMF: Introduce filters in CursoAnchorInfo API 7/N
  Scribe in IMF: Early InkWindow preparation 6/N
2022-01-27 10:32:06 +00:00
TreeHugger Robot
cc016b3496 Merge "Scribe in IMF: Stylus Spy windows Impl 5/N" 2022-01-27 08:33:08 +00:00
Yohei Yukawa
daeb827056 Merge "Factor out to NavigationBarController#scheduleRelayout()" 2022-01-26 21:37:16 +00:00
Taran Singh
104932e4bf Make IME extract text fields public
InputMethodService uses the following IDs for extract view.
- R.id.inputExtractEditText
- R.id.inputExtractAction
- R.id.inputExtractAccessories
While the first one is public, others are not. It makes sense to make
all of the public so IMEs can customize it.

Bug: 210777608
Test: atest InputMethodServiceTest

Change-Id: I125767d67839293c0b0f40c750d0fb1bb77951e9
2022-01-26 20:06:15 +00:00
Taran Singh
342509f094 Scribe in IMF: Early InkWindow preparation 6/N
Allow stylus hover events for:
1. send early signal to IME onPrepareStylusHandwriting()
2. Prepare InkWindow internally.

Test: atest StylusHandwritingTest
Bug: 210039666
Bug: 203086136

Change-Id: Iebbd62659cb98b3c61edfa35d5a84a1c6837eb23
2022-01-26 15:41:27 +00:00
Taran Singh
52f330491b Scribe in IMF: Stylus Spy windows Impl 5/N
Implement Handwriting surface spy in IMF that listens
and manages Stylus events.

Test: atest StylusHandwritingTest
Bug: 210039666
Bug: 203086136
Change-Id: I8681a33bb32f20b48cf741ba3ad2116de5db7ffa
2022-01-26 15:41:24 +00:00
Charles Chen
958b56e8de Merge "Remove redundant API" 2022-01-26 08:53:35 +00:00
Yohei Yukawa
4dd61edf09 Factor out to NavigationBarController#scheduleRelayout()
This is a mechanical refactoring CL so that we can avoid code
duplicate later.

Bug: 215550296
Test: Manually verified that there is no behavior change
Change-Id: I14d2c7609e156b9e627b26471d392cb47b14163b
2022-01-25 20:55:46 -08:00
Yohei Yukawa
177e4aafdb Update the IME nav UI when gesture navigation mode changes
With this CL, nav buttons rendered by InputMethodService can be
dynamically enabled or disabled when the gesture navigation mode is
updated.

Note that the feature is still disabled by default behind the flag.
Hence there should be no observable behavior changes unless the
feature is explicitly enabled with setprop.

Fix: 215552600
Test: Manually done as follows
  1. Build aosp_coral-userdebug and flash it
  2. adb root
  3. adb shell setprop \
           persist.sys.ime.can_render_gestural_nav_buttons true
  4. adb reboot
  5. Tap any edit field to show AOSP Keyboard.
  6. adb shell dumpsys input_method | grep mNavigationBarController
     -> Confirm mRenderGesturalNavButtons is false.
     -> Confirm mNavigationBarFrame is null.
  7. Switch to gestural navigation mode.
  8. adb shell dumpsys input_method | grep mNavigationBarController
     -> Confirm mRenderGesturalNavButtons is true.
     -> Confirm mNavigationBarFrame is not null.
  9. Switch to 3-button navigation mode again.
 10. adb shell dumpsys input_method | grep mNavigationBarController
     -> Confirm mRenderGesturalNavButtons is false.
     -> Confirm mNavigationBarFrame is null.

Change-Id: Id0cfa44cce5de515dc5d28254e1d41bdfc01e201
2022-01-24 19:13:13 -08:00
Yohei Yukawa
dcd0264584 Merge "Minimum impl of nav buttons rendered by IME" 2022-01-24 19:00:42 +00:00
Yohei Yukawa
99cc65c470 Remove unused IInputMethod#revokeSession
Seems that IInputMethod#revokeSession has been defined but has never
been called since at least Android 1.5.

Let's remove it for now for simplicity.

Bug: 192412909
Test: presubmit
Change-Id: I3de8de1226ae028ac2e6bae8aeb34cd83f4c4f41
2022-01-22 06:35:53 -08:00
Yohei Yukawa
ff7b453ca8 Minimum impl of nav buttons rendered by IME
This is the minimum implementation of rendering the back button and
the IME switcher button in the InputMethodService process.

Note that the feature is still disabled by default behind the flag.
Newly added UI logic should be running only when the feature flag is
enabled.

 Bug 215545985: Enable canImeRenderGesturalNavButtons() by default

Here is the list of known blockers before enabling the flag.

 * Bug 215552600: Subscribe gesture mode change.
 * Bug 215551357: Show IME swicher button only when necessary.
 * Bug 215549533: Support light navigation bar.
 * Bug 215550296: Support floating IME.
 * Bug 215554582: Set "input_method_rounded_corner_content_padding"
                  for each devices.

Also, after enabling the flag by default, we start cleaning up newly
added code under

  android.inputmethodservice.navigationbar.

at Bug 215443343.

Bug: 205803355
Test: Manually done as follows
  1. Build aosp_coral-userdebug and flash it
  2. Switch to gestural navigation mode.
  3. adb root
  4. adb shell setprop \
       persist.sys.ime.can_render_gestural_nav_buttons true
  5. adb reboot
  6. Tap any edit field to show AOSP Keyboard.
  7. Confirm that the back button on the navbar works.
  8. Confirm that the IME switcher button on the navbar works.
Change-Id: I3e7e1f83554444131e2765dc159617bb9e2337c7
2022-01-20 21:28:34 -08:00
Charles Chen
9c327699b8 Remove redundant API
Now InputMethodService has been migrated to WindowProviderService.
We don't need to override isUiContext anymore.

Bug: 193247900
Test: presubmit
Change-Id: I1cb0f04aca02d0d2c623995666ce5315125a0b4a
2022-01-14 22:24:24 +08:00
TreeHugger Robot
01d195c67c Merge "Revert "Revert "Scribe in IMF: startStylusHandwriting & lifecycl..."" 2022-01-13 16:54:42 +00:00
TreeHugger Robot
5aa8e247fd Merge "Add a sysprop to disable SysUI's nav buttons when IME is shown" 2022-01-13 05:17:48 +00:00
Taran Singh
94324080af Revert "Revert "Scribe in IMF: startStylusHandwriting & lifecycl..."
Revert^2 "CTS for Stylus Handwriting lifecycle"

493b8d7d3b4d43e483c03b155d38057e3eacd3c9

Reason: Fix API signature related issues by making newly introduced
 methods in InputMethod.java default

Bug: 213976598
Bug: 203086136
Test: atest StylusHandwritingTest
Test: atest SignatureTest#testSignature

Change-Id: Idfd5d1f84e66e3a19ef384589b4892adb91f8066
2022-01-12 19:23:47 +00:00
TreeHugger Robot
05c62452d9 Merge "[RESTRICT AUTOMERGE] Attempt to fix exception in IMS" 2022-01-12 07:58:25 +00:00
TreeHugger Robot
c6b5a2db45 Merge "[IME]: Make mFullscreenArea invisble when candidate/extract frame not used" 2022-01-12 04:31:09 +00:00
Charles Chen
07a7f23e36 [RESTRICT AUTOMERGE] Attempt to fix exception in IMS
IMS might throw IllegalStateException in
WindowContextController#attachToWindowToken when #initializeInternal
is called. A possible root cause may be #initializeInternal is called
after onDestroy, which detach IMS from ImeContainer.

This CL add a flag in #onDestroy to prevent #initializeInternal from
being called after #onDestroy.

Bug: 211062619
Test: presubmit

Change-Id: Ie7814da801878a3487123fefdc9e71d0e1ed28d7
2022-01-12 02:56:46 +00:00
Yohei Yukawa
a25070917a Add a sysprop to disable SysUI's nav buttons when IME is shown
This CL introduces a new runtime mode where the SysUI no longer
renders the back button and the IME switcher button when the IME is
shown, which is the first milestone to move those buttons to the IME
process.

To enable this mode, run the following commands:

  $ adb root
  $ adb shell setprop \
          persist.sys.ime.can_render_gestural_nav_buttons true
  $ adb reboot

Keep in mind that you always need to reboot the device after changing
this sysprop.

Note that only AOSP-based gestural navigation mode is officially
supported by this flag, which is when

  com.android.internal.R.integer.config_navBarInteractionMode

is set to

  WindowManagerPolicyConstants#NAV_BAR_MODE_GESTURAL.

Note that nav button rendering in the IME process is yet to be done in
subsequent CLs.  Hence the expected behavior right now is only one
thing that the SysUI stops rendering the back button and the IME
switcher button any more when the flag takes effect.

The flag is treated as off by default.  Hence there should be no
visible behavior changes unless you manually enable it.

Alternatives Considered:

Instead of letting NavigationBarView directly read the sysprop, we
could propagate the information from the InputMethodService to the
SysUI via InputMethodPrivilegedOperations#setImeWindowStatusAsync().
This approach was abandoned because of the following reasons.

 * Such a complex mechanism is not necessary for production code.
 * There are some ad-hoc invocations of
     IMMS#updateSystemUiLocked(0, mBackDisposition),
   which makes it difficult to keep IMS and SysUI in sync.

Bug: 205803355
Test: Manually done as follows
  1. Build aosp_coral-userdebug and flash it
  2. Tap any edit field to show AOSP Keyboard.
  3. Confirm that nav buttons are rendered in 3-button nav mode
  4. Switch to gestural navigation mode.
  5. Confirm that nav buttons are still shown when IME is visible.
  6. adb root
  7. adb shell setprop \
           persist.sys.ime.can_render_gestural_nav_buttons true
  8. adb reboot
  9. Tap any edit field to show AOSP Keyboard.
 10. Confirm that nav buttons are not shown when IME is visible.
 11. Switch to 3-button navigation mode.
 12. Tap any edit field to show AOSP Keyboard.
 13. Confirm that nav buttons are shown again when IME is visible.
 14. Switch to gestural navigation mode again.
 15. Confirm that nav buttons are not shown when IME is visible.
Change-Id: I7a2e9f08072a97d61b78dddb144282a5728d1407
2022-01-12 02:28:53 +00:00
Josh Wu
9d0c8ce4f3 Revert "Scribe in IMF: startStylusHandwriting & lifecycle 2/N"
Revert "CTS for Stylus Handwriting lifecycle"

Revert submission 16281467-stylus-handwriting-lifecycle

Reason for revert: Breaks apisignaturetests

BUGID: b/213976598

Reverted Changes:
I7b066c284:Scribe in IMF: startStylusHandwriting & lifecycle ...
I7d672b150:CTS for Stylus Handwriting lifecycle

Change-Id: Ieec94ea525fdb45cf5316b4a331c2bf9882e1083
2022-01-11 08:35:33 +00:00
Taran Singh
44dc2805b5 Scribe in IMF: startStylusHandwriting & lifecycle 2/N
Introduce InputMethodManager.startStylusHandwriting(View) API
and IME lifecycle.

Bug: 203086136
Test: atest StylusHandwritingTest
Change-Id: I7b066c2841b713e7a00ae2ea4ca0ce04aad751c6
2022-01-10 19:09:55 +00:00
Yohei Yukawa
ef936ff07d Deprecate SoftInputWindowProto.{name,window_type,gravity,takes_focus}
This is a follow up CL to my previous CL [1], which made it clear that
the following 4 tracing fields in SoftInputWindowProto had always been
logged with the same values.

  - name:         "InputMethod"
  - window_type:  WindowManager.LayoutParams.TYPE_INPUT_METHOD
  - gravity:      Gravity.BOTTOM
  - takes_focus:  false

This CL simply deprecates those fields in favor of simplicity and
smaller code size.

There should be no behavior change unless IME tracing is enabled.

 [1]: I619ae6011f5e66dba126931719569a97513eaa7e
      ea7801bd26

Bug: 192412909
Test: IME tracing still works
Change-Id: I04b59307ecf2c692282c7882ac839f77c94b938f
2022-01-03 16:49:24 -08:00
Yohei Yukawa
880a1b80b4 Merge SoftInputWindow#initDockWindow() into IMS#onCreate()
This CL merges

  SoftInputWindow#initDockWindow()

into

  InputMethodService#onCreate()

so that we can see what parameters are set to the IME window at a
glance, rather than having to check 2 different files.

The end result is expected to be the same, and in theory there should
be no observable behavior change.

If you are reading this commit message to look for why those
parameters have been set, here are some quick links to relevant CLs.

 * `FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS`
  - DecorView#mNavigationGuard is gone [1]
 * `window.setDecorFitsSystemWindows(false)`
  - Updated InputMethodService to not inset by navigation bar if
    requested by automotive. [2]
  - Smooth out IME animation for automotive devices [3]
 * `setFitInsetsTypes(statusBars() | navigationBars())`
  - Do let IME fit invisible insets [4]
 * `setFitInsetsSides(Side.all() & ~Side.BOTTOM)`
  - Make IME fit navgation bars at left and right sides [5]
 * `receiveInsetsIgnoringZOrder = true`
  - Let IME receive insets ignoring z-order [6]

 [1]: I664630099b6eb3fe31675444ba94944cb0eb98b0
      8f162c6e84
 [2]: I4faf82bdd7536bd2d049ded04034a9635d8ca0d3
      7eec316f54
 [3]: I5d7b03d5c829a2679efdd06fa961d1158494e08f
      b0d0d7c46a
 [4]: I6e7d665c55839dfbb14c8d2e5365537416f5f6c6
      145f71182a
 [5]: I0ef3d6379a9ae52b3749154d2fdc54e9aa94a9e0
      c8364e3878
 [6]: I53c64a5598f246ad577f652156903e4666a30cd9
      ea491da863

Bug: 192412909
Test: presubmit
Change-Id: If0f2bac45e6752612cc11e57d2fac55626221bd1
2021-12-27 19:29:13 -08:00
Yohei Yukawa
ea7801bd26 Simplify SoftInputWindow
Now that SoftInputWindow is used only by InputMethodService [1], we
can safely simplify SoftInputWindow.

This is still mechanical refactoring.  There should be no observable
behavior change.

 [1]: 5ed8dae6bc9cca87d5f35e781f173477a2388c2e

Bug: 192412909
Test: prebuilts/checkstyle/checkstyle.py -f \
  frameworks/base/core/java/android/inputmethodservice/SoftInputWindow.java
Change-Id: I619ae6011f5e66dba126931719569a97513eaa7e
2021-12-27 19:29:11 -08:00
Yohei Yukawa
60e56525b7 Fix lint errors and style nits in SoftInputWindow
This is a mechanical refactoring CL as a preparation to remove the
dependency on

   android.inputmethodservice.SoftInputWindow

from

   android.service.voice.VoiceInteractionSession.

Before creating a copy of SoftInputWindow for VoiceInteractionSession,
this CL aims to clean up lint errors and style nits as many as
possible, notably:

 * Addressing lint errors
 * Adding missing @Override
 * Making SoftInputWindow a final class
 * Making internal member fields private
 * Removing SoftInputWindow#{get,set}Gravity(), which are no longer used
 * Renaming SoftInputWindowState to WindowState

There should be no observable behavior change in this CL.

Bug: 192412909
Test: prebuilts/checkstyle/checkstyle.py -f \
  frameworks/base/core/java/android/inputmethodservice/SoftInputWindow.java
Change-Id: I547489d3946bf523a59ada80f63cfd934e70c1f4
2021-12-27 19:26:09 -08:00
Ming-Shin Lu
e1da618d5a [IME]: Make mFullscreenArea invisble when candidate/extract frame not used
The flicker happens when the app in landscape mode with focusing the
search editor without enabling full-screen editText, after typing something
and pressing search button, the app quickly clears the editor focus then
makes the main activity focused and starts the fallback connection to
enable the fullscreen mode, so that the extracted view been inflated and
occcupied in mFullscreenArea,

Even though the full-screen mode changed to false during hiding the
keyboard, in updateExtractFrameVisibility() still makes mFullscreenArea
visible and flicker until the keyboard is hidden.

As the mFullscreenArea contains 2 frames: ExtractFrame & CandidateFrame,
Since ExtractFrame is used when enabling the full-screen editor mode,
for non-full-screen mode, we can rely on the candidate frame visiblity
to see if mFullscreenArea has to set visible, in case flicker happening
by unnecessary visible setting.

Fix: 211085869
Test: manual as steps:
 1). Set device dark theme is on.
 2). Open Messages on Landscape mode > Split screen.
 3). Tap Search box > input something.
 4). Tap Search icon on keyboard.
 5). Expect no flicker happens when hiding the keyboard after 4).

Change-Id: I0d50ae68016993329e8bb84b90ec835445f3db31
2021-12-24 02:43:24 +08:00
Tony Wickham
4ad97f9522 Merge "Consider IME_VISIBLE_IMPERCEPTIBLE as shown for taskbar purposes" into sc-v2-dev am: 7aa0c3f9ee am: d7f237995c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16323570

Change-Id: Ie92373cbe9227cd848457c55bae22c6fd3292d29
2021-12-01 16:57:44 +00:00
Tony Wickham
e51f699fa8 Consider IME_VISIBLE_IMPERCEPTIBLE as shown for taskbar purposes
IME_VISIBLE isn't set until the keyboard is "perceptibly" visible to the user (e.g. based on alpha). But we want to signal to taskbar as soon as we know IME will be visible.

Test: tap an edit field to open keyboard, ensure taskbar reacts immediately instead of halfway through the transition
Bug: 202511986
Change-Id: I39c15578ed3e5b729f4645ad76988b113f0b57a6
2021-11-30 15:32:30 -08:00
Yohei Yukawa
daa6695c2e Add IMM#invalidateInput()
Historically TextView#setText() has internally called

  InputMethodManager#restartInput(View)

simply because the text seen from the IME is going to be out-of-sync.

Although this behavior is semantically helpful for IMEs, especially
after the initial surrounding text information became available in
EditorInfo, issuing a sync IPC from the calling thread (UI thread
actually) is not plausible from the performance perspective.

This CL fills this gap by adding a new API

  InputMethodManager#invalidateInput(View)

for the scenario where apps independently modify the text with keeping
other text metadata such as input-type to be the same.

All the observable behaviors from the IME remain to be the same as

  InputMethodManager#restartInput(View).

For instance, any pending tasks that are already issued with

  InputMethodService#getCurrentInputConnection()

will be effectively cancelled by using a recently added mechanism [1].

 [1]: I383c3958d2ac1a8d217706509fa12a92b381bbb3

Fix: 203086369
Test: atest -c CtsInputMethodTestCases:InputMethodStartInputLifecycleTest
Change-Id: I3161755779080f98bcef0e47dd0c5247d8a3a256
2021-11-17 15:21:32 -08:00
Calvin Pan
c33444b736 Support IME to take extra information to editor
Add the TextAttribute class and variant of setComposingText(),
setComposingRegion(), commitText() to support IME to take extra
information to editor.

Bug: 198732184
Test: atest  CtsInputMethodTestCases:InputConnectionEndToEndTest CtsInputMethodTestCases:TextAttributeTest
Change-Id: Ic9c917b70726ca32c2097b0374951c20af9624c4
2021-11-09 21:23:54 +08:00
Ming-Shin Lu
8bd8b27853 Fix IME crash on SoftInputWindow.show by TOKEN_PENDING
Originated from CL[1] to fix a crash edge case that happened when
calling InputMethodPrivilegedOperationsRegistry#put that assumes there
is only one pair of window token and IInputMethodPrivilegedOperations
in the container.

However, InputMethodPrivilegedOperationsRegistry is a process-level
singleton instances that may run into a timing when there are 2
InputMethodService (IMS) instances, one is just created and the other
is in the way of destorying.

Before the destorying one calls
InputMethodPrivilegedOperationsRegistry#remove, IMS#initializeInternal
invoked for the new one with the same window token, that makes system
ignored the initialization process because CL[1] introduced
InputMethodPrivilegedOperationsRegistry#isRegistered(token) and system
thoughts the token has been registered before, but actually this method
is problemetic to aware this token registraction is for previous IMS.

As the result, IME will crash when SoftInputWindow.show because the
windowState is still under TOKEN_PENDING and lose the token attachment.

To fix this crash timing issue, making
InputMethodPrivilegedOperationsRegistry be able to maintain more than
one pairs of IME token and IInputMethodPrivilegedOperations makes more
sense and we can remove the ignore logic in initializeInternal to
fix the token attachment issue.

[1]: Ie6bfbae735724fe744590e715124d2737d2b665d

Fix: 202081442
Test: atest CtsInputMethodTestCases
Test: atest MultiDisplaySystemDecorationTests

Change-Id: I21cec3f228520ed703cd8ad68ea0ef59c966ed9d
2021-10-13 09:31:44 +08:00
Taran Singh
7c7bb9ab40 Merge "Remove binder tracing from IMS" into sc-v2-dev am: 53a1d2e0e0 am: 5ddc05cd3a
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16033402

Change-Id: I48a6e566d01aba312c63e59ffcd39721b53cc79d
2021-10-11 20:48:34 +00:00