diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/android/input.h | 2 | ||||
| -rw-r--r-- | include/android/keycodes.h | 9 | ||||
| -rw-r--r-- | include/android/sensor.h | 120 | ||||
| -rw-r--r-- | include/android/surface_control.h | 345 | ||||
| -rw-r--r-- | include/android/system_fonts.h | 409 | ||||
| -rw-r--r-- | include/android/trace.h | 35 | ||||
| -rw-r--r-- | include/input/DisplayViewport.h | 67 | ||||
| -rw-r--r-- | include/input/IInputFlinger.h | 13 | ||||
| -rw-r--r-- | include/input/Input.h | 60 | ||||
| -rw-r--r-- | include/input/InputApplication.h | 94 | ||||
| -rw-r--r-- | include/input/InputDevice.h | 24 | ||||
| -rw-r--r-- | include/input/InputEventLabels.h | 15 | ||||
| -rw-r--r-- | include/input/InputTransport.h | 31 | ||||
| -rw-r--r-- | include/input/InputWindow.h | 247 | ||||
| -rw-r--r-- | include/input/KeyCharacterMap.h | 7 | ||||
| -rw-r--r-- | include/input/KeyLayoutMap.h | 2 | ||||
| -rw-r--r-- | include/input/Keyboard.h | 19 | ||||
| -rw-r--r-- | include/input/TouchVideoFrame.h | 67 | ||||
| -rw-r--r-- | include/input/VelocityTracker.h | 2 | ||||
| -rw-r--r-- | include/input/VirtualKeyMap.h | 3 |
20 files changed, 1508 insertions, 63 deletions
diff --git a/include/android/input.h b/include/android/input.h index 681090188f..cfade6c806 100644 --- a/include/android/input.h +++ b/include/android/input.h @@ -83,7 +83,7 @@ enum { }; /** - * Meta key / modifer state. + * Meta key / modifier state. */ enum { /** No meta keys are pressed. */ diff --git a/include/android/keycodes.h b/include/android/keycodes.h index 59d67f35f2..214559d683 100644 --- a/include/android/keycodes.h +++ b/include/android/keycodes.h @@ -769,7 +769,14 @@ enum { /** all apps */ AKEYCODE_ALL_APPS = 284, /** refresh key */ - AKEYCODE_REFRESH = 285 + AKEYCODE_REFRESH = 285, + /** Thumbs up key. Apps can use this to let user upvote content. */ + AKEYCODE_THUMBS_UP = 286, + /** Thumbs down key. Apps can use this to let user downvote content. */ + AKEYCODE_THUMBS_DOWN = 287, + /** Used to switch current account that is consuming content. + * May be consumed by system to switch current viewer profile. */ + AKEYCODE_PROFILE_SWITCH = 288 // NOTE: If you add a new keycode here you must also add it to several other files. // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. diff --git a/include/android/sensor.h b/include/android/sensor.h index 005564d153..e9d5c16d0d 100644 --- a/include/android/sensor.h +++ b/include/android/sensor.h @@ -64,6 +64,7 @@ typedef struct AHardwareBuffer AHardwareBuffer; #define ASENSOR_RESOLUTION_INVALID (nanf("")) #define ASENSOR_FIFO_COUNT_INVALID (-1) #define ASENSOR_DELAY_INVALID INT32_MIN +#define ASENSOR_INVALID (-1) /* (Keep in sync with hardware/sensors-base.h and Sensor.java.) */ @@ -208,6 +209,35 @@ enum { */ ASENSOR_TYPE_HEART_BEAT = 31, /** + * This sensor type is for delivering additional sensor information aside + * from sensor event data. + * + * Additional information may include: + * - {@link ASENSOR_ADDITIONAL_INFO_INTERNAL_TEMPERATURE} + * - {@link ASENSOR_ADDITIONAL_INFO_SAMPLING} + * - {@link ASENSOR_ADDITIONAL_INFO_SENSOR_PLACEMENT} + * - {@link ASENSOR_ADDITIONAL_INFO_UNTRACKED_DELAY} + * - {@link ASENSOR_ADDITIONAL_INFO_VEC3_CALIBRATION} + * + * This type will never bind to a sensor. In other words, no sensor in the + * sensor list can have the type {@link ASENSOR_TYPE_ADDITIONAL_INFO}. + * + * If a device supports the sensor additional information feature, it will + * report additional information events via {@link ASensorEvent} and will + * have {@link ASensorEvent#type} set to + * {@link ASENSOR_TYPE_ADDITIONAL_INFO} and {@link ASensorEvent#sensor} set + * to the handle of the reporting sensor. + * + * Additional information reports consist of multiple frames ordered by + * {@link ASensorEvent#timestamp}. The first frame in the report will have + * a {@link AAdditionalInfoEvent#type} of + * {@link ASENSOR_ADDITIONAL_INFO_BEGIN}, and the last frame in the report + * will have a {@link AAdditionalInfoEvent#type} of + * {@link ASENSOR_ADDITIONAL_INFO_END}. + * + */ + ASENSOR_TYPE_ADDITIONAL_INFO = 33, + /** * {@link ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT} */ ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT = 34, @@ -273,6 +303,51 @@ enum { ASENSOR_DIRECT_CHANNEL_TYPE_HARDWARE_BUFFER = 2 }; +/** + * Sensor Additional Info Types. + * + * Used to populate {@link AAdditionalInfoEvent#type}. + */ +enum { + /** Marks the beginning of additional information frames */ + ASENSOR_ADDITIONAL_INFO_BEGIN = 0, + + /** Marks the end of additional information frames */ + ASENSOR_ADDITIONAL_INFO_END = 1, + + /** + * Estimation of the delay that is not tracked by sensor timestamps. This + * includes delay introduced by sensor front-end filtering, data transport, + * etc. + * float[2]: delay in seconds, standard deviation of estimated value + */ + ASENSOR_ADDITIONAL_INFO_UNTRACKED_DELAY = 0x10000, + + /** float: Celsius temperature */ + ASENSOR_ADDITIONAL_INFO_INTERNAL_TEMPERATURE, + + /** + * First three rows of a homogeneous matrix, which represents calibration to + * a three-element vector raw sensor reading. + * float[12]: 3x4 matrix in row major order + */ + ASENSOR_ADDITIONAL_INFO_VEC3_CALIBRATION, + + /** + * Location and orientation of sensor element in the device frame: origin is + * the geometric center of the mobile device screen surface; the axis + * definition corresponds to Android sensor definitions. + * float[12]: 3x4 matrix in row major order + */ + ASENSOR_ADDITIONAL_INFO_SENSOR_PLACEMENT, + + /** + * float[2]: raw sample period in seconds, + * standard deviation of sampling period + */ + ASENSOR_ADDITIONAL_INFO_SAMPLING, +}; + /* * A few useful constants */ @@ -341,7 +416,7 @@ typedef struct ADynamicSensorEvent { int32_t handle; } ADynamicSensorEvent; -typedef struct { +typedef struct AAdditionalInfoEvent { int32_t type; int32_t serial; union { @@ -420,6 +495,7 @@ struct ASensorEventQueue; * - ASensorEventQueue_hasEvents() * - ASensorEventQueue_getEvents() * - ASensorEventQueue_setEventRate() + * - ASensorEventQueue_requestAdditionalInfoEvents() */ typedef struct ASensorEventQueue ASensorEventQueue; @@ -444,6 +520,7 @@ struct ASensor; * - ASensor_getStringType() * - ASensor_getReportingMode() * - ASensor_isWakeUpSensor() + * - ASensor_getHandle() */ typedef struct ASensor ASensor; /** @@ -703,6 +780,29 @@ int ASensorEventQueue_hasEvents(ASensorEventQueue* queue); */ ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, ASensorEvent* events, size_t count); +#if __ANDROID_API__ >= __ANDROID_API_Q__ +/** + * Request that {@link ASENSOR_TYPE_ADDITIONAL_INFO} events to be delivered on + * the given {@link ASensorEventQueue}. + * + * Sensor data events are always delivered to the {@ASensorEventQueue}. + * + * The {@link ASENSOR_TYPE_ADDITIONAL_INFO} events will be returned through + * {@link ASensorEventQueue_getEvents}. The client is responsible for checking + * {@link ASensorEvent#type} to determine the event type prior to handling of + * the event. + * + * The client must be tolerant of any value for + * {@link AAdditionalInfoEvent#type}, as new values may be defined in the future + * and may delivered to the client. + * + * \param queue {@link ASensorEventQueue} to configure + * \param enable true to request {@link ASENSOR_TYPE_ADDITIONAL_INFO} events, + * false to stop receiving events + * \return 0 on success or a negative error code on failure + */ +int ASensorEventQueue_requestAdditionalInfoEvents(ASensorEventQueue* queue, bool enable); +#endif /* __ANDROID_API__ >= __ANDRDOID_API_Q__ */ /*****************************************************************************/ @@ -785,6 +885,24 @@ bool ASensor_isDirectChannelTypeSupported(ASensor const* sensor, int channelType int ASensor_getHighestDirectReportRateLevel(ASensor const* sensor) __INTRODUCED_IN(26); #endif /* __ANDROID_API__ >= 26 */ +#if __ANDROID_API__ >= __ANDROID_API_Q__ +/** + * Returns the sensor's handle. + * + * The handle identifies the sensor within the system and is included in the + * {@link ASensorEvent#sensor} field of sensor events, including those sent with type + * {@link ASENSOR_TYPE_ADDITIONAL_INFO}. + * + * A sensor's handle is able to be used to map {@link ASENSOR_TYPE_ADDITIONAL_INFO} events to the + * sensor that generated the event. + * + * It is important to note that the value returned by {@link ASensor_getHandle} is not the same as + * the value returned by the Java API {@link android.hardware.Sensor#getId} and no mapping exists + * between the values. + */ +int ASensor_getHandle(ASensor const* sensor) __INTRODUCED_IN(__ANDROID_API_Q__); +#endif /* __ANDROID_API__ >= ANDROID_API_Q__ */ + #ifdef __cplusplus }; #endif diff --git a/include/android/surface_control.h b/include/android/surface_control.h new file mode 100644 index 0000000000..05731871d9 --- /dev/null +++ b/include/android/surface_control.h @@ -0,0 +1,345 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * 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. + */ + +/** + * @addtogroup NativeActivity Native Activity + * @{ + */ + +/** + * @file surface_control.h + */ + +#ifndef ANDROID_SURFACE_CONTROL_H +#define ANDROID_SURFACE_CONTROL_H + +#include <sys/cdefs.h> + +#include <android/hardware_buffer.h> +#include <android/hdr_metadata.h> +#include <android/native_window.h> + +__BEGIN_DECLS + +#if __ANDROID_API__ >= 29 + +struct ASurfaceControl; + +/** + * The SurfaceControl API can be used to provide a heirarchy of surfaces for + * composition to the system compositor. ASurfaceControl represents a content node in + * this heirarchy. + */ +typedef struct ASurfaceControl ASurfaceControl; + +/* + * Creates an ASurfaceControl with either ANativeWindow or an ASurfaceControl as its parent. + * |debug_name| is a debug name associated with this surface. It can be used to + * identify this surface in the SurfaceFlinger's layer tree. It must not be + * null. + * + * The caller takes ownership of the ASurfaceControl returned and must release it + * using ASurfaceControl_release below. + */ +ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* parent, const char* debug_name) + __INTRODUCED_IN(29); + +ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) + __INTRODUCED_IN(29); + +/** + * Releases the |surface_control| object. After releasing the ASurfaceControl the caller no longer + * has ownership of the AsurfaceControl. The surface and it's children may remain on display as long + * as their parent remains on display. + */ +void ASurfaceControl_release(ASurfaceControl* surface_control) __INTRODUCED_IN(29); + +struct ASurfaceTransaction; + +/** + * ASurfaceTransaction is a collection of updates to the surface tree that must + * be applied atomically. + */ +typedef struct ASurfaceTransaction ASurfaceTransaction; + +/** + * The caller takes ownership of the transaction and must release it using + * ASurfaceControl_delete below. + */ +ASurfaceTransaction* ASurfaceTransaction_create() __INTRODUCED_IN(29); + +/** + * Destroys the |transaction| object. + */ +void ASurfaceTransaction_delete(ASurfaceTransaction* transaction) __INTRODUCED_IN(29); + +/** + * Applies the updates accumulated in |transaction|. + * + * Note that the transaction is guaranteed to be applied atomically. The + * transactions which are applied on the same thread are also guaranteed to be + * applied in order. + */ +void ASurfaceTransaction_apply(ASurfaceTransaction* transaction) __INTRODUCED_IN(29); + +/** + * An opaque handle returned during a callback that can be used to query general stats and stats for + * surfaces which were either removed or for which buffers were updated after this transaction was + * applied. + */ +typedef struct ASurfaceTransactionStats ASurfaceTransactionStats; + +/** + * Since the transactions are applied asynchronously, the + * ASurfaceTransaction_OnComplete callback can be used to be notified when a frame + * including the updates in a transaction was presented. + * + * |context| is the optional context provided by the client that is passed into + * the callback. + * + * |stats| is an opaque handle that can be passed to ASurfaceTransactionStats functions to query + * information about the transaction. The handle is only valid during the the callback. + * + * THREADING + * The transaction completed callback can be invoked on any thread. + */ +typedef void (*ASurfaceTransaction_OnComplete)(void* context, ASurfaceTransactionStats* stats) + __INTRODUCED_IN(29); + +/** + * Returns the timestamp of when the frame was latched by the framework. Once a frame is + * latched by the framework, it is presented at the following hardware vsync. + */ +int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* surface_transaction_stats) + __INTRODUCED_IN(29); + +/** + * Returns a sync fence that signals when the transaction has been presented. + * The recipient of the callback takes ownership of the fence and is responsible for closing + * it. + */ +int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* surface_transaction_stats) + __INTRODUCED_IN(29); + +/** + * |outASurfaceControls| returns an array of ASurfaceControl pointers that were updated during the + * transaction. Stats for the surfaces can be queried through ASurfaceTransactionStats functions. + * When the client is done using the array, it must release it by calling + * ASurfaceTransactionStats_releaseASurfaceControls. + * + * |outASurfaceControlsSize| returns the size of the ASurfaceControls array. + */ +void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* surface_transaction_stats, + ASurfaceControl*** outASurfaceControls, + size_t* outASurfaceControlsSize) + __INTRODUCED_IN(29); +/** + * Releases the array of ASurfaceControls that were returned by + * ASurfaceTransactionStats_getASurfaceControls. + */ +void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** surface_controls) + __INTRODUCED_IN(29); + +/** + * Returns the timestamp of when the CURRENT buffer was acquired. A buffer is considered + * acquired when its acquire_fence_fd has signaled. A buffer cannot be latched or presented until + * it is acquired. If no acquire_fence_fd was provided, this timestamp will be set to -1. + */ +int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* surface_transaction_stats, + ASurfaceControl* surface_control) + __INTRODUCED_IN(29); + +/** + * The returns the fence used to signal the release of the PREVIOUS buffer set on + * this surface. If this fence is valid (>=0), the PREVIOUS buffer has not yet been released and the + * fence will signal when the PREVIOUS buffer has been released. If the fence is -1 , the PREVIOUS + * buffer is already released. The recipient of the callback takes ownership of the + * previousReleaseFenceFd and is responsible for closing it. + * + * Each time a buffer is set through ASurfaceTransaction_setBuffer()/_setCachedBuffer() on a + * transaction which is applied, the framework takes a ref on this buffer. The framework treats the + * addition of a buffer to a particular surface as a unique ref. When a transaction updates or + * removes a buffer from a surface, or removes the surface itself from the tree, this ref is + * guaranteed to be released in the OnComplete callback for this transaction. The + * ASurfaceControlStats provided in the callback for this surface may contain an optional fence + * which must be signaled before the ref is assumed to be released. + * + * The client must ensure that all pending refs on a buffer are released before attempting to reuse + * this buffer, otherwise synchronization errors may occur. + */ +int ASurfaceTransactionStats_getPreviousReleaseFenceFd( + ASurfaceTransactionStats* surface_transaction_stats, + ASurfaceControl* surface_control) + __INTRODUCED_IN(29); + +/** + * Sets the callback that will be invoked when the updates from this transaction + * are presented. For details on the callback semantics and data, see the + * comments on the ASurfaceTransaction_OnComplete declaration above. + */ +void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* transaction, void* context, + ASurfaceTransaction_OnComplete func) __INTRODUCED_IN(29); + +/** + * Reparents the |surface_control| from its old parent to the |new_parent| surface control. + * Any children of the* reparented |surface_control| will remain children of the |surface_control|. + * + * The |new_parent| can be null. Surface controls with a null parent do not appear on the display. + */ +void ASurfaceTransaction_reparent(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, ASurfaceControl* new_parent) + __INTRODUCED_IN(29); + +/* Parameter for ASurfaceTransaction_setVisibility */ +enum { + ASURFACE_TRANSACTION_VISIBILITY_HIDE = 0, + ASURFACE_TRANSACTION_VISIBILITY_SHOW = 1, +}; +/** + * Updates the visibility of |surface_control|. If show is set to + * ASURFACE_TRANSACTION_VISIBILITY_HIDE, the |surface_control| and all surfaces in its subtree will + * be hidden. + */ +void ASurfaceTransaction_setVisibility(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, int8_t visibility) + __INTRODUCED_IN(29); + +/** + * Updates the z order index for |surface_control|. Note that the z order for a surface + * is relative to other surfaces which are siblings of this surface. The behavior of sibilings with + * the same z order is undefined. + * + * Z orders may be from MIN_INT32 to MAX_INT32. A layer's default z order index is 0. + */ +void ASurfaceTransaction_setZOrder(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, int32_t z_order) + __INTRODUCED_IN(29); + +/** + * Updates the AHardwareBuffer displayed for |surface_control|. If not -1, the + * acquire_fence_fd should be a file descriptor that is signaled when all pending work + * for the buffer is complete and the buffer can be safely read. + * + * The frameworks takes ownership of the |acquire_fence_fd| passed and is responsible + * for closing it. + */ +void ASurfaceTransaction_setBuffer(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, AHardwareBuffer* buffer, + int acquire_fence_fd = -1) __INTRODUCED_IN(29); + +/** + * Updates the color for |surface_control|. This will make the background color for the + * ASurfaceControl visible in transparent regions of the surface. Colors |r|, |g|, + * and |b| must be within the range that is valid for |dataspace|. |dataspace| and |alpha| + * will be the dataspace and alpha set for the background color layer. + */ +void ASurfaceTransaction_setColor(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, float r, float g, float b, + float alpha, ADataSpace dataspace) + __INTRODUCED_IN(29); + +/** + * |source| the sub-rect within the buffer's content to be rendered inside the surface's area + * The surface's source rect is clipped by the bounds of its current buffer. The source rect's width + * and height must be > 0. + * + * |destination| specifies the rect in the parent's space where this surface will be drawn. The post + * source rect bounds are scaled to fit the destination rect. The surface's destination rect is + * clipped by the bounds of its parent. The destination rect's width and height must be > 0. + * + * |transform| the transform applied after the source rect is applied to the buffer. This parameter + * should be set to 0 for no transform. To specify a transfrom use the NATIVE_WINDOW_TRANSFORM_* + * enum. + */ +void ASurfaceTransaction_setGeometry(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, const ARect& source, + const ARect& destination, int32_t transform) + __INTRODUCED_IN(29); + + +/* Parameter for ASurfaceTransaction_setBufferTransparency */ +enum { + ASURFACE_TRANSACTION_TRANSPARENCY_TRANSPARENT = 0, + ASURFACE_TRANSACTION_TRANSPARENCY_TRANSLUCENT = 1, + ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE = 2, +}; +/** + * Updates whether the content for the buffer associated with this surface is + * completely opaque. If true, every pixel of content inside the buffer must be + * opaque or visual errors can occur. + */ +void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, + int8_t transparency) + __INTRODUCED_IN(29); + +/** + * Updates the region for the content on this surface updated in this + * transaction. If unspecified, the complete surface is assumed to be damaged. + */ +void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, const ARect rects[], + uint32_t count) __INTRODUCED_IN(29); + +/** + * Specifies a desiredPresentTime for the transaction. The framework will try to present + * the transaction at or after the time specified. + * + * Transactions will not be presented until all of their acquire fences have signaled even if the + * app requests an earlier present time. + * + * If an earlier transaction has a desired present time of x, and a later transaction has a desired + * present time that is before x, the later transaction will not preempt the earlier transaction. + */ +void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* transaction, + int64_t desiredPresentTime) __INTRODUCED_IN(29); + +/** + * Sets the alpha for the buffer. It uses a premultiplied blending. + * + * The |alpha| must be between 0.0 and 1.0. + */ +void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, float alpha) + __INTRODUCED_IN(29); + +/* + * SMPTE ST 2086 "Mastering Display Color Volume" static metadata + * + * When |metadata| is set to null, the framework does not use any smpte2086 metadata when rendering + * the surface's buffer. + */ +void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, + struct AHdrMetadata_smpte2086* metadata) + __INTRODUCED_IN(29); + +/* + * Sets the CTA 861.3 "HDR Static Metadata Extension" static metadata on a surface. + * + * When |metadata| is set to null, the framework does not use any cta861.3 metadata when rendering + * the surface's buffer. + */ +void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* transaction, + ASurfaceControl* surface_control, + struct AHdrMetadata_cta861_3* metadata) + __INTRODUCED_IN(29); + +#endif // __ANDROID_API__ >= 29 + +__END_DECLS + +#endif // ANDROID_SURFACE_CONTROL_H diff --git a/include/android/system_fonts.h b/include/android/system_fonts.h new file mode 100644 index 0000000000..38f036e4c0 --- /dev/null +++ b/include/android/system_fonts.h @@ -0,0 +1,409 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * 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. + */ + +/** + * @file system_fonts.h + * @brief Provides the system font configurations. + * + * These APIs provides the list of system installed font files with additional metadata about the + * font. + * + * The ASystemFontIterator_open method will give you an iterator which can iterate all system + * installed font files as shown in the following example. + * + * \code{.cpp} + * ASystemFontIterator* iterator = ASystemFontIterator_open(); + * ASystemFont* font = NULL; + * + * while ((font = ASystemFontIterator_next(iterator)) != nullptr) { + * // Look if the font is your desired one. + * if (ASystemFont_getWeight(font) == 400 && !ASystemFont_isItalic(font) + * && ASystemFont_getLocale(font) == NULL) { + * break; + * } + * ASystemFont_close(font); + * } + * ASystemFontIterator_close(iterator); + * + * int fd = open(ASystemFont_getFontFilePath(font), O_RDONLY); + * int collectionIndex = ASystemFont_getCollectionINdex(font); + * std::vector<std::pair<uint32_t, float>> variationSettings; + * for (size_t i = 0; i < ASystemFont_getAxisCount(font); ++i) { + * variationSettings.push_back(std::make_pair( + * ASystemFont_getAxisTag(font, i), + * ASystemFont_getAxisValue(font, i))); + * } + * ASystemFont_close(font); + * + * // Use this font for your text rendering engine. + * + * \endcode + * + * Available since API level 29. + */ + +#ifndef ANDROID_SYSTEM_FONTS_H +#define ANDROID_SYSTEM_FONTS_H + +#include <stdbool.h> +#include <stddef.h> +#include <sys/cdefs.h> + +/****************************************************************** + * + * IMPORTANT NOTICE: + * + * This file is part of Android's set of stable system headers + * exposed by the Android NDK (Native Development Kit). + * + * Third-party source AND binary code relies on the definitions + * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES. + * + * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES) + * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS + * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY + * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES + */ + +__BEGIN_DECLS + +#if __ANDROID_API__ >= 29 + +enum { + /** The minimum value fot the font weight value. */ + ASYSTEM_FONT_WEIGHT_MIN = 0, + + /** A font weight value for the thin weight. */ + ASYSTEM_FONT_WEIGHT_THIN = 100, + + /** A font weight value for the extra-light weight. */ + ASYSTEM_FONT_WEIGHT_EXTRA_LIGHT = 200, + + /** A font weight value for the light weight. */ + ASYSTEM_FONT_WEIGHT_LIGHT = 300, + + /** A font weight value for the normal weight. */ + ASYSTEM_FONT_WEIGHT_NORMAL = 400, + + /** A font weight value for the medium weight. */ + ASYSTEM_FONT_WEIGHT_MEDIUM = 500, + + /** A font weight value for the semi-bold weight. */ + ASYSTEM_FONT_WEIGHT_SEMI_BOLD = 600, + + /** A font weight value for the bold weight. */ + ASYSTEM_FONT_WEIGHT_BOLD = 700, + + /** A font weight value for the extra-bold weight. */ + ASYSTEM_FONT_WEIGHT_EXTRA_BOLD = 800, + + /** A font weight value for the black weight. */ + ASYSTEM_FONT_WEIGHT_BLACK = 900, + + /** The maximum value for the font weight value. */ + ASYSTEM_FONT_WEIGHT_MAX = 1000 +}; + +/** + * ASystemFontIterator provides access to the system font configuration. + * + * ASystemFontIterator is an iterator for all available system font settings. + * This iterator is not a thread-safe object. Do not pass this iterator to other threads. + */ +struct ASystemFontIterator; + +/** + * ASystemFont provides information of the single system font configuration. + */ +struct ASystemFont; + +/** + * Create a system font iterator. + * + * Use ASystemFont_close() to close the iterator. + * + * \return a pointer for a newly allocated iterator, nullptr on failure. + */ +ASystemFontIterator* _Nullable ASystemFontIterator_open() __INTRODUCED_IN(29); + +/** + * Close an opened system font iterator, freeing any related resources. + * + * \param iterator a pointer of an iterator for the system fonts. Do nothing if NULL is passed. + */ +void ASystemFontIterator_close(ASystemFontIterator* _Nullable iterator) __INTRODUCED_IN(29); + +/** + * Move to the next system font. + * + * \param iterator an iterator for the system fonts. Passing NULL is not allowed. + * \return a font. If no more font is available, returns nullptr. You need to release the returned + * font by ASystemFont_close when it is no longer needed. + */ +ASystemFont* _Nullable ASystemFontIterator_next(ASystemFontIterator* _Nonnull iterator) __INTRODUCED_IN(29); + +/** + * Close an ASystemFont returned by ASystemFontIterator_next. + * + * \param font a font returned by ASystemFontIterator_next or ASystemFont_matchFamilyStyleCharacter. + * Do nothing if NULL is passed. + */ +void ASystemFont_close(ASystemFont* _Nullable font) __INTRODUCED_IN(29); + + +/** + * Select the best font from given parameters. + * + * Only generic font families are supported. + * For more information about generic font families, read [W3C spec](https://www.w3.org/TR/css-fonts-4/#generic-font-families) + * + * Even if no font can render the given text, this function will return a non-null result for + * drawing Tofu character. + * + * Examples: + * \code{.cpp} + * // Simple font query for the ASCII character. + * std::vector<uint16_t> text = { 'A' }; + * ASystemFont font = ASystemFont_matchFamilyStyleCharacter( + * "sans", 400, false, "en-US", text.data(), text.length(), &runLength); + * // runLength will be 1 and the font will points a valid font file. + * + * // Querying font for CJK characters + * std::vector<uint16_t> text = { 0x9AA8 }; + * ASystemFont font = ASystemFont_matchFamilyStyleCharacter( + * "sans", 400, false, "zh-CN,ja-JP", text.data(), text.length(), &runLength); + * // runLength will be 1 and the font will points a Simplified Chinese font. + * ASystemFont font = ASystemFont_matchFamilyStyleCharacter( + * "sans", 400, false, "ja-JP,zh-CN", text.data(), text.length(), &runLength); + * // runLength will be 1 and the font will points a Japanese font. + * + * // Querying font for text/color emoji + * std::vector<uint16_t> text = { 0xD83D, 0xDC68, 0x200D, 0x2764, 0xFE0F, 0x200D, 0xD83D, 0xDC68 }; + * ASystemFont font = ASystemFont_matchFamilyStyleCharacter( + * "sans", 400, false, "en-US", text.data(), text.length(), &runLength); + * // runLength will be 8 and the font will points a color emoji font. + * + * // Mixture of multiple script of characters. + * // 0x05D0 is a Hebrew character and 0x0E01 is a Thai character. + * std::vector<uint16_t> text = { 0x05D0, 0x0E01 }; + * ASystemFont font = ASystemFont_matchFamilyStyleCharacter( + * "sans", 400, false, "en-US", text.data(), text.length(), &runLength); + * // runLength will be 1 and the font will points a Hebrew font. + * \endcode + * + * \param familyName a null character terminated font family name + * \param weight a font weight value. Only from 0 to 1000 value is valid + * \param italic true if italic, otherwise false. + * \param languageTags a null character terminated comma separated IETF BCP47 compliant language + * tags. + * \param text a UTF-16 encoded text buffer to be rendered. Do not pass empty string. + * \param textLength a length of the given text buffer. This must not be zero. + * \param runLengthOut if not null, the font run length will be filled. + * \return a font to be used for given text and params. You need to release the returned font by + * ASystemFont_close when it is no longer needed. + */ +ASystemFont* _Nonnull ASystemFont_matchFamilyStyleCharacter( + const char* _Nonnull familyName, + uint16_t weight, + bool italic, + const char* _Nonnull languageTags, + const uint16_t* _Nonnull text, + uint32_t textLength, + uint32_t* _Nullable runLengthOut) __INTRODUCED_IN(29); + +/** + * Return an absolute path to the current font file. + * + * Here is a list of font formats returned by this method: + * <ul> + * <li>OpenType</li> + * <li>OpenType Font Collection</li> + * <li>TrueType</li> + * <li>TrueType Collection</li> + * </ul> + * The file extension could be one of *.otf, *.ttf, *.otc or *.ttc. + * + * The font file returned is guaranteed to be opend with O_RDONLY. + * Note that the returned pointer is valid until ASystemFont_close() is called for the given font. + * + * \param font a font object. Passing NULL is not allowed. + * \return a string of the font file path. + */ +const char* _Nonnull ASystemFont_getFontFilePath(const ASystemFont* _Nonnull font) __INTRODUCED_IN(29); + +/** + * Return a weight value associated with the current font. + * + * The weight values are positive and less than or equal to 1000. + * Here are pairs of the common names and their values. + * <p> + * <table> + * <tr> + * <th align="center">Value</th> + * <th align="center">Name</th> + * <th align="center">NDK Definition</th> + * </tr> + * <tr> + * <td align="center">100</td> + * <td align="center">Thin</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_THIN}</td> + * </tr> + * <tr> + * <td align="center">200</td> + * <td align="center">Extra Light (Ultra Light)</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_EXTRA_LIGHT}</td> + * </tr> + * <tr> + * <td align="center">300</td> + * <td align="center">Light</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_LIGHT}</td> + * </tr> + * <tr> + * <td align="center">400</td> + * <td align="center">Normal (Regular)</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_NORMAL}</td> + * </tr> + * <tr> + * <td align="center">500</td> + * <td align="center">Medium</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_MEDIUM}</td> + * </tr> + * <tr> + * <td align="center">600</td> + * <td align="center">Semi Bold (Demi Bold)</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_SEMI_BOLD}</td> + * </tr> + * <tr> + * <td align="center">700</td> + * <td align="center">Bold</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_BOLD}</td> + * </tr> + * <tr> + * <td align="center">800</td> + * <td align="center">Extra Bold (Ultra Bold)</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_EXTRA_BOLD}</td> + * </tr> + * <tr> + * <td align="center">900</td> + * <td align="center">Black (Heavy)</td> + * <td align="center">{@link ASYSTEM_FONT_WEIGHT_BLACK}</td> + * </tr> + * </table> + * </p> + * Note that the weight value may fall in between above values, e.g. 250 weight. + * + * For more information about font weight, read [OpenType usWeightClass](https://docs.microsoft.com/en-us/typography/opentype/spec/os2#usweightclass) + * + * \param font a font object. Passing NULL is not allowed. + * \return a positive integer less than or equal to {@link ASYSTEM_FONT_MAX_WEIGHT} is returned. + */ +uint16_t ASystemFont_getWeight(const ASystemFont* _Nonnull font) __INTRODUCED_IN(29); + +/** + * Return true if the current font is italic, otherwise returns false. + * + * \param font a font object. Passing NULL is not allowed. + * \return true if italic, otherwise false. + */ +bool ASystemFont_isItalic(const ASystemFont* _Nonnull font) __INTRODUCED_IN(29); + +/** + * Return a IETF BCP47 compliant language tag associated with the current font. + * + * For information about IETF BCP47, read [Locale.forLanguageTag(java.lang.String)](https://developer.android.com/reference/java/util/Locale.html#forLanguageTag(java.lang.String)") + * + * Note that the returned pointer is valid until ASystemFont_close() is called. + * + * \param font a font object. Passing NULL is not allowed. + * \return a IETF BCP47 compliant langauge tag or nullptr if not available. + */ +const char* _Nullable ASystemFont_getLocale(const ASystemFont* _Nonnull font) __INTRODUCED_IN(29); + +/** + * Return a font collection index value associated with the current font. + * + * In case the target font file is a font collection (e.g. .ttc or .otc), this + * returns a non-negative value as an font offset in the collection. This + * always returns 0 if the target font file is a regular font. + * + * \param font a font object. Passing NULL is not allowed. + * \return a font collection index. + */ +size_t ASystemFont_getCollectionIndex(const ASystemFont* _Nonnull font) __INTRODUCED_IN(29); + +/** + * Return a count of font variation settings associated with the current font + * + * The font variation settings are provided as multiple tag-values pairs. + * + * For example, bold italic font may have following font variation settings: + * 'wght' 700, 'slnt' -12 + * In this case, ASystemFont_getAxisCount returns 2 and ASystemFont_getAxisTag + * and ASystemFont_getAxisValue will return following values. + * \code{.cpp} + * ASystemFont* font = ASystemFontIterator_next(ite); + * + * // Returns the number of axes + * ASystemFont_getAxisCount(font); // Returns 2 + * + * // Returns the tag-value pair for the first axis. + * ASystemFont_getAxisTag(font, 0); // Returns 'wght'(0x77676874) + * ASystemFont_getAxisValue(font, 0); // Returns 700.0 + * + * // Returns the tag-value pair for the second axis. + * ASystemFont_getAxisTag(font, 1); // Returns 'slnt'(0x736c6e74) + * ASystemFont_getAxisValue(font, 1); // Returns -12.0 + * \endcode + * + * For more information about font variation settings, read [Font Variations Table](https://docs.microsoft.com/en-us/typography/opentype/spec/fvar) + * + * \param font a font object. Passing NULL is not allowed. + * \return a number of font variation settings. + */ +size_t ASystemFont_getAxisCount(const ASystemFont* _Nonnull font) __INTRODUCED_IN(29); + + +/** + * Return an OpenType axis tag associated with the current font. + * + * See ASystemFont_getAxisCount for more details. + * + * \param font a font object. Passing NULL is not allowed. + * \param axisIndex an index to the font variation settings. Passing value larger than or + * equal to {@link ASystemFont_getAxisCount} is not allowed. + * \return an OpenType axis tag value for the given font variation setting. + */ +uint32_t ASystemFont_getAxisTag(const ASystemFont* _Nonnull font, uint32_t axisIndex) + __INTRODUCED_IN(29); + +/** + * Return an OpenType axis value associated with the current font. + * + * See ASystemFont_getAxisCount for more details. + * + * \param font a font object. Passing NULL is not allowed. + * \param axisIndex an index to the font variation settings. Passing value larger than or + * equal to {@link ASYstemFont_getAxisCount} is not allwed. + * \return a float value for the given font variation setting. + */ +float ASystemFont_getAxisValue(const ASystemFont* _Nonnull font, uint32_t axisIndex) + __INTRODUCED_IN(29); + +#endif // __ANDROID_API__ >= 29 + +__END_DECLS + +#endif // ANDROID_SYSTEM_FONTS_H diff --git a/include/android/trace.h b/include/android/trace.h index aa24995cae..bb7ff28f79 100644 --- a/include/android/trace.h +++ b/include/android/trace.h @@ -33,6 +33,7 @@ #define ANDROID_NATIVE_TRACE_H #include <stdbool.h> +#include <stdint.h> #include <sys/cdefs.h> #ifdef __cplusplus @@ -73,6 +74,40 @@ void ATrace_endSection() __INTRODUCED_IN(23); #endif /* __ANDROID_API__ >= 23 */ +#if __ANDROID_API__ >= __ANDROID_API_Q__ + +/** + * Writes a trace message to indicate that a given section of code has + * begun. Must be followed by a call to {@link ATrace_endAsyncSection} with the same + * methodName and cookie. Unlike {@link ATrace_beginSection} and {@link ATrace_endSection}, + * asynchronous events do not need to be nested. The name and cookie used to + * begin an event must be used to end it. + * + * \param sectionName The method name to appear in the trace. + * \param cookie Unique identifier for distinguishing simultaneous events + */ +void ATrace_beginAsyncSection(const char* sectionName, int32_t cookie) __INTRODUCED_IN(29); + +/** + * Writes a trace message to indicate that the current method has ended. + * Must be called exactly once for each call to {@link ATrace_beginAsyncSection} + * using the same name and cookie. + * + * \param methodName The method name to appear in the trace. + * \param cookie Unique identifier for distinguishing simultaneous events + */ +void ATrace_endAsyncSection(const char* sectionName, int32_t cookie) __INTRODUCED_IN(29); + +/** + * Writes trace message to indicate the value of a given counter. + * + * \param counterName The counter name to appear in the trace. + * \param counterValue The counter value. + */ +void ATrace_setCounter(const char* counterName, int64_t counterValue) __INTRODUCED_IN(29); + +#endif /* __ANDROID_API__ >= 29 */ + #ifdef __cplusplus }; #endif diff --git a/include/input/DisplayViewport.h b/include/input/DisplayViewport.h index 86da4d38e8..fa456bb213 100644 --- a/include/input/DisplayViewport.h +++ b/include/input/DisplayViewport.h @@ -17,11 +17,39 @@ #ifndef _LIBINPUT_DISPLAY_VIEWPORT_H #define _LIBINPUT_DISPLAY_VIEWPORT_H +#include <android-base/stringprintf.h> #include <ui/DisplayInfo.h> #include <input/Input.h> +#include <inttypes.h> +#include <optional> + +using android::base::StringPrintf; namespace android { +/** + * Describes the different type of viewports supported by input flinger. + * Keep in sync with values in InputManagerService.java. + */ +enum class ViewportType : int32_t { + VIEWPORT_INTERNAL = 1, + VIEWPORT_EXTERNAL = 2, + VIEWPORT_VIRTUAL = 3, +}; + +static const char* viewportTypeToString(ViewportType type) { + switch(type) { + case ViewportType::VIEWPORT_INTERNAL: + return "INTERNAL"; + case ViewportType::VIEWPORT_EXTERNAL: + return "EXTERNAL"; + case ViewportType::VIEWPORT_VIRTUAL: + return "VIRTUAL"; + default: + return "UNKNOWN"; + } +} + /* * Describes how coordinates are mapped on a physical display. * See com.android.server.display.DisplayViewport. @@ -39,13 +67,18 @@ struct DisplayViewport { int32_t physicalBottom; int32_t deviceWidth; int32_t deviceHeight; - String8 uniqueId; + std::string uniqueId; + // The actual (hardware) port that the associated display is connected to. + // Not all viewports will have this specified. + std::optional<uint8_t> physicalPort; + ViewportType type; DisplayViewport() : displayId(ADISPLAY_ID_NONE), orientation(DISPLAY_ORIENTATION_0), logicalLeft(0), logicalTop(0), logicalRight(0), logicalBottom(0), physicalLeft(0), physicalTop(0), physicalRight(0), physicalBottom(0), - deviceWidth(0), deviceHeight(0) { + deviceWidth(0), deviceHeight(0), uniqueId(), physicalPort(std::nullopt), + type(ViewportType::VIEWPORT_INTERNAL) { } bool operator==(const DisplayViewport& other) const { @@ -61,7 +94,9 @@ struct DisplayViewport { && physicalBottom == other.physicalBottom && deviceWidth == other.deviceWidth && deviceHeight == other.deviceHeight - && uniqueId == other.uniqueId; + && uniqueId == other.uniqueId + && physicalPort == other.physicalPort + && type == other.type; } bool operator!=(const DisplayViewport& other) const { @@ -86,17 +121,25 @@ struct DisplayViewport { deviceWidth = width; deviceHeight = height; uniqueId.clear(); + physicalPort = std::nullopt; + type = ViewportType::VIEWPORT_INTERNAL; } -}; -/** - * Describes the different type of viewports supported by input flinger. - * Keep in sync with values in InputManagerService.java. - */ -enum class ViewportType : int32_t { - VIEWPORT_INTERNAL = 1, - VIEWPORT_EXTERNAL = 2, - VIEWPORT_VIRTUAL = 3, + std::string toString() const { + return StringPrintf("Viewport %s: displayId=%d, uniqueId=%s, port=%s, orientation=%d, " + "logicalFrame=[%d, %d, %d, %d], " + "physicalFrame=[%d, %d, %d, %d], " + "deviceSize=[%d, %d]", + viewportTypeToString(type), displayId, + uniqueId.c_str(), + physicalPort ? StringPrintf("%" PRIu8, *physicalPort).c_str() : "<none>", + orientation, + logicalLeft, logicalTop, + logicalRight, logicalBottom, + physicalLeft, physicalTop, + physicalRight, physicalBottom, + deviceWidth, deviceHeight); + } }; } // namespace android diff --git a/include/input/IInputFlinger.h b/include/input/IInputFlinger.h index 11bb7215d6..ff443c6928 100644 --- a/include/input/IInputFlinger.h +++ b/include/input/IInputFlinger.h @@ -22,6 +22,9 @@ #include <binder/IInterface.h> +#include <utils/Vector.h> +#include <input/InputWindow.h> + namespace android { /* @@ -31,6 +34,11 @@ namespace android { class IInputFlinger : public IInterface { public: DECLARE_META_INTERFACE(InputFlinger) + + virtual void setInputWindows(const Vector<InputWindowInfo>& inputHandles) = 0; + virtual void transferTouchFocus(const sp<IBinder>& fromToken, const sp<IBinder>& toToken) = 0; + virtual void registerInputChannel(const sp<InputChannel>& channel) = 0; + virtual void unregisterInputChannel(const sp<InputChannel>& channel) = 0; }; @@ -40,7 +48,10 @@ public: class BnInputFlinger : public BnInterface<IInputFlinger> { public: enum { - DO_SOMETHING_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION, + SET_INPUT_WINDOWS_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION, + REGISTER_INPUT_CHANNEL_TRANSACTION, + UNREGISTER_INPUT_CHANNEL_TRANSACTION, + TRANSFER_TOUCH_FOCUS }; virtual status_t onTransact(uint32_t code, const Parcel& data, diff --git a/include/input/Input.h b/include/input/Input.h index 756b337bc8..805957a5ca 100644 --- a/include/input/Input.h +++ b/include/input/Input.h @@ -17,6 +17,8 @@ #ifndef _LIBINPUT_INPUT_H #define _LIBINPUT_INPUT_H +#pragma GCC system_header + /** * Native input event structures. */ @@ -25,7 +27,6 @@ #include <utils/BitSet.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> -#include <utils/String8.h> #include <utils/Timers.h> #include <utils/Vector.h> #include <stdint.h> @@ -58,6 +59,12 @@ enum { */ AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 0x2, + /** + * This flag indicates that the event has been generated by a gesture generator. It + * provides a hint to the GestureDetector to not apply any touch slop. + */ + AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE = 0x8, + /* Motion event is inconsistent with previously sent motion events. */ AMOTION_EVENT_FLAG_TAINTED = 0x80000000, }; @@ -213,6 +220,32 @@ enum { POLICY_FLAG_PASS_TO_USER = 0x40000000, }; +/** + * Classifications of the current gesture, if available. + * + * The following values must be kept in sync with MotionEvent.java + */ +enum class MotionClassification : uint8_t { + /** + * No classification is available. + */ + NONE = 0, + /** + * Too early to classify the current gesture. Need more events. Look for changes in the + * upcoming motion events. + */ + AMBIGUOUS_GESTURE = 1, + /** + * The current gesture likely represents a user intentionally exerting force on the touchscreen. + */ + DEEP_PRESS = 2, +}; + +/** + * String representation of MotionClassification + */ +const char* motionClassificationToString(MotionClassification classification); + /* * Pointer coordinate data. */ @@ -237,7 +270,12 @@ struct PointerCoords { float getAxisValue(int32_t axis) const; status_t setAxisValue(int32_t axis, float value); - void scale(float scale); + void scale(float globalScale); + + // Scale the pointer coordinates according to a global scale and a + // window scale. The global scale will be applied to TOUCH/TOOL_MAJOR/MINOR + // axes, however the window scaling will not. + void scale(float globalScale, float windowXScale, float windowYScale); void applyOffset(float xOffset, float yOffset); inline float getX() const { @@ -302,12 +340,18 @@ public: inline void setSource(int32_t source) { mSource = source; } + inline int32_t getDisplayId() const { return mDisplayId; } + + inline void setDisplayId(int32_t displayId) { mDisplayId = displayId; } + + protected: - void initialize(int32_t deviceId, int32_t source); + void initialize(int32_t deviceId, int32_t source, int32_t displayId); void initialize(const InputEvent& from); int32_t mDeviceId; int32_t mSource; + int32_t mDisplayId; }; /* @@ -339,10 +383,11 @@ public: static const char* getLabel(int32_t keyCode); static int32_t getKeyCodeFromLabel(const char* label); - + void initialize( int32_t deviceId, int32_t source, + int32_t displayId, int32_t action, int32_t flags, int32_t keyCode, @@ -400,6 +445,8 @@ public: inline void setButtonState(int32_t buttonState) { mButtonState = buttonState; } + inline MotionClassification getClassification() const { return mClassification; } + inline int32_t getActionButton() const { return mActionButton; } inline void setActionButton(int32_t button) { mActionButton = button; } @@ -556,12 +603,14 @@ public: void initialize( int32_t deviceId, int32_t source, + int32_t displayId, int32_t action, int32_t actionButton, int32_t flags, int32_t edgeFlags, int32_t metaState, int32_t buttonState, + MotionClassification classification, float xOffset, float yOffset, float xPrecision, @@ -580,7 +629,7 @@ public: void offsetLocation(float xOffset, float yOffset); - void scale(float scaleFactor); + void scale(float globalScaleFactor); // Apply 3x3 perspective matrix transformation. // Matrix is in row-major form and compatible with SkMatrix. @@ -615,6 +664,7 @@ protected: int32_t mEdgeFlags; int32_t mMetaState; int32_t mButtonState; + MotionClassification mClassification; float mXOffset; float mYOffset; float mXPrecision; diff --git a/include/input/InputApplication.h b/include/input/InputApplication.h new file mode 100644 index 0000000000..71a8f20468 --- /dev/null +++ b/include/input/InputApplication.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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 _UI_INPUT_APPLICATION_H +#define _UI_INPUT_APPLICATION_H + +#include <string> + +#include <binder/IBinder.h> +#include <binder/Parcel.h> + +#include <input/Input.h> +#include <utils/RefBase.h> +#include <utils/Timers.h> + +namespace android { + +/* + * Describes the properties of an application that can receive input. + */ +struct InputApplicationInfo { + sp<IBinder> token; + std::string name; + nsecs_t dispatchingTimeout; + + status_t write(Parcel& output) const; + static InputApplicationInfo read(const Parcel& from); +}; + + +/* + * Handle for an application that can receive input. + * + * Used by the native input dispatcher as a handle for the window manager objects + * that describe an application. + */ +class InputApplicationHandle : public RefBase { +public: + inline const InputApplicationInfo* getInfo() const { + return mInfo; + } + + inline std::string getName() const { + return mInfo ? mInfo->name : "<invalid>"; + } + + inline nsecs_t getDispatchingTimeout(nsecs_t defaultValue) const { + return mInfo ? mInfo->dispatchingTimeout : defaultValue; + } + + inline sp<IBinder> getApplicationToken() const { + return mInfo ? mInfo->token : nullptr; + } + + /** + * Requests that the state of this object be updated to reflect + * the most current available information about the application. + * + * This method should only be called from within the input dispatcher's + * critical section. + * + * Returns true on success, or false if the handle is no longer valid. + */ + virtual bool updateInfo() = 0; + + /** + * Releases the storage used by the associated information when it is + * no longer needed. + */ + void releaseInfo(); + +protected: + InputApplicationHandle(); + virtual ~InputApplicationHandle(); + + InputApplicationInfo* mInfo; +}; + +} // namespace android + +#endif // _UI_INPUT_APPLICATION_H diff --git a/include/input/InputDevice.h b/include/input/InputDevice.h index 1ea69d352d..34d164c280 100644 --- a/include/input/InputDevice.h +++ b/include/input/InputDevice.h @@ -31,9 +31,9 @@ struct InputDeviceIdentifier { } // Information provided by the kernel. - String8 name; - String8 location; - String8 uniqueId; + std::string name; + std::string location; + std::string uniqueId; uint16_t bus; uint16_t vendor; uint16_t product; @@ -45,7 +45,7 @@ struct InputDeviceIdentifier { // It is hashed from whatever kernel provided information is available. // Ideally, the way this value is computed should not change between Android releases // because that would invalidate persistent settings that rely on it. - String8 descriptor; + std::string descriptor; // A value added to uniquely identify a device in the absence of a unique id. This // is intended to be a minimum way to distinguish from other active devices and may @@ -73,16 +73,16 @@ public: }; void initialize(int32_t id, int32_t generation, int32_t controllerNumber, - const InputDeviceIdentifier& identifier, const String8& alias, bool isExternal, + const InputDeviceIdentifier& identifier, const std::string& alias, bool isExternal, bool hasMic); inline int32_t getId() const { return mId; } inline int32_t getControllerNumber() const { return mControllerNumber; } inline int32_t getGeneration() const { return mGeneration; } inline const InputDeviceIdentifier& getIdentifier() const { return mIdentifier; } - inline const String8& getAlias() const { return mAlias; } - inline const String8& getDisplayName() const { - return mAlias.isEmpty() ? mIdentifier.name : mAlias; + inline const std::string& getAlias() const { return mAlias; } + inline const std::string& getDisplayName() const { + return mAlias.empty() ? mIdentifier.name : mAlias; } inline bool isExternal() const { return mIsExternal; } inline bool hasMic() const { return mHasMic; } @@ -121,7 +121,7 @@ private: int32_t mGeneration; int32_t mControllerNumber; InputDeviceIdentifier mIdentifier; - String8 mAlias; + std::string mAlias; bool mIsExternal; bool mHasMic; uint32_t mSources; @@ -149,7 +149,7 @@ enum InputDeviceConfigurationFileType { * * Returns an empty string if not found. */ -extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier( +extern std::string getInputDeviceConfigurationFilePathByDeviceIdentifier( const InputDeviceIdentifier& deviceIdentifier, InputDeviceConfigurationFileType type); @@ -162,8 +162,8 @@ extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier( * * Returns an empty string if not found. */ -extern String8 getInputDeviceConfigurationFilePathByName( - const String8& name, InputDeviceConfigurationFileType type); +extern std::string getInputDeviceConfigurationFilePathByName( + const std::string& name, InputDeviceConfigurationFileType type); } // namespace android diff --git a/include/input/InputEventLabels.h b/include/input/InputEventLabels.h index 4b33a96adf..59d16d15af 100644 --- a/include/input/InputEventLabels.h +++ b/include/input/InputEventLabels.h @@ -325,8 +325,11 @@ static const InputEventLabel KEYCODES[] = { DEFINE_KEYCODE(SYSTEM_NAVIGATION_RIGHT), DEFINE_KEYCODE(ALL_APPS), DEFINE_KEYCODE(REFRESH), + DEFINE_KEYCODE(THUMBS_UP), + DEFINE_KEYCODE(THUMBS_DOWN), + DEFINE_KEYCODE(PROFILE_SWITCH), - { NULL, 0 } + { nullptr, 0 } }; static const InputEventLabel AXES[] = { @@ -375,7 +378,7 @@ static const InputEventLabel AXES[] = { // NOTE: If you add a new axis here you must also add it to several other files. // Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list. - { NULL, 0 } + { nullptr, 0 } }; static const InputEventLabel LEDS[] = { @@ -396,7 +399,7 @@ static const InputEventLabel LEDS[] = { DEFINE_LED(CONTROLLER_4), // NOTE: If you add new LEDs here, you must also add them to Input.h - { NULL, 0 } + { nullptr, 0 } }; static const InputEventLabel FLAGS[] = { @@ -404,7 +407,7 @@ static const InputEventLabel FLAGS[] = { DEFINE_FLAG(FUNCTION), DEFINE_FLAG(GESTURE), - { NULL, 0 } + { nullptr, 0 } }; static int lookupValueByLabel(const char* literal, const InputEventLabel *list) { @@ -424,7 +427,7 @@ static const char* lookupLabelByValue(int value, const InputEventLabel* list) { } list++; } - return NULL; + return nullptr; } static inline int32_t getKeyCodeByLabel(const char* label) { @@ -435,7 +438,7 @@ static inline const char* getLabelByKeyCode(int32_t keyCode) { if (keyCode >= 0 && keyCode < static_cast<int32_t>(size(KEYCODES))) { return KEYCODES[keyCode].literal; } - return NULL; + return nullptr; } static inline uint32_t getKeyFlagByLabel(const char* label) { diff --git a/include/input/InputTransport.h b/include/input/InputTransport.h index ecdc075ac8..63606e5911 100644 --- a/include/input/InputTransport.h +++ b/include/input/InputTransport.h @@ -17,6 +17,8 @@ #ifndef _LIBINPUT_INPUT_TRANSPORT_H #define _LIBINPUT_INPUT_TRANSPORT_H +#pragma GCC system_header + /** * Native input transport. * @@ -27,6 +29,9 @@ * The InputConsumer is used by the application to receive events from the input dispatcher. */ +#include <string> + +#include <binder/IBinder.h> #include <input/Input.h> #include <utils/Errors.h> #include <utils/Timers.h> @@ -35,6 +40,7 @@ #include <utils/BitSet.h> namespace android { +class Parcel; /* * Intermediate representation used to send input events and related signals. @@ -99,8 +105,9 @@ struct InputMessage { int32_t flags; int32_t metaState; int32_t buttonState; + MotionClassification classification; // base type: uint8_t + uint8_t empty2[3]; int32_t edgeFlags; - uint32_t empty2; nsecs_t downTime __attribute__((aligned(8))); float xOffset; float yOffset; @@ -154,6 +161,7 @@ protected: virtual ~InputChannel(); public: + InputChannel() = default; InputChannel(const std::string& name, int fd); /* Creates a pair of input channels. @@ -194,9 +202,19 @@ public: /* Returns a new object that has a duplicate of this channel's fd. */ sp<InputChannel> dup() const; + status_t write(Parcel& out) const; + status_t read(const Parcel& from); + + sp<IBinder> getToken() const; + void setToken(const sp<IBinder>& token); + private: + void setFd(int fd); + std::string mName; - int mFd; + int mFd = -1; + + sp<IBinder> mToken = nullptr; }; /* @@ -225,6 +243,7 @@ public: uint32_t seq, int32_t deviceId, int32_t source, + int32_t displayId, int32_t action, int32_t flags, int32_t keyCode, @@ -253,6 +272,7 @@ public: int32_t edgeFlags, int32_t metaState, int32_t buttonState, + MotionClassification classification, float xOffset, float yOffset, float xPrecision, @@ -318,7 +338,7 @@ public: * Other errors probably indicate that the channel is broken. */ status_t consume(InputEventFactoryInterface* factory, bool consumeBatches, - nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent, int32_t* displayId); + nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent); /* Sends a finished signal to the publisher to inform it that the message * with the specified sequence number has finished being process and whether @@ -473,10 +493,9 @@ private: Vector<SeqChain> mSeqChains; status_t consumeBatch(InputEventFactoryInterface* factory, - nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent, int32_t* displayId); + nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent); status_t consumeSamples(InputEventFactoryInterface* factory, - Batch& batch, size_t count, uint32_t* outSeq, InputEvent** outEvent, - int32_t* displayId); + Batch& batch, size_t count, uint32_t* outSeq, InputEvent** outEvent); void updateTouchState(InputMessage& msg); void resampleTouchState(nsecs_t frameTime, MotionEvent* event, diff --git a/include/input/InputWindow.h b/include/input/InputWindow.h new file mode 100644 index 0000000000..2b8cc57c05 --- /dev/null +++ b/include/input/InputWindow.h @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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 _UI_INPUT_WINDOW_H +#define _UI_INPUT_WINDOW_H + +#include <input/Input.h> +#include <input/InputTransport.h> +#include <ui/Rect.h> +#include <ui/Region.h> +#include <utils/RefBase.h> +#include <utils/Timers.h> + +#include "InputApplication.h" + +namespace android { +class Parcel; + +/* + * Describes the properties of a window that can receive input. + */ +struct InputWindowInfo { + InputWindowInfo() = default; + InputWindowInfo(const Parcel& from); + + // Window flags from WindowManager.LayoutParams + enum { + FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 0x00000001, + FLAG_DIM_BEHIND = 0x00000002, + FLAG_BLUR_BEHIND = 0x00000004, + FLAG_NOT_FOCUSABLE = 0x00000008, + FLAG_NOT_TOUCHABLE = 0x00000010, + FLAG_NOT_TOUCH_MODAL = 0x00000020, + FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040, + FLAG_KEEP_SCREEN_ON = 0x00000080, + FLAG_LAYOUT_IN_SCREEN = 0x00000100, + FLAG_LAYOUT_NO_LIMITS = 0x00000200, + FLAG_FULLSCREEN = 0x00000400, + FLAG_FORCE_NOT_FULLSCREEN = 0x00000800, + FLAG_DITHER = 0x00001000, + FLAG_SECURE = 0x00002000, + FLAG_SCALED = 0x00004000, + FLAG_IGNORE_CHEEK_PRESSES = 0x00008000, + FLAG_LAYOUT_INSET_DECOR = 0x00010000, + FLAG_ALT_FOCUSABLE_IM = 0x00020000, + FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000, + FLAG_SHOW_WHEN_LOCKED = 0x00080000, + FLAG_SHOW_WALLPAPER = 0x00100000, + FLAG_TURN_SCREEN_ON = 0x00200000, + FLAG_DISMISS_KEYGUARD = 0x00400000, + FLAG_SPLIT_TOUCH = 0x00800000, + FLAG_SLIPPERY = 0x20000000, + FLAG_NEEDS_MENU_KEY = 0x40000000, + }; + + // Window types from WindowManager.LayoutParams + enum { + FIRST_APPLICATION_WINDOW = 1, + TYPE_BASE_APPLICATION = 1, + TYPE_APPLICATION = 2, + TYPE_APPLICATION_STARTING = 3, + LAST_APPLICATION_WINDOW = 99, + FIRST_SUB_WINDOW = 1000, + TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW, + TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW+1, + TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW+2, + TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3, + TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW+4, + LAST_SUB_WINDOW = 1999, + FIRST_SYSTEM_WINDOW = 2000, + TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW, + TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1, + TYPE_PHONE = FIRST_SYSTEM_WINDOW+2, + TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3, + TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW+4, + TYPE_TOAST = FIRST_SYSTEM_WINDOW+5, + TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6, + TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW+7, + TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW+8, + TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW+9, + TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10, + TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW+11, + TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW+12, + TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW+13, + TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW+14, + TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+15, + TYPE_DRAG = FIRST_SYSTEM_WINDOW+16, + TYPE_STATUS_BAR_SUB_PANEL = FIRST_SYSTEM_WINDOW+17, + TYPE_POINTER = FIRST_SYSTEM_WINDOW+18, + TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW+19, + TYPE_VOLUME_OVERLAY = FIRST_SYSTEM_WINDOW+20, + TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW+21, + TYPE_INPUT_CONSUMER = FIRST_SYSTEM_WINDOW+22, + TYPE_NAVIGATION_BAR_PANEL = FIRST_SYSTEM_WINDOW+24, + TYPE_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW+27, + TYPE_ACCESSIBILITY_OVERLAY = FIRST_SYSTEM_WINDOW+32, + TYPE_DOCK_DIVIDER = FIRST_SYSTEM_WINDOW+34, + LAST_SYSTEM_WINDOW = 2999, + }; + + enum { + INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES = 0x00000001, + INPUT_FEATURE_NO_INPUT_CHANNEL = 0x00000002, + INPUT_FEATURE_DISABLE_USER_ACTIVITY = 0x00000004, + }; + + /* These values are filled in by the WM and passed through SurfaceFlinger + * unless specified otherwise. + */ + sp<IBinder> token; + std::string name; + int32_t layoutParamsFlags; + int32_t layoutParamsType; + nsecs_t dispatchingTimeout; + + /* These values are filled in by SurfaceFlinger. */ + int32_t frameLeft; + int32_t frameTop; + int32_t frameRight; + int32_t frameBottom; + + /* + * SurfaceFlinger consumes this value to shrink the computed frame. This is + * different from shrinking the touchable region in that it DOES shift the coordinate + * space where-as the touchable region does not and is more like "cropping". This + * is used for window shadows. + */ + int32_t surfaceInset = 0; + + // A global scaling factor for all windows. Unlike windowScaleX/Y this results + // in scaling of the TOUCH_MAJOR/TOUCH_MINOR axis. + float globalScaleFactor; + + // Scaling factors applied to individual windows. + float windowXScale = 1.0f; + float windowYScale = 1.0f; + + /* + * This is filled in by the WM relative to the frame and then translated + * to absolute coordinates by SurfaceFlinger once the frame is computed. + */ + Region touchableRegion; + bool visible; + bool canReceiveKeys; + bool hasFocus; + bool hasWallpaper; + bool paused; + int32_t layer; + int32_t ownerPid; + int32_t ownerUid; + int32_t inputFeatures; + int32_t displayId; + InputApplicationInfo applicationInfo; + + void addTouchableRegion(const Rect& region); + + bool touchableRegionContainsPoint(int32_t x, int32_t y) const; + bool frameContainsPoint(int32_t x, int32_t y) const; + + /* Returns true if the window is of a trusted type that is allowed to silently + * overlay other windows for the purpose of implementing the secure views feature. + * Trusted overlays, such as IME windows, can partly obscure other windows without causing + * motion events to be delivered to them with AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED. + */ + bool isTrustedOverlay() const; + + bool supportsSplitTouch() const; + + bool overlaps(const InputWindowInfo* other) const; + + status_t write(Parcel& output) const; + static InputWindowInfo read(const Parcel& from); +}; + + +/* + * Handle for a window that can receive input. + * + * Used by the native input dispatcher to indirectly refer to the window manager objects + * that describe a window. + */ +class InputWindowHandle : public RefBase { +public: + + inline const InputWindowInfo* getInfo() const { + return &mInfo; + } + + sp<IBinder> getToken() const; + + sp<IBinder> getApplicationToken() { + return mInfo.applicationInfo.token; + } + + inline std::string getName() const { + return mInfo.token ? mInfo.name : "<invalid>"; + } + + inline nsecs_t getDispatchingTimeout(nsecs_t defaultValue) const { + return mInfo.token ? mInfo.dispatchingTimeout : defaultValue; + } + + /** + * Requests that the state of this object be updated to reflect + * the most current available information about the application. + * + * This method should only be called from within the input dispatcher's + * critical section. + * + * Returns true on success, or false if the handle is no longer valid. + */ + virtual bool updateInfo() = 0; + + /** + * Updates from another input window handle. + */ + void updateFrom(const sp<InputWindowHandle> handle); + + /** + * Releases the channel used by the associated information when it is + * no longer needed. + */ + void releaseChannel(); + +protected: + explicit InputWindowHandle(); + virtual ~InputWindowHandle(); + + InputWindowInfo mInfo; +}; + +} // namespace android + +#endif // _UI_INPUT_WINDOW_H diff --git a/include/input/KeyCharacterMap.h b/include/input/KeyCharacterMap.h index 5e542b87ec..a1a32a63de 100644 --- a/include/input/KeyCharacterMap.h +++ b/include/input/KeyCharacterMap.h @@ -27,7 +27,6 @@ #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/Tokenizer.h> -#include <utils/String8.h> #include <utils/Unicode.h> #include <utils/RefBase.h> @@ -75,10 +74,10 @@ public: }; /* Loads a key character map from a file. */ - static status_t load(const String8& filename, Format format, sp<KeyCharacterMap>* outMap); + static status_t load(const std::string& filename, Format format, sp<KeyCharacterMap>* outMap); /* Loads a key character map from its string contents. */ - static status_t loadContents(const String8& filename, + static status_t loadContents(const std::string& filename, const char* contents, Format format, sp<KeyCharacterMap>* outMap); /* Combines a base key character map and an overlay. */ @@ -221,7 +220,7 @@ private: status_t parseKey(); status_t parseKeyProperty(); status_t finishKey(Key* key); - status_t parseModifier(const String8& token, int32_t* outMetaState); + status_t parseModifier(const std::string& token, int32_t* outMetaState); status_t parseCharacterLiteral(char16_t* outCharacter); }; diff --git a/include/input/KeyLayoutMap.h b/include/input/KeyLayoutMap.h index 1e8de7173b..73815fe8b4 100644 --- a/include/input/KeyLayoutMap.h +++ b/include/input/KeyLayoutMap.h @@ -62,7 +62,7 @@ struct AxisInfo { */ class KeyLayoutMap : public RefBase { public: - static status_t load(const String8& filename, sp<KeyLayoutMap>* outMap); + static status_t load(const std::string& filename, sp<KeyLayoutMap>* outMap); status_t mapKey(int32_t scanCode, int32_t usageCode, int32_t* outKeyCode, uint32_t* outFlags) const; diff --git a/include/input/Keyboard.h b/include/input/Keyboard.h index d4903e98df..8b66f693cc 100644 --- a/include/input/Keyboard.h +++ b/include/input/Keyboard.h @@ -21,7 +21,6 @@ #include <input/InputDevice.h> #include <input/InputEventLabels.h> #include <utils/Errors.h> -#include <utils/String8.h> #include <utils/PropertyMap.h> namespace android { @@ -43,10 +42,10 @@ class KeyCharacterMap; */ class KeyMap { public: - String8 keyLayoutFile; + std::string keyLayoutFile; sp<KeyLayoutMap> keyLayoutMap; - String8 keyCharacterMapFile; + std::string keyCharacterMapFile; sp<KeyCharacterMap> keyCharacterMap; KeyMap(); @@ -56,11 +55,11 @@ public: const PropertyMap* deviceConfiguration); inline bool haveKeyLayout() const { - return !keyLayoutFile.isEmpty(); + return !keyLayoutFile.empty(); } inline bool haveKeyCharacterMap() const { - return !keyCharacterMapFile.isEmpty(); + return !keyCharacterMapFile.empty(); } inline bool isComplete() const { @@ -68,12 +67,12 @@ public: } private: - bool probeKeyMap(const InputDeviceIdentifier& deviceIdentifier, const String8& name); - status_t loadKeyLayout(const InputDeviceIdentifier& deviceIdentifier, const String8& name); + bool probeKeyMap(const InputDeviceIdentifier& deviceIdentifier, const std::string& name); + status_t loadKeyLayout(const InputDeviceIdentifier& deviceIdentifier, const std::string& name); status_t loadKeyCharacterMap(const InputDeviceIdentifier& deviceIdentifier, - const String8& name); - String8 getPath(const InputDeviceIdentifier& deviceIdentifier, - const String8& name, InputDeviceConfigurationFileType type); + const std::string& name); + std::string getPath(const InputDeviceIdentifier& deviceIdentifier, + const std::string& name, InputDeviceConfigurationFileType type); }; /** diff --git a/include/input/TouchVideoFrame.h b/include/input/TouchVideoFrame.h new file mode 100644 index 0000000000..d68f27431a --- /dev/null +++ b/include/input/TouchVideoFrame.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * 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 _LIBINPUT_TOUCHVIDEOFRAME_H +#define _LIBINPUT_TOUCHVIDEOFRAME_H + +#include <stdint.h> +#include <sys/time.h> +#include <vector> + +namespace android { + +/** + * Represents data from a single scan of the touchscreen device. + * Similar in concept to a video frame, but the touch strength is used as + * the values instead. + */ +class TouchVideoFrame { +public: + TouchVideoFrame(uint32_t width, uint32_t height, std::vector<int16_t> data, + const struct timeval& timestamp) : + mWidth(width), mHeight(height), mData(std::move(data)), mTimestamp(timestamp) { + } + + /** + * Width of the frame + */ + uint32_t getWidth() const { return mWidth; } + /** + * Height of the frame + */ + uint32_t getHeight() const { return mHeight; } + /** + * The touch strength data. + * The array is a 2-D row-major matrix, with dimensions (height, width). + * Total size of the array should equal getHeight() * getWidth(). + * Data is allowed to be negative. + */ + const std::vector<int16_t>& getData() const { return mData; } + /** + * Time at which the heatmap was taken. + */ + const struct timeval& getTimestamp() const { return mTimestamp; } + +private: + uint32_t mWidth; + uint32_t mHeight; + std::vector<int16_t> mData; + struct timeval mTimestamp; +}; + +} // namespace android + +#endif // _LIBINPUT_TOUCHVIDEOFRAME_H diff --git a/include/input/VelocityTracker.h b/include/input/VelocityTracker.h index ffa1614b55..727865a933 100644 --- a/include/input/VelocityTracker.h +++ b/include/input/VelocityTracker.h @@ -63,7 +63,7 @@ public: // Creates a velocity tracker using the specified strategy. // If strategy is NULL, uses the default strategy for the platform. - VelocityTracker(const char* strategy = NULL); + VelocityTracker(const char* strategy = nullptr); ~VelocityTracker(); diff --git a/include/input/VirtualKeyMap.h b/include/input/VirtualKeyMap.h index e245ead682..24e0e0ed9e 100644 --- a/include/input/VirtualKeyMap.h +++ b/include/input/VirtualKeyMap.h @@ -23,7 +23,6 @@ #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/Tokenizer.h> -#include <utils/String8.h> #include <utils/Unicode.h> namespace android { @@ -50,7 +49,7 @@ class VirtualKeyMap { public: ~VirtualKeyMap(); - static status_t load(const String8& filename, VirtualKeyMap** outMap); + static status_t load(const std::string& filename, VirtualKeyMap** outMap); inline const Vector<VirtualKeyDefinition>& getVirtualKeys() const { return mVirtualKeys; |