xref: /aosp_15_r20/frameworks/base/libs/input/PointerController.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #ifndef _UI_POINTER_CONTROLLER_H
18*d57664e9SAndroid Build Coastguard Worker #define _UI_POINTER_CONTROLLER_H
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <PointerControllerInterface.h>
21*d57664e9SAndroid Build Coastguard Worker #include <gui/DisplayEventReceiver.h>
22*d57664e9SAndroid Build Coastguard Worker #include <gui/WindowInfosUpdate.h>
23*d57664e9SAndroid Build Coastguard Worker #include <input/DisplayViewport.h>
24*d57664e9SAndroid Build Coastguard Worker #include <input/Input.h>
25*d57664e9SAndroid Build Coastguard Worker #include <utils/BitSet.h>
26*d57664e9SAndroid Build Coastguard Worker #include <utils/Looper.h>
27*d57664e9SAndroid Build Coastguard Worker #include <utils/RefBase.h>
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker #include <map>
30*d57664e9SAndroid Build Coastguard Worker #include <memory>
31*d57664e9SAndroid Build Coastguard Worker #include <string>
32*d57664e9SAndroid Build Coastguard Worker #include <vector>
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker #include "MouseCursorController.h"
35*d57664e9SAndroid Build Coastguard Worker #include "PointerControllerContext.h"
36*d57664e9SAndroid Build Coastguard Worker #include "SpriteController.h"
37*d57664e9SAndroid Build Coastguard Worker #include "TouchSpotController.h"
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker namespace android {
40*d57664e9SAndroid Build Coastguard Worker 
41*d57664e9SAndroid Build Coastguard Worker /*
42*d57664e9SAndroid Build Coastguard Worker  * Tracks pointer movements and draws the pointer sprite to a surface.
43*d57664e9SAndroid Build Coastguard Worker  *
44*d57664e9SAndroid Build Coastguard Worker  * Handles pointer acceleration and animation.
45*d57664e9SAndroid Build Coastguard Worker  */
46*d57664e9SAndroid Build Coastguard Worker class PointerController : public PointerControllerInterface {
47*d57664e9SAndroid Build Coastguard Worker public:
48*d57664e9SAndroid Build Coastguard Worker     static std::shared_ptr<PointerController> create(
49*d57664e9SAndroid Build Coastguard Worker             const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper,
50*d57664e9SAndroid Build Coastguard Worker             SpriteController& spriteController, ControllerType type);
51*d57664e9SAndroid Build Coastguard Worker 
52*d57664e9SAndroid Build Coastguard Worker     ~PointerController() override;
53*d57664e9SAndroid Build Coastguard Worker 
54*d57664e9SAndroid Build Coastguard Worker     vec2 move(float deltaX, float deltaY) override;
55*d57664e9SAndroid Build Coastguard Worker     void setPosition(float x, float y) override;
56*d57664e9SAndroid Build Coastguard Worker     vec2 getPosition() const override;
57*d57664e9SAndroid Build Coastguard Worker     ui::LogicalDisplayId getDisplayId() const override;
58*d57664e9SAndroid Build Coastguard Worker     void fade(Transition transition) override;
59*d57664e9SAndroid Build Coastguard Worker     void unfade(Transition transition) override;
60*d57664e9SAndroid Build Coastguard Worker     void setDisplayViewport(const DisplayViewport& viewport) override;
61*d57664e9SAndroid Build Coastguard Worker 
62*d57664e9SAndroid Build Coastguard Worker     void setPresentation(Presentation presentation) override;
63*d57664e9SAndroid Build Coastguard Worker     void setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex,
64*d57664e9SAndroid Build Coastguard Worker                   BitSet32 spotIdBits, ui::LogicalDisplayId displayId) override;
65*d57664e9SAndroid Build Coastguard Worker     void clearSpots() override;
66*d57664e9SAndroid Build Coastguard Worker     void updatePointerIcon(PointerIconStyle iconId) override;
67*d57664e9SAndroid Build Coastguard Worker     void setCustomPointerIcon(const SpriteIcon& icon) override;
68*d57664e9SAndroid Build Coastguard Worker     void setSkipScreenshotFlagForDisplay(ui::LogicalDisplayId displayId) override;
69*d57664e9SAndroid Build Coastguard Worker     void clearSkipScreenshotFlags() override;
70*d57664e9SAndroid Build Coastguard Worker     ui::Transform getDisplayTransform() const override;
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker     virtual void setInactivityTimeout(InactivityTimeout inactivityTimeout);
73*d57664e9SAndroid Build Coastguard Worker     void doInactivityTimeout();
74*d57664e9SAndroid Build Coastguard Worker     void reloadPointerResources();
75*d57664e9SAndroid Build Coastguard Worker     void onDisplayViewportsUpdated(const std::vector<DisplayViewport>& viewports);
76*d57664e9SAndroid Build Coastguard Worker 
77*d57664e9SAndroid Build Coastguard Worker     void onDisplayInfosChangedLocked(const std::vector<gui::DisplayInfo>& displayInfos)
78*d57664e9SAndroid Build Coastguard Worker             REQUIRES(getLock());
79*d57664e9SAndroid Build Coastguard Worker 
80*d57664e9SAndroid Build Coastguard Worker     std::string dump() override;
81*d57664e9SAndroid Build Coastguard Worker 
82*d57664e9SAndroid Build Coastguard Worker protected:
83*d57664e9SAndroid Build Coastguard Worker     using WindowListenerRegisterConsumer = std::function<std::vector<gui::DisplayInfo>(
84*d57664e9SAndroid Build Coastguard Worker             const sp<android::gui::WindowInfosListener>&)>;
85*d57664e9SAndroid Build Coastguard Worker     using WindowListenerUnregisterConsumer =
86*d57664e9SAndroid Build Coastguard Worker             std::function<void(const sp<android::gui::WindowInfosListener>&)>;
87*d57664e9SAndroid Build Coastguard Worker 
88*d57664e9SAndroid Build Coastguard Worker     // Constructor used to test WindowInfosListener registration.
89*d57664e9SAndroid Build Coastguard Worker     PointerController(const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper,
90*d57664e9SAndroid Build Coastguard Worker                       SpriteController& spriteController,
91*d57664e9SAndroid Build Coastguard Worker                       const WindowListenerRegisterConsumer& registerListener,
92*d57664e9SAndroid Build Coastguard Worker                       WindowListenerUnregisterConsumer unregisterListener);
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker     PointerController(const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper,
95*d57664e9SAndroid Build Coastguard Worker                       SpriteController& spriteController);
96*d57664e9SAndroid Build Coastguard Worker 
97*d57664e9SAndroid Build Coastguard Worker private:
98*d57664e9SAndroid Build Coastguard Worker     friend PointerControllerContext::LooperCallback;
99*d57664e9SAndroid Build Coastguard Worker     friend PointerControllerContext::MessageHandler;
100*d57664e9SAndroid Build Coastguard Worker 
101*d57664e9SAndroid Build Coastguard Worker     // PointerController's DisplayInfoListener can outlive the PointerController because when the
102*d57664e9SAndroid Build Coastguard Worker     // listener is registered, a strong pointer to the listener (which can extend its lifecycle)
103*d57664e9SAndroid Build Coastguard Worker     // is given away. To avoid the small overhead of using two separate locks in these two objects,
104*d57664e9SAndroid Build Coastguard Worker     // we use the DisplayInfoListener's lock in PointerController.
105*d57664e9SAndroid Build Coastguard Worker     std::mutex& getLock() const;
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker     PointerControllerContext mContext;
108*d57664e9SAndroid Build Coastguard Worker 
109*d57664e9SAndroid Build Coastguard Worker     MouseCursorController mCursorController;
110*d57664e9SAndroid Build Coastguard Worker 
111*d57664e9SAndroid Build Coastguard Worker     struct Locked {
112*d57664e9SAndroid Build Coastguard Worker         Presentation presentation;
113*d57664e9SAndroid Build Coastguard Worker         ui::LogicalDisplayId pointerDisplayId = ui::LogicalDisplayId::INVALID;
114*d57664e9SAndroid Build Coastguard Worker 
115*d57664e9SAndroid Build Coastguard Worker         std::vector<gui::DisplayInfo> mDisplayInfos;
116*d57664e9SAndroid Build Coastguard Worker         std::unordered_map<ui::LogicalDisplayId, TouchSpotController> spotControllers;
117*d57664e9SAndroid Build Coastguard Worker         std::unordered_set<ui::LogicalDisplayId> displaysToSkipScreenshot;
118*d57664e9SAndroid Build Coastguard Worker     } mLocked GUARDED_BY(getLock());
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker     class DisplayInfoListener : public gui::WindowInfosListener {
121*d57664e9SAndroid Build Coastguard Worker     public:
DisplayInfoListener(PointerController * pc)122*d57664e9SAndroid Build Coastguard Worker         explicit DisplayInfoListener(PointerController* pc) : mPointerController(pc){};
123*d57664e9SAndroid Build Coastguard Worker         void onWindowInfosChanged(const gui::WindowInfosUpdate&) override;
124*d57664e9SAndroid Build Coastguard Worker         void onPointerControllerDestroyed();
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker         // This lock is also used by PointerController. See PointerController::getLock().
127*d57664e9SAndroid Build Coastguard Worker         std::mutex mLock;
128*d57664e9SAndroid Build Coastguard Worker 
129*d57664e9SAndroid Build Coastguard Worker     private:
130*d57664e9SAndroid Build Coastguard Worker         PointerController* mPointerController GUARDED_BY(mLock);
131*d57664e9SAndroid Build Coastguard Worker     };
132*d57664e9SAndroid Build Coastguard Worker 
133*d57664e9SAndroid Build Coastguard Worker     sp<DisplayInfoListener> mDisplayInfoListener;
134*d57664e9SAndroid Build Coastguard Worker     const WindowListenerUnregisterConsumer mUnregisterWindowInfosListener;
135*d57664e9SAndroid Build Coastguard Worker 
136*d57664e9SAndroid Build Coastguard Worker     const ui::Transform& getTransformForDisplayLocked(ui::LogicalDisplayId displayId) const
137*d57664e9SAndroid Build Coastguard Worker             REQUIRES(getLock());
138*d57664e9SAndroid Build Coastguard Worker 
139*d57664e9SAndroid Build Coastguard Worker     void clearSpotsLocked() REQUIRES(getLock());
140*d57664e9SAndroid Build Coastguard Worker };
141*d57664e9SAndroid Build Coastguard Worker 
142*d57664e9SAndroid Build Coastguard Worker class MousePointerController : public PointerController {
143*d57664e9SAndroid Build Coastguard Worker public:
144*d57664e9SAndroid Build Coastguard Worker     /** A version of PointerController that controls one mouse pointer. */
145*d57664e9SAndroid Build Coastguard Worker     MousePointerController(const sp<PointerControllerPolicyInterface>& policy,
146*d57664e9SAndroid Build Coastguard Worker                            const sp<Looper>& looper, SpriteController& spriteController);
147*d57664e9SAndroid Build Coastguard Worker 
148*d57664e9SAndroid Build Coastguard Worker     ~MousePointerController() override;
149*d57664e9SAndroid Build Coastguard Worker 
setPresentation(Presentation)150*d57664e9SAndroid Build Coastguard Worker     void setPresentation(Presentation) override {
151*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
152*d57664e9SAndroid Build Coastguard Worker     }
setSpots(const PointerCoords *,const uint32_t *,BitSet32,ui::LogicalDisplayId)153*d57664e9SAndroid Build Coastguard Worker     void setSpots(const PointerCoords*, const uint32_t*, BitSet32, ui::LogicalDisplayId) override {
154*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
155*d57664e9SAndroid Build Coastguard Worker     }
clearSpots()156*d57664e9SAndroid Build Coastguard Worker     void clearSpots() override {
157*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
158*d57664e9SAndroid Build Coastguard Worker     }
159*d57664e9SAndroid Build Coastguard Worker };
160*d57664e9SAndroid Build Coastguard Worker 
161*d57664e9SAndroid Build Coastguard Worker class TouchPointerController : public PointerController {
162*d57664e9SAndroid Build Coastguard Worker public:
163*d57664e9SAndroid Build Coastguard Worker     /** A version of PointerController that controls touch spots. */
164*d57664e9SAndroid Build Coastguard Worker     TouchPointerController(const sp<PointerControllerPolicyInterface>& policy,
165*d57664e9SAndroid Build Coastguard Worker                            const sp<Looper>& looper, SpriteController& spriteController);
166*d57664e9SAndroid Build Coastguard Worker 
167*d57664e9SAndroid Build Coastguard Worker     ~TouchPointerController() override;
168*d57664e9SAndroid Build Coastguard Worker 
move(float,float)169*d57664e9SAndroid Build Coastguard Worker     vec2 move(float, float) override {
170*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
171*d57664e9SAndroid Build Coastguard Worker     }
setPosition(float,float)172*d57664e9SAndroid Build Coastguard Worker     void setPosition(float, float) override {
173*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
174*d57664e9SAndroid Build Coastguard Worker     }
getPosition()175*d57664e9SAndroid Build Coastguard Worker     vec2 getPosition() const override {
176*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
177*d57664e9SAndroid Build Coastguard Worker     }
getDisplayId()178*d57664e9SAndroid Build Coastguard Worker     ui::LogicalDisplayId getDisplayId() const override {
179*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
180*d57664e9SAndroid Build Coastguard Worker     }
fade(Transition)181*d57664e9SAndroid Build Coastguard Worker     void fade(Transition) override {
182*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
183*d57664e9SAndroid Build Coastguard Worker     }
unfade(Transition)184*d57664e9SAndroid Build Coastguard Worker     void unfade(Transition) override {
185*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
186*d57664e9SAndroid Build Coastguard Worker     }
setDisplayViewport(const DisplayViewport &)187*d57664e9SAndroid Build Coastguard Worker     void setDisplayViewport(const DisplayViewport&) override {
188*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
189*d57664e9SAndroid Build Coastguard Worker     }
setPresentation(Presentation)190*d57664e9SAndroid Build Coastguard Worker     void setPresentation(Presentation) override {
191*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
192*d57664e9SAndroid Build Coastguard Worker     }
updatePointerIcon(PointerIconStyle)193*d57664e9SAndroid Build Coastguard Worker     void updatePointerIcon(PointerIconStyle) override {
194*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
195*d57664e9SAndroid Build Coastguard Worker     }
setCustomPointerIcon(const SpriteIcon &)196*d57664e9SAndroid Build Coastguard Worker     void setCustomPointerIcon(const SpriteIcon&) override {
197*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
198*d57664e9SAndroid Build Coastguard Worker     }
199*d57664e9SAndroid Build Coastguard Worker     // fade() should not be called by inactivity timeout. Do nothing.
setInactivityTimeout(InactivityTimeout)200*d57664e9SAndroid Build Coastguard Worker     void setInactivityTimeout(InactivityTimeout) override {}
201*d57664e9SAndroid Build Coastguard Worker };
202*d57664e9SAndroid Build Coastguard Worker 
203*d57664e9SAndroid Build Coastguard Worker class StylusPointerController : public PointerController {
204*d57664e9SAndroid Build Coastguard Worker public:
205*d57664e9SAndroid Build Coastguard Worker     /** A version of PointerController that controls one stylus pointer. */
206*d57664e9SAndroid Build Coastguard Worker     StylusPointerController(const sp<PointerControllerPolicyInterface>& policy,
207*d57664e9SAndroid Build Coastguard Worker                             const sp<Looper>& looper, SpriteController& spriteController);
208*d57664e9SAndroid Build Coastguard Worker 
209*d57664e9SAndroid Build Coastguard Worker     ~StylusPointerController() override;
210*d57664e9SAndroid Build Coastguard Worker 
setPresentation(Presentation)211*d57664e9SAndroid Build Coastguard Worker     void setPresentation(Presentation) override {
212*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
213*d57664e9SAndroid Build Coastguard Worker     }
setSpots(const PointerCoords *,const uint32_t *,BitSet32,ui::LogicalDisplayId)214*d57664e9SAndroid Build Coastguard Worker     void setSpots(const PointerCoords*, const uint32_t*, BitSet32, ui::LogicalDisplayId) override {
215*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
216*d57664e9SAndroid Build Coastguard Worker     }
clearSpots()217*d57664e9SAndroid Build Coastguard Worker     void clearSpots() override {
218*d57664e9SAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("Should not be called");
219*d57664e9SAndroid Build Coastguard Worker     }
220*d57664e9SAndroid Build Coastguard Worker };
221*d57664e9SAndroid Build Coastguard Worker 
222*d57664e9SAndroid Build Coastguard Worker } // namespace android
223*d57664e9SAndroid Build Coastguard Worker 
224*d57664e9SAndroid Build Coastguard Worker #endif // _UI_POINTER_CONTROLLER_H
225