@@ -952,7 +952,7 @@ InputDispatcher::InputDispatcher(InputDispatcherPolicyInterface& policy,
952952 new LatencyAggregatorWithHistograms()))
953953 : std::move(std::unique_ptr<InputEventTimelineProcessor>(
954954 new LatencyAggregator()))),
955- mLatencyTracker(*mInputEventTimelineProcessor ) {
955+ mLatencyTracker(*mInputEventTimelineProcessor , mInputDevices ) {
956956 mReporter = createInputReporter ();
957957
958958 mWindowInfoListener = sp<DispatcherWindowListener>::make (*this );
@@ -1961,11 +1961,74 @@ bool InputDispatcher::dispatchKeyLocked(nsecs_t currentTime, std::shared_ptr<con
19611961 }
19621962 }
19631963
1964+ if (entry->interceptKeyResult == KeyEntry::InterceptKeyResult::FALLBACK) {
1965+ findAndDispatchFallbackEvent (currentTime, entry, inputTargets);
1966+ // Drop the key.
1967+ return true ;
1968+ }
1969+
19641970 // Dispatch the key.
19651971 dispatchEventLocked (currentTime, entry, inputTargets);
19661972 return true ;
19671973}
19681974
1975+ void InputDispatcher::findAndDispatchFallbackEvent (nsecs_t currentTime,
1976+ std::shared_ptr<const KeyEntry> entry,
1977+ std::vector<InputTarget>& inputTargets) {
1978+ // Find the fallback associated with the incoming key event and dispatch it.
1979+ KeyEvent event = createKeyEvent (*entry);
1980+ const int32_t originalKeyCode = entry->keyCode ;
1981+
1982+ // Fetch the fallback event.
1983+ KeyCharacterMap::FallbackAction fallback;
1984+ for (const InputDeviceInfo& deviceInfo : mInputDevices ) {
1985+ if (deviceInfo.getId () == entry->deviceId ) {
1986+ const KeyCharacterMap* map = deviceInfo.getKeyCharacterMap ();
1987+
1988+ LOG_ALWAYS_FATAL_IF (map == nullptr , " No KeyCharacterMap for device %d" ,
1989+ entry->deviceId );
1990+ map->getFallbackAction (entry->keyCode , entry->metaState , &fallback);
1991+ break ;
1992+ }
1993+ }
1994+
1995+ if (fallback.keyCode == AKEYCODE_UNKNOWN) {
1996+ // No fallback detected.
1997+ return ;
1998+ }
1999+
2000+ std::unique_ptr<KeyEntry> fallbackKeyEntry =
2001+ std::make_unique<KeyEntry>(mIdGenerator .nextId (), entry->injectionState ,
2002+ event.getEventTime (), event.getDeviceId (), event.getSource (),
2003+ event.getDisplayId (), entry->policyFlags , entry->action ,
2004+ event.getFlags () | AKEY_EVENT_FLAG_FALLBACK,
2005+ fallback.keyCode , event.getScanCode (), /* metaState=*/ 0 ,
2006+ event.getRepeatCount (), event.getDownTime ());
2007+
2008+ if (mTracer ) {
2009+ fallbackKeyEntry->traceTracker =
2010+ mTracer ->traceDerivedEvent (*fallbackKeyEntry, *entry->traceTracker );
2011+ }
2012+
2013+ for (const InputTarget& inputTarget : inputTargets) {
2014+ std::shared_ptr<Connection> connection = inputTarget.connection ;
2015+ if (!connection->responsive || (connection->status != Connection::Status::NORMAL)) {
2016+ return ;
2017+ }
2018+
2019+ connection->inputState .setFallbackKey (originalKeyCode, fallback.keyCode );
2020+ if (entry->action == AKEY_EVENT_ACTION_UP) {
2021+ connection->inputState .removeFallbackKey (originalKeyCode);
2022+ }
2023+
2024+ if (mTracer ) {
2025+ mTracer ->dispatchToTargetHint (*fallbackKeyEntry->traceTracker , inputTarget);
2026+ }
2027+ enqueueDispatchEntryAndStartDispatchCycleLocked (currentTime, connection,
2028+ std::move (fallbackKeyEntry), inputTarget);
2029+ }
2030+ }
2031+
19692032void InputDispatcher::logOutboundKeyDetails (const char * prefix, const KeyEntry& entry) {
19702033 LOG_IF (INFO, DEBUG_OUTBOUND_EVENT_DETAILS)
19712034 << prefix << " eventTime=" << entry.eventTime << " , deviceId=" << entry.deviceId
@@ -4346,7 +4409,7 @@ void InputDispatcher::notifyInputDevicesChanged(const NotifyInputDevicesChangedA
43464409 std::scoped_lock _l (mLock );
43474410 // Reset key repeating in case a keyboard device was added or removed or something.
43484411 resetKeyRepeatLocked ();
4349- mLatencyTracker . setInputDevices ( args.inputDeviceInfos ) ;
4412+ mInputDevices = args.inputDeviceInfos ;
43504413}
43514414
43524415void InputDispatcher::notifyKey (const NotifyKeyArgs& args) {
0 commit comments