Merge changes from topics "cursor_type_hotspot", "set_viewport_in_input_reader" am: 43beafe0b0

Change-Id: Ib3930377b494bf7bafce339165dff428a30563b6
This commit is contained in:
Treehugger Robot 2020-05-29 21:57:19 +00:00 committed by Automerger Merge Worker
commit 036b105b6e
7 changed files with 80 additions and 15 deletions

View file

@ -99,6 +99,16 @@ std::optional<DisplayViewport> InputReaderConfiguration::getDisplayViewportByPor
return std::nullopt;
}
std::optional<DisplayViewport> InputReaderConfiguration::getDisplayViewportById(
int32_t displayId) const {
for (const DisplayViewport& currentViewport : mDisplays) {
if (currentViewport.displayId == displayId) {
return std::make_optional(currentViewport);
}
}
return std::nullopt;
}
void InputReaderConfiguration::setDisplayViewports(const std::vector<DisplayViewport>& viewports) {
mDisplays = viewports;
}
@ -125,4 +135,4 @@ void TouchAffineTransformation::applyTo(float& x, float& y) const {
y = newY;
}
} // namespace android
} // namespace android

View file

@ -172,6 +172,9 @@ struct InputReaderConfiguration {
// Used to determine which DisplayViewport should be tied to which InputDevice.
std::unordered_map<std::string, uint8_t> portAssociations;
// The suggested display ID to show the cursor.
int32_t defaultPointerDisplayId;
// Velocity control parameters for mouse pointer movements.
VelocityControlParameters pointerVelocityControlParameters;
@ -274,6 +277,7 @@ struct InputReaderConfiguration {
std::optional<DisplayViewport> getDisplayViewportByUniqueId(const std::string& uniqueDisplayId)
const;
std::optional<DisplayViewport> getDisplayViewportByPort(uint8_t physicalPort) const;
std::optional<DisplayViewport> getDisplayViewportById(int32_t displayId) const;
void setDisplayViewports(const std::vector<DisplayViewport>& viewports);
@ -349,4 +353,4 @@ public:
} // namespace android
#endif // _UI_INPUT_READER_COMMON_H
#endif // _UI_INPUT_READER_COMMON_H

View file

@ -17,6 +17,7 @@
#ifndef _INPUTFLINGER_POINTER_CONTROLLER_INTERFACE_H
#define _INPUTFLINGER_POINTER_CONTROLLER_INTERFACE_H
#include <input/DisplayViewport.h>
#include <input/Input.h>
#include <utils/BitSet.h>
#include <utils/RefBase.h>
@ -101,6 +102,9 @@ public:
/* Gets the id of the display where the pointer should be shown. */
virtual int32_t getDisplayId() const = 0;
/* Sets the associated display of this pointer. Pointer should show on that display. */
virtual void setDisplayViewport(const DisplayViewport& displayViewport) = 0;
};
} // namespace android

View file

@ -189,12 +189,32 @@ void CursorInputMapper::configure(nsecs_t when, const InputReaderConfiguration*
// Update the PointerController if viewports changed.
if (mParameters.mode == Parameters::MODE_POINTER) {
getPolicy()->obtainPointerController(getDeviceId());
updatePointerControllerDisplayViewport(*config);
}
bumpGeneration();
}
}
void CursorInputMapper::updatePointerControllerDisplayViewport(
const InputReaderConfiguration& config) {
std::optional<DisplayViewport> viewport =
config.getDisplayViewportById(config.defaultPointerDisplayId);
if (!viewport) {
ALOGW("Can't find the designated viewport with ID %" PRId32 " to update cursor input "
"mapper. Fall back to default display",
config.defaultPointerDisplayId);
viewport = config.getDisplayViewportById(ADISPLAY_ID_DEFAULT);
}
if (!viewport) {
ALOGE("Still can't find a viable viewport to update cursor input mapper. Skip setting it to"
" PointerController.");
return;
}
mPointerController->setDisplayViewport(*viewport);
}
void CursorInputMapper::configureParameters() {
mParameters.mode = Parameters::MODE_POINTER;
String8 cursorModeString;

View file

@ -116,8 +116,9 @@ private:
void dumpParameters(std::string& dump);
void sync(nsecs_t when);
void updatePointerControllerDisplayViewport(const InputReaderConfiguration& config);
};
} // namespace android
#endif // _UI_INPUTREADER_CURSOR_INPUT_MAPPER_H
#endif // _UI_INPUTREADER_CURSOR_INPUT_MAPPER_H

View file

@ -557,9 +557,10 @@ bool TouchInputMapper::hasExternalStylus() const {
* Determine which DisplayViewport to use.
* 1. If display port is specified, return the matching viewport. If matching viewport not
* found, then return.
* 2. If a device has associated display, get the matching viewport by either unique id or by
* 2. Always use the suggested viewport from WindowManagerService for pointers.
* 3. If a device has associated display, get the matching viewport by either unique id or by
* the display type (internal or external).
* 3. Otherwise, use a non-display viewport.
* 4. Otherwise, use a non-display viewport.
*/
std::optional<DisplayViewport> TouchInputMapper::findViewport() {
if (mParameters.hasAssociatedDisplay) {
@ -575,6 +576,18 @@ std::optional<DisplayViewport> TouchInputMapper::findViewport() {
return v;
}
if (mDeviceMode == DEVICE_MODE_POINTER) {
std::optional<DisplayViewport> viewport =
mConfig.getDisplayViewportById(mConfig.defaultPointerDisplayId);
if (viewport) {
return viewport;
} else {
ALOGW("Can't find designated display viewport with ID %" PRId32 " for pointers.",
mConfig.defaultPointerDisplayId);
}
}
// Check if uniqueDisplayId is specified in idc file.
if (!mParameters.uniqueDisplayId.empty()) {
return mConfig.getDisplayViewportByUniqueId(mParameters.uniqueDisplayId);
}
@ -758,6 +771,7 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) {
(mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) {
if (mPointerController == nullptr || viewportChanged) {
mPointerController = getPolicy()->obtainPointerController(getDeviceId());
mPointerController->setDisplayViewport(mViewport);
}
} else {
mPointerController.clear();

View file

@ -85,10 +85,6 @@ public:
mMaxY = maxY;
}
void setDisplayId(int32_t displayId) {
mDisplayId = displayId;
}
virtual void setPosition(float x, float y) {
mX = x;
mY = y;
@ -111,6 +107,10 @@ public:
return mDisplayId;
}
virtual void setDisplayViewport(const DisplayViewport& viewport) {
mDisplayId = viewport.displayId;
}
const std::map<int32_t, std::vector<int32_t>>& getSpots() {
return mSpotsByDisplay;
}
@ -255,6 +255,10 @@ public:
mConfig.showTouches = enabled;
}
void setDefaultPointerDisplayId(int32_t pointerDisplayId) {
mConfig.defaultPointerDisplayId = pointerDisplayId;
}
private:
DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height,
int32_t orientation, const std::string& uniqueId, std::optional<uint8_t> physicalPort,
@ -3159,12 +3163,18 @@ TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) {
CursorInputMapper* mapper = new CursorInputMapper(mDevice);
addMapperAndConfigure(mapper);
// Setup PointerController for second display.
// Setup for second display.
constexpr int32_t SECOND_DISPLAY_ID = 1;
const std::string SECOND_DISPLAY_UNIQUE_ID = "local:1";
mFakePolicy->addDisplayViewport(SECOND_DISPLAY_ID, 800, 480, DISPLAY_ORIENTATION_0,
SECOND_DISPLAY_UNIQUE_ID, NO_PORT,
ViewportType::VIEWPORT_EXTERNAL);
mFakePolicy->setDefaultPointerDisplayId(SECOND_DISPLAY_ID);
configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
mFakePointerController->setPosition(100, 200);
mFakePointerController->setButtonState(0);
mFakePointerController->setDisplayId(SECOND_DISPLAY_ID);
NotifyMotionArgs args;
process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
@ -6329,14 +6339,16 @@ TEST_F(MultiTouchInputMapperTest, Viewports_Fallback) {
}
TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) {
// Setup PointerController for second display.
// Setup for second display.
sp<FakePointerController> fakePointerController = new FakePointerController();
fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
fakePointerController->setBounds(0, 0, DISPLAY_WIDTH - 1, DISPLAY_HEIGHT - 1);
fakePointerController->setPosition(100, 200);
fakePointerController->setButtonState(0);
fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID);
mFakePolicy->setPointerController(mDevice->getId(), fakePointerController);
mFakePolicy->setDefaultPointerDisplayId(SECONDARY_DISPLAY_ID);
prepareSecondaryDisplay(ViewportType::VIEWPORT_EXTERNAL);
MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
prepareDisplay(DISPLAY_ORIENTATION_0);
prepareAxes(POSITION);