blob: 96d83a5f0d15f61f61912495baa26e9bccffb557 [file] [log] [blame]
Liam Harringtonc782be62020-07-17 19:48:24 +00001/*
2 * Copyright (C) 2020 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#ifndef _UI_POINTER_CONTROLLER_CONTEXT_H
18#define _UI_POINTER_CONTROLLER_CONTEXT_H
19
20#include <PointerControllerInterface.h>
21#include <gui/DisplayEventReceiver.h>
22#include <input/DisplayViewport.h>
23#include <input/Input.h>
Liam Harringtonc782be62020-07-17 19:48:24 +000024#include <utils/BitSet.h>
25#include <utils/Looper.h>
26#include <utils/RefBase.h>
27
Liam Harringtonce637132020-08-14 04:00:11 +000028#include <functional>
Liam Harringtonc782be62020-07-17 19:48:24 +000029#include <map>
30#include <memory>
31#include <vector>
32
33#include "SpriteController.h"
34
35namespace android {
36
37class PointerController;
Liam Harringtonce637132020-08-14 04:00:11 +000038class MouseCursorController;
39class TouchSpotController;
Liam Harringtonc782be62020-07-17 19:48:24 +000040
41/*
42 * Pointer resources.
43 */
44struct PointerResources {
45 SpriteIcon spotHover;
46 SpriteIcon spotTouch;
47 SpriteIcon spotAnchor;
48};
49
50struct PointerAnimation {
51 std::vector<SpriteIcon> animationFrames;
52 nsecs_t durationPerFrame;
53};
54
55enum class InactivityTimeout {
56 NORMAL = 0,
57 SHORT = 1,
58};
59
60/*
61 * Pointer controller policy interface.
62 *
63 * The pointer controller policy is used by the pointer controller to interact with
64 * the Window Manager and other system components.
65 *
66 * The actual implementation is partially supported by callbacks into the DVM
67 * via JNI. This interface is also mocked in the unit tests.
68 */
69class PointerControllerPolicyInterface : public virtual RefBase {
70protected:
71 PointerControllerPolicyInterface() {}
72 virtual ~PointerControllerPolicyInterface() {}
73
74public:
75 virtual void loadPointerIcon(SpriteIcon* icon, int32_t displayId) = 0;
76 virtual void loadPointerResources(PointerResources* outResources, int32_t displayId) = 0;
77 virtual void loadAdditionalMouseResources(
Brandon Pollack015f5d92022-06-02 06:59:33 +000078 std::map<PointerIconStyle, SpriteIcon>* outResources,
79 std::map<PointerIconStyle, PointerAnimation>* outAnimationResources,
80 int32_t displayId) = 0;
81 virtual PointerIconStyle getDefaultPointerIconId() = 0;
Seunghwan Choi670b33d2023-01-13 21:12:59 +090082 virtual PointerIconStyle getDefaultStylusIconId() = 0;
Brandon Pollack015f5d92022-06-02 06:59:33 +000083 virtual PointerIconStyle getCustomPointerIconId() = 0;
Prabir Pradhan0e3d6652022-03-10 14:39:46 +000084 virtual void onPointerDisplayIdChanged(int32_t displayId, float xPos, float yPos) = 0;
Liam Harringtonc782be62020-07-17 19:48:24 +000085};
86
87/*
88 * Contains logic and resources shared among PointerController,
89 * MouseCursorController, and TouchSpotController.
90 */
91
92class PointerControllerContext {
93public:
94 PointerControllerContext(const sp<PointerControllerPolicyInterface>& policy,
95 const sp<Looper>& looper, const sp<SpriteController>& spriteController,
96 PointerController& controller);
97 ~PointerControllerContext();
98
99 void removeInactivityTimeout();
100 void resetInactivityTimeout();
101 void startAnimation();
102 void setInactivityTimeout(InactivityTimeout inactivityTimeout);
103
Liam Harringtonc782be62020-07-17 19:48:24 +0000104 nsecs_t getAnimationTime();
105
106 void clearSpotsByDisplay(int32_t displayId);
107
108 void setHandlerController(std::shared_ptr<PointerController> controller);
109 void setCallbackController(std::shared_ptr<PointerController> controller);
110
111 sp<PointerControllerPolicyInterface> getPolicy();
112 sp<SpriteController> getSpriteController();
113
Liam Harringtonc782be62020-07-17 19:48:24 +0000114 void handleDisplayEvents();
115
Liam Harringtonce637132020-08-14 04:00:11 +0000116 void addAnimationCallback(int32_t displayId, std::function<bool(nsecs_t)> callback);
117 void removeAnimationCallback(int32_t displayId);
118
Liam Harringtonc782be62020-07-17 19:48:24 +0000119 class MessageHandler : public virtual android::MessageHandler {
120 public:
121 enum {
122 MSG_INACTIVITY_TIMEOUT,
123 };
124
125 void handleMessage(const Message& message) override;
126 std::weak_ptr<PointerController> pointerController;
127 };
128
129 class LooperCallback : public virtual android::LooperCallback {
130 public:
131 int handleEvent(int fd, int events, void* data) override;
132 std::weak_ptr<PointerController> pointerController;
133 };
134
135private:
Liam Harringtonce637132020-08-14 04:00:11 +0000136 class PointerAnimator {
137 public:
138 PointerAnimator(PointerControllerContext& context);
139
140 void addCallback(int32_t displayId, std::function<bool(nsecs_t)> callback);
141 void removeCallback(int32_t displayId);
142 void handleVsyncEvents();
143 nsecs_t getAnimationTimeLocked();
144
145 mutable std::mutex mLock;
146
147 private:
148 struct Locked {
149 bool animationPending{false};
150 nsecs_t animationTime{systemTime(SYSTEM_TIME_MONOTONIC)};
151
152 std::unordered_map<int32_t, std::function<bool(nsecs_t)>> callbacks;
153 } mLocked GUARDED_BY(mLock);
154
155 DisplayEventReceiver mDisplayEventReceiver;
156
157 PointerControllerContext& mContext;
158
159 void initializeDisplayEventReceiver();
160 void startAnimationLocked();
161 void handleCallbacksLocked(nsecs_t timestamp);
162 };
163
Liam Harringtonc782be62020-07-17 19:48:24 +0000164 sp<PointerControllerPolicyInterface> mPolicy;
165 sp<Looper> mLooper;
166 sp<SpriteController> mSpriteController;
167 sp<MessageHandler> mHandler;
168 sp<LooperCallback> mCallback;
169
Liam Harringtonc782be62020-07-17 19:48:24 +0000170 PointerController& mController;
171
Liam Harringtonce637132020-08-14 04:00:11 +0000172 PointerAnimator mAnimator;
173
Liam Harringtonc782be62020-07-17 19:48:24 +0000174 mutable std::mutex mLock;
175
176 struct Locked {
Liam Harringtonc782be62020-07-17 19:48:24 +0000177 InactivityTimeout inactivityTimeout;
178 } mLocked GUARDED_BY(mLock);
179
180 void resetInactivityTimeoutLocked();
181};
182
183} // namespace android
184
185#endif // _UI_POINTER_CONTROLLER_CONTEXT_H