PointerController.cpp revision d41cff2d3a95963a7aa348e502c6d42bae367235
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#define LOG_TAG "PointerController" 18b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 19b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown//#define LOG_NDEBUG 0 20b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 21b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown// Log debug messages about pointer updates 22b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#define DEBUG_POINTER_UPDATES 0 23b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 24b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "PointerController.h" 25b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 26b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <cutils/log.h> 27b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 28b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <SkBitmap.h> 29b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <SkCanvas.h> 30b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <SkColor.h> 31b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <SkPaint.h> 32b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include <SkXfermode.h> 33b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 34b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownnamespace android { 35b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 36b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown// --- PointerController --- 37b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 3805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown// Time to wait before starting the fade when the pointer is inactive. 3905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownstatic const nsecs_t INACTIVITY_FADE_DELAY_TIME_NORMAL = 15 * 1000 * 1000000LL; // 15 seconds 4005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownstatic const nsecs_t INACTIVITY_FADE_DELAY_TIME_SHORT = 3 * 1000 * 1000000LL; // 3 seconds 4105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 4205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown// Time to spend fading out the pointer completely. 4305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownstatic const nsecs_t FADE_DURATION = 500 * 1000000LL; // 500 ms 4405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 4505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown// Time to wait between frames. 4605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownstatic const nsecs_t FADE_FRAME_INTERVAL = 1000000000LL / 60; 4705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 4805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown// Amount to subtract from alpha per frame. 4905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownstatic const float FADE_DECAY_PER_FRAME = float(FADE_FRAME_INTERVAL) / FADE_DURATION; 5005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 5105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 5205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownPointerController::PointerController(const sp<Looper>& looper, int32_t pointerLayer) : 5305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLooper(looper), mPointerLayer(pointerLayer) { 54b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 55b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 56b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.displayWidth = -1; 57b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.displayHeight = -1; 58b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.displayOrientation = DISPLAY_ORIENTATION_0; 59b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 60b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerX = 0; 61b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerY = 0; 62b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.buttonState = 0; 63b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 64b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.iconBitmap = NULL; 65b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.iconHotSpotX = 0; 66b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.iconHotSpotY = 0; 67b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 6805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.fadeAlpha = 1; 6905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.inactivityFadeDelay = INACTIVITY_FADE_DELAY_NORMAL; 7005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 71b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.wantVisible = false; 72b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.visible = false; 73b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.drawn = false; 7405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 7505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mHandler = new WeakMessageHandler(this); 76b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 77b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 78b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff BrownPointerController::~PointerController() { 7905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLooper->removeMessages(mHandler); 8005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 81b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mSurfaceControl != NULL) { 82b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mSurfaceControl->clear(); 83b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mSurfaceControl.clear(); 84b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 85b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 86b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mSurfaceComposerClient != NULL) { 87b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mSurfaceComposerClient->dispose(); 88b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mSurfaceComposerClient.clear(); 89b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 90b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 91b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown delete mLocked.iconBitmap; 92b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 93b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 94b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownbool PointerController::getBounds(float* outMinX, float* outMinY, 95b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float* outMaxX, float* outMaxY) const { 96b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 97b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 98b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return getBoundsLocked(outMinX, outMinY, outMaxX, outMaxY); 99b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 100b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 101b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownbool PointerController::getBoundsLocked(float* outMinX, float* outMinY, 102b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float* outMaxX, float* outMaxY) const { 103b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mLocked.displayWidth <= 0 || mLocked.displayHeight <= 0) { 104b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 105b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 106b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 107b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *outMinX = 0; 108b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *outMinY = 0; 109b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown switch (mLocked.displayOrientation) { 110b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_90: 111b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_270: 112d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown *outMaxX = mLocked.displayHeight - 1; 113d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown *outMaxY = mLocked.displayWidth - 1; 114b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 115b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown default: 116d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown *outMaxX = mLocked.displayWidth - 1; 117d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown *outMaxY = mLocked.displayHeight - 1; 118b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 119b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 120b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return true; 121b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 122b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 123b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::move(float deltaX, float deltaY) { 124b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#if DEBUG_POINTER_UPDATES 125b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGD("Move pointer by deltaX=%0.3f, deltaY=%0.3f", deltaX, deltaY); 126b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#endif 127b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (deltaX == 0.0f && deltaY == 0.0f) { 128b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return; 129b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 130b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 131b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 132b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 133b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown setPositionLocked(mLocked.pointerX + deltaX, mLocked.pointerY + deltaY); 134b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 135b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 136b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::setButtonState(uint32_t buttonState) { 137b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#if DEBUG_POINTER_UPDATES 138b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGD("Set button state 0x%08x", buttonState); 139b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#endif 140b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 141b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 142b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mLocked.buttonState != buttonState) { 143b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.buttonState = buttonState; 14405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown unfadeBeforeUpdateLocked(); 145b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown updateLocked(); 146b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 147b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 148b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 149b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownuint32_t PointerController::getButtonState() const { 150b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 151b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 152b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return mLocked.buttonState; 153b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 154b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 155b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::setPosition(float x, float y) { 156b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#if DEBUG_POINTER_UPDATES 157b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGD("Set pointer position to x=%0.3f, y=%0.3f", x, y); 158b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#endif 159b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 160b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 161b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown setPositionLocked(x, y); 162b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 163b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 164b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::setPositionLocked(float x, float y) { 165b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float minX, minY, maxX, maxY; 166b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) { 167b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (x <= minX) { 168b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerX = minX; 169b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } else if (x >= maxX) { 170b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerX = maxX; 171b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } else { 172b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerX = x; 173b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 174b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (y <= minY) { 175b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerY = minY; 176b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } else if (y >= maxY) { 177b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerY = maxY; 178b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } else { 179b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerY = y; 180b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 18105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown unfadeBeforeUpdateLocked(); 182b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown updateLocked(); 183b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 184b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 185b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 186b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::getPosition(float* outX, float* outY) const { 187b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 188b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 189b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *outX = mLocked.pointerX; 190b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *outY = mLocked.pointerY; 191b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 192b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 19305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::fade() { 19405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 19505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 19605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown startFadeLocked(); 19705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 19805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 19905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::unfade() { 20005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 20105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 20205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (unfadeBeforeUpdateLocked()) { 20305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown updateLocked(); 20405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 20505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 20605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 20705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::setInactivityFadeDelay(InactivityFadeDelay inactivityFadeDelay) { 20805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 20905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 21005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (mLocked.inactivityFadeDelay != inactivityFadeDelay) { 21105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.inactivityFadeDelay = inactivityFadeDelay; 21205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown startInactivityFadeDelayLocked(); 21305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 21405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 21505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 216b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::updateLocked() { 217b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown bool wantVisibleAndHavePointerIcon = mLocked.wantVisible && mLocked.iconBitmap; 218b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 219b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (wantVisibleAndHavePointerIcon) { 220b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown // Want the pointer to be visible. 221b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown // Ensure the surface is created and drawn. 222b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (!createSurfaceIfNeededLocked() || !drawPointerIfNeededLocked()) { 223b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return; 224b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 225b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } else { 226b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown // Don't want the pointer to be visible. 227b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown // If it is not visible then we are done. 228b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mSurfaceControl == NULL || !mLocked.visible) { 229b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return; 230b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 231b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 232b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 233b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status_t status = mSurfaceComposerClient->openTransaction(); 234b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 235b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error opening surface transaction to update pointer surface."); 236b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return; 237b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 238b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 239b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (wantVisibleAndHavePointerIcon) { 240b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = mSurfaceControl->setPosition( 241b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerX - mLocked.iconHotSpotX, 242b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerY - mLocked.iconHotSpotY); 243b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 244b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error %d moving pointer surface.", status); 245b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown goto CloseTransaction; 246b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 247b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 24805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown status = mSurfaceControl->setAlpha(mLocked.fadeAlpha); 24905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (status) { 25005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown LOGE("Error %d setting pointer surface alpha.", status); 25105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown goto CloseTransaction; 25205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 25305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 254b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (!mLocked.visible) { 255b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = mSurfaceControl->setLayer(mPointerLayer); 256b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 257b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error %d setting pointer surface layer.", status); 258b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown goto CloseTransaction; 259b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 260b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 261b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = mSurfaceControl->show(mPointerLayer); 262b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 263b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error %d showing pointer surface.", status); 264b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown goto CloseTransaction; 265b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 266b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 267b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.visible = true; 268b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 269b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } else { 270b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mLocked.visible) { 271b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = mSurfaceControl->hide(); 272b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 273b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error %d hiding pointer surface.", status); 274b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown goto CloseTransaction; 275b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 276b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 277b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.visible = false; 278b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 279b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 280b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 281b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff BrownCloseTransaction: 282b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = mSurfaceComposerClient->closeTransaction(); 283b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 284b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error closing surface transaction to update pointer surface."); 285b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 286b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 287b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 288b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::setDisplaySize(int32_t width, int32_t height) { 289b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 290b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 291b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mLocked.displayWidth != width || mLocked.displayHeight != height) { 292b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.displayWidth = width; 293b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.displayHeight = height; 294b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 295b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown float minX, minY, maxX, maxY; 296b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) { 297b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerX = (minX + maxX) * 0.5f; 298b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerY = (minY + maxY) * 0.5f; 299b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } else { 300b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerX = 0; 301b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.pointerY = 0; 302b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 303b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 304b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown updateLocked(); 305b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 306b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 307b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 308b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::setDisplayOrientation(int32_t orientation) { 309b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 310b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 311b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mLocked.displayOrientation != orientation) { 312d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown // Apply offsets to convert from the pixel top-left corner position to the pixel center. 313d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown // This creates an invariant frame of reference that we can easily rotate when 314d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown // taking into account that the pointer may be located at fractional pixel offsets. 315d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown float x = mLocked.pointerX + 0.5f; 316d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown float y = mLocked.pointerY + 0.5f; 317d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown float temp; 318d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown 319d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown // Undo the previous rotation. 320b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown switch (mLocked.displayOrientation) { 321b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_90: 322d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown temp = x; 323d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown x = mLocked.displayWidth - y; 324d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown y = temp; 325b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 326b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_180: 327d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown x = mLocked.displayWidth - x; 328d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown y = mLocked.displayHeight - y; 329b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 330b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_270: 331d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown temp = x; 332d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown x = y; 333d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown y = mLocked.displayHeight - temp; 334b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 335b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 336b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 337d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown // Perform the new rotation. 338b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown switch (orientation) { 339b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_90: 340d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown temp = x; 341d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown x = y; 342d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown y = mLocked.displayWidth - x; 343b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 344b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_180: 345d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown x = mLocked.displayWidth - x; 346d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown y = mLocked.displayHeight - y; 347b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 348b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown case DISPLAY_ORIENTATION_270: 349d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown temp = x; 350d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown x = mLocked.displayHeight - y; 351d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown y = temp; 352b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown break; 353b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 354b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 355d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown // Apply offsets to convert from the pixel center to the pixel top-left corner position 356d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown // and save the results. 357d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown mLocked.pointerX = x - 0.5f; 358d41cff2d3a95963a7aa348e502c6d42bae367235Jeff Brown mLocked.pointerY = y - 0.5f; 359b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.displayOrientation = orientation; 360b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 361b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown updateLocked(); 362b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 363b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 364b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 365b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownvoid PointerController::setPointerIcon(const SkBitmap* bitmap, float hotSpotX, float hotSpotY) { 366b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown AutoMutex _l(mLock); 367b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 368f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown if (mLocked.iconBitmap) { 369f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown delete mLocked.iconBitmap; 370f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown mLocked.iconBitmap = NULL; 371f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown } 372f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown 373f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown if (bitmap) { 374f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown mLocked.iconBitmap = new SkBitmap(); 375f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown bitmap->copyTo(mLocked.iconBitmap, SkBitmap::kARGB_8888_Config); 376f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown } 377f5a2ff6f2e5c5ba9dc7ab16f3b7f8f05daf3c159Jeff Brown 378b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.iconHotSpotX = hotSpotX; 379b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.iconHotSpotY = hotSpotY; 380b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.drawn = false; 381b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 382b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 383b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownbool PointerController::createSurfaceIfNeededLocked() { 384b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (!mLocked.iconBitmap) { 385b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown // If we don't have a pointer icon, then no point allocating a surface now. 386b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 387b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 388b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 389b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mSurfaceComposerClient == NULL) { 390b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mSurfaceComposerClient = new SurfaceComposerClient(); 391b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 392b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 393b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mSurfaceControl == NULL) { 394b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mSurfaceControl = mSurfaceComposerClient->createSurface(getpid(), 395b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown String8("Pointer Icon"), 0, 396b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.iconBitmap->width(), mLocked.iconBitmap->height(), 397b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown PIXEL_FORMAT_RGBA_8888); 398b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (mSurfaceControl == NULL) { 399b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error creating pointer surface."); 400b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 401b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 402b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 403b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return true; 404b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 405b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 406b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownbool PointerController::drawPointerIfNeededLocked() { 407b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (!mLocked.drawn) { 408b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (!mLocked.iconBitmap) { 409b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 410b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 411b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 412b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (!resizeSurfaceLocked(mLocked.iconBitmap->width(), mLocked.iconBitmap->height())) { 413b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 414b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 415b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 416b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown sp<Surface> surface = mSurfaceControl->getSurface(); 417b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 418b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown Surface::SurfaceInfo surfaceInfo; 419b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status_t status = surface->lock(&surfaceInfo); 420b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 421b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error %d locking pointer surface before drawing.", status); 422b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 423b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 424b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 425b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown SkBitmap surfaceBitmap; 426b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown ssize_t bpr = surfaceInfo.s * bytesPerPixel(surfaceInfo.format); 427b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown surfaceBitmap.setConfig(SkBitmap::kARGB_8888_Config, surfaceInfo.w, surfaceInfo.h, bpr); 428b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown surfaceBitmap.setPixels(surfaceInfo.bits); 429b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 430b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown SkCanvas surfaceCanvas; 431b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown surfaceCanvas.setBitmapDevice(surfaceBitmap); 432b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 433b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown SkPaint paint; 434b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown paint.setXfermodeMode(SkXfermode::kSrc_Mode); 435b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown surfaceCanvas.drawBitmap(*mLocked.iconBitmap, 0, 0, &paint); 436b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 437b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = surface->unlockAndPost(); 438b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 439b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error %d unlocking pointer surface after drawing.", status); 440b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 441b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 442b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 443b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 444b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mLocked.drawn = true; 445b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return true; 446b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 447b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 448b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brownbool PointerController::resizeSurfaceLocked(int32_t width, int32_t height) { 449b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status_t status = mSurfaceComposerClient->openTransaction(); 450b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 451b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error opening surface transaction to resize pointer surface."); 452b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 453b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 454b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 455b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = mSurfaceControl->setSize(width, height); 456b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 457b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error %d setting pointer surface size.", status); 458b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 459b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 460b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 461b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown status = mSurfaceComposerClient->closeTransaction(); 462b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown if (status) { 463b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown LOGE("Error closing surface transaction to resize pointer surface."); 464b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return false; 465b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown } 466b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 467b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown return true; 468b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} 469b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 47005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::handleMessage(const Message& message) { 47105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown switch (message.what) { 47205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown case MSG_FADE_STEP: { 47305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown AutoMutex _l(mLock); 47405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown fadeStepLocked(); 47505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown break; 47605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 47705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 47805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 47905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 48005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownbool PointerController::unfadeBeforeUpdateLocked() { 48105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sendFadeStepMessageDelayedLocked(getInactivityFadeDelayTimeLocked()); 48205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 48305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (isFadingLocked()) { 48405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.wantVisible = true; 48505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.fadeAlpha = 1; 48605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown return true; // update required to effect the unfade 48705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 48805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown return false; // update not required 48905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 49005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 49105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::startFadeLocked() { 49205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (!isFadingLocked()) { 49305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sendFadeStepMessageDelayedLocked(0); 49405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 49505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 49605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 49705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::startInactivityFadeDelayLocked() { 49805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (!isFadingLocked()) { 49905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sendFadeStepMessageDelayedLocked(getInactivityFadeDelayTimeLocked()); 50005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 50105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 50205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 50305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::fadeStepLocked() { 50405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (mLocked.wantVisible) { 50505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.fadeAlpha -= FADE_DECAY_PER_FRAME; 50605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown if (mLocked.fadeAlpha < 0) { 50705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.fadeAlpha = 0; 50805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLocked.wantVisible = false; 50905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } else { 51005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown sendFadeStepMessageDelayedLocked(FADE_FRAME_INTERVAL); 51105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 51205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown updateLocked(); 51305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 51405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 51505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 51605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownbool PointerController::isFadingLocked() { 51705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown return !mLocked.wantVisible || mLocked.fadeAlpha != 1; 51805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 51905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 52005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownnsecs_t PointerController::getInactivityFadeDelayTimeLocked() { 52105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown return mLocked.inactivityFadeDelay == INACTIVITY_FADE_DELAY_SHORT 52205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown ? INACTIVITY_FADE_DELAY_TIME_SHORT : INACTIVITY_FADE_DELAY_TIME_NORMAL; 52305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 52405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 52505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownvoid PointerController::sendFadeStepMessageDelayedLocked(nsecs_t delayTime) { 52605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLooper->removeMessages(mHandler, MSG_FADE_STEP); 52705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mLooper->sendMessageDelayed(delayTime, mHandler, Message(MSG_FADE_STEP)); 52805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown} 52905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 530b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown} // namespace android 531