mirror of
https://gitee.com/openharmony/ability_ability_runtime
synced 2024-11-23 15:20:34 +00:00
e9adae47c5
Signed-off-by: XKK <huyingsong@huawei.com>
197 lines
6.8 KiB
C++
197 lines
6.8 KiB
C++
/*
|
|
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef OHOS_ABILITY_RUNTIME_PENDING_WANT_MANAGER_H
|
|
#define OHOS_ABILITY_RUNTIME_PENDING_WANT_MANAGER_H
|
|
|
|
#include <mutex>
|
|
#include <memory>
|
|
#include <map>
|
|
#include <vector>
|
|
#include <string>
|
|
#include "cpp/mutex.h"
|
|
|
|
#include "ability_manager_errors.h"
|
|
#include "ability_record.h"
|
|
#include "common_event.h"
|
|
#include "nocopyable.h"
|
|
#include "pending_want_key.h"
|
|
#include "pending_want_record.h"
|
|
#include "pending_want_common_event.h"
|
|
#include "sender_info.h"
|
|
#include "task_handler_wrap.h"
|
|
#include "want_sender_info.h"
|
|
|
|
namespace OHOS {
|
|
namespace AAFwk {
|
|
enum class OperationType {
|
|
/**
|
|
* Unknown operation.
|
|
*/
|
|
UNKNOWN_TYPE,
|
|
|
|
/**
|
|
* Starts an ability with a UI.
|
|
*/
|
|
START_ABILITY,
|
|
|
|
/**
|
|
* Starts multiple abilities.
|
|
*/
|
|
START_ABILITIES,
|
|
|
|
/**
|
|
* Starts an ability without a UI.
|
|
*/
|
|
START_SERVICE,
|
|
|
|
/**
|
|
* Sends a common event.
|
|
*/
|
|
SEND_COMMON_EVENT,
|
|
|
|
/**
|
|
* Starts a foreground ability without a UI.
|
|
*/
|
|
START_FOREGROUND_SERVICE,
|
|
|
|
/**
|
|
* Starts a service extension.
|
|
*/
|
|
START_SERVICE_EXTENSION
|
|
};
|
|
|
|
enum class Flags {
|
|
/**
|
|
* Indicates that the {@link WantAgent} can be used only once.
|
|
*/
|
|
ONE_TIME_FLAG = 1 << 30,
|
|
|
|
/**
|
|
* Indicates that {@code null} is returned if the {@link WantAgent} does not exist.
|
|
*/
|
|
NO_BUILD_FLAG = 1 << 29,
|
|
|
|
/**
|
|
* Indicates that the existing {@link WantAgent} should be canceled before the new object is generated.
|
|
*/
|
|
CANCEL_PRESENT_FLAG = 1 << 28,
|
|
|
|
/**
|
|
* Indicates that the system only replaces the extra data of the existing {@link WantAgent}
|
|
* with that of the new object.
|
|
*/
|
|
UPDATE_PRESENT_FLAG = 1 << 27,
|
|
|
|
/**
|
|
* Indicates that the created {@link WantAgent} should be immutable.
|
|
*/
|
|
CONSTANT_FLAG = 1 << 26,
|
|
|
|
/**
|
|
* Indicates that the current value of {@code element} can be replaced
|
|
* when the {@link WantAgent} is triggered.
|
|
*/
|
|
REPLACE_ELEMENT,
|
|
|
|
/**
|
|
* Indicates that the current value of {@code action} can be replaced
|
|
* when the {@link WantAgent} is triggered.
|
|
*/
|
|
REPLACE_ACTION,
|
|
|
|
/**
|
|
* Indicates that the current value of {@code uri} can be replaced when the {@link WantAgent} is triggered.
|
|
*/
|
|
REPLACE_URI,
|
|
|
|
/**
|
|
* Indicates that the current value of {@code entities} can be replaced
|
|
* when the {@link WantAgent} is triggered.
|
|
*/
|
|
REPLACE_ENTITIES,
|
|
|
|
/**
|
|
* Indicates that the current value of {@code bundleName} can be replaced
|
|
* when the {@link WantAgent} is triggered.
|
|
*/
|
|
REPLACE_BUNDLE
|
|
};
|
|
|
|
class PendingWantManager : public std::enable_shared_from_this<PendingWantManager>, public NoCopyable {
|
|
public:
|
|
PendingWantManager();
|
|
explicit PendingWantManager(const std::shared_ptr<PendingWantManager> &manager) {};
|
|
virtual ~PendingWantManager();
|
|
|
|
public:
|
|
sptr<IWantSender> GetWantSender(int32_t callingUid, int32_t uid, const bool isSystemApp,
|
|
const WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken, int32_t appIndex = 0);
|
|
int32_t SendWantSender(sptr<IWantSender> target, const SenderInfo &senderInfo);
|
|
void CancelWantSender(const bool isSystemApp, const sptr<IWantSender> &sender);
|
|
|
|
int32_t GetPendingWantUid(const sptr<IWantSender> &target);
|
|
int32_t GetPendingWantUserId(const sptr<IWantSender> &target);
|
|
std::string GetPendingWantBundleName(const sptr<IWantSender> &target);
|
|
int32_t GetPendingWantCode(const sptr<IWantSender> &target);
|
|
int32_t GetPendingWantType(const sptr<IWantSender> &target);
|
|
void RegisterCancelListener(const sptr<IWantSender> &sender, const sptr<IWantReceiver> &recevier);
|
|
void UnregisterCancelListener(const sptr<IWantSender> &sender, const sptr<IWantReceiver> &recevier);
|
|
int32_t GetPendingRequestWant(const sptr<IWantSender> &target, std::shared_ptr<Want> &want);
|
|
int32_t GetWantSenderInfo(const sptr<IWantSender> &target, std::shared_ptr<WantSenderInfo> &info);
|
|
|
|
void CancelWantSenderLocked(PendingWantRecord &record, bool cleanAbility);
|
|
int32_t PendingWantStartAbility(const Want &want, const sptr<StartOptions> &startOptions,
|
|
const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid, int32_t callerTokenId);
|
|
int32_t PendingWantStartServiceExtension(Want &want, const sptr<IRemoteObject> &callerToken);
|
|
int32_t PendingWantStartAbilitys(const std::vector<WantsInfo> &wantsInfo, const sptr<StartOptions> &startOptions,
|
|
const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid, int32_t callerTokenId);
|
|
int32_t DeviceIdDetermine(const Want &want, const sptr<StartOptions> &startOptions,
|
|
const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid, int32_t callerTokenId);
|
|
int32_t PendingWantPublishCommonEvent(const Want &want, const SenderInfo &senderInfo, int32_t callerUid,
|
|
int32_t callerTokenId);
|
|
void ClearPendingWantRecord(const std::string &bundleName, int32_t uid);
|
|
|
|
void Dump(std::vector<std::string> &info);
|
|
void DumpByRecordId(std::vector<std::string> &info, const std::string &args);
|
|
int32_t GetAllRunningInstanceKeysByBundleName(const std::string &bundleName, std::vector<std::string> &appKey);
|
|
|
|
private:
|
|
sptr<IWantSender> GetWantSenderLocked(const int32_t callingUid, const int32_t uid, const int32_t userId,
|
|
WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken, int32_t appIndex = 0);
|
|
void MakeWantSenderCanceledLocked(PendingWantRecord &record);
|
|
|
|
sptr<PendingWantRecord> GetPendingWantRecordByKey(const std::shared_ptr<PendingWantKey> &key);
|
|
bool CheckPendingWantRecordByKey(
|
|
const std::shared_ptr<PendingWantKey> &inputKey, const std::shared_ptr<PendingWantKey> &key);
|
|
|
|
sptr<PendingWantRecord> GetPendingWantRecordByCode(int32_t code);
|
|
static int32_t PendingRecordIdCreate();
|
|
void ClearPendingWantRecordTask(const std::string &bundleName, int32_t uid);
|
|
|
|
bool CheckCallerPermission();
|
|
|
|
bool CheckWindowState(int32_t pid);
|
|
|
|
private:
|
|
std::shared_ptr<TaskHandlerWrap> taskHandler_;
|
|
std::map<std::shared_ptr<PendingWantKey>, sptr<PendingWantRecord>> wantRecords_;
|
|
ffrt::mutex mutex_;
|
|
};
|
|
} // namespace AAFwk
|
|
} // namespace OHOS
|
|
|
|
#endif // OHOS_ABILITY_RUNTIME_PENDING_WANT_MANAGER_H
|