1/*
2 * Copyright (c) 2022-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#ifndef OHOS_DISTRIBUTED_INPUT_CONTEXT_H
17#define OHOS_DISTRIBUTED_INPUT_CONTEXT_H
18
19#include <cstdint>
20#include <map>
21#include <memory>
22#include <mutex>
23#include <string>
24#include <unordered_map>
25
26#include <refbase.h>
27
28#include "single_instance.h"
29
30#include "constants.h"
31#include "device_type.h"
32#include "distributed_hardware_fwk_kit.h"
33#include "if_system_ability_manager.h"
34#include "iservice_registry.h"
35#include "nlohmann/json.hpp"
36#include "system_ability_definition.h"
37
38#include "dinput_log.h"
39#include "i_dinput_context.h"
40
41namespace OHOS {
42namespace DistributedHardware {
43namespace DistributedInput {
44const nlohmann::json ENABLE_LOW_LATENCY = {
45    {DH_TYPE, DHType::INPUT},
46    {LOW_LATENCY_ENABLE, true},
47};
48
49const nlohmann::json DISABLE_LOW_LATENCY = {
50    {DH_TYPE, DHType::INPUT},
51    {LOW_LATENCY_ENABLE, false},
52};
53class DInputContext {
54DECLARE_SINGLE_INSTANCE_BASE(DInputContext);
55public:
56    std::string GetScreenInfoKey(const std::string &devId, const uint64_t sourceWinId);
57    int32_t RemoveSinkScreenInfo(const std::string &screenInfoKey);
58    int32_t UpdateSinkScreenInfo(const std::string &screenInfoKey, const SinkScreenInfo &sinkScreenInfo);
59    SinkScreenInfo GetSinkScreenInfo(const std::string &screenInfoKey);
60    const std::unordered_map<std::string, SinkScreenInfo> &GetAllSinkScreenInfo();
61
62    int32_t RemoveSrcScreenInfo(const std::string &screenInfoKey);
63    int32_t UpdateSrcScreenInfo(const std::string &screenInfoKey, const SrcScreenInfo &srcScreenInfo);
64    SrcScreenInfo GetSrcScreenInfo(const std::string &screenInfoKey);
65
66    void SetLocalTouchScreenInfo(const LocalTouchScreenInfo &localTouchScreenInfo);
67    LocalTouchScreenInfo GetLocalTouchScreenInfo();
68    std::shared_ptr<DistributedHardwareFwkKit> GetDHFwkKit();
69    sptr<IRemoteObject> GetRemoteObject(const int32_t saId);
70    void AddRemoteObject(const int32_t saId, const sptr<IRemoteObject> &remoteObject);
71    void RemoveRemoteObject(const int32_t saId);
72
73private:
74    int32_t CalculateTransformInfo(SinkScreenInfo &sinkScreenInfo);
75
76private:
77    DInputContext() = default;
78    ~DInputContext();
79
80    /* the key is Combination of sink's localDeviceId and windowId, the value is sinkScreenInfo */
81    std::unordered_map<std::string, SinkScreenInfo> sinkScreenInfoMap_;
82
83    /* the key is Combination of source's localDeviceId and windowId, the value is sourceScreenInfo */
84    std::unordered_map<std::string, SrcScreenInfo> srcScreenInfoMap_;
85    LocalTouchScreenInfo localTouchScreenInfo_;
86    std::mutex srcMapMutex_;
87    std::mutex sinkMapMutex_;
88    std::mutex localTouchScreenInfoMutex_;
89    std::shared_ptr<DistributedHardwareFwkKit> dhFwkKit_;
90    std::mutex dhFwkKitMutex_;
91    std::unordered_map<int32_t, sptr<IRemoteObject>> remoteObjects_;
92    std::mutex remoteObjectsMutex_;
93};
94} // namespace DistributedInput
95} // namespace DistributedHardware
96} // namespace OHOS
97
98#endif // OHOS_DISTRIBUTED_INPUT_CONTEXT_H