1da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro/* 2da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * Copyright (C) 2017 The Android Open Source Project 3da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * 4da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * Licensed under the Apache License, Version 2.0 (the "License"); 5da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * you may not use this file except in compliance with the License. 6da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * You may obtain a copy of the License at 7da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * 8da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * http://www.apache.org/licenses/LICENSE-2.0 9da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * 10da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * Unless required by applicable law or agreed to in writing, software 11da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * distributed under the License is distributed on an "AS IS" BASIS, 12da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * See the License for the specific language governing permissions and 14da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro * limitations under the License. 15da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro */ 16da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 17da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#include "chre/platform/slpi/see/island_vote_client.h" 18da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 19da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#include <cinttypes> 20da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 21da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#include "chre/platform/assert.h" 22da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#include "chre/platform/fatal_error.h" 23da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#include "chre/platform/log.h" 24da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#include "chre/platform/system_time.h" 25da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#include "chre/util/lock_guard.h" 26da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 27da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguronamespace chre { 28da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 29da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur IshiguroIslandVoteClient::IslandVoteClient(const char *clientName) { 30da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#ifdef CHRE_SLPI_UIMG_ENABLED 31da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro mClientHandle = sns_island_aggregator_register_client(clientName); 32da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro if (mClientHandle == nullptr) { 33da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro FATAL_ERROR("Island aggregator client register failed"); 34da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 35da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#endif // CHRE_SLPI_UIMG_ENABLED 36da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro} 37da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 38da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur IshiguroIslandVoteClient::~IslandVoteClient() { 39da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#ifdef CHRE_SLPI_UIMG_ENABLED 40da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro sns_island_aggregator_deregister_client(mClientHandle); 41da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#endif // CHRE_SLPI_UIMG_ENABLED 42da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro} 43da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 44da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishigurobool IslandVoteClient::voteBigImage(bool bigImage) { 45da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#ifdef CHRE_SLPI_UIMG_ENABLED 46da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro bool success = true; 47da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 48da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro { 49da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro LockGuard<Mutex> lock(mMutex); 50da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro mLastBigImageRequest = bigImage; 51da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 52da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro bool needBigImage = (bigImage || mBigImageRefCount > 0); 53da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro if (needBigImage != mLastBigImageVote) { 54da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro success = voteSnsPowerMode(needBigImage); 55da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro mLastBigImageVote = needBigImage; 56da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 57da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 58da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro return success; 59da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#else 60da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro return true; 61da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#endif // CHRE_SLPI_UIMG_ENABLED 62da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro} 63da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 64da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#ifdef CHRE_SLPI_UIMG_ENABLED 65da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishigurovoid IslandVoteClient::incrementBigImageRefCount() { 66da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro LockGuard<Mutex> lock(mMutex); 67da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 68da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro if (mBigImageRefCount++ == 0) { 69da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro mRefCountStart = Milliseconds(SystemTime::getMonotonicTime()); 70da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro LOGW("Big image ref count begins"); 71da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 72da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro if (!mLastBigImageVote) { 73da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro // Do not call voteBigImage() directly as it will override 74da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro // mLastBigImageRequest. 75da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro voteSnsPowerMode(true /* bigImage */); 76da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro mLastBigImageVote = true; 77da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 78da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 79da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro} 80da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 81da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishigurovoid IslandVoteClient::decrementBigImageRefCount() { 82da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro LockGuard<Mutex> lock(mMutex); 83da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro CHRE_ASSERT_LOG(mBigImageRefCount > 0, 84da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro "Tried to decrement big image ref count when it's 0"); 85da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 86da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro if (--mBigImageRefCount == 0) { 87da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro uint64_t duration = 88da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro Milliseconds(SystemTime::getMonotonicTime()).getMilliseconds() 89da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro - mRefCountStart.getMilliseconds(); 90da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro LOGW("Big image ref count ends: %" PRIu64 " ms", duration); 91da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 92da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro // There's no big image activity now, restore the intended uimg power state. 93da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro if (!mLastBigImageRequest) { 94da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro voteSnsPowerMode(false /* bigImage */); 95da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro mLastBigImageVote = false; 96da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 97da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 98da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro} 99da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 100da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishigurobool IslandVoteClient::voteSnsPowerMode(bool bigImage) { 101da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro sns_rc rc = bigImage 102da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro ? sns_island_block(mClientHandle) : sns_island_unblock(mClientHandle); 103da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 104da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro // TODO: (b/74524281) define success = (rc == SNS_RC_SUCCESS). 105da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro bool success = (rc != SNS_RC_FAILED); 106da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro if (!success) { 107da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro // Note that FATAL_ERROR must not be used here, because this can be called 108da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro // from preFatalError() (not that we should use it here regardless) 109da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro LOGE("Failed to vote for bigImage %d with result %d", bigImage, rc); 110da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro } 111da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro return success; 112da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro} 113da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro#endif // CHRE_SLPI_UIMG_ENABLED 114da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 115da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro//! Explicitly instantiate the IslandVoteClient singleton to reduce code size. 116da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishigurotemplate class Singleton<IslandVoteClient>; 117da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro 118da00f25c26c6aef86160a68f3b70fba98f4c8501Arthur Ishiguro} // namespace chre 119