12d43be4eSopenharmony_ci/*
22d43be4eSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
32d43be4eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
42d43be4eSopenharmony_ci * you may not use this file except in compliance with the License.
52d43be4eSopenharmony_ci * You may obtain a copy of the License at
62d43be4eSopenharmony_ci *
72d43be4eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
82d43be4eSopenharmony_ci *
92d43be4eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
102d43be4eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
112d43be4eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122d43be4eSopenharmony_ci * See the License for the specific language governing permissions and
132d43be4eSopenharmony_ci * limitations under the License.
142d43be4eSopenharmony_ci */
152d43be4eSopenharmony_ci
162d43be4eSopenharmony_ci#ifndef CELLULAR_DATA_CLIENT_H
172d43be4eSopenharmony_ci#define CELLULAR_DATA_CLIENT_H
182d43be4eSopenharmony_ci
192d43be4eSopenharmony_ci#include <cstdint>
202d43be4eSopenharmony_ci#include <iremote_object.h>
212d43be4eSopenharmony_ci#include <singleton.h>
222d43be4eSopenharmony_ci
232d43be4eSopenharmony_ci#include "data_sim_account_call_back.h"
242d43be4eSopenharmony_ci#include "i_cellular_data_manager.h"
252d43be4eSopenharmony_ci#include "sim_account_callback.h"
262d43be4eSopenharmony_ci#include "apn_item.h"
272d43be4eSopenharmony_ci#include "cellular_data_constant.h"
282d43be4eSopenharmony_ci
292d43be4eSopenharmony_cinamespace OHOS {
302d43be4eSopenharmony_cinamespace Telephony {
312d43be4eSopenharmony_ciclass CellularDataClient : public DelayedRefSingleton<CellularDataClient> {
322d43be4eSopenharmony_ci    DECLARE_DELAYED_REF_SINGLETON(CellularDataClient);
332d43be4eSopenharmony_ci
342d43be4eSopenharmony_cipublic:
352d43be4eSopenharmony_ci    /**
362d43be4eSopenharmony_ci     * @brief Whether cellular data service is connected.
372d43be4eSopenharmony_ci     *
382d43be4eSopenharmony_ci     * @return Return true on connected, false on not connected.
392d43be4eSopenharmony_ci     */
402d43be4eSopenharmony_ci    bool IsConnect();
412d43be4eSopenharmony_ci
422d43be4eSopenharmony_ci    /**
432d43be4eSopenharmony_ci     * @brief Whether to enable cellular data user switch
442d43be4eSopenharmony_ci     *
452d43be4eSopenharmony_ci     * @param enable Enable or not.
462d43be4eSopenharmony_ci     * @return Return 84082688 invalid parameter, 0 data enable success, others enable fail.
472d43be4eSopenharmony_ci     */
482d43be4eSopenharmony_ci    int32_t EnableCellularData(bool enable);
492d43be4eSopenharmony_ci
502d43be4eSopenharmony_ci    /**
512d43be4eSopenharmony_ci     * @brief Whether to enable intelligence switch
522d43be4eSopenharmony_ci     *
532d43be4eSopenharmony_ci     * @param enable Enable or not.
542d43be4eSopenharmony_ci     * @return Return 84082688 invalid parameter, 1 data enable success, 0 enable fail.
552d43be4eSopenharmony_ci     */
562d43be4eSopenharmony_ci    int32_t EnableIntelligenceSwitch(bool enable);
572d43be4eSopenharmony_ci
582d43be4eSopenharmony_ci    /**
592d43be4eSopenharmony_ci     * @brief Whether the cellular data user switch is enabled
602d43be4eSopenharmony_ci     *
612d43be4eSopenharmony_ci     * @param dataEnabled Indicates the result of data enabled status.
622d43be4eSopenharmony_ci     * @return Returns error code.
632d43be4eSopenharmony_ci     */
642d43be4eSopenharmony_ci    int32_t IsCellularDataEnabled(bool &dataEnabled);
652d43be4eSopenharmony_ci
662d43be4eSopenharmony_ci    /**
672d43be4eSopenharmony_ci     * @brief Cellular data connection status
682d43be4eSopenharmony_ci     *
692d43be4eSopenharmony_ci     * @return Returns data connection status defined in DataConnectionStatus.
702d43be4eSopenharmony_ci     */
712d43be4eSopenharmony_ci    int32_t GetCellularDataState();
722d43be4eSopenharmony_ci
732d43be4eSopenharmony_ci    /**
742d43be4eSopenharmony_ci     * @brief Get the apn status based on slotId and apnType
752d43be4eSopenharmony_ci     *
762d43be4eSopenharmony_ci     * @return Returns apn status
772d43be4eSopenharmony_ci     */
782d43be4eSopenharmony_ci    int32_t GetApnState(int32_t slotId, const std::string &apnType);
792d43be4eSopenharmony_ci
802d43be4eSopenharmony_ci    /**
812d43be4eSopenharmony_ci     * Get IntelligenceSwitch State
822d43be4eSopenharmony_ci     *
832d43be4eSopenharmony_ci     * @param switchState Returns IntelligenceSwitch State
842d43be4eSopenharmony_ci     * @return Returns 0 on success, others on failure.
852d43be4eSopenharmony_ci     */
862d43be4eSopenharmony_ci    int32_t GetIntelligenceSwitchState(bool &switchState);
872d43be4eSopenharmony_ci
882d43be4eSopenharmony_ci    /**
892d43be4eSopenharmony_ci     * @brief Get recovery state
902d43be4eSopenharmony_ci     */
912d43be4eSopenharmony_ci    int32_t GetDataRecoveryState();
922d43be4eSopenharmony_ci
932d43be4eSopenharmony_ci    /**
942d43be4eSopenharmony_ci     * @brief Whether roaming is allowed
952d43be4eSopenharmony_ci     *
962d43be4eSopenharmony_ci     * @param slotId Indicates card slot identification
972d43be4eSopenharmony_ci     * @param dataRoamingEnabled Indicates the result of data roaming enabled status.
982d43be4eSopenharmony_ci     * @return Returns error code.
992d43be4eSopenharmony_ci     */
1002d43be4eSopenharmony_ci    int32_t IsCellularDataRoamingEnabled(int32_t slotId, bool &dataRoamingEnabled);
1012d43be4eSopenharmony_ci
1022d43be4eSopenharmony_ci    /**
1032d43be4eSopenharmony_ci     * @brief Whether roaming switches are allowed
1042d43be4eSopenharmony_ci     *
1052d43be4eSopenharmony_ci     * @param slotId card slot identification
1062d43be4eSopenharmony_ci     * @param enable Whether roaming switches are allowed
1072d43be4eSopenharmony_ci     * @return Returns 0 on failure, 1 on failure. 84082688 invalid parameter
1082d43be4eSopenharmony_ci     */
1092d43be4eSopenharmony_ci    int32_t EnableCellularDataRoaming(int32_t slotId, bool enable);
1102d43be4eSopenharmony_ci
1112d43be4eSopenharmony_ci    /**
1122d43be4eSopenharmony_ci     * @brief Get the slotId that uses the data traffic by default
1132d43be4eSopenharmony_ci     *
1142d43be4eSopenharmony_ci     * @return Returns the default settings data card, -1 error code
1152d43be4eSopenharmony_ci     */
1162d43be4eSopenharmony_ci    int32_t GetDefaultCellularDataSlotId();
1172d43be4eSopenharmony_ci
1182d43be4eSopenharmony_ci    /**
1192d43be4eSopenharmony_ci     * Get the simId that uses the data traffic by default
1202d43be4eSopenharmony_ci     *
1212d43be4eSopenharmony_ci     * @param simId Returns default settings data sim id
1222d43be4eSopenharmony_ci     * @return Returns 0 on success, others on failure.
1232d43be4eSopenharmony_ci     */
1242d43be4eSopenharmony_ci    int32_t GetDefaultCellularDataSimId(int32_t &simId);
1252d43be4eSopenharmony_ci
1262d43be4eSopenharmony_ci    /**
1272d43be4eSopenharmony_ci     * @brief Set the slotId that uses the data traffic by default
1282d43be4eSopenharmony_ci     *
1292d43be4eSopenharmony_ci     * @param slotId card slot identification
1302d43be4eSopenharmony_ci     * @return 0 set success, others set fail, 84082688 invalid parameter
1312d43be4eSopenharmony_ci     */
1322d43be4eSopenharmony_ci    int32_t SetDefaultCellularDataSlotId(int32_t slotId);
1332d43be4eSopenharmony_ci
1342d43be4eSopenharmony_ci    /**
1352d43be4eSopenharmony_ci     * @brief Get data packet type
1362d43be4eSopenharmony_ci     *
1372d43be4eSopenharmony_ci     * @return Returns cell data flow type defined in CellDataFlowType.
1382d43be4eSopenharmony_ci     */
1392d43be4eSopenharmony_ci    int32_t GetCellularDataFlowType();
1402d43be4eSopenharmony_ci
1412d43be4eSopenharmony_ci    /**
1422d43be4eSopenharmony_ci     * @brief Whether cellular data has internet capability.
1432d43be4eSopenharmony_ci     *
1442d43be4eSopenharmony_ci     * @param slotId Card slot identification.
1452d43be4eSopenharmony_ci     * @param cid Context identification.
1462d43be4eSopenharmony_ci     * @return Return 1 if has, 0 if hasn't.
1472d43be4eSopenharmony_ci     */
1482d43be4eSopenharmony_ci    int32_t HasInternetCapability(int32_t slotId, int32_t cid);
1492d43be4eSopenharmony_ci
1502d43be4eSopenharmony_ci    /**
1512d43be4eSopenharmony_ci     * @brief Clear cellular data connections.
1522d43be4eSopenharmony_ci     *
1532d43be4eSopenharmony_ci     * @param slotId Card slot identification.
1542d43be4eSopenharmony_ci     * @return 1 set success, 0 set fail, 84082688 invalid parameter
1552d43be4eSopenharmony_ci     */
1562d43be4eSopenharmony_ci    int32_t ClearCellularDataConnections(int32_t slotId);
1572d43be4eSopenharmony_ci
1582d43be4eSopenharmony_ci    int32_t ClearAllConnections(int32_t slotId, DisConnectionReason reason);
1592d43be4eSopenharmony_ci
1602d43be4eSopenharmony_ci    int32_t HandleApnChanged(int32_t slotId);
1612d43be4eSopenharmony_ci
1622d43be4eSopenharmony_ci    /**
1632d43be4eSopenharmony_ci     * @brief Get cellular data proxy.
1642d43be4eSopenharmony_ci     *
1652d43be4eSopenharmony_ci     * @return Cellular data service.
1662d43be4eSopenharmony_ci     */
1672d43be4eSopenharmony_ci    sptr<ICellularDataManager> GetProxy();
1682d43be4eSopenharmony_ci
1692d43be4eSopenharmony_ci    /**
1702d43be4eSopenharmony_ci     * @brief Update the slotId that uses the data traffic by default
1712d43be4eSopenharmony_ci     *
1722d43be4eSopenharmony_ci     * @return Returns the default settings data card, -1 error code
1732d43be4eSopenharmony_ci     */
1742d43be4eSopenharmony_ci    int32_t UpdateDefaultCellularDataSlotId();
1752d43be4eSopenharmony_ci
1762d43be4eSopenharmony_ci    /**
1772d43be4eSopenharmony_ci     * @brief Get data connections apn attribute.
1782d43be4eSopenharmony_ci     *
1792d43be4eSopenharmony_ci     * @param slotId Card slot identification.
1802d43be4eSopenharmony_ci     * @param apnType Indicates the APN attribute used by the data connection.
1812d43be4eSopenharmony_ci     * @return 1 set success, 0 set fail
1822d43be4eSopenharmony_ci     */
1832d43be4eSopenharmony_ci    int32_t GetDataConnApnAttr(int32_t slotId, ApnItem::Attribute &apnAttr);
1842d43be4eSopenharmony_ci
1852d43be4eSopenharmony_ci    /**
1862d43be4eSopenharmony_ci     * @brief Get data connections ip type.
1872d43be4eSopenharmony_ci     *
1882d43be4eSopenharmony_ci     * @param slotId Card slot identification.
1892d43be4eSopenharmony_ci     * @param ipType Indicates IP array after data connection.
1902d43be4eSopenharmony_ci     * @return 1 set success, 0 set fail
1912d43be4eSopenharmony_ci     */
1922d43be4eSopenharmony_ci    int32_t GetDataConnIpType(int32_t slotId, std::string &ipType);
1932d43be4eSopenharmony_ci
1942d43be4eSopenharmony_ci    /**
1952d43be4eSopenharmony_ci     * @brief Whether do recovery is needed.
1962d43be4eSopenharmony_ci     *
1972d43be4eSopenharmony_ci     * @param slotId Card slot identification.
1982d43be4eSopenharmony_ci     * @param needDoRecovery Whether do recovery is needed.
1992d43be4eSopenharmony_ci     * @return 1 set success, 0 set fail
2002d43be4eSopenharmony_ci     */
2012d43be4eSopenharmony_ci    int32_t IsNeedDoRecovery(int32_t slotId, bool needDoRecovery);
2022d43be4eSopenharmony_ci
2032d43be4eSopenharmony_ci    /**
2042d43be4eSopenharmony_ci     * @brief Init CellularDataController instance.
2052d43be4eSopenharmony_ci     *
2062d43be4eSopenharmony_ci     * @param slotId Card slot identification.
2072d43be4eSopenharmony_ci     * @return 1 set success, 0 set fail
2082d43be4eSopenharmony_ci     */
2092d43be4eSopenharmony_ci    int32_t InitCellularDataController(int32_t slotId);
2102d43be4eSopenharmony_ci
2112d43be4eSopenharmony_ci    int32_t EstablishAllApnsIfConnectable(int32_t slotId);
2122d43be4eSopenharmony_ci
2132d43be4eSopenharmony_ci    /**
2142d43be4eSopenharmony_ci     * @brief Release cellular data connection.
2152d43be4eSopenharmony_ci     *
2162d43be4eSopenharmony_ci     * @param slotId Card slot identification.
2172d43be4eSopenharmony_ci     * @return 1 set success, 0 set fail
2182d43be4eSopenharmony_ci     */
2192d43be4eSopenharmony_ci    int32_t ReleaseCellularDataConnection(int32_t slotId);
2202d43be4eSopenharmony_ci
2212d43be4eSopenharmony_ci    /**
2222d43be4eSopenharmony_ci     * @brief Get cellular data supplierId.
2232d43be4eSopenharmony_ci     *
2242d43be4eSopenharmony_ci     * @param slotId Card slot identification.
2252d43be4eSopenharmony_ci     * @param capability Net capability.
2262d43be4eSopenharmony_ci     * @param supplierId Cellular supplier id.
2272d43be4eSopenharmony_ci     * @return 0 get success, others get fail.
2282d43be4eSopenharmony_ci     */
2292d43be4eSopenharmony_ci    int32_t GetCellularDataSupplierId(int32_t slotId, uint64_t capability, uint32_t &supplierId);
2302d43be4eSopenharmony_ci
2312d43be4eSopenharmony_ci    /**
2322d43be4eSopenharmony_ci     * @brief Correct net supplier available is false.
2332d43be4eSopenharmony_ci     *
2342d43be4eSopenharmony_ci     * @param slotId Card slot identification.
2352d43be4eSopenharmony_ci     * @return 0 set success, others set fail.
2362d43be4eSopenharmony_ci     */
2372d43be4eSopenharmony_ci    int32_t CorrectNetSupplierNoAvailable(int32_t slotId);
2382d43be4eSopenharmony_ci
2392d43be4eSopenharmony_ci    /**
2402d43be4eSopenharmony_ci     * @brief Get supplier register state.
2412d43be4eSopenharmony_ci     *
2422d43be4eSopenharmony_ci     * @param supplierId Cellular supplier id.
2432d43be4eSopenharmony_ci     * @param regState Supplier register state.
2442d43be4eSopenharmony_ci     * @return 0 set success, others set fail.
2452d43be4eSopenharmony_ci     */
2462d43be4eSopenharmony_ci    int32_t GetSupplierRegisterState(uint32_t supplierId, int32_t &regState);
2472d43be4eSopenharmony_ci
2482d43be4eSopenharmony_ciprivate:
2492d43be4eSopenharmony_ci    class CellularDataDeathRecipient : public IRemoteObject::DeathRecipient {
2502d43be4eSopenharmony_ci    public:
2512d43be4eSopenharmony_ci        explicit CellularDataDeathRecipient(CellularDataClient &client) : client_(client) {}
2522d43be4eSopenharmony_ci        ~CellularDataDeathRecipient() override = default;
2532d43be4eSopenharmony_ci        void OnRemoteDied(const wptr<IRemoteObject> &remote) override
2542d43be4eSopenharmony_ci        {
2552d43be4eSopenharmony_ci            client_.OnRemoteDied(remote);
2562d43be4eSopenharmony_ci        }
2572d43be4eSopenharmony_ci
2582d43be4eSopenharmony_ci    private:
2592d43be4eSopenharmony_ci        CellularDataClient &client_;
2602d43be4eSopenharmony_ci    };
2612d43be4eSopenharmony_ci
2622d43be4eSopenharmony_ci    void OnRemoteDied(const wptr<IRemoteObject> &remote);
2632d43be4eSopenharmony_ci    void RegisterSimAccountCallback();
2642d43be4eSopenharmony_ci    void UnregisterSimAccountCallback();
2652d43be4eSopenharmony_ci    bool IsValidSlotId(int32_t slotId);
2662d43be4eSopenharmony_ci    bool IsCellularDataSysAbilityExist(sptr<IRemoteObject> &object);
2672d43be4eSopenharmony_ci
2682d43be4eSopenharmony_ciprivate:
2692d43be4eSopenharmony_ci    std::mutex mutexProxy_;
2702d43be4eSopenharmony_ci    sptr<ICellularDataManager> proxy_ { nullptr };
2712d43be4eSopenharmony_ci    sptr<IRemoteObject::DeathRecipient> deathRecipient_ { nullptr };
2722d43be4eSopenharmony_ci    sptr<SimAccountCallback> callback_ { nullptr };
2732d43be4eSopenharmony_ci    static int32_t defaultCellularDataSlotId_;
2742d43be4eSopenharmony_ci    static int32_t defaultCellularDataSimId_;
2752d43be4eSopenharmony_ci    bool registerStatus_ = false;
2762d43be4eSopenharmony_ci};
2772d43be4eSopenharmony_ci} // namespace Telephony
2782d43be4eSopenharmony_ci} // namespace OHOS
2792d43be4eSopenharmony_ci#endif // CELLULAR_DATA_CLIENT_H
280