• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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_MOUSE_CURSOR_CONTROLLER_H
18 #define _UI_MOUSE_CURSOR_CONTROLLER_H
19 
20 #include <gui/DisplayEventReceiver.h>
21 #include <input/DisplayViewport.h>
22 #include <input/Input.h>
23 #include <utils/BitSet.h>
24 #include <utils/Looper.h>
25 #include <utils/RefBase.h>
26 
27 #include <functional>
28 #include <map>
29 #include <memory>
30 #include <vector>
31 
32 #include "PointerControllerContext.h"
33 #include "SpriteController.h"
34 
35 namespace android {
36 
37 /*
38  * Helper class for PointerController that specifically handles
39  * mouse cursor resources and actions.
40  */
41 class MouseCursorController {
42 public:
43     MouseCursorController(PointerControllerContext& context);
44     ~MouseCursorController();
45 
46     std::optional<FloatRect> getBounds() const;
47     void move(float deltaX, float deltaY);
48     void setPosition(float x, float y);
49     FloatPoint getPosition() const;
50     int32_t getDisplayId() const;
51     void fade(PointerControllerInterface::Transition transition);
52     void unfade(PointerControllerInterface::Transition transition);
53     void setDisplayViewport(const DisplayViewport& viewport, bool getAdditionalMouseResources);
54     void setStylusHoverMode(bool stylusHoverMode);
55 
56     void updatePointerIcon(PointerIconStyle iconId);
57     void setCustomPointerIcon(const SpriteIcon& icon);
58     void reloadPointerResources(bool getAdditionalMouseResources);
59 
60     void getAdditionalMouseResources();
61     bool isViewportValid();
62 
63     bool doAnimations(nsecs_t timestamp);
64 
65     bool resourcesLoaded();
66 
67 private:
68     mutable std::mutex mLock;
69 
70     PointerResources mResources;
71 
72     PointerControllerContext& mContext;
73 
74     struct Locked {
75         DisplayViewport viewport;
76         bool stylusHoverMode;
77 
78         size_t animationFrameIndex;
79         nsecs_t lastFrameUpdatedTime;
80 
81         int32_t pointerFadeDirection;
82         float pointerX;
83         float pointerY;
84         float pointerAlpha;
85         sp<Sprite> pointerSprite;
86         SpriteIcon pointerIcon;
87         bool updatePointerIcon;
88 
89         bool resourcesLoaded;
90 
91         std::map<PointerIconStyle, SpriteIcon> additionalMouseResources;
92         std::map<PointerIconStyle, PointerAnimation> animationResources;
93 
94         PointerIconStyle requestedPointerType;
95         PointerIconStyle resolvedPointerType;
96 
97         bool animating{false};
98 
99     } mLocked GUARDED_BY(mLock);
100 
101     std::optional<FloatRect> getBoundsLocked() const;
102     void setPositionLocked(float x, float y);
103 
104     void updatePointerLocked();
105 
106     void loadResourcesLocked(bool getAdditionalMouseResources);
107 
108     bool doBitmapAnimationLocked(nsecs_t timestamp);
109     bool doFadingAnimationLocked(nsecs_t timestamp);
110 
111     void startAnimationLocked();
112 };
113 
114 } // namespace android
115 
116 #endif // _UI_MOUSE_CURSOR_CONTROLLER_H
117