1/* 2 * Copyright (C) 2024 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#include "fold_status_manager.h" 17 18#include "telephony_log_wrapper.h" 19#include "syspara/parameters.h" 20#include "call_dialog.h" 21 22namespace OHOS { 23namespace Telephony { 24const std::string FOLD_PRODUCT_TYPE_KEY = "const.window.foldscreen.type"; 25const std::string SMALL_FOLD_PRODUCT_TYPE = "2,0,0,0"; 26 27FoldStatusManager::~FoldStatusManager() {}; 28 29FoldStatusManager::FoldStatusManager() 30{ 31 TELEPHONY_LOGI("Enter FoldStatusManager"); 32 mOldFoldStatus = Rosen::FoldStatus::UNKNOWN; 33}; 34 35void FoldStatusManager::RegisterFoldableListener() 36{ 37 if (!IsSmallFoldDevice()) { 38 TELEPHONY_LOGI("Is not small fold device"); 39 return; 40 } 41 if (foldStatusListener_ != nullptr) { 42 TELEPHONY_LOGI("Foldable listener is already registed"); 43 return; 44 } 45 foldStatusListener_ = new (std::nothrow) FoldStatusListener(); 46 if (foldStatusListener_ == nullptr) { 47 TELEPHONY_LOGE("RegisterFoldableListener new listener failed"); 48 return; 49 } 50 auto ret = Rosen::DisplayManager::GetInstance().RegisterFoldStatusListener(foldStatusListener_); 51 if (ret != Rosen::DMError::DM_OK) { 52 TELEPHONY_LOGE("Rosen::DisplayManager::RegisterFoldStatusListener failed"); 53 foldStatusListener_ = nullptr; 54 } else { 55 mOldFoldStatus = Rosen::DisplayManager::GetInstance().GetFoldStatus(); 56 TELEPHONY_LOGI("Rosen::DisplayManager::RegisterFoldStatusListener success"); 57 } 58} 59 60void FoldStatusManager::UnregisterFoldableListener() 61{ 62 if (foldStatusListener_ == nullptr) { 63 TELEPHONY_LOGI("UnregisterFoldableListener listener is nullptr"); 64 return; 65 } 66 auto ret = Rosen::DisplayManager::GetInstance().UnregisterFoldStatusListener(foldStatusListener_); 67 if (ret != Rosen::DMError::DM_OK) { 68 TELEPHONY_LOGE("Rosen::DisplayManager::UnregisterFoldStatusListener failed"); 69 } else { 70 mOldFoldStatus = Rosen::FoldStatus::UNKNOWN; 71 foldStatusListener_ = nullptr; 72 TELEPHONY_LOGI("Rosen::DisplayManager::UnregisterFoldStatusListener success"); 73 } 74} 75 76void FoldStatusManager::FoldStatusListener::OnFoldStatusChanged(Rosen::FoldStatus foldStatus) 77{ 78 auto oldFoldStatus = DelayedSingleton<FoldStatusManager>::GetInstance()->mOldFoldStatus; 79 TELEPHONY_LOGI("OnFoldStatusChanged foldStatus is %{public}d, oldFoldStatus is %{public}d", 80 static_cast<int32_t>(foldStatus), static_cast<int32_t>(oldFoldStatus)); 81 if (foldStatus == oldFoldStatus) { 82 TELEPHONY_LOGE("Fold status don't change"); 83 return; 84 } 85 DelayedSingleton<CallDialog>::GetInstance()->DialogCallingPrivacyModeExtension(foldStatus); 86 DelayedSingleton<FoldStatusManager>::GetInstance()->mOldFoldStatus = foldStatus; 87} 88 89bool FoldStatusManager::IsSmallFoldDevice() 90{ 91 std::string foldType = system::GetParameter(FOLD_PRODUCT_TYPE_KEY, "0,0,0,0"); 92 TELEPHONY_LOGI("IsSmallFoldDevice foldType is %{public}s", foldType.c_str()); 93 return foldType == SMALL_FOLD_PRODUCT_TYPE; 94} 95} // namespace Telephony 96} // namespace OHOS