• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <thread>
18 
19 #include <gtest/gtest.h>
20 
21 #include <gui/SurfaceComposerClient.h>
22 #include <private/gui/ComposerService.h>
23 
24 static constexpr int kRefreshRateOverlayCode = 1034;
25 static constexpr int kRefreshRateOverlayEnable = 1;
26 static constexpr int kRefreshRateOverlayDisable = 0;
27 static constexpr int kRefreshRateOverlayQuery = 2;
28 
29 // These values must match the ones we used for developer options in
30 // com.android.settings.development.ShowRefreshRatePreferenceController
31 static_assert(kRefreshRateOverlayCode == 1034);
32 static_assert(kRefreshRateOverlayEnable == 1);
33 static_assert(kRefreshRateOverlayDisable == 0);
34 static_assert(kRefreshRateOverlayQuery == 2);
35 
36 namespace android {
37 
38 namespace {
sendCommandToSf(int command,Parcel & reply)39 void sendCommandToSf(int command, Parcel& reply) {
40     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
41     Parcel request;
42     request.writeInterfaceToken(String16("android.ui.ISurfaceComposer"));
43     request.writeInt32(command);
44     ASSERT_EQ(NO_ERROR,
45               IInterface::asBinder(sf)->transact(kRefreshRateOverlayCode, request, &reply));
46 }
47 
isOverlayEnabled()48 bool isOverlayEnabled() {
49     Parcel reply;
50     sendCommandToSf(kRefreshRateOverlayQuery, reply);
51     return reply.readBool();
52 }
53 
waitForOverlay(bool enabled)54 void waitForOverlay(bool enabled) {
55     static constexpr auto kTimeout = std::chrono::nanoseconds(1s);
56     static constexpr auto kIterations = 10;
57     for (int i = 0; i < kIterations; i++) {
58         if (enabled == isOverlayEnabled()) {
59             return;
60         }
61         std::this_thread::sleep_for(kTimeout / kIterations);
62     }
63 }
64 
toggleOverlay(bool enabled)65 void toggleOverlay(bool enabled) {
66     if (enabled == isOverlayEnabled()) {
67         return;
68     }
69 
70     Parcel reply;
71     const auto command = enabled ? kRefreshRateOverlayEnable : kRefreshRateOverlayDisable;
72     sendCommandToSf(command, reply);
73     waitForOverlay(enabled);
74     ASSERT_EQ(enabled, isOverlayEnabled());
75 }
76 
77 } // namespace
78 
TEST(RefreshRateOverlayTest,enableOverlay)79 TEST(RefreshRateOverlayTest, enableOverlay) {
80     toggleOverlay(true);
81 }
82 
TEST(RefreshRateOverlayTest,disableOverlay)83 TEST(RefreshRateOverlayTest, disableOverlay) {
84     toggleOverlay(false);
85 }
86 
TEST(RefreshRateOverlayTest,enableAndDisableOverlay)87 TEST(RefreshRateOverlayTest, enableAndDisableOverlay) {
88     toggleOverlay(true);
89     toggleOverlay(false);
90 
91     toggleOverlay(true);
92     toggleOverlay(false);
93 }
94 
95 } // namespace android