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
205541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown#include "SpriteController.h"
215541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown
22b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <ui/DisplayInfo.h>
239d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/Input.h>
248a90e6e3174083f274538567d851f98478fc83e9Jeff Brown#include <utils/BitSet.h>
25b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <utils/RefBase.h>
2605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown#include <utils/Looper.h>
27b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <utils/String8.h>
28b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
29b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <SkBitmap.h>
30b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
31b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownnamespace android {
32b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
33b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown/**
342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * Interface for tracking a mouse / touch pad pointer and touch pad spots.
352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown *
362352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * The spots are sprites on screen that visually represent the positions of
372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * fingers
38b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
39b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * The pointer controller is responsible for providing synchronization and for tracking
40b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * display orientation changes if needed.
41b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown */
42b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownclass PointerControllerInterface : public virtual RefBase {
43b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownprotected:
44b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    PointerControllerInterface() { }
45b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual ~PointerControllerInterface() { }
46b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
47b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownpublic:
48b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    /* Gets the bounds of the region that the pointer can traverse.
49b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown     * Returns true if the bounds are available. */
50b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual bool getBounds(float* outMinX, float* outMinY,
51b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            float* outMaxX, float* outMaxY) const = 0;
52b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
53b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    /* Move the pointer. */
54b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual void move(float deltaX, float deltaY) = 0;
55b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
56b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    /* Sets a mask that indicates which buttons are pressed. */
57fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    virtual void setButtonState(int32_t buttonState) = 0;
58b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
59b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    /* Gets a mask that indicates which buttons are pressed. */
60fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    virtual int32_t getButtonState() const = 0;
61b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
62b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    /* Sets the absolute location of the pointer. */
63b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual void setPosition(float x, float y) = 0;
64b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
65b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    /* Gets the absolute location of the pointer. */
66b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual void getPosition(float* outX, float* outY) const = 0;
6705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
68538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    enum Transition {
69538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        // Fade/unfade immediately.
70538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        TRANSITION_IMMEDIATE,
71538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        // Fade/unfade gradually.
72538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        TRANSITION_GRADUAL,
73538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    };
74538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown
7505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    /* Fades the pointer out now. */
76538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    virtual void fade(Transition transition) = 0;
7705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    /* Makes the pointer visible if it has faded out.
792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * The pointer never unfades itself automatically.  This method must be called
802352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * by the client whenever the pointer is moved or a button is pressed and it
812352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * wants to ensure that the pointer becomes visible again. */
82538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    virtual void unfade(Transition transition) = 0;
832352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
842352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    enum Presentation {
852352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        // Show the mouse pointer.
862352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        PRESENTATION_POINTER,
872352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        // Show spots and a spot anchor in place of the mouse pointer.
882352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        PRESENTATION_SPOT,
892352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    };
902352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
912352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    /* Sets the mode of the pointer controller. */
922352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void setPresentation(Presentation presentation) = 0;
932352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
942352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    /* Sets the spots for the current gesture.
952352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * The spots are not subject to the inactivity timeout like the pointer
962352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * itself it since they are expected to remain visible for so long as
972352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * the fingers are on the touch pad.
982352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     *
992352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * The values of the AMOTION_EVENT_AXIS_PRESSURE axis is significant.
1002352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * For spotCoords, pressure != 0 indicates that the spot's location is being
1012352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     * pressed (not hovering).
1022352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown     */
103cb5ffcf0e41d2597401208221c61589547a00f3dJeff Brown    virtual void setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex,
1042352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            BitSet32 spotIdBits) = 0;
1052352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1062352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    /* Removes all spots. */
1072352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void clearSpots() = 0;
1082352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown};
1092352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1102352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1112352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown/*
1122352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * Pointer resources.
1132352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown */
1142352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownstruct PointerResources {
1152352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    SpriteIcon spotHover;
1162352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    SpriteIcon spotTouch;
1172352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    SpriteIcon spotAnchor;
1182352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown};
1192352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1202352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1212352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown/*
1222352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * Pointer controller policy interface.
1232352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown *
1242352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * The pointer controller policy is used by the pointer controller to interact with
1252352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * the Window Manager and other system components.
1262352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown *
1272352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * The actual implementation is partially supported by callbacks into the DVM
1282352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown * via JNI.  This interface is also mocked in the unit tests.
1292352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown */
1302352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownclass PointerControllerPolicyInterface : public virtual RefBase {
1312352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownprotected:
1322352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    PointerControllerPolicyInterface() { }
1332352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual ~PointerControllerPolicyInterface() { }
1342352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1352352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brownpublic:
1362352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void loadPointerResources(PointerResources* outResources) = 0;
137b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown};
138b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
139b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
140b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown/*
141b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Tracks pointer movements and draws the pointer sprite to a surface.
142b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
143b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Handles pointer acceleration and animation.
144b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown */
14505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownclass PointerController : public PointerControllerInterface, public MessageHandler {
146b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownprotected:
147b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual ~PointerController();
148b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
149b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownpublic:
1502352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    enum InactivityTimeout {
1512352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        INACTIVITY_TIMEOUT_NORMAL = 0,
1522352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        INACTIVITY_TIMEOUT_SHORT = 1,
15305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    };
15405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
1552352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    PointerController(const sp<PointerControllerPolicyInterface>& policy,
1562352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            const sp<Looper>& looper, const sp<SpriteController>& spriteController);
157b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
158b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual bool getBounds(float* outMinX, float* outMinY,
159b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            float* outMaxX, float* outMaxY) const;
160b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual void move(float deltaX, float deltaY);
161fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    virtual void setButtonState(int32_t buttonState);
162fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    virtual int32_t getButtonState() const;
163b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual void setPosition(float x, float y);
164b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    virtual void getPosition(float* outX, float* outY) const;
165538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    virtual void fade(Transition transition);
166538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    virtual void unfade(Transition transition);
167b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
1682352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void setPresentation(Presentation presentation);
169cb5ffcf0e41d2597401208221c61589547a00f3dJeff Brown    virtual void setSpots(const PointerCoords* spotCoords,
170cb5ffcf0e41d2597401208221c61589547a00f3dJeff Brown            const uint32_t* spotIdToIndex, BitSet32 spotIdBits);
1712352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void clearSpots();
1722352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
173d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    void setDisplayViewport(int32_t width, int32_t height, int32_t orientation);
1742352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void setPointerIcon(const SpriteIcon& icon);
1752352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void setInactivityTimeout(InactivityTimeout inactivityTimeout);
176b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
177b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownprivate:
1782352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    static const size_t MAX_RECYCLED_SPRITES = 12;
1792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    static const size_t MAX_SPOTS = 12;
1802352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
18105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    enum {
1822352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        MSG_ANIMATE,
1832352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        MSG_INACTIVITY_TIMEOUT,
1842352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    };
1852352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1862352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    struct Spot {
1872352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        static const uint32_t INVALID_ID = 0xffffffff;
1882352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1892352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        uint32_t id;
1902352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        sp<Sprite> sprite;
1912352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float alpha;
1922352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float scale;
1932352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float x, y;
1942352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1952352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        inline Spot(uint32_t id, const sp<Sprite>& sprite)
1962352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown                : id(id), sprite(sprite), alpha(1.0f), scale(1.0f),
1972352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown                  x(0.0f), y(0.0f), lastIcon(NULL) { }
1982352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1992352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        void updateSprite(const SpriteIcon* icon, float x, float y);
2002352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
2012352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    private:
2022352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        const SpriteIcon* lastIcon;
20305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    };
20405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
205b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    mutable Mutex mLock;
206b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
2072352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    sp<PointerControllerPolicyInterface> mPolicy;
20805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<Looper> mLooper;
2095541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown    sp<SpriteController> mSpriteController;
2105541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown    sp<WeakMessageHandler> mHandler;
211b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
2122352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    PointerResources mResources;
2132352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
214b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    struct Locked {
2152352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        bool animationPending;
2162352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        nsecs_t animationTime;
2172352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
218b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown        int32_t displayWidth;
219b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown        int32_t displayHeight;
220b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown        int32_t displayOrientation;
221b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
2222352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        InactivityTimeout inactivityTimeout;
2232352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
2242352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        Presentation presentation;
2252352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        bool presentationChanged;
2262352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
227538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        int32_t pointerFadeDirection;
228b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown        float pointerX;
229b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown        float pointerY;
2302352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float pointerAlpha;
2312352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        sp<Sprite> pointerSprite;
2322352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        SpriteIcon pointerIcon;
2332352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        bool pointerIconChanged;
234b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
235fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        int32_t buttonState;
236b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
2372352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        Vector<Spot*> spots;
2382352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        Vector<sp<Sprite> > recycledSprites;
2395541de9ea3513a12d1ac2ad07e7e04a3aa7741a0Jeff Brown    } mLocked;
24005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
241b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    bool getBoundsLocked(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const;
242b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    void setPositionLocked(float x, float y);
24305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
24405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    void handleMessage(const Message& message);
2452352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void doAnimate();
2462352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void doInactivityTimeout();
2472352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
2482352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void startAnimationLocked();
2492352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
2502352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void resetInactivityTimeoutLocked();
251538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    void removeInactivityTimeoutLocked();
2522352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void updatePointerLocked();
2532352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
2542352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    Spot* getSpotLocked(uint32_t id);
2552352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    Spot* createAndAddSpotLocked(uint32_t id);
2562352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    Spot* removeFirstFadingSpotLocked();
2572352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void releaseSpotLocked(Spot* spot);
2582352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void fadeOutAndReleaseSpotLocked(Spot* spot);
2592352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void fadeOutAndReleaseAllSpotsLocked();
2602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
2612352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    void loadResources();
262b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown};
263b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
264b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} // namespace android
265b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
266b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#endif // _UI_POINTER_CONTROLLER_H
267