158ec469eSopenharmony_ci/*
258ec469eSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
358ec469eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
458ec469eSopenharmony_ci * you may not use this file except in compliance with the License.
558ec469eSopenharmony_ci * You may obtain a copy of the License at
658ec469eSopenharmony_ci *
758ec469eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
858ec469eSopenharmony_ci *
958ec469eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1058ec469eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1158ec469eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1258ec469eSopenharmony_ci * See the License for the specific language governing permissions and
1358ec469eSopenharmony_ci * limitations under the License.
1458ec469eSopenharmony_ci */
1558ec469eSopenharmony_ci
1658ec469eSopenharmony_ci#ifndef MISCDEVICE_SERVICE_H
1758ec469eSopenharmony_ci#define MISCDEVICE_SERVICE_H
1858ec469eSopenharmony_ci
1958ec469eSopenharmony_ci#include <memory>
2058ec469eSopenharmony_ci#include <mutex>
2158ec469eSopenharmony_ci#include <set>
2258ec469eSopenharmony_ci#include <string>
2358ec469eSopenharmony_ci#include <unordered_map>
2458ec469eSopenharmony_ci#include <vector>
2558ec469eSopenharmony_ci
2658ec469eSopenharmony_ci#include "accesstoken_kit.h"
2758ec469eSopenharmony_ci#include "common_event_manager.h"
2858ec469eSopenharmony_ci#include "nocopyable.h"
2958ec469eSopenharmony_ci#include "system_ability.h"
3058ec469eSopenharmony_ci#include "thread_ex.h"
3158ec469eSopenharmony_ci#include "want.h"
3258ec469eSopenharmony_ci
3358ec469eSopenharmony_ci#include "file_utils.h"
3458ec469eSopenharmony_ci#include "json_parser.h"
3558ec469eSopenharmony_ci#include "light_hdi_connection.h"
3658ec469eSopenharmony_ci#include "miscdevice_common.h"
3758ec469eSopenharmony_ci#include "miscdevice_common_event_subscriber.h"
3858ec469eSopenharmony_ci#include "miscdevice_delayed_sp_singleton.h"
3958ec469eSopenharmony_ci#include "miscdevice_dump.h"
4058ec469eSopenharmony_ci#include "miscdevice_service_stub.h"
4158ec469eSopenharmony_ci#include "vibrator_hdi_connection.h"
4258ec469eSopenharmony_ci#include "vibrator_infos.h"
4358ec469eSopenharmony_ci#include "vibrator_thread.h"
4458ec469eSopenharmony_ci
4558ec469eSopenharmony_cinamespace OHOS {
4658ec469eSopenharmony_cinamespace Sensors {
4758ec469eSopenharmony_ciusing namespace Security::AccessToken;
4858ec469eSopenharmony_cienum class MiscdeviceServiceState {
4958ec469eSopenharmony_ci    STATE_STOPPED,
5058ec469eSopenharmony_ci    STATE_RUNNING,
5158ec469eSopenharmony_ci};
5258ec469eSopenharmony_ci
5358ec469eSopenharmony_ciclass MiscdeviceService : public SystemAbility, public MiscdeviceServiceStub {
5458ec469eSopenharmony_ci    DECLARE_SYSTEM_ABILITY(MiscdeviceService)
5558ec469eSopenharmony_ci    MISCDEVICE_DECLARE_DELAYED_SP_SINGLETON(MiscdeviceService);
5658ec469eSopenharmony_ci
5758ec469eSopenharmony_cipublic:
5858ec469eSopenharmony_ci    void OnDump() override;
5958ec469eSopenharmony_ci    void OnStart() override;
6058ec469eSopenharmony_ci    void OnStop() override;
6158ec469eSopenharmony_ci    void OnStartFuzz();
6258ec469eSopenharmony_ci    bool IsValid(int32_t lightId);
6358ec469eSopenharmony_ci    bool IsLightAnimationValid(const LightAnimationIPC &animation);
6458ec469eSopenharmony_ci    int32_t Dump(int32_t fd, const std::vector<std::u16string> &args) override;
6558ec469eSopenharmony_ci    void ProcessDeathObserver(const wptr<IRemoteObject> &object);
6658ec469eSopenharmony_ci    virtual int32_t Vibrate(int32_t vibratorId, int32_t timeOut, int32_t usage, bool systemUsage) override;
6758ec469eSopenharmony_ci    virtual int32_t PlayVibratorEffect(int32_t vibratorId, const std::string &effect,
6858ec469eSopenharmony_ci                                       int32_t loopCount, int32_t usage, bool systemUsage) override;
6958ec469eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM
7058ec469eSopenharmony_ci    virtual int32_t PlayVibratorCustom(int32_t vibratorId, const RawFileDescriptor &rawFd, int32_t usage,
7158ec469eSopenharmony_ci        bool systemUsage, const VibrateParameter &parameter) override;
7258ec469eSopenharmony_ci#endif // OHOS_BUILD_ENABLE_VIBRATOR_CUSTOM
7358ec469eSopenharmony_ci    virtual int32_t StopVibrator(int32_t vibratorId) override;
7458ec469eSopenharmony_ci    virtual int32_t StopVibrator(int32_t vibratorId, const std::string &mode) override;
7558ec469eSopenharmony_ci    virtual int32_t IsSupportEffect(const std::string &effect, bool &state) override;
7658ec469eSopenharmony_ci    virtual std::vector<LightInfoIPC> GetLightList() override;
7758ec469eSopenharmony_ci    virtual int32_t TurnOn(int32_t lightId, const LightColor &color, const LightAnimationIPC &animation) override;
7858ec469eSopenharmony_ci    virtual int32_t TurnOff(int32_t lightId) override;
7958ec469eSopenharmony_ci    virtual int32_t PlayPattern(const VibratePattern &pattern, int32_t usage,
8058ec469eSopenharmony_ci        bool systemUsage, const VibrateParameter &parameter) override;
8158ec469eSopenharmony_ci    virtual int32_t GetDelayTime(int32_t &delayTime) override;
8258ec469eSopenharmony_ci    virtual int32_t TransferClientRemoteObject(const sptr<IRemoteObject> &vibratorServiceClient) override;
8358ec469eSopenharmony_ci    virtual int32_t PlayPrimitiveEffect(int32_t vibratorId, const std::string &effect, int32_t intensity,
8458ec469eSopenharmony_ci                                        int32_t usage, bool systemUsage, int32_t count) override;
8558ec469eSopenharmony_ci    virtual int32_t GetVibratorCapacity(VibratorCapacity &capacity) override;
8658ec469eSopenharmony_ci
8758ec469eSopenharmony_ciprivate:
8858ec469eSopenharmony_ci    DISALLOW_COPY_AND_MOVE(MiscdeviceService);
8958ec469eSopenharmony_ci    bool InitInterface();
9058ec469eSopenharmony_ci    bool InitLightInterface();
9158ec469eSopenharmony_ci    std::string GetPackageName(AccessTokenID tokenId);
9258ec469eSopenharmony_ci    void StartVibrateThread(VibrateInfo info);
9358ec469eSopenharmony_ci    void StopVibrateThread();
9458ec469eSopenharmony_ci    bool ShouldIgnoreVibrate(const VibrateInfo &info);
9558ec469eSopenharmony_ci    std::string GetCurrentTime();
9658ec469eSopenharmony_ci    void MergeVibratorParmeters(const VibrateParameter &parameter, VibratePackage &package);
9758ec469eSopenharmony_ci    bool CheckVibratorParmeters(const VibrateParameter &parameter);
9858ec469eSopenharmony_ci    bool InitLightList();
9958ec469eSopenharmony_ci    void RegisterClientDeathRecipient(sptr<IRemoteObject> vibratorServiceClient, int32_t pid);
10058ec469eSopenharmony_ci    void UnregisterClientDeathRecipient(sptr<IRemoteObject> vibratorServiceClient);
10158ec469eSopenharmony_ci    void SaveClientPid(const sptr<IRemoteObject> &vibratorServiceClient, int32_t pid);
10258ec469eSopenharmony_ci    int32_t FindClientPid(const sptr<IRemoteObject> &vibratorServiceClient);
10358ec469eSopenharmony_ci    void DestroyClientPid(const sptr<IRemoteObject> &vibratorServiceClient);
10458ec469eSopenharmony_ci    void OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override;
10558ec469eSopenharmony_ci    int32_t SubscribeCommonEvent(const std::string &eventName, EventReceiver receiver);
10658ec469eSopenharmony_ci    void OnReceiveEvent(const EventFwk::CommonEventData &data);
10758ec469eSopenharmony_ci    std::mutex isVibrationPriorityReadyMutex_;
10858ec469eSopenharmony_ci    static bool isVibrationPriorityReady_;
10958ec469eSopenharmony_ci    VibratorHdiConnection &vibratorHdiConnection_ = VibratorHdiConnection::GetInstance();
11058ec469eSopenharmony_ci    LightHdiConnection &lightHdiConnection_ = LightHdiConnection::GetInstance();
11158ec469eSopenharmony_ci    bool lightExist_;
11258ec469eSopenharmony_ci    bool vibratorExist_;
11358ec469eSopenharmony_ci    std::vector<LightInfoIPC> lightInfos_;
11458ec469eSopenharmony_ci    std::map<MiscdeviceDeviceId, bool> miscDeviceIdMap_;
11558ec469eSopenharmony_ci    MiscdeviceServiceState state_;
11658ec469eSopenharmony_ci    std::shared_ptr<VibratorThread> vibratorThread_ = nullptr;
11758ec469eSopenharmony_ci    std::mutex vibratorThreadMutex_;
11858ec469eSopenharmony_ci    sptr<IRemoteObject::DeathRecipient> clientDeathObserver_ = nullptr;
11958ec469eSopenharmony_ci    std::mutex clientDeathObserverMutex_;
12058ec469eSopenharmony_ci    std::map<sptr<IRemoteObject>, int32_t> clientPidMap_;
12158ec469eSopenharmony_ci    std::mutex clientPidMapMutex_;
12258ec469eSopenharmony_ci    std::mutex miscDeviceIdMapMutex_;
12358ec469eSopenharmony_ci};
12458ec469eSopenharmony_ci}  // namespace Sensors
12558ec469eSopenharmony_ci}  // namespace OHOS
12658ec469eSopenharmony_ci#endif  // MISCDEVICE_SERVICE_H
127