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 <ui/DisplayInfo.h> 23 #include <input/Input.h> 24 #include <utils/BitSet.h> 25 #include <utils/RefBase.h> 26 #include <utils/Looper.h> 27 #include <utils/String8.h> 28 29 #include <SkBitmap.h> 30 31 namespace android { 32 33 /** 34 * Interface for tracking a mouse / touch pad pointer and touch pad spots. 35 * 36 * The spots are sprites on screen that visually represent the positions of 37 * fingers 38 * 39 * The pointer controller is responsible for providing synchronization and for tracking 40 * display orientation changes if needed. 41 */ 42 class PointerControllerInterface : public virtual RefBase { 43 protected: 44 PointerControllerInterface() { } 45 virtual ~PointerControllerInterface() { } 46 47 public: 48 /* Gets the bounds of the region that the pointer can traverse. 49 * Returns true if the bounds are available. */ 50 virtual bool getBounds(float* outMinX, float* outMinY, 51 float* outMaxX, float* outMaxY) const = 0; 52 53 /* Move the pointer. */ 54 virtual void move(float deltaX, float deltaY) = 0; 55 56 /* Sets a mask that indicates which buttons are pressed. */ 57 virtual void setButtonState(int32_t buttonState) = 0; 58 59 /* Gets a mask that indicates which buttons are pressed. */ 60 virtual int32_t getButtonState() const = 0; 61 62 /* Sets the absolute location of the pointer. */ 63 virtual void setPosition(float x, float y) = 0; 64 65 /* Gets the absolute location of the pointer. */ 66 virtual void getPosition(float* outX, float* outY) const = 0; 67 68 enum Transition { 69 // Fade/unfade immediately. 70 TRANSITION_IMMEDIATE, 71 // Fade/unfade gradually. 72 TRANSITION_GRADUAL, 73 }; 74 75 /* Fades the pointer out now. */ 76 virtual void fade(Transition transition) = 0; 77 78 /* Makes the pointer visible if it has faded out. 79 * The pointer never unfades itself automatically. This method must be called 80 * by the client whenever the pointer is moved or a button is pressed and it 81 * wants to ensure that the pointer becomes visible again. */ 82 virtual void unfade(Transition transition) = 0; 83 84 enum Presentation { 85 // Show the mouse pointer. 86 PRESENTATION_POINTER, 87 // Show spots and a spot anchor in place of the mouse pointer. 88 PRESENTATION_SPOT, 89 }; 90 91 /* Sets the mode of the pointer controller. */ 92 virtual void setPresentation(Presentation presentation) = 0; 93 94 /* Sets the spots for the current gesture. 95 * The spots are not subject to the inactivity timeout like the pointer 96 * itself it since they are expected to remain visible for so long as 97 * the fingers are on the touch pad. 98 * 99 * The values of the AMOTION_EVENT_AXIS_PRESSURE axis is significant. 100 * For spotCoords, pressure != 0 indicates that the spot's location is being 101 * pressed (not hovering). 102 */ 103 virtual void setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex, 104 BitSet32 spotIdBits) = 0; 105 106 /* Removes all spots. */ 107 virtual void clearSpots() = 0; 108 }; 109 110 111 /* 112 * Pointer resources. 113 */ 114 struct PointerResources { 115 SpriteIcon spotHover; 116 SpriteIcon spotTouch; 117 SpriteIcon spotAnchor; 118 }; 119 120 121 /* 122 * Pointer controller policy interface. 123 * 124 * The pointer controller policy is used by the pointer controller to interact with 125 * the Window Manager and other system components. 126 * 127 * The actual implementation is partially supported by callbacks into the DVM 128 * via JNI. This interface is also mocked in the unit tests. 129 */ 130 class PointerControllerPolicyInterface : public virtual RefBase { 131 protected: 132 PointerControllerPolicyInterface() { } 133 virtual ~PointerControllerPolicyInterface() { } 134 135 public: 136 virtual void loadPointerResources(PointerResources* outResources) = 0; 137 }; 138 139 140 /* 141 * Tracks pointer movements and draws the pointer sprite to a surface. 142 * 143 * Handles pointer acceleration and animation. 144 */ 145 class PointerController : public PointerControllerInterface, public MessageHandler { 146 protected: 147 virtual ~PointerController(); 148 149 public: 150 enum InactivityTimeout { 151 INACTIVITY_TIMEOUT_NORMAL = 0, 152 INACTIVITY_TIMEOUT_SHORT = 1, 153 }; 154 155 PointerController(const sp<PointerControllerPolicyInterface>& policy, 156 const sp<Looper>& looper, const sp<SpriteController>& spriteController); 157 158 virtual bool getBounds(float* outMinX, float* outMinY, 159 float* outMaxX, float* outMaxY) const; 160 virtual void move(float deltaX, float deltaY); 161 virtual void setButtonState(int32_t buttonState); 162 virtual int32_t getButtonState() const; 163 virtual void setPosition(float x, float y); 164 virtual void getPosition(float* outX, float* outY) const; 165 virtual void fade(Transition transition); 166 virtual void unfade(Transition transition); 167 168 virtual void setPresentation(Presentation presentation); 169 virtual void setSpots(const PointerCoords* spotCoords, 170 const uint32_t* spotIdToIndex, BitSet32 spotIdBits); 171 virtual void clearSpots(); 172 173 void setDisplayViewport(int32_t width, int32_t height, int32_t orientation); 174 void setPointerIcon(const SpriteIcon& icon); 175 void setInactivityTimeout(InactivityTimeout inactivityTimeout); 176 177 private: 178 static const size_t MAX_RECYCLED_SPRITES = 12; 179 static const size_t MAX_SPOTS = 12; 180 181 enum { 182 MSG_ANIMATE, 183 MSG_INACTIVITY_TIMEOUT, 184 }; 185 186 struct Spot { 187 static const uint32_t INVALID_ID = 0xffffffff; 188 189 uint32_t id; 190 sp<Sprite> sprite; 191 float alpha; 192 float scale; 193 float x, y; 194 195 inline Spot(uint32_t id, const sp<Sprite>& sprite) 196 : id(id), sprite(sprite), alpha(1.0f), scale(1.0f), 197 x(0.0f), y(0.0f), lastIcon(NULL) { } 198 199 void updateSprite(const SpriteIcon* icon, float x, float y); 200 201 private: 202 const SpriteIcon* lastIcon; 203 }; 204 205 mutable Mutex mLock; 206 207 sp<PointerControllerPolicyInterface> mPolicy; 208 sp<Looper> mLooper; 209 sp<SpriteController> mSpriteController; 210 sp<WeakMessageHandler> mHandler; 211 212 PointerResources mResources; 213 214 struct Locked { 215 bool animationPending; 216 nsecs_t animationTime; 217 218 int32_t displayWidth; 219 int32_t displayHeight; 220 int32_t displayOrientation; 221 222 InactivityTimeout inactivityTimeout; 223 224 Presentation presentation; 225 bool presentationChanged; 226 227 int32_t pointerFadeDirection; 228 float pointerX; 229 float pointerY; 230 float pointerAlpha; 231 sp<Sprite> pointerSprite; 232 SpriteIcon pointerIcon; 233 bool pointerIconChanged; 234 235 int32_t buttonState; 236 237 Vector<Spot*> spots; 238 Vector<sp<Sprite> > recycledSprites; 239 } mLocked; 240 241 bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const; 242 void setPositionLocked(float x, float y); 243 244 void handleMessage(const Message& message); 245 void doAnimate(); 246 void doInactivityTimeout(); 247 248 void startAnimationLocked(); 249 250 void resetInactivityTimeoutLocked(); 251 void removeInactivityTimeoutLocked(); 252 void updatePointerLocked(); 253 254 Spot* getSpotLocked(uint32_t id); 255 Spot* createAndAddSpotLocked(uint32_t id); 256 Spot* removeFirstFadingSpotLocked(); 257 void releaseSpotLocked(Spot* spot); 258 void fadeOutAndReleaseSpotLocked(Spot* spot); 259 void fadeOutAndReleaseAllSpotsLocked(); 260 261 void loadResources(); 262 }; 263 264 } // namespace android 265 266 #endif // _UI_POINTER_CONTROLLER_H 267