xref: /aosp_15_r20/system/teeui/libteeui/example/touch_button_example.cpp (revision 20bfefbe1966c142a35ae1ab84a8af250b3fd403)
1*20bfefbeSAndroid Build Coastguard Worker /*
2*20bfefbeSAndroid Build Coastguard Worker  * Copyright 2020, The Android Open Source Project
3*20bfefbeSAndroid Build Coastguard Worker  *
4*20bfefbeSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*20bfefbeSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*20bfefbeSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*20bfefbeSAndroid Build Coastguard Worker  *
8*20bfefbeSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*20bfefbeSAndroid Build Coastguard Worker  *
10*20bfefbeSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*20bfefbeSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*20bfefbeSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*20bfefbeSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*20bfefbeSAndroid Build Coastguard Worker  * limitations under the License.
15*20bfefbeSAndroid Build Coastguard Worker  */
16*20bfefbeSAndroid Build Coastguard Worker 
17*20bfefbeSAndroid Build Coastguard Worker #include "touch_button_example.h"
18*20bfefbeSAndroid Build Coastguard Worker 
19*20bfefbeSAndroid Build Coastguard Worker #include <stddef.h>
20*20bfefbeSAndroid Build Coastguard Worker #include <stdint.h>
21*20bfefbeSAndroid Build Coastguard Worker 
22*20bfefbeSAndroid Build Coastguard Worker #include "example_utils.h"
23*20bfefbeSAndroid Build Coastguard Worker #include "layout/touch_button_layout.h"
24*20bfefbeSAndroid Build Coastguard Worker 
25*20bfefbeSAndroid Build Coastguard Worker namespace teeui {
26*20bfefbeSAndroid Build Coastguard Worker namespace example {
27*20bfefbeSAndroid Build Coastguard Worker namespace touch_button {
28*20bfefbeSAndroid Build Coastguard Worker 
translateLabels(Layout * layout)29*20bfefbeSAndroid Build Coastguard Worker template <typename Layout> static void translateLabels(Layout* layout) {
30*20bfefbeSAndroid Build Coastguard Worker     translateLabel<LabelOK>(layout);
31*20bfefbeSAndroid Build Coastguard Worker     translateLabel<LabelCancel>(layout);
32*20bfefbeSAndroid Build Coastguard Worker     translateLabel<LabelTitle>(layout);
33*20bfefbeSAndroid Build Coastguard Worker     translateLabel<LabelHint>(layout);
34*20bfefbeSAndroid Build Coastguard Worker }
35*20bfefbeSAndroid Build Coastguard Worker 
36*20bfefbeSAndroid Build Coastguard Worker class GUIStateTouch : public ITeeuiExample {
37*20bfefbeSAndroid Build Coastguard Worker   private:
38*20bfefbeSAndroid Build Coastguard Worker     bool okTapped_ = false;
39*20bfefbeSAndroid Build Coastguard Worker     bool cancelTapped_ = false;
40*20bfefbeSAndroid Build Coastguard Worker     EventResult eventResult_ = EventResult::NONE;
41*20bfefbeSAndroid Build Coastguard Worker 
42*20bfefbeSAndroid Build Coastguard Worker   public:
43*20bfefbeSAndroid Build Coastguard Worker     bool inverted_;
44*20bfefbeSAndroid Build Coastguard Worker     std::string confirmationMessage_;
45*20bfefbeSAndroid Build Coastguard Worker     layout_t<ConfUILayout> layoutInstance_ = {};
46*20bfefbeSAndroid Build Coastguard Worker 
GUIStateTouch()47*20bfefbeSAndroid Build Coastguard Worker     GUIStateTouch() : okTapped_(false), cancelTapped_(false), inverted_(false), layoutInstance_{} {}
48*20bfefbeSAndroid Build Coastguard Worker 
isOkTapped() const49*20bfefbeSAndroid Build Coastguard Worker     bool isOkTapped() const { return okTapped_; }
isCancelTapped() const50*20bfefbeSAndroid Build Coastguard Worker     bool isCancelTapped() const { return cancelTapped_; }
51*20bfefbeSAndroid Build Coastguard Worker 
tapOk(Event e)52*20bfefbeSAndroid Build Coastguard Worker     Error tapOk(Event e) {
53*20bfefbeSAndroid Build Coastguard Worker         if (e.event_ == EventType::KeyUp) {
54*20bfefbeSAndroid Build Coastguard Worker             okTapped_ = true;
55*20bfefbeSAndroid Build Coastguard Worker             eventResult_ = EventResult::CONFIRM;
56*20bfefbeSAndroid Build Coastguard Worker         }
57*20bfefbeSAndroid Build Coastguard Worker         return Error::OK;
58*20bfefbeSAndroid Build Coastguard Worker     }
59*20bfefbeSAndroid Build Coastguard Worker 
tapCancel(Event e)60*20bfefbeSAndroid Build Coastguard Worker     Error tapCancel(Event e) {
61*20bfefbeSAndroid Build Coastguard Worker         if (e.event_ == EventType::KeyUp) {
62*20bfefbeSAndroid Build Coastguard Worker             cancelTapped_ = true;
63*20bfefbeSAndroid Build Coastguard Worker             eventResult_ = EventResult::CANCEL;
64*20bfefbeSAndroid Build Coastguard Worker         }
65*20bfefbeSAndroid Build Coastguard Worker         return Error::OK;
66*20bfefbeSAndroid Build Coastguard Worker     }
67*20bfefbeSAndroid Build Coastguard Worker 
selectLanguage(const char * language_id)68*20bfefbeSAndroid Build Coastguard Worker     void selectLanguage(const char* language_id) override {
69*20bfefbeSAndroid Build Coastguard Worker         teeui::localization::selectLangId(language_id);
70*20bfefbeSAndroid Build Coastguard Worker         translateLabels(&layoutInstance_);
71*20bfefbeSAndroid Build Coastguard Worker     }
72*20bfefbeSAndroid Build Coastguard Worker 
setConfirmationMessage(std::string confirmationMessage)73*20bfefbeSAndroid Build Coastguard Worker     void setConfirmationMessage(std::string confirmationMessage) override {
74*20bfefbeSAndroid Build Coastguard Worker         confirmationMessage_ = std::move(confirmationMessage);
75*20bfefbeSAndroid Build Coastguard Worker         std::get<LabelBody>(layoutInstance_)
76*20bfefbeSAndroid Build Coastguard Worker             .setText({&*confirmationMessage_.begin(), &*confirmationMessage_.end()});
77*20bfefbeSAndroid Build Coastguard Worker     }
78*20bfefbeSAndroid Build Coastguard Worker 
79*20bfefbeSAndroid Build Coastguard Worker     uint32_t setDeviceInfo(DeviceInfo device_info, bool magnified, bool inverted = false) override;
80*20bfefbeSAndroid Build Coastguard Worker 
81*20bfefbeSAndroid Build Coastguard Worker     EventResult onEvent(uint32_t x, uint32_t y, uint32_t) override;
82*20bfefbeSAndroid Build Coastguard Worker 
83*20bfefbeSAndroid Build Coastguard Worker     uint32_t renderUIIntoBuffer(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t lineStride,
84*20bfefbeSAndroid Build Coastguard Worker                                 uint32_t* buffer,
85*20bfefbeSAndroid Build Coastguard Worker                                 size_t buffer_size_in_elements_not_bytes) override;
86*20bfefbeSAndroid Build Coastguard Worker };
87*20bfefbeSAndroid Build Coastguard Worker 
createTeeuiExample()88*20bfefbeSAndroid Build Coastguard Worker std::unique_ptr<ITeeuiExample> createTeeuiExample() {
89*20bfefbeSAndroid Build Coastguard Worker     return std::make_unique<GUIStateTouch>();
90*20bfefbeSAndroid Build Coastguard Worker }
91*20bfefbeSAndroid Build Coastguard Worker 
onEvent(uint32_t x,uint32_t y,uint32_t)92*20bfefbeSAndroid Build Coastguard Worker EventResult GUIStateTouch::onEvent(uint32_t x, uint32_t y, uint32_t) {
93*20bfefbeSAndroid Build Coastguard Worker     eventResult_ = EventResult::NONE;
94*20bfefbeSAndroid Build Coastguard Worker     Event event{x, y, EventType::KeyUp};
95*20bfefbeSAndroid Build Coastguard Worker     handleAllEvent(layoutInstance_, event);
96*20bfefbeSAndroid Build Coastguard Worker     return eventResult_;
97*20bfefbeSAndroid Build Coastguard Worker }
98*20bfefbeSAndroid Build Coastguard Worker 
setLayoutParams(DeviceInfo & deviceInfo,bool magnified,bool inverted)99*20bfefbeSAndroid Build Coastguard Worker static context<ConfUIParameters> setLayoutParams(DeviceInfo& deviceInfo, bool magnified,
100*20bfefbeSAndroid Build Coastguard Worker                                                  bool inverted) {
101*20bfefbeSAndroid Build Coastguard Worker     context<ConfUIParameters> ctx(deviceInfo.mm2px_, deviceInfo.dp2px_);
102*20bfefbeSAndroid Build Coastguard Worker     ctx.setParam<RightEdgeOfScreen>(pxs(deviceInfo.width_));
103*20bfefbeSAndroid Build Coastguard Worker     ctx.setParam<BottomOfScreen>(pxs(deviceInfo.height_));
104*20bfefbeSAndroid Build Coastguard Worker     if (magnified) {
105*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<DefaultFontSize>(18_dp);
106*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<BodyFontSize>(20_dp);
107*20bfefbeSAndroid Build Coastguard Worker     } else {
108*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<DefaultFontSize>(14_dp);
109*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<BodyFontSize>(16_dp);
110*20bfefbeSAndroid Build Coastguard Worker     }
111*20bfefbeSAndroid Build Coastguard Worker     if (inverted) {
112*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ShieldColor>(kShieldColorInv);
113*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ColorText>(kTextColorInv);
114*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ColorBG>(kBackGroundColorInv);
115*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ColorButton>(kShieldColorInv);
116*20bfefbeSAndroid Build Coastguard Worker     } else {
117*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ShieldColor>(kShieldColor);
118*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ColorText>(kTextColor);
119*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ColorBG>(kBackGroundColor);
120*20bfefbeSAndroid Build Coastguard Worker         ctx.setParam<ColorButton>(kShieldColor);
121*20bfefbeSAndroid Build Coastguard Worker     }
122*20bfefbeSAndroid Build Coastguard Worker     return ctx;
123*20bfefbeSAndroid Build Coastguard Worker }
124*20bfefbeSAndroid Build Coastguard Worker 
setDeviceInfo(DeviceInfo device_info,bool magnified,bool inverted)125*20bfefbeSAndroid Build Coastguard Worker uint32_t GUIStateTouch::setDeviceInfo(DeviceInfo device_info, bool magnified, bool inverted) {
126*20bfefbeSAndroid Build Coastguard Worker     layoutInstance_ =
127*20bfefbeSAndroid Build Coastguard Worker         instantiateLayout(ConfUILayout(), setLayoutParams(device_info, magnified, inverted));
128*20bfefbeSAndroid Build Coastguard Worker     inverted_ = inverted;
129*20bfefbeSAndroid Build Coastguard Worker     std::get<LabelOK>(layoutInstance_)
130*20bfefbeSAndroid Build Coastguard Worker         .setCB(makeCallback<Error, Event>(
131*20bfefbeSAndroid Build Coastguard Worker             [](Event e, void* p) -> Error { return reinterpret_cast<GUIStateTouch*>(p)->tapOk(e); },
132*20bfefbeSAndroid Build Coastguard Worker             this));
133*20bfefbeSAndroid Build Coastguard Worker     std::get<LabelCancel>(layoutInstance_)
134*20bfefbeSAndroid Build Coastguard Worker         .setCB(makeCallback<Error, Event>(
135*20bfefbeSAndroid Build Coastguard Worker             [](Event e, void* p) -> Error {
136*20bfefbeSAndroid Build Coastguard Worker                 return reinterpret_cast<GUIStateTouch*>(p)->tapCancel(e);
137*20bfefbeSAndroid Build Coastguard Worker             },
138*20bfefbeSAndroid Build Coastguard Worker             this));
139*20bfefbeSAndroid Build Coastguard Worker     return 0;
140*20bfefbeSAndroid Build Coastguard Worker }
141*20bfefbeSAndroid Build Coastguard Worker 
renderUIIntoBuffer(uint32_t x,uint32_t y,uint32_t w,uint32_t h,uint32_t lineStride,uint32_t * buffer,size_t buffer_size_in_elements_not_bytes)142*20bfefbeSAndroid Build Coastguard Worker uint32_t GUIStateTouch::renderUIIntoBuffer(uint32_t x, uint32_t y, uint32_t w, uint32_t h,
143*20bfefbeSAndroid Build Coastguard Worker                                            uint32_t lineStride, uint32_t* buffer,
144*20bfefbeSAndroid Build Coastguard Worker                                            size_t buffer_size_in_elements_not_bytes) {
145*20bfefbeSAndroid Build Coastguard Worker     uint32_t afterLastPixelIndex = 0;
146*20bfefbeSAndroid Build Coastguard Worker     if (__builtin_add_overflow(y, h, &afterLastPixelIndex) ||
147*20bfefbeSAndroid Build Coastguard Worker         __builtin_add_overflow(afterLastPixelIndex, -1, &afterLastPixelIndex) ||
148*20bfefbeSAndroid Build Coastguard Worker         __builtin_mul_overflow(afterLastPixelIndex, lineStride, &afterLastPixelIndex) ||
149*20bfefbeSAndroid Build Coastguard Worker         __builtin_add_overflow(afterLastPixelIndex, x, &afterLastPixelIndex) ||
150*20bfefbeSAndroid Build Coastguard Worker         __builtin_add_overflow(afterLastPixelIndex, w, &afterLastPixelIndex) ||
151*20bfefbeSAndroid Build Coastguard Worker         afterLastPixelIndex > buffer_size_in_elements_not_bytes) {
152*20bfefbeSAndroid Build Coastguard Worker         return uint32_t(Error::OutOfBoundsDrawing);
153*20bfefbeSAndroid Build Coastguard Worker     }
154*20bfefbeSAndroid Build Coastguard Worker 
155*20bfefbeSAndroid Build Coastguard Worker     uint32_t* begin = buffer + (y * lineStride + x);
156*20bfefbeSAndroid Build Coastguard Worker 
157*20bfefbeSAndroid Build Coastguard Worker     Color bgColor = inverted_ ? kBackGroundColorInv : kBackGroundColor;
158*20bfefbeSAndroid Build Coastguard Worker 
159*20bfefbeSAndroid Build Coastguard Worker     for (uint32_t yi = 0; yi < h; ++yi) {
160*20bfefbeSAndroid Build Coastguard Worker         for (uint32_t xi = 0; xi < w; ++xi) {
161*20bfefbeSAndroid Build Coastguard Worker             begin[xi] = bgColor;
162*20bfefbeSAndroid Build Coastguard Worker         }
163*20bfefbeSAndroid Build Coastguard Worker         begin += lineStride;
164*20bfefbeSAndroid Build Coastguard Worker     }
165*20bfefbeSAndroid Build Coastguard Worker     FrameBuffer fb;
166*20bfefbeSAndroid Build Coastguard Worker     fb.left_ = x;
167*20bfefbeSAndroid Build Coastguard Worker     fb.top_ = y;
168*20bfefbeSAndroid Build Coastguard Worker     fb.width_ = w;
169*20bfefbeSAndroid Build Coastguard Worker     fb.height_ = h;
170*20bfefbeSAndroid Build Coastguard Worker     fb.buffer_ = buffer;
171*20bfefbeSAndroid Build Coastguard Worker     fb.size_in_elements_ = buffer_size_in_elements_not_bytes;
172*20bfefbeSAndroid Build Coastguard Worker     fb.lineStride_ = lineStride;
173*20bfefbeSAndroid Build Coastguard Worker 
174*20bfefbeSAndroid Build Coastguard Worker     auto pixelDrawer = makePixelDrawer(
175*20bfefbeSAndroid Build Coastguard Worker         [&fb](uint32_t x, uint32_t y, Color color) -> Error { return fb.drawPixel(x, y, color); });
176*20bfefbeSAndroid Build Coastguard Worker 
177*20bfefbeSAndroid Build Coastguard Worker     if (auto error = drawElements(layoutInstance_, pixelDrawer)) {
178*20bfefbeSAndroid Build Coastguard Worker         return uint32_t(error.code());
179*20bfefbeSAndroid Build Coastguard Worker     }
180*20bfefbeSAndroid Build Coastguard Worker 
181*20bfefbeSAndroid Build Coastguard Worker     return 0;  // OK
182*20bfefbeSAndroid Build Coastguard Worker }
183*20bfefbeSAndroid Build Coastguard Worker 
184*20bfefbeSAndroid Build Coastguard Worker }  // namespace touch_button
185*20bfefbeSAndroid Build Coastguard Worker }  // namespace example
186*20bfefbeSAndroid Build Coastguard Worker }  // namespace teeui
187