diff --git a/frameworks/native/cloud_file_kit_inner/src/data_sync/data_syncer_rdb_store.cpp b/frameworks/native/cloud_file_kit_inner/src/data_sync/data_syncer_rdb_store.cpp index 0182ea66bf3f4dd30d24e5394ddf8103dd97f0c1..30b2843eae0cf3440887ffd8cb4be80a4d24c594 100644 --- a/frameworks/native/cloud_file_kit_inner/src/data_sync/data_syncer_rdb_store.cpp +++ b/frameworks/native/cloud_file_kit_inner/src/data_sync/data_syncer_rdb_store.cpp @@ -15,12 +15,16 @@ #include "data_syncer_rdb_store.h" +#include "bundle_mgr_client.h" +#include "bundle_mgr_interface.h" #include "data_syncer_rdb_col.h" #include "dfs_error.h" +#include "iservice_registry.h" #include "rdb_helper.h" #include "rdb_sql_utils.h" #include "rdb_store_config.h" #include "result_set.h" +#include "system_ability_definition.h" #include "utils_log.h" namespace OHOS::FileManagement::CloudSync { @@ -94,6 +98,21 @@ int32_t DataSyncerRdbStore::Insert(int32_t userId, const std::string &bundleName return E_OK; } +int32_t DataSyncerRdbStore::Erase() +{ + if (rdb_ == nullptr) { + if (RdbInit() != E_OK) { + LOGE("Data Syncer init rdb failed"); + return E_RDB; + } + } + int32_t changeRows = -1; + string whereClause = USER_ID + "= ? AND" + BUNDLE_NAME + "= ?"; + vector whereArgs = { to_string(userId), bundleName }; + int32_t ret = rdb_->Delete(changeRows, DATA_SYNCER_TABLE, whereClause, whereArgs); + return E_OK; +} + static int64_t UTCTimeMilliSeconds() { struct timespec t; @@ -189,6 +208,85 @@ static int32_t GetInt(const string &key, int32_t &val, NativeRdb::ResultSet &res return E_OK; } +static bool GetBundleManagerProxy(std::shared_ptr &BundleManager) +{ + std::shared_ptr systemAbilityManager = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (!systemAbilityManager) { + return false; + } + std::shared_ptr remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); + if (!remoteObject) { + return false; + } + bundleManager = iface_cast(remoteObject); + if (bundleManager == nullptr) { + return false; + } + return true; +} + +static int32_t IsBundleInstalled(const std::string &bundleName, int32_t userId, + bool &isInstalled) +{ + std::shared_ptr bundleManager; + if (bundlemanager == nullptr) { + return E_RDB; + } + if (bundleManager == nullptr) { + return E_RDB; + } + int32_t appIndex = 0; + return bundlemanager->IsBundleInstalled(bundleName, userId, appIndex, installedStatus); +} + +int32_t DataSyncerRdbStore::GetRemovedInfo(std::vector &removedInfos) +{ + NativeRdb::AbsRdbPredicates predicates = NativeRdb::AbsRdbPredicates(DATA_SYNCER_TABLE); + std::shared_ptr resultSet = nullptr; + int32_t ret = Query(predicates, resultSet); + if (ret != E_OK) { + LOGE("get removedinfo query failed"); + return ret; + } + int32_t userId = 0; + std::string bundleName = ""; + + while(resultSet->GoToNextRow() == E_OK) { + int32_t userId = 0; + std::string bundleName = ""; + ret = GetInt(USER_ID, userId, *resultSet); + if (ret != E_OK) { + LOGE("GetRemovedInfo failed to get userId, ret = %{public}d", ret); + continue; + } + int32_t index; + ret = resultSet->GetColumnIndex(BUNDLE_NAME, index); + if (ret != E_OK) { + LOGE("GetRemovedInfo failed to get bundleName column index, ret = %{public}d", ret); + continue; + } + ret = resultSet->GetString(index, bundleName); + if (ret != E_OK) { + LOGE("GetRemovedInfo failed to get bundleName, ret = %{public}d", ret); + continue; + } + bool isInstalled = true; + ret = IsBundleInstalled(bundleName, userId, isInstalled); + if (ret != E_OK) { + LOGE("Failed to get isInstalled, ret = %{public}d", ret); + continue; + } + if (!isInstalled) { + RemovedInfo removedInfo; + removedInfo.bundleName = bundleName; + removedInfo.userId = userId; + removedInfos.push_back(removedInfo); + } + } + return E_OK; +} + int32_t DataSyncerRdbStore::GetSyncStateAndErrorType(int32_t userId, const std::string &bundleName, CloudSyncState &cloudSyncState, ErrorType &errorType) { diff --git a/frameworks/native/cloud_file_kit_inner/src/data_sync/task_state_manager.cpp b/frameworks/native/cloud_file_kit_inner/src/data_sync/task_state_manager.cpp index 00c616c21ea04fa1e5264875c29d7327991dca09..818d94bacd761cf203ee333e1ce2f88809a29c0b 100644 --- a/frameworks/native/cloud_file_kit_inner/src/data_sync/task_state_manager.cpp +++ b/frameworks/native/cloud_file_kit_inner/src/data_sync/task_state_manager.cpp @@ -15,6 +15,7 @@ #include "task_state_manager.h" +#include "data_sync_const.h" #include "gallery_download_file_stat.h" #include "iservice_registry.h" #include "mem_mgr_client.h" @@ -145,6 +146,7 @@ void TaskStateManager::DelayUnloadTask(bool needSetCritical) return; } system::SetParameter(CLOUD_FILE_SERVICE_SA_STATUS_FLAG, CLOUD_FILE_SERVICE_SA_END); + system::SetParameter(CloudSync::CLOUDSYNC_REMOVED_STATUS, "false"); int32_t ret = samgrProxy->UnloadSystemAbility(FILEMANAGEMENT_CLOUD_SYNC_SERVICE_SA_ID); if (ret != ERR_OK) { LOGE("remove system ability failed"); diff --git a/frameworks/native/cloud_file_kit_inner/src/data_sync_manager.cpp b/frameworks/native/cloud_file_kit_inner/src/data_sync_manager.cpp index 9b998bf013b3e49cdda3233672d4e7eefe737cda..494fae945b852a67478019a8a6f97185b037f9de 100644 --- a/frameworks/native/cloud_file_kit_inner/src/data_sync_manager.cpp +++ b/frameworks/native/cloud_file_kit_inner/src/data_sync_manager.cpp @@ -105,6 +105,11 @@ int32_t DataSyncManager::CleanCloudFile(const int32_t userId, const std::string return E_OK; } +int32_t DataSyncManager::CleanRdbStore(const int32_t userId, const std::string &bundleName) +{ + return E_OK; +} + int32_t DataSyncManager::CleanRemainFile(const std::string &bundleName, const int32_t userId) { return E_OK; diff --git a/interfaces/inner_api/native/cloud_file_kit_inner/BUILD.gn b/interfaces/inner_api/native/cloud_file_kit_inner/BUILD.gn index 581e69e77a1cedd026c531c604f22dc9cbe1ef05..35b4edf7cfcc0c41aa5520b13e660f8e259a077c 100644 --- a/interfaces/inner_api/native/cloud_file_kit_inner/BUILD.gn +++ b/interfaces/inner_api/native/cloud_file_kit_inner/BUILD.gn @@ -98,6 +98,8 @@ ohos_shared_library("cloudfile_kit") { "ability_runtime:dataobs_manager", "access_token:libaccesstoken_sdk", "access_token:libtokenid_sdk", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", "data_share:datashare_consumer", diff --git a/interfaces/inner_api/native/cloud_file_kit_inner/data_sync_const.h b/interfaces/inner_api/native/cloud_file_kit_inner/data_sync_const.h index 69f0a45e6611b5c8d16bff33fba4337e3e121c7d..7010f15dcfea24e1ae6139293f11ac25a08ad106 100644 --- a/interfaces/inner_api/native/cloud_file_kit_inner/data_sync_const.h +++ b/interfaces/inner_api/native/cloud_file_kit_inner/data_sync_const.h @@ -102,6 +102,7 @@ static const std::string CLOUDSYNC_STATUS_SWITCHOFF = "5"; static const std::string CLOUDSYNC_STATUS_CLEANING = "6"; static const std::string CLOUDSYNC_SWITCH_STATUS = "persist.kernel.cloudsync.switch_status"; +static const std::string CLOUDSYNC_REMOVED_STATUS = "persist.kernel.cloudsync.removed_status"; static inline uint64_t GetCurrentTimeStamp() { diff --git a/interfaces/inner_api/native/cloud_file_kit_inner/data_syncer_rdb_store.h b/interfaces/inner_api/native/cloud_file_kit_inner/data_syncer_rdb_store.h index 21920b9d2d6303f2c2b5691dee0587be455ccacd..af70cc1b551947774cfa3bb6f6d239a33dca2b36 100644 --- a/interfaces/inner_api/native/cloud_file_kit_inner/data_syncer_rdb_store.h +++ b/interfaces/inner_api/native/cloud_file_kit_inner/data_syncer_rdb_store.h @@ -22,11 +22,17 @@ #include "cloud_sync_constants.h" namespace OHOS::FileManagement::CloudSync { +struct RemovedInfo { + std::string bundleName; + int32_t userId; +} + class DataSyncerRdbStore { public: static DataSyncerRdbStore &GetInstance(); ~DataSyncerRdbStore() = default; + int32_t Erase(const std::string &bundleName, int32_t userId); int32_t Insert(int32_t userId, const std::string &bundleName); int32_t UpdateSyncState(int32_t userId, const std::string &bundleName, CloudSyncState cloudSyncState, ErrorType errorType); @@ -35,6 +41,7 @@ public: int32_t QueryCloudSync(int32_t userId, const std::string &bundleName, std::shared_ptr &resultSet); + int32_t GetRemovedInfo(std::vector &removedInfos); int32_t GetSyncStateAndErrorType(int32_t userId, const std::string &bundleName, CloudSyncState &cloudSyncState, ErrorType &errorType); private: diff --git a/services/5204.json b/services/5204.json index b300af2a6e6b0d86e9168f272f9212e328f5971d..d15c79695b92cccaa70dfcf4c65450150be83baa 100644 --- a/services/5204.json +++ b/services/5204.json @@ -87,6 +87,12 @@ { "name": "usual.event.USER_UNLOCKED" } + ], + "param": [ + { + "name": "persist.kernel.cloudsync.removed_status", + "value": "true" + } ] } } diff --git a/services/cloudfiledaemon/BUILD.gn b/services/cloudfiledaemon/BUILD.gn index ae5f0ea52e70cfe4b8add87d9aa3f3539cc3becc..77c5925a3292570c49810a25bebde2ae5ff6f28a 100644 --- a/services/cloudfiledaemon/BUILD.gn +++ b/services/cloudfiledaemon/BUILD.gn @@ -91,6 +91,8 @@ ohos_shared_library("cloudfiledaemon") { external_deps = [ "ability_base:want", "ability_runtime:dataobs_manager", + "bundle_framework:appexecfwk_base", + "bundle_framework:appexecfwk_core", "c_utils:utils", "common_event_service:cesfwk_innerkits", "data_share:datashare_consumer", diff --git a/services/cloudfiledaemon/src/cloud_disk/account_status_listener.cpp b/services/cloudfiledaemon/src/cloud_disk/account_status_listener.cpp index c84147583cfa6fc76352b571950c7adda7613bf2..767201872046fbcc8900fc6bea2ef1e871661f48 100644 --- a/services/cloudfiledaemon/src/cloud_disk/account_status_listener.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/account_status_listener.cpp @@ -17,15 +17,17 @@ #include +#include "account_status.h" #include "cloud_daemon_statistic.h" #include "cloud_file_utils.h" #include "common_event_manager.h" #include "common_event_support.h" -#include "account_status.h" +#include "data_sync_const.h" #include "file_operations_base.h" #include "file_operations_helper.h" #include "fuse_manager.h" #include "meta_file.h" +#include "parameters.h" #include "setting_data_helper.h" #include "utils_log.h" @@ -144,6 +146,7 @@ void AccountStatusSubscriber::RemovedClean(const EventFwk::CommonEventData &even LOGE("Stat parentDest Failed!"); return; } + system::SetParameter(CloudSync::CLOUDSYNC_REMOVED_STATUS, "true"); auto data = reinterpret_cast(se->userdata); auto node = FileOperationsHelper::FindCloudDiskInode(data, static_cast(childSt.st_ino)); if (node == nullptr) { diff --git a/services/cloudsyncservice/include/ipc/cloud_sync_service.h b/services/cloudsyncservice/include/ipc/cloud_sync_service.h index e19c0abe332d0b47d10e512a8a8b3e7cd0281924..f203db1c194d7b26d9bedd778281a789d5fe62a3 100644 --- a/services/cloudsyncservice/include/ipc/cloud_sync_service.h +++ b/services/cloudsyncservice/include/ipc/cloud_sync_service.h @@ -120,7 +120,7 @@ private: void PreInit(); void Init(); void HandleStartReason(const SystemAbilityOnDemandReason &startReason); - void HandlePackageRemoved(const SystemAbilityOnDemandReason &startReason); + void HandlePackageRemoved(); int32_t GetBundleNameUserInfo(BundleNameUserInfo &bundleNameUserInfo); void GetBundleNameUserInfo(const std::vector &uriVec, BundleNameUserInfo &bundleNameUserInfo); void CovertBundleName(std::string &bundleName); diff --git a/services/cloudsyncservice/include/sync_rule/package_status_listener.h b/services/cloudsyncservice/include/sync_rule/package_status_listener.h index 8b1cca80db636d4a44ecea63606969e36b071158..f3772b8887dcce2efe793e08d328b09087765872 100644 --- a/services/cloudsyncservice/include/sync_rule/package_status_listener.h +++ b/services/cloudsyncservice/include/sync_rule/package_status_listener.h @@ -29,7 +29,7 @@ public: void Start(); void Stop(); void RemovedClean(const std::string &bundleName, const int32_t userId); - bool IsCloudSyncOn(const int32_t userId, const std::string &bundleName); + bool IsCloudSyncEnabled(const int32_t userId, const std::string &bundleName); private: std::shared_ptr dataSyncManager_; diff --git a/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp b/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp index 345cb3ea4b8cb9173983e5e75bc94fe99fde0465..17f1ac4a72b6547765edc0d43d9e5d43b79e0fe4 100644 --- a/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp +++ b/services/cloudsyncservice/src/ipc/cloud_sync_service.cpp @@ -256,8 +256,8 @@ void CloudSyncService::HandleStartReason(const SystemAbilityOnDemandReason& star dataSyncManager_->TriggerRecoverySync(SyncTriggerType::POWER_CONNECT_TRIGGER); dataSyncManager_->DownloadThumb(); dataSyncManager_->CacheVideo(); - } else if (reason == "usual.event.PACKAGE_REMOVED") { - HandlePackageRemoved(startReason); + } else if (reason == "persist.kernel.cloudsync.removed_status") { + HandlePackageRemoved(); } if (reason != "load") { @@ -266,31 +266,22 @@ void CloudSyncService::HandleStartReason(const SystemAbilityOnDemandReason& star } } -void CloudSyncService::HandlePackageRemoved(const SystemAbilityOnDemandReason& startReason) +void CloudSyncService::HandlePackageRemoved() { std::string bundleName; std::string userId; - auto extraData = startReason.GetExtraData().GetWant(); - auto iter = extraData.find("bundleName"); - if (iter != extraData.end()) { - bundleName = iter->second; - } else { - LOGE("Cant find bundleName"); + std::vector removedInfos; + int32_t ret = DataSyncerRdbStore::GetInstance().GetRemovedInfo(removedInfos); + if (ret != E_OK) { + LOGE("RemovedClean get RemovedInfo failed"); return; } - iter = extraData.find("userId"); - if (iter != extraData.end()) { - userId = iter->second; - } else { - LOGE("Cant find userId"); + if (removedInfos.size() == 0) { return; } - int32_t userIdNum = std::atoi(userId.c_str()); - if (userIdNum < 0 || (userIdNum == 0 && userId != "0")) { - LOGE("Get UserId Failed!"); - return; + for (const auto& removedInfo : removedInfos) { + packageStatusListener_->RemovedClean(removedInfo.bundleName, removedInfo.userId); } - packageStatusListener_->RemovedClean(bundleName, userIdNum); } void CloudSyncService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) diff --git a/services/cloudsyncservice/src/sync_rule/package_status_listener.cpp b/services/cloudsyncservice/src/sync_rule/package_status_listener.cpp index 47756db6a9d353e3bd98ad74a6429b060f9ccf40..29498ff588815f1dee8427ee2d28c8710cbba4b5 100644 --- a/services/cloudsyncservice/src/sync_rule/package_status_listener.cpp +++ b/services/cloudsyncservice/src/sync_rule/package_status_listener.cpp @@ -62,7 +62,7 @@ PackageStatusListener::~PackageStatusListener() void PackageStatusListener::RemovedClean(const std::string &bundleName, const int32_t userId) { LOGI("RemovedClean Start"); - if (!IsCloudSyncOn(userId, bundleName)) { + if (!IsCloudSyncEnabled(userId, bundleName)) { LOGI("Cloud Sync is Off"); return; } @@ -86,6 +86,11 @@ void PackageStatusListener::RemovedClean(const std::string &bundleName, const in LOGE("CleanCloudFile failed, ret: %{public}d", ret); return; } + ret = dataSyncManager_->CleanRdbStore(bundleName, userId); + if (ret != 0) { + LOGE("CleanRdbStore failed, ret: %{public}d", ret); + return; + } LOGI("RemovedClean Complete"); } @@ -108,7 +113,7 @@ void PackageStatusListener::Stop() } } -bool PackageStatusListener::IsCloudSyncOn(const int32_t userId, const std::string &bundleName) +bool PackageStatusListener::IsCloudSyncEnabled(const int32_t userId, const std::string &bundleName) { std::shared_ptr resultSet; int32_t ret = DataSyncerRdbStore::GetInstance().QueryCloudSync(userId, bundleName, resultSet); diff --git a/test/unittests/cloudsync_sa/sync_rule/package_status_listener_test.cpp b/test/unittests/cloudsync_sa/sync_rule/package_status_listener_test.cpp index 843f7b7026ba28b6c0728344ea676d690c843450..b19cd8ac4358bee4f4b6032fb3eccd8c9e78605b 100644 --- a/test/unittests/cloudsync_sa/sync_rule/package_status_listener_test.cpp +++ b/test/unittests/cloudsync_sa/sync_rule/package_status_listener_test.cpp @@ -246,7 +246,7 @@ HWTEST_F(PackageStatusListenerTest, RemovedCleanTest006, TestSize.Level1) /** * @tc.name: IsCloudSyncOnTest001 - * @tc.desc: Verify the IsCloudSyncOn function + * @tc.desc: Verify the IsCloudSyncEnabled function * @tc.type: FUNC * @tc.require: IB3SWZ */ @@ -258,7 +258,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest001, TestSize.Level1) auto packageStatusListener = std::make_shared(dataSyncManager); const std::string bundleName = "Test"; const int32_t userId = USER_ID; - packageStatusListener->IsCloudSyncOn(userId, bundleName); + packageStatusListener->IsCloudSyncEnabled(userId, bundleName); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false); @@ -269,7 +269,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest001, TestSize.Level1) /** * @tc.name: IsCloudSyncOnTest002 - * @tc.desc: Verify the IsCloudSyncOn function + * @tc.desc: Verify the IsCloudSyncEnabled function * @tc.type: FUNC * @tc.require: IB3SWZ */ @@ -281,7 +281,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest002, TestSize.Level1) auto packageStatusListener = std::make_shared(dataSyncManager); const std::string bundleName = ""; const int32_t userId = USER_ID; - packageStatusListener->IsCloudSyncOn(userId, bundleName); + packageStatusListener->IsCloudSyncEnabled(userId, bundleName); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false); @@ -292,7 +292,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest002, TestSize.Level1) /** * @tc.name: IsCloudSyncOnTest003 - * @tc.desc: Verify the IsCloudSyncOn function + * @tc.desc: Verify the IsCloudSyncEnabled function * @tc.type: FUNC * @tc.require: IB3SWZ */ @@ -304,7 +304,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest003, TestSize.Level1) auto packageStatusListener = std::make_shared(dataSyncManager); const std::string bundleName = "Test"; const int32_t userId = -1; - packageStatusListener->IsCloudSyncOn(userId, bundleName); + packageStatusListener->IsCloudSyncEnabled(userId, bundleName); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false); @@ -315,7 +315,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest003, TestSize.Level1) /** * @tc.name: IsCloudSyncOnTest004 - * @tc.desc: Verify the IsCloudSyncOn function + * @tc.desc: Verify the IsCloudSyncEnabled function * @tc.type: FUNC * @tc.require: IB3SWZ */ @@ -327,7 +327,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest004, TestSize.Level1) auto packageStatusListener = std::make_shared(dataSyncManager); const std::string bundleName = ""; const int32_t userId = -1; - packageStatusListener->IsCloudSyncOn(userId, bundleName); + packageStatusListener->IsCloudSyncEnabled(userId, bundleName); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false); @@ -338,7 +338,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest004, TestSize.Level1) /** * @tc.name: IsCloudSyncOnTest005 - * @tc.desc: Verify the IsCloudSyncOn function + * @tc.desc: Verify the IsCloudSyncEnabled function * @tc.type: FUNC * @tc.require: IB3SWZ */ @@ -350,7 +350,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest005, TestSize.Level1) auto packageStatusListener = std::make_shared(dataSyncManager); const std::string bundleName = "Test"; const int32_t userId = 0; - packageStatusListener->IsCloudSyncOn(userId, bundleName); + packageStatusListener->IsCloudSyncEnabled(userId, bundleName); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false); @@ -361,7 +361,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest005, TestSize.Level1) /** * @tc.name: IsCloudSyncOnTest006 - * @tc.desc: Verify the IsCloudSyncOn function + * @tc.desc: Verify the IsCloudSyncEnabled function * @tc.type: FUNC * @tc.require: IB3SWZ */ @@ -373,7 +373,7 @@ HWTEST_F(PackageStatusListenerTest, IsCloudSyncOnTest006, TestSize.Level1) auto packageStatusListener = std::make_shared(dataSyncManager); const std::string bundleName = ""; const int32_t userId = 0; - packageStatusListener->IsCloudSyncOn(userId, bundleName); + packageStatusListener->IsCloudSyncEnabled(userId, bundleName); EXPECT_TRUE(true); } catch (...) { EXPECT_TRUE(false);