xref: /aosp_15_r20/frameworks/base/libs/input/TouchSpotController.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_TOUCH_SPOT_CONTROLLER_H
18*d57664e9SAndroid Build Coastguard Worker #define _UI_TOUCH_SPOT_CONTROLLER_H
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <functional>
21*d57664e9SAndroid Build Coastguard Worker 
22*d57664e9SAndroid Build Coastguard Worker #include "PointerControllerContext.h"
23*d57664e9SAndroid Build Coastguard Worker 
24*d57664e9SAndroid Build Coastguard Worker namespace android {
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker /*
27*d57664e9SAndroid Build Coastguard Worker  * Helper class for PointerController that specifically handles
28*d57664e9SAndroid Build Coastguard Worker  * touch spot resources and actions for a single display.
29*d57664e9SAndroid Build Coastguard Worker  */
30*d57664e9SAndroid Build Coastguard Worker class TouchSpotController {
31*d57664e9SAndroid Build Coastguard Worker public:
32*d57664e9SAndroid Build Coastguard Worker     TouchSpotController(ui::LogicalDisplayId displayId, PointerControllerContext& context);
33*d57664e9SAndroid Build Coastguard Worker     ~TouchSpotController();
34*d57664e9SAndroid Build Coastguard Worker     void setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex,
35*d57664e9SAndroid Build Coastguard Worker                   BitSet32 spotIdBits, bool skipScreenshot);
36*d57664e9SAndroid Build Coastguard Worker     void clearSpots();
37*d57664e9SAndroid Build Coastguard Worker 
38*d57664e9SAndroid Build Coastguard Worker     void reloadSpotResources();
39*d57664e9SAndroid Build Coastguard Worker     bool doAnimations(nsecs_t timestamp);
40*d57664e9SAndroid Build Coastguard Worker 
41*d57664e9SAndroid Build Coastguard Worker     void dump(std::string& out, const char* prefix = "") const;
42*d57664e9SAndroid Build Coastguard Worker 
43*d57664e9SAndroid Build Coastguard Worker private:
44*d57664e9SAndroid Build Coastguard Worker     struct Spot {
45*d57664e9SAndroid Build Coastguard Worker         static const uint32_t INVALID_ID = 0xffffffff;
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker         uint32_t id;
48*d57664e9SAndroid Build Coastguard Worker         sp<Sprite> sprite;
49*d57664e9SAndroid Build Coastguard Worker         float alpha;
50*d57664e9SAndroid Build Coastguard Worker         float scale;
51*d57664e9SAndroid Build Coastguard Worker         float x, y;
52*d57664e9SAndroid Build Coastguard Worker 
SpotSpot53*d57664e9SAndroid Build Coastguard Worker         inline Spot(uint32_t id, const sp<Sprite>& sprite)
54*d57664e9SAndroid Build Coastguard Worker               : id(id),
55*d57664e9SAndroid Build Coastguard Worker                 sprite(sprite),
56*d57664e9SAndroid Build Coastguard Worker                 alpha(1.0f),
57*d57664e9SAndroid Build Coastguard Worker                 scale(1.0f),
58*d57664e9SAndroid Build Coastguard Worker                 x(0.0f),
59*d57664e9SAndroid Build Coastguard Worker                 y(0.0f),
60*d57664e9SAndroid Build Coastguard Worker                 mLastIcon(nullptr) {}
61*d57664e9SAndroid Build Coastguard Worker 
62*d57664e9SAndroid Build Coastguard Worker         void updateSprite(const SpriteIcon* icon, float x, float y, ui::LogicalDisplayId displayId,
63*d57664e9SAndroid Build Coastguard Worker                           bool skipScreenshot);
64*d57664e9SAndroid Build Coastguard Worker         void dump(std::string& out, const char* prefix = "") const;
65*d57664e9SAndroid Build Coastguard Worker 
66*d57664e9SAndroid Build Coastguard Worker     private:
67*d57664e9SAndroid Build Coastguard Worker         const SpriteIcon* mLastIcon;
68*d57664e9SAndroid Build Coastguard Worker     };
69*d57664e9SAndroid Build Coastguard Worker 
70*d57664e9SAndroid Build Coastguard Worker     ui::LogicalDisplayId mDisplayId;
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker     mutable std::mutex mLock;
73*d57664e9SAndroid Build Coastguard Worker 
74*d57664e9SAndroid Build Coastguard Worker     PointerResources mResources;
75*d57664e9SAndroid Build Coastguard Worker 
76*d57664e9SAndroid Build Coastguard Worker     PointerControllerContext& mContext;
77*d57664e9SAndroid Build Coastguard Worker 
78*d57664e9SAndroid Build Coastguard Worker     static constexpr size_t MAX_RECYCLED_SPRITES = 12;
79*d57664e9SAndroid Build Coastguard Worker     static constexpr size_t MAX_SPOTS = 12;
80*d57664e9SAndroid Build Coastguard Worker 
81*d57664e9SAndroid Build Coastguard Worker     struct Locked {
82*d57664e9SAndroid Build Coastguard Worker         std::vector<Spot*> displaySpots;
83*d57664e9SAndroid Build Coastguard Worker         std::vector<sp<Sprite>> recycledSprites;
84*d57664e9SAndroid Build Coastguard Worker 
85*d57664e9SAndroid Build Coastguard Worker         bool animating{false};
86*d57664e9SAndroid Build Coastguard Worker 
87*d57664e9SAndroid Build Coastguard Worker     } mLocked GUARDED_BY(mLock);
88*d57664e9SAndroid Build Coastguard Worker 
89*d57664e9SAndroid Build Coastguard Worker     Spot* getSpot(uint32_t id, const std::vector<Spot*>& spots);
90*d57664e9SAndroid Build Coastguard Worker     Spot* createAndAddSpotLocked(uint32_t id, std::vector<Spot*>& spots);
91*d57664e9SAndroid Build Coastguard Worker     Spot* removeFirstFadingSpotLocked(std::vector<Spot*>& spots);
92*d57664e9SAndroid Build Coastguard Worker     void releaseSpotLocked(Spot* spot);
93*d57664e9SAndroid Build Coastguard Worker     void fadeOutAndReleaseSpotLocked(Spot* spot);
94*d57664e9SAndroid Build Coastguard Worker     void fadeOutAndReleaseAllSpotsLocked();
95*d57664e9SAndroid Build Coastguard Worker     bool doFadingAnimationLocked(nsecs_t timestamp);
96*d57664e9SAndroid Build Coastguard Worker     void startAnimationLocked();
97*d57664e9SAndroid Build Coastguard Worker };
98*d57664e9SAndroid Build Coastguard Worker 
99*d57664e9SAndroid Build Coastguard Worker } // namespace android
100*d57664e9SAndroid Build Coastguard Worker 
101*d57664e9SAndroid Build Coastguard Worker #endif // _UI_TOUCH_SPOT_CONTROLLER_H
102