PointerController.h revision f9d9ce7705475874c82af04eb9b208a7fb556792
1/* 2 * Copyright (C) 2010 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_H 18#define _UI_POINTER_CONTROLLER_H 19 20#include "SpriteController.h" 21 22#include <map> 23#include <vector> 24 25#include <ui/DisplayInfo.h> 26#include <input/Input.h> 27#include <inputflinger/PointerControllerInterface.h> 28#include <utils/BitSet.h> 29#include <utils/RefBase.h> 30#include <utils/Looper.h> 31#include <utils/String8.h> 32#include <gui/DisplayEventReceiver.h> 33 34namespace android { 35 36/* 37 * Pointer resources. 38 */ 39struct PointerResources { 40 SpriteIcon spotHover; 41 SpriteIcon spotTouch; 42 SpriteIcon spotAnchor; 43}; 44 45struct PointerAnimation { 46 std::vector<SpriteIcon> animationFrames; 47 nsecs_t durationPerFrame; 48}; 49 50/* 51 * Pointer controller policy interface. 52 * 53 * The pointer controller policy is used by the pointer controller to interact with 54 * the Window Manager and other system components. 55 * 56 * The actual implementation is partially supported by callbacks into the DVM 57 * via JNI. This interface is also mocked in the unit tests. 58 */ 59class PointerControllerPolicyInterface : public virtual RefBase { 60protected: 61 PointerControllerPolicyInterface() { } 62 virtual ~PointerControllerPolicyInterface() { } 63 64public: 65 virtual void loadPointerIcon(SpriteIcon* icon) = 0; 66 virtual void loadPointerResources(PointerResources* outResources) = 0; 67 virtual void loadAdditionalMouseResources(std::map<int32_t, SpriteIcon>* outResources, 68 std::map<int32_t, PointerAnimation>* outAnimationResources) = 0; 69 virtual int32_t getDefaultPointerIconId() = 0; 70 virtual int32_t getCustomPointerIconId() = 0; 71}; 72 73 74/* 75 * Tracks pointer movements and draws the pointer sprite to a surface. 76 * 77 * Handles pointer acceleration and animation. 78 */ 79class PointerController : public PointerControllerInterface, public MessageHandler, 80 public LooperCallback { 81protected: 82 virtual ~PointerController(); 83 84public: 85 enum InactivityTimeout { 86 INACTIVITY_TIMEOUT_NORMAL = 0, 87 INACTIVITY_TIMEOUT_SHORT = 1, 88 }; 89 90 PointerController(const sp<PointerControllerPolicyInterface>& policy, 91 const sp<Looper>& looper, const sp<SpriteController>& spriteController); 92 93 virtual bool getBounds(float* outMinX, float* outMinY, 94 float* outMaxX, float* outMaxY) const; 95 virtual void move(float deltaX, float deltaY); 96 virtual void setButtonState(int32_t buttonState); 97 virtual int32_t getButtonState() const; 98 virtual void setPosition(float x, float y); 99 virtual void getPosition(float* outX, float* outY) const; 100 virtual void fade(Transition transition); 101 virtual void unfade(Transition transition); 102 103 virtual void setPresentation(Presentation presentation); 104 virtual void setSpots(const PointerCoords* spotCoords, 105 const uint32_t* spotIdToIndex, BitSet32 spotIdBits); 106 virtual void clearSpots(); 107 108 void updatePointerIcon(int32_t iconId); 109 void setCustomPointerIcon(const SpriteIcon& icon); 110 void setDisplayViewport(int32_t width, int32_t height, int32_t orientation); 111 void setInactivityTimeout(InactivityTimeout inactivityTimeout); 112 void reloadPointerResources(); 113 114 /* Detach or attach the pointer icon status. When detached, the pointer icon disappears 115 * and the icon location does not change at all. */ 116 void detachPointerIcon(bool detached); 117 118private: 119 static const size_t MAX_RECYCLED_SPRITES = 12; 120 static const size_t MAX_SPOTS = 12; 121 122 enum { 123 MSG_INACTIVITY_TIMEOUT, 124 }; 125 126 struct Spot { 127 static const uint32_t INVALID_ID = 0xffffffff; 128 129 uint32_t id; 130 sp<Sprite> sprite; 131 float alpha; 132 float scale; 133 float x, y; 134 135 inline Spot(uint32_t id, const sp<Sprite>& sprite) 136 : id(id), sprite(sprite), alpha(1.0f), scale(1.0f), 137 x(0.0f), y(0.0f), lastIcon(NULL) { } 138 139 void updateSprite(const SpriteIcon* icon, float x, float y); 140 141 private: 142 const SpriteIcon* lastIcon; 143 }; 144 145 mutable Mutex mLock; 146 147 sp<PointerControllerPolicyInterface> mPolicy; 148 sp<Looper> mLooper; 149 sp<SpriteController> mSpriteController; 150 sp<WeakMessageHandler> mHandler; 151 152 DisplayEventReceiver mDisplayEventReceiver; 153 154 PointerResources mResources; 155 156 struct Locked { 157 bool animationPending; 158 nsecs_t animationTime; 159 160 size_t animationFrameIndex; 161 nsecs_t lastFrameUpdatedTime; 162 163 int32_t displayWidth; 164 int32_t displayHeight; 165 int32_t displayOrientation; 166 167 InactivityTimeout inactivityTimeout; 168 169 Presentation presentation; 170 bool presentationChanged; 171 172 int32_t pointerFadeDirection; 173 float pointerX; 174 float pointerY; 175 float pointerAlpha; 176 sp<Sprite> pointerSprite; 177 SpriteIcon pointerIcon; 178 bool pointerIconChanged; 179 180 std::map<int32_t, SpriteIcon> additionalMouseResources; 181 std::map<int32_t, PointerAnimation> animationResources; 182 183 int32_t requestedPointerType; 184 185 int32_t buttonState; 186 187 bool iconDetached; 188 189 Vector<Spot*> spots; 190 Vector<sp<Sprite> > recycledSprites; 191 } mLocked; 192 193 bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const; 194 void setPositionLocked(float x, float y); 195 196 void handleMessage(const Message& message); 197 int handleEvent(int fd, int events, void* data); 198 void doAnimate(nsecs_t timestamp); 199 bool doFadingAnimationLocked(nsecs_t timestamp); 200 bool doBitmapAnimationLocked(nsecs_t timestamp); 201 void doInactivityTimeout(); 202 203 void startAnimationLocked(); 204 205 void resetInactivityTimeoutLocked(); 206 void removeInactivityTimeoutLocked(); 207 void updatePointerLocked(); 208 209 Spot* getSpotLocked(uint32_t id); 210 Spot* createAndAddSpotLocked(uint32_t id); 211 Spot* removeFirstFadingSpotLocked(); 212 void releaseSpotLocked(Spot* spot); 213 void fadeOutAndReleaseSpotLocked(Spot* spot); 214 void fadeOutAndReleaseAllSpotsLocked(); 215 216 void loadResources(); 217}; 218 219} // namespace android 220 221#endif // _UI_POINTER_CONTROLLER_H 222