| // Copyright 2017 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef STARBOARD_ANDROID_SHARED_INPUT_EVENTS_GENERATOR_H_ |
| #define STARBOARD_ANDROID_SHARED_INPUT_EVENTS_GENERATOR_H_ |
| |
| #include <android/input.h> |
| #include <map> |
| #include <memory> |
| #include <vector> |
| |
| #ifdef STARBOARD_INPUT_EVENTS_FILTER |
| #include "starboard/android/shared/input_events_filter.h" |
| #endif |
| |
| #include "starboard/input.h" |
| #include "starboard/shared/starboard/application.h" |
| #include "starboard/window.h" |
| |
| namespace starboard { |
| namespace android { |
| namespace shared { |
| |
| class InputEventsGenerator { |
| public: |
| typedef ::starboard::shared::starboard::Application::Event Event; |
| typedef std::vector<std::unique_ptr<Event> > Events; |
| |
| explicit InputEventsGenerator(SbWindow window); |
| virtual ~InputEventsGenerator(); |
| |
| // Translates an Android input event into a series of Starboard application |
| // events. The caller owns the new events and must delete them when done with |
| // them. |
| bool CreateInputEventsFromAndroidEvent(AInputEvent* android_event, |
| Events* events); |
| |
| // Create press/unpress events from SbKey |
| // (for use with CobaltA11yHelper injection) |
| void CreateInputEventsFromSbKey(SbKey key, Events* events); |
| |
| private: |
| enum FlatAxis { |
| kLeftX, |
| kLeftY, |
| kRightX, |
| kRightY, |
| kNumAxes, |
| }; |
| |
| bool ProcessKeyEvent(AInputEvent* android_event, Events* events); |
| bool ProcessPointerEvent(AInputEvent* android_event, Events* events); |
| bool ProcessMotionEvent(AInputEvent* android_event, Events* events); |
| void ProcessJoyStickEvent(FlatAxis axis, |
| int32_t motion_axis, |
| AInputEvent* android_event, |
| Events* events); |
| void UpdateDeviceFlatMapIfNecessary(AInputEvent* android_event); |
| |
| void ProcessFallbackDPadEvent(SbInputEventType type, |
| SbKey key, |
| AInputEvent* android_event, |
| Events* events); |
| void UpdateHatValuesAndPossiblySynthesizeKeyEvents(AInputEvent* android_event, |
| Events* events); |
| |
| SbWindow window_; |
| |
| #ifdef STARBOARD_INPUT_EVENTS_FILTER |
| InputEventsFilter input_events_filter_; |
| #endif |
| |
| // Map the device id with joystick flat position. |
| // Cache the flat area of joystick to avoid calling jni functions frequently. |
| std::map<int32_t, std::vector<float> > device_flat_; |
| |
| // The curent X/Y analog values of the "hat" (dpad on the game controller). |
| float hat_value_[2]; |
| |
| // The last known value of the left thumbstick, used to track when we should |
| // generate key unpressed events for it. We store values for horizontal and |
| // vertical directions independently. |
| SbKey left_thumbstick_key_pressed_[2]; |
| }; |
| |
| } // namespace shared |
| } // namespace android |
| } // namespace starboard |
| |
| #endif // STARBOARD_ANDROID_SHARED_INPUT_EVENTS_GENERATOR_H_ |