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