xref: /aosp_15_r20/frameworks/base/libs/input/PointerControllerContext.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2020 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_CONTEXT_H
18*d57664e9SAndroid Build Coastguard Worker #define _UI_POINTER_CONTROLLER_CONTEXT_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 <input/DisplayViewport.h>
23*d57664e9SAndroid Build Coastguard Worker #include <input/Input.h>
24*d57664e9SAndroid Build Coastguard Worker #include <utils/BitSet.h>
25*d57664e9SAndroid Build Coastguard Worker #include <utils/Looper.h>
26*d57664e9SAndroid Build Coastguard Worker #include <utils/RefBase.h>
27*d57664e9SAndroid Build Coastguard Worker 
28*d57664e9SAndroid Build Coastguard Worker #include <functional>
29*d57664e9SAndroid Build Coastguard Worker #include <map>
30*d57664e9SAndroid Build Coastguard Worker #include <memory>
31*d57664e9SAndroid Build Coastguard Worker #include <vector>
32*d57664e9SAndroid Build Coastguard Worker 
33*d57664e9SAndroid Build Coastguard Worker #include "SpriteController.h"
34*d57664e9SAndroid Build Coastguard Worker 
35*d57664e9SAndroid Build Coastguard Worker namespace android {
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker class PointerController;
38*d57664e9SAndroid Build Coastguard Worker class MouseCursorController;
39*d57664e9SAndroid Build Coastguard Worker class TouchSpotController;
40*d57664e9SAndroid Build Coastguard Worker 
41*d57664e9SAndroid Build Coastguard Worker /*
42*d57664e9SAndroid Build Coastguard Worker  * Pointer resources.
43*d57664e9SAndroid Build Coastguard Worker  */
44*d57664e9SAndroid Build Coastguard Worker struct PointerResources {
45*d57664e9SAndroid Build Coastguard Worker     SpriteIcon spotHover;
46*d57664e9SAndroid Build Coastguard Worker     SpriteIcon spotTouch;
47*d57664e9SAndroid Build Coastguard Worker     SpriteIcon spotAnchor;
48*d57664e9SAndroid Build Coastguard Worker };
49*d57664e9SAndroid Build Coastguard Worker 
50*d57664e9SAndroid Build Coastguard Worker struct PointerAnimation {
51*d57664e9SAndroid Build Coastguard Worker     std::vector<SpriteIcon> animationFrames;
52*d57664e9SAndroid Build Coastguard Worker     nsecs_t durationPerFrame;
53*d57664e9SAndroid Build Coastguard Worker };
54*d57664e9SAndroid Build Coastguard Worker 
55*d57664e9SAndroid Build Coastguard Worker enum class InactivityTimeout {
56*d57664e9SAndroid Build Coastguard Worker     NORMAL = 0,
57*d57664e9SAndroid Build Coastguard Worker     SHORT = 1,
58*d57664e9SAndroid Build Coastguard Worker };
59*d57664e9SAndroid Build Coastguard Worker 
60*d57664e9SAndroid Build Coastguard Worker /*
61*d57664e9SAndroid Build Coastguard Worker  * Pointer controller policy interface.
62*d57664e9SAndroid Build Coastguard Worker  *
63*d57664e9SAndroid Build Coastguard Worker  * The pointer controller policy is used by the pointer controller to interact with
64*d57664e9SAndroid Build Coastguard Worker  * the Window Manager and other system components.
65*d57664e9SAndroid Build Coastguard Worker  *
66*d57664e9SAndroid Build Coastguard Worker  * The actual implementation is partially supported by callbacks into the DVM
67*d57664e9SAndroid Build Coastguard Worker  * via JNI.  This interface is also mocked in the unit tests.
68*d57664e9SAndroid Build Coastguard Worker  */
69*d57664e9SAndroid Build Coastguard Worker class PointerControllerPolicyInterface : public virtual RefBase {
70*d57664e9SAndroid Build Coastguard Worker protected:
PointerControllerPolicyInterface()71*d57664e9SAndroid Build Coastguard Worker     PointerControllerPolicyInterface() {}
~PointerControllerPolicyInterface()72*d57664e9SAndroid Build Coastguard Worker     virtual ~PointerControllerPolicyInterface() {}
73*d57664e9SAndroid Build Coastguard Worker 
74*d57664e9SAndroid Build Coastguard Worker public:
75*d57664e9SAndroid Build Coastguard Worker     virtual void loadPointerIcon(SpriteIcon* icon, ui::LogicalDisplayId displayId) = 0;
76*d57664e9SAndroid Build Coastguard Worker     virtual void loadPointerResources(PointerResources* outResources,
77*d57664e9SAndroid Build Coastguard Worker                                       ui::LogicalDisplayId displayId) = 0;
78*d57664e9SAndroid Build Coastguard Worker     virtual void loadAdditionalMouseResources(
79*d57664e9SAndroid Build Coastguard Worker             std::map<PointerIconStyle, SpriteIcon>* outResources,
80*d57664e9SAndroid Build Coastguard Worker             std::map<PointerIconStyle, PointerAnimation>* outAnimationResources,
81*d57664e9SAndroid Build Coastguard Worker             ui::LogicalDisplayId displayId) = 0;
82*d57664e9SAndroid Build Coastguard Worker     virtual PointerIconStyle getDefaultPointerIconId() = 0;
83*d57664e9SAndroid Build Coastguard Worker     virtual PointerIconStyle getDefaultStylusIconId() = 0;
84*d57664e9SAndroid Build Coastguard Worker     virtual PointerIconStyle getCustomPointerIconId() = 0;
85*d57664e9SAndroid Build Coastguard Worker };
86*d57664e9SAndroid Build Coastguard Worker 
87*d57664e9SAndroid Build Coastguard Worker /*
88*d57664e9SAndroid Build Coastguard Worker  * Contains logic and resources shared among PointerController,
89*d57664e9SAndroid Build Coastguard Worker  * MouseCursorController, and TouchSpotController.
90*d57664e9SAndroid Build Coastguard Worker  */
91*d57664e9SAndroid Build Coastguard Worker 
92*d57664e9SAndroid Build Coastguard Worker class PointerControllerContext {
93*d57664e9SAndroid Build Coastguard Worker public:
94*d57664e9SAndroid Build Coastguard Worker     PointerControllerContext(const sp<PointerControllerPolicyInterface>& policy,
95*d57664e9SAndroid Build Coastguard Worker                              const sp<Looper>& looper, SpriteController& spriteController,
96*d57664e9SAndroid Build Coastguard Worker                              PointerController& controller);
97*d57664e9SAndroid Build Coastguard Worker     ~PointerControllerContext();
98*d57664e9SAndroid Build Coastguard Worker 
99*d57664e9SAndroid Build Coastguard Worker     void removeInactivityTimeout();
100*d57664e9SAndroid Build Coastguard Worker     void resetInactivityTimeout();
101*d57664e9SAndroid Build Coastguard Worker     void startAnimation();
102*d57664e9SAndroid Build Coastguard Worker     void setInactivityTimeout(InactivityTimeout inactivityTimeout);
103*d57664e9SAndroid Build Coastguard Worker 
104*d57664e9SAndroid Build Coastguard Worker     nsecs_t getAnimationTime();
105*d57664e9SAndroid Build Coastguard Worker 
106*d57664e9SAndroid Build Coastguard Worker     void clearSpotsByDisplay(ui::LogicalDisplayId displayId);
107*d57664e9SAndroid Build Coastguard Worker 
108*d57664e9SAndroid Build Coastguard Worker     void setHandlerController(std::shared_ptr<PointerController> controller);
109*d57664e9SAndroid Build Coastguard Worker     void setCallbackController(std::shared_ptr<PointerController> controller);
110*d57664e9SAndroid Build Coastguard Worker 
111*d57664e9SAndroid Build Coastguard Worker     sp<PointerControllerPolicyInterface> getPolicy();
112*d57664e9SAndroid Build Coastguard Worker     SpriteController& getSpriteController();
113*d57664e9SAndroid Build Coastguard Worker 
114*d57664e9SAndroid Build Coastguard Worker     void handleDisplayEvents();
115*d57664e9SAndroid Build Coastguard Worker 
116*d57664e9SAndroid Build Coastguard Worker     void addAnimationCallback(ui::LogicalDisplayId displayId,
117*d57664e9SAndroid Build Coastguard Worker                               std::function<bool(nsecs_t)> callback);
118*d57664e9SAndroid Build Coastguard Worker     void removeAnimationCallback(ui::LogicalDisplayId displayId);
119*d57664e9SAndroid Build Coastguard Worker 
120*d57664e9SAndroid Build Coastguard Worker     class MessageHandler : public virtual android::MessageHandler {
121*d57664e9SAndroid Build Coastguard Worker     public:
122*d57664e9SAndroid Build Coastguard Worker         enum {
123*d57664e9SAndroid Build Coastguard Worker             MSG_INACTIVITY_TIMEOUT,
124*d57664e9SAndroid Build Coastguard Worker         };
125*d57664e9SAndroid Build Coastguard Worker 
126*d57664e9SAndroid Build Coastguard Worker         void handleMessage(const Message& message) override;
127*d57664e9SAndroid Build Coastguard Worker         std::weak_ptr<PointerController> pointerController;
128*d57664e9SAndroid Build Coastguard Worker     };
129*d57664e9SAndroid Build Coastguard Worker 
130*d57664e9SAndroid Build Coastguard Worker     class LooperCallback : public virtual android::LooperCallback {
131*d57664e9SAndroid Build Coastguard Worker     public:
132*d57664e9SAndroid Build Coastguard Worker         int handleEvent(int fd, int events, void* data) override;
133*d57664e9SAndroid Build Coastguard Worker         std::weak_ptr<PointerController> pointerController;
134*d57664e9SAndroid Build Coastguard Worker     };
135*d57664e9SAndroid Build Coastguard Worker 
136*d57664e9SAndroid Build Coastguard Worker private:
137*d57664e9SAndroid Build Coastguard Worker     class PointerAnimator {
138*d57664e9SAndroid Build Coastguard Worker     public:
139*d57664e9SAndroid Build Coastguard Worker         PointerAnimator(PointerControllerContext& context);
140*d57664e9SAndroid Build Coastguard Worker 
141*d57664e9SAndroid Build Coastguard Worker         void addCallback(ui::LogicalDisplayId displayId, std::function<bool(nsecs_t)> callback);
142*d57664e9SAndroid Build Coastguard Worker         void removeCallback(ui::LogicalDisplayId displayId);
143*d57664e9SAndroid Build Coastguard Worker         void handleVsyncEvents();
144*d57664e9SAndroid Build Coastguard Worker         nsecs_t getAnimationTimeLocked();
145*d57664e9SAndroid Build Coastguard Worker 
146*d57664e9SAndroid Build Coastguard Worker         mutable std::mutex mLock;
147*d57664e9SAndroid Build Coastguard Worker 
148*d57664e9SAndroid Build Coastguard Worker     private:
149*d57664e9SAndroid Build Coastguard Worker         struct Locked {
150*d57664e9SAndroid Build Coastguard Worker             bool animationPending{false};
151*d57664e9SAndroid Build Coastguard Worker             nsecs_t animationTime{systemTime(SYSTEM_TIME_MONOTONIC)};
152*d57664e9SAndroid Build Coastguard Worker 
153*d57664e9SAndroid Build Coastguard Worker             std::unordered_map<ui::LogicalDisplayId, std::function<bool(nsecs_t)>> callbacks;
154*d57664e9SAndroid Build Coastguard Worker         } mLocked GUARDED_BY(mLock);
155*d57664e9SAndroid Build Coastguard Worker 
156*d57664e9SAndroid Build Coastguard Worker         DisplayEventReceiver mDisplayEventReceiver;
157*d57664e9SAndroid Build Coastguard Worker 
158*d57664e9SAndroid Build Coastguard Worker         PointerControllerContext& mContext;
159*d57664e9SAndroid Build Coastguard Worker 
160*d57664e9SAndroid Build Coastguard Worker         void initializeDisplayEventReceiver();
161*d57664e9SAndroid Build Coastguard Worker         void startAnimationLocked();
162*d57664e9SAndroid Build Coastguard Worker         void handleCallbacksLocked(nsecs_t timestamp);
163*d57664e9SAndroid Build Coastguard Worker     };
164*d57664e9SAndroid Build Coastguard Worker 
165*d57664e9SAndroid Build Coastguard Worker     sp<PointerControllerPolicyInterface> mPolicy;
166*d57664e9SAndroid Build Coastguard Worker     sp<Looper> mLooper;
167*d57664e9SAndroid Build Coastguard Worker     SpriteController& mSpriteController;
168*d57664e9SAndroid Build Coastguard Worker     sp<MessageHandler> mHandler;
169*d57664e9SAndroid Build Coastguard Worker     sp<LooperCallback> mCallback;
170*d57664e9SAndroid Build Coastguard Worker 
171*d57664e9SAndroid Build Coastguard Worker     PointerController& mController;
172*d57664e9SAndroid Build Coastguard Worker 
173*d57664e9SAndroid Build Coastguard Worker     PointerAnimator mAnimator;
174*d57664e9SAndroid Build Coastguard Worker 
175*d57664e9SAndroid Build Coastguard Worker     mutable std::mutex mLock;
176*d57664e9SAndroid Build Coastguard Worker 
177*d57664e9SAndroid Build Coastguard Worker     struct Locked {
178*d57664e9SAndroid Build Coastguard Worker         InactivityTimeout inactivityTimeout;
179*d57664e9SAndroid Build Coastguard Worker     } mLocked GUARDED_BY(mLock);
180*d57664e9SAndroid Build Coastguard Worker 
181*d57664e9SAndroid Build Coastguard Worker     void resetInactivityTimeoutLocked();
182*d57664e9SAndroid Build Coastguard Worker };
183*d57664e9SAndroid Build Coastguard Worker 
184*d57664e9SAndroid Build Coastguard Worker } // namespace android
185*d57664e9SAndroid Build Coastguard Worker 
186*d57664e9SAndroid Build Coastguard Worker #endif // _UI_POINTER_CONTROLLER_CONTEXT_H
187