1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "SingleTouchInputMapper.h"
18 
19 namespace android {
20 
SingleTouchInputMapper(InputDeviceContext & deviceContext,const InputReaderConfiguration & readerConfig)21 SingleTouchInputMapper::SingleTouchInputMapper(InputDeviceContext& deviceContext,
22                                                const InputReaderConfiguration& readerConfig)
23       : TouchInputMapper(deviceContext, readerConfig) {}
24 
~SingleTouchInputMapper()25 SingleTouchInputMapper::~SingleTouchInputMapper() {}
26 
reset(nsecs_t when)27 std::list<NotifyArgs> SingleTouchInputMapper::reset(nsecs_t when) {
28     mSingleTouchMotionAccumulator.reset(getDeviceContext());
29 
30     return TouchInputMapper::reset(when);
31 }
32 
process(const RawEvent & rawEvent)33 std::list<NotifyArgs> SingleTouchInputMapper::process(const RawEvent& rawEvent) {
34     std::list<NotifyArgs> out = TouchInputMapper::process(rawEvent);
35 
36     mSingleTouchMotionAccumulator.process(rawEvent);
37     return out;
38 }
39 
syncTouch(nsecs_t when,RawState * outState)40 void SingleTouchInputMapper::syncTouch(nsecs_t when, RawState* outState) {
41     if (mTouchButtonAccumulator.isToolActive()) {
42         outState->rawPointerData.pointerCount = 1;
43         outState->rawPointerData.idToIndex[0] = 0;
44 
45         bool isHovering = mTouchButtonAccumulator.getToolType() != ToolType::MOUSE &&
46                 (mTouchButtonAccumulator.isHovering() ||
47                  (mRawPointerAxes.pressure.valid &&
48                   mSingleTouchMotionAccumulator.getAbsolutePressure() <= 0));
49         outState->rawPointerData.markIdBit(0, isHovering);
50 
51         RawPointerData::Pointer& outPointer = outState->rawPointerData.pointers[0];
52         outPointer.id = 0;
53         outPointer.x = mSingleTouchMotionAccumulator.getAbsoluteX();
54         outPointer.y = mSingleTouchMotionAccumulator.getAbsoluteY();
55         outPointer.pressure = mSingleTouchMotionAccumulator.getAbsolutePressure();
56         outPointer.touchMajor = 0;
57         outPointer.touchMinor = 0;
58         outPointer.toolMajor = mSingleTouchMotionAccumulator.getAbsoluteToolWidth();
59         outPointer.toolMinor = mSingleTouchMotionAccumulator.getAbsoluteToolWidth();
60         outPointer.orientation = 0;
61         outPointer.distance = mSingleTouchMotionAccumulator.getAbsoluteDistance();
62         outPointer.tiltX = mSingleTouchMotionAccumulator.getAbsoluteTiltX();
63         outPointer.tiltY = mSingleTouchMotionAccumulator.getAbsoluteTiltY();
64         outPointer.toolType = mTouchButtonAccumulator.getToolType();
65         if (outPointer.toolType == ToolType::UNKNOWN) {
66             outPointer.toolType = ToolType::FINGER;
67         }
68         outPointer.isHovering = isHovering;
69     }
70 }
71 
configureRawPointerAxes()72 void SingleTouchInputMapper::configureRawPointerAxes() {
73     TouchInputMapper::configureRawPointerAxes();
74 
75     getAbsoluteAxisInfo(ABS_X, &mRawPointerAxes.x);
76     getAbsoluteAxisInfo(ABS_Y, &mRawPointerAxes.y);
77     getAbsoluteAxisInfo(ABS_PRESSURE, &mRawPointerAxes.pressure);
78     getAbsoluteAxisInfo(ABS_TOOL_WIDTH, &mRawPointerAxes.toolMajor);
79     getAbsoluteAxisInfo(ABS_DISTANCE, &mRawPointerAxes.distance);
80     getAbsoluteAxisInfo(ABS_TILT_X, &mRawPointerAxes.tiltX);
81     getAbsoluteAxisInfo(ABS_TILT_Y, &mRawPointerAxes.tiltY);
82 }
83 
hasStylus() const84 bool SingleTouchInputMapper::hasStylus() const {
85     return mTouchButtonAccumulator.hasStylus();
86 }
87 
88 } // namespace android
89