PointerController.h revision 19a560197950425f7e1856d5bd1216fbc680bf70
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}; 71 72 73/* 74 * Tracks pointer movements and draws the pointer sprite to a surface. 75 * 76 * Handles pointer acceleration and animation. 77 */ 78class PointerController : public PointerControllerInterface, public MessageHandler, 79 public LooperCallback { 80protected: 81 virtual ~PointerController(); 82 83public: 84 enum InactivityTimeout { 85 INACTIVITY_TIMEOUT_NORMAL = 0, 86 INACTIVITY_TIMEOUT_SHORT = 1, 87 }; 88 89 PointerController(const sp<PointerControllerPolicyInterface>& policy, 90 const sp<Looper>& looper, const sp<SpriteController>& spriteController); 91 92 virtual bool getBounds(float* outMinX, float* outMinY, 93 float* outMaxX, float* outMaxY) const; 94 virtual void move(float deltaX, float deltaY); 95 virtual void setButtonState(int32_t buttonState); 96 virtual int32_t getButtonState() const; 97 virtual void setPosition(float x, float y); 98 virtual void getPosition(float* outX, float* outY) const; 99 virtual void fade(Transition transition); 100 virtual void unfade(Transition transition); 101 102 virtual void setPresentation(Presentation presentation); 103 virtual void setSpots(const PointerCoords* spotCoords, 104 const uint32_t* spotIdToIndex, BitSet32 spotIdBits); 105 virtual void clearSpots(); 106 107 void updatePointerShape(int32_t iconId); 108 void setDisplayViewport(int32_t width, int32_t height, int32_t orientation); 109 void setInactivityTimeout(InactivityTimeout inactivityTimeout); 110 void reloadPointerResources(); 111 112private: 113 static const size_t MAX_RECYCLED_SPRITES = 12; 114 static const size_t MAX_SPOTS = 12; 115 116 enum { 117 MSG_INACTIVITY_TIMEOUT, 118 }; 119 120 struct Spot { 121 static const uint32_t INVALID_ID = 0xffffffff; 122 123 uint32_t id; 124 sp<Sprite> sprite; 125 float alpha; 126 float scale; 127 float x, y; 128 129 inline Spot(uint32_t id, const sp<Sprite>& sprite) 130 : id(id), sprite(sprite), alpha(1.0f), scale(1.0f), 131 x(0.0f), y(0.0f), lastIcon(NULL) { } 132 133 void updateSprite(const SpriteIcon* icon, float x, float y); 134 135 private: 136 const SpriteIcon* lastIcon; 137 }; 138 139 mutable Mutex mLock; 140 141 sp<PointerControllerPolicyInterface> mPolicy; 142 sp<Looper> mLooper; 143 sp<SpriteController> mSpriteController; 144 sp<WeakMessageHandler> mHandler; 145 146 DisplayEventReceiver mDisplayEventReceiver; 147 148 PointerResources mResources; 149 150 struct Locked { 151 bool animationPending; 152 nsecs_t animationTime; 153 154 size_t animationFrameIndex; 155 nsecs_t lastFrameUpdatedTime; 156 157 int32_t displayWidth; 158 int32_t displayHeight; 159 int32_t displayOrientation; 160 161 InactivityTimeout inactivityTimeout; 162 163 Presentation presentation; 164 bool presentationChanged; 165 166 int32_t pointerFadeDirection; 167 float pointerX; 168 float pointerY; 169 float pointerAlpha; 170 sp<Sprite> pointerSprite; 171 SpriteIcon pointerIcon; 172 bool pointerIconChanged; 173 174 std::map<int32_t, SpriteIcon> additionalMouseResources; 175 std::map<int32_t, PointerAnimation> animationResources; 176 177 int32_t requestedPointerShape; 178 179 int32_t buttonState; 180 181 Vector<Spot*> spots; 182 Vector<sp<Sprite> > recycledSprites; 183 } mLocked; 184 185 bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const; 186 void setPositionLocked(float x, float y); 187 188 void handleMessage(const Message& message); 189 int handleEvent(int fd, int events, void* data); 190 void doAnimate(nsecs_t timestamp); 191 bool doFadingAnimationLocked(nsecs_t timestamp); 192 bool doBitmapAnimationLocked(nsecs_t timestamp); 193 void doInactivityTimeout(); 194 195 void startAnimationLocked(); 196 197 void resetInactivityTimeoutLocked(); 198 void removeInactivityTimeoutLocked(); 199 void updatePointerLocked(); 200 201 Spot* getSpotLocked(uint32_t id); 202 Spot* createAndAddSpotLocked(uint32_t id); 203 Spot* removeFirstFadingSpotLocked(); 204 void releaseSpotLocked(Spot* spot); 205 void fadeOutAndReleaseSpotLocked(Spot* spot); 206 void fadeOutAndReleaseAllSpotsLocked(); 207 208 void loadResources(); 209}; 210 211} // namespace android 212 213#endif // _UI_POINTER_CONTROLLER_H 214