PointerController.h revision a6dbfdd3a858aac52cc87f80f91e8eef7d613605
1b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown/* 2b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Copyright (C) 2010 The Android Open Source Project 3b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * 4b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * you may not use this file except in compliance with the License. 6b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * You may obtain a copy of the License at 7b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * 8b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * 10b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Unless required by applicable law or agreed to in writing, software 11b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * See the License for the specific language governing permissions and 14b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * limitations under the License. 15b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown */ 16b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 17b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#ifndef _UI_POINTER_CONTROLLER_H 18b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#define _UI_POINTER_CONTROLLER_H 19b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 20a6dbfdd3a858aac52cc87f80f91e8eef7d613605Jeff Brown#include "SpriteController.h" 21a6dbfdd3a858aac52cc87f80f91e8eef7d613605Jeff Brown 22b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <ui/DisplayInfo.h> 2305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown#include <ui/Input.h> 24b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <utils/RefBase.h> 2505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown#include <utils/Looper.h> 26b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <utils/String8.h> 27b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 28b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <SkBitmap.h> 29b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 30b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownnamespace android { 31b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 32b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown/** 33b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Interface for tracking a single (mouse) pointer. 34b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * 35b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * The pointer controller is responsible for providing synchronization and for tracking 36b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * display orientation changes if needed. 37b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown */ 38b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownclass PointerControllerInterface : public virtual RefBase { 39b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownprotected: 40b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown PointerControllerInterface() { } 41b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual ~PointerControllerInterface() { } 42b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 43b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownpublic: 44b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown /* Gets the bounds of the region that the pointer can traverse. 45b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Returns true if the bounds are available. */ 46b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual bool getBounds(float* outMinX, float* outMinY, 47b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float* outMaxX, float* outMaxY) const = 0; 48b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 49b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown /* Move the pointer. */ 50b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void move(float deltaX, float deltaY) = 0; 51b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 52b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown /* Sets a mask that indicates which buttons are pressed. */ 53b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void setButtonState(uint32_t buttonState) = 0; 54b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 55b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown /* Gets a mask that indicates which buttons are pressed. */ 56b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual uint32_t getButtonState() const = 0; 57b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 58b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown /* Sets the absolute location of the pointer. */ 59b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void setPosition(float x, float y) = 0; 60b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 61b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown /* Gets the absolute location of the pointer. */ 62b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void getPosition(float* outX, float* outY) const = 0; 6305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown /* Fades the pointer out now. */ 6505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void fade() = 0; 6605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 6705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown /* Makes the pointer visible if it has faded out. */ 6805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void unfade() = 0; 69b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown}; 70b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 71b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 72b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown/* 73b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Tracks pointer movements and draws the pointer sprite to a surface. 74b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * 75b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Handles pointer acceleration and animation. 76b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown */ 7705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownclass PointerController : public PointerControllerInterface, public MessageHandler { 78b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownprotected: 79b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual ~PointerController(); 80b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 81b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownpublic: 8205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown enum InactivityFadeDelay { 8305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown INACTIVITY_FADE_DELAY_NORMAL = 0, 8405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown INACTIVITY_FADE_DELAY_SHORT = 1, 8505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown }; 8605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 87a6dbfdd3a858aac52cc87f80f91e8eef7d613605Jeff Brown PointerController(const sp<Looper>& looper, const sp<SpriteController>& spriteController); 88b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 89b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual bool getBounds(float* outMinX, float* outMinY, 90b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float* outMaxX, float* outMaxY) const; 91b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void move(float deltaX, float deltaY); 92b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void setButtonState(uint32_t buttonState); 93b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual uint32_t getButtonState() const; 94b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void setPosition(float x, float y); 95b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown virtual void getPosition(float* outX, float* outY) const; 9605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void fade(); 9705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void unfade(); 98b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 99b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown void setDisplaySize(int32_t width, int32_t height); 100b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown void setDisplayOrientation(int32_t orientation); 101b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown void setPointerIcon(const SkBitmap* bitmap, float hotSpotX, float hotSpotY); 10205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void setInactivityFadeDelay(InactivityFadeDelay inactivityFadeDelay); 103b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 104b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownprivate: 10505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown enum { 10605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown MSG_FADE_STEP = 0, 10705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown }; 10805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 109b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mutable Mutex mLock; 110b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 11105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sp<Looper> mLooper; 112a6dbfdd3a858aac52cc87f80f91e8eef7d613605Jeff Brown sp<SpriteController> mSpriteController; 113a6dbfdd3a858aac52cc87f80f91e8eef7d613605Jeff Brown sp<WeakMessageHandler> mHandler; 114b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 115b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown struct Locked { 116b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown int32_t displayWidth; 117b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown int32_t displayHeight; 118b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown int32_t displayOrientation; 119b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 120b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float pointerX; 121b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float pointerY; 122b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown uint32_t buttonState; 123b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 12405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown float fadeAlpha; 12505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown InactivityFadeDelay inactivityFadeDelay; 12605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 127b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown bool visible; 128b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 129a6dbfdd3a858aac52cc87f80f91e8eef7d613605Jeff Brown sp<Sprite> sprite; 130a6dbfdd3a858aac52cc87f80f91e8eef7d613605Jeff Brown } mLocked; 13105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 132b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const; 133b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown void setPositionLocked(float x, float y); 134b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown void updateLocked(); 13505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 13605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void handleMessage(const Message& message); 13705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown bool unfadeBeforeUpdateLocked(); 13805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void startFadeLocked(); 13905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void startInactivityFadeDelayLocked(); 14005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void fadeStepLocked(); 14105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown bool isFadingLocked(); 14205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown nsecs_t getInactivityFadeDelayTimeLocked(); 14305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown void sendFadeStepMessageDelayedLocked(nsecs_t delayTime); 144b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown}; 145b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 146b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} // namespace android 147b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 148b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#endif // _UI_POINTER_CONTROLLER_H 149