1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "pointer_info.h"
17
18namespace OHOS::uitest {
19    const std::string PointerInfo::EVENT_TYPE = "pointer";
20    std::map <int32_t, std::string> PointerInfo::OP_TYPE = {
21        {TouchOpt::OP_CLICK, "click"},
22        {TouchOpt::OP_LONG_CLICK, "longClick"},
23        {TouchOpt::OP_DOUBLE_CLICK, "doubleClick"},
24        {TouchOpt::OP_SWIPE, "swipe"},
25        {TouchOpt::OP_DRAG, "drag"},
26        {TouchOpt::OP_FLING, "fling"},
27        {TouchOpt::OP_PINCH, "pinch"},
28        {TouchOpt::OP_HOME, "home"},
29        {TouchOpt::OP_RECENT, "recent"},
30        {TouchOpt::OP_RETURN, "back"},
31    };
32    nlohmann::json FingerInfo::WriteData()
33    {
34        auto data = nlohmann::json();
35        data["X_POSI"] = std::to_string(firstTouchEventInfo.x);
36        data["Y_POSI"] = std::to_string(firstTouchEventInfo.y);
37        auto first_event_attr = firstTouchEventInfo.attributes;
38        if (!first_event_attr.empty()) {
39            data["W1_ID"] = first_event_attr[UiAttr::ID];
40            data["W1_Type"] = first_event_attr[UiAttr::TYPE];
41            data["W1_Text"] = first_event_attr[UiAttr::TEXT];
42            data["W1_BOUNDS"] = first_event_attr[UiAttr::BOUNDS];
43            data["W1_HIER"] = first_event_attr[UiAttr::HIERARCHY];
44        }
45        data["X2_POSI"] = lastTouchEventInfo.x != 0 ? std::to_string(lastTouchEventInfo.x) : "";
46        data["Y2_POSI"] = lastTouchEventInfo.y != 0 ? std::to_string(lastTouchEventInfo.y) : "";
47        auto last_event_attr = lastTouchEventInfo.attributes;
48        if (!last_event_attr.empty()) {
49            data["W2_ID"] = last_event_attr[UiAttr::ID];
50            data["W2_Type"] = last_event_attr[UiAttr::TYPE];
51            data["W2_Text"] = last_event_attr[UiAttr::TEXT];
52            data["W2_BOUNDS"] = last_event_attr[UiAttr::BOUNDS];
53            data["W2_HIER"] = last_event_attr[UiAttr::HIERARCHY];
54        }
55        data["LENGTH"] = std::to_string(stepLength);
56        data["MAX_VEL"] = std::to_string(MAX_VELOCITY);
57        data["VELO"] = std::to_string(velocity);
58        data["direction.X"] = std::to_string(direction.GetX());
59        data["direction.Y"] = std::to_string(direction.GetY());
60        return data;
61    }
62
63    std::string FingerInfo::WriteWindowData(std::string actionType)
64    {
65        std::stringstream sout;
66        auto first_event_attr = firstTouchEventInfo.attributes;
67        auto last_event_attr = lastTouchEventInfo.attributes;
68        if (actionType == "click" || actionType == "longClick" || actionType == "doubleClick") {
69            sout << actionType << ": " ;
70            if (first_event_attr.empty()) {
71                sout <<" at Point(x:" << firstTouchEventInfo.x << ", y:" << firstTouchEventInfo.y << ") "<< "; ";
72            } else if (first_event_attr[UiAttr::ID] != "" || first_event_attr[UiAttr::TEXT] != "") {
73                sout << " at Widget( id: " << first_event_attr[UiAttr::ID] << ", "
74                     << "text: " << first_event_attr[UiAttr::TEXT] << ", "
75                     << "type: " << first_event_attr[UiAttr::TYPE] << ") "<< "; ";
76            } else {
77                sout <<" at Point(x:" << firstTouchEventInfo.x << ", y:" << firstTouchEventInfo.y << ") "<< "; ";
78            }
79        }
80        // fling swipe drag
81        if (first_event_attr.empty()) {
82            sout << "from Point(x:" << firstTouchEventInfo.x << ", y:" << firstTouchEventInfo.y << ") ";
83        } else if (first_event_attr[UiAttr::ID] != "" || first_event_attr[UiAttr::TEXT] != "") {
84            sout << "from Widget(id: " << first_event_attr[UiAttr::ID] << ", "
85                    << "type: " << first_event_attr[UiAttr::TYPE] << ", "
86                    << "text: " << first_event_attr[UiAttr::TEXT] << ") " << "; ";
87        } else {
88            sout << "from Point(x:" << firstTouchEventInfo.x << ", y:" << firstTouchEventInfo.y << ") ";
89        }
90        if (last_event_attr.empty()) {
91            sout << " to Point(x:" << lastTouchEventInfo.x << ", y:" << lastTouchEventInfo.y << ") " << "; ";
92        } else if (last_event_attr[UiAttr::ID] != "" || last_event_attr[UiAttr::TEXT] != "") {
93            sout << "to Widget(id: " << last_event_attr[UiAttr::ID] << ", "
94                    << "type: " << last_event_attr[UiAttr::TYPE] << ", "
95                    << "text: " << last_event_attr[UiAttr::TEXT] << ") " << "; ";
96        } else {
97            sout << " to Point(x:" << lastTouchEventInfo.x << ", y:" << lastTouchEventInfo.y << ") " << "; ";
98        }
99        if (actionType == "fling" || actionType == "swipe") {
100            sout << "Off-hand speed:" << velocity << ", " << "Step length:" << stepLength << ";";
101        }
102        return sout.str();
103    }
104
105    nlohmann::json PointerInfo::WriteData()
106    {
107        auto data = nlohmann::json();
108        data["EVENT_TYPE"] = EVENT_TYPE;
109        data["OP_TYPE"] = OP_TYPE[touchOpt];
110        data["fingerNumber"] = std::to_string(fingers.size());
111        data["duration"] = duration;
112
113        data["BUNDLE"] = bundleName;
114        data["ABILITY"] = abilityName;
115        data["direction.X"] = std::to_string(avgDirection.GetX());
116        data["direction.Y"] = std::to_string(avgDirection.GetY());
117        data["LENGTH"] = std::to_string(avgStepLength);
118        data["VELO"] = std::to_string(avgVelocity);
119        data["CENTER_X"] = centerSet.px_ == 0.0 ? "" : std::to_string(centerSet.px_);
120        data["CENTER_Y"] = centerSet.py_ == 0.0 ? "" : std::to_string(centerSet.py_);
121
122        auto fingerjson = nlohmann::json();
123        for (auto& finger :fingers) {
124            fingerjson.push_back(finger.WriteData());
125        }
126        data["fingerList"] = fingerjson;
127        return data;
128    }
129
130    std::string PointerInfo::WriteWindowData()
131    {
132        std::stringstream sout;
133        std::string actionType = OP_TYPE[touchOpt];
134        sout << actionType << " , "
135             << "fingerNumber:" << std::to_string(fingers.size()) << " , " ;
136        int i = 1;
137        for (auto& finger :fingers) {
138            sout << std::endl;
139            sout << "\t" << "finger" << i << ":" << finger.WriteWindowData(actionType) ;
140            i++;
141        }
142        return sout.str();
143    }
144}