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