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