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