1 /* 2 * Copyright (c) 2021-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 #ifndef OHOS_ABILITY_RUNTIME_ABILITY_RECORD_H 17 #define OHOS_ABILITY_RUNTIME_ABILITY_RECORD_H 18 19 #include <ctime> 20 #include <functional> 21 #include <list> 22 #include <memory> 23 #include <vector> 24 #include <utility> 25 #include <set> 26 #include "cpp/mutex.h" 27 #include "cpp/condition_variable.h" 28 29 #include "ability_connect_callback_interface.h" 30 #include "ability_info.h" 31 #include "ability_start_setting.h" 32 #include "ability_state.h" 33 #include "ability_token_stub.h" 34 #include "app_scheduler.h" 35 #include "application_info.h" 36 #include "bundlemgr/bundle_mgr_interface.h" 37 #include "call_container.h" 38 #include "exit_reason.h" 39 #include "ipc_skeleton.h" 40 #include "lifecycle_deal.h" 41 #include "lifecycle_state_info.h" 42 #include "session_info.h" 43 #include "ui_extension_window_command.h" 44 #include "uri.h" 45 #include "want.h" 46 #include "window_config.h" 47 #ifdef SUPPORT_GRAPHICS 48 #include "ability_window_configuration.h" 49 #include "resource_manager.h" 50 #include "start_options.h" 51 #include "window_manager_service_handler.h" 52 #endif 53 54 namespace OHOS { 55 namespace AAFwk { 56 using Closure = std::function<void()>; 57 58 class AbilityRecord; 59 class ConnectionRecord; 60 class CallContainer; 61 62 constexpr const char* ABILITY_TOKEN_NAME = "AbilityToken"; 63 constexpr const char* LAUNCHER_BUNDLE_NAME = "com.ohos.launcher"; 64 65 /** 66 * @class Token 67 * Token is identification of ability and used to interact with kit and wms. 68 */ 69 class Token : public AbilityTokenStub { 70 public: 71 explicit Token(std::weak_ptr<AbilityRecord> abilityRecord); 72 virtual ~Token(); 73 74 std::shared_ptr<AbilityRecord> GetAbilityRecord() const; 75 static std::shared_ptr<AbilityRecord> GetAbilityRecordByToken(const sptr<IRemoteObject> &token); 76 77 private: 78 std::weak_ptr<AbilityRecord> abilityRecord_; // ability of this token 79 }; 80 81 /** 82 * @class AbilityResult 83 * Record requestCode of for-result start mode and result. 84 */ 85 class AbilityResult { 86 public: 87 AbilityResult() = default; AbilityResult(int requestCode,int resultCode,const Want & resultWant)88 AbilityResult(int requestCode, int resultCode, const Want &resultWant) 89 : requestCode_(requestCode), resultCode_(resultCode), resultWant_(resultWant) 90 {} ~AbilityResult()91 virtual ~AbilityResult() 92 {} 93 94 int requestCode_ = -1; // requestCode of for-result start mode 95 int resultCode_ = -1; // resultCode of for-result start mode 96 Want resultWant_; // for-result start mode ability will send the result to caller 97 }; 98 99 /** 100 * @class SystemAbilityCallerRecord 101 * Record system caller ability of for-result start mode and result. 102 */ 103 class SystemAbilityCallerRecord { 104 public: SystemAbilityCallerRecord(std::string & srcAbilityId,const sptr<IRemoteObject> & callerToken)105 SystemAbilityCallerRecord(std::string &srcAbilityId, const sptr<IRemoteObject> &callerToken) 106 : srcAbilityId_(srcAbilityId), callerToken_(callerToken) 107 {} ~SystemAbilityCallerRecord()108 virtual ~SystemAbilityCallerRecord() 109 {} 110 GetSrcAbilityId()111 std::string GetSrcAbilityId() 112 { 113 return srcAbilityId_; 114 } GetCallerToken()115 const sptr<IRemoteObject> GetCallerToken() 116 { 117 return callerToken_; 118 } SetResult(Want & want,int resultCode)119 void SetResult(Want &want, int resultCode) 120 { 121 resultWant_ = want; 122 resultCode_ = resultCode; 123 } GetResultWant()124 Want &GetResultWant() 125 { 126 return resultWant_; 127 } GetResultCode()128 int &GetResultCode() 129 { 130 return resultCode_; 131 } 132 /** 133 * Set result to system ability. 134 * 135 */ 136 void SetResultToSystemAbility(std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord, 137 Want &resultWant, int resultCode); 138 /** 139 * Send result to system ability. 140 * 141 */ 142 void SendResultToSystemAbility(int requestCode, 143 const std::shared_ptr<SystemAbilityCallerRecord> callerSystemAbilityRecord, 144 int32_t callerUid, uint32_t accessToken, bool schedulerdied); 145 146 private: 147 std::string srcAbilityId_; 148 sptr<IRemoteObject> callerToken_; 149 Want resultWant_; 150 int resultCode_ = -1; 151 }; 152 153 /** 154 * @struct CallerAbilityInfo 155 * caller ability info. 156 */ 157 struct CallerAbilityInfo { 158 public: 159 std::string callerBundleName; 160 std::string callerAbilityName; 161 int32_t callerTokenId = 0; 162 int32_t callerUid = 0; 163 int32_t callerPid = 0; 164 std::string callerNativeName; 165 int32_t callerAppCloneIndex = 0; 166 }; 167 168 /** 169 * @class CallerRecord 170 * Record caller ability of for-result start mode and result. 171 */ 172 class CallerRecord { 173 public: 174 CallerRecord() = default; 175 CallerRecord(int requestCode, std::weak_ptr<AbilityRecord> caller); CallerRecord(int requestCode,std::shared_ptr<SystemAbilityCallerRecord> saCaller)176 CallerRecord(int requestCode, std::shared_ptr<SystemAbilityCallerRecord> saCaller) : requestCode_(requestCode), 177 saCaller_(saCaller) 178 {} ~CallerRecord()179 virtual ~CallerRecord() 180 {} 181 GetRequestCode()182 int GetRequestCode() 183 { 184 return requestCode_; 185 } GetCaller()186 std::shared_ptr<AbilityRecord> GetCaller() 187 { 188 return caller_.lock(); 189 } GetSaCaller()190 std::shared_ptr<SystemAbilityCallerRecord> GetSaCaller() 191 { 192 return saCaller_; 193 } GetCallerInfo()194 std::shared_ptr<CallerAbilityInfo> GetCallerInfo() 195 { 196 return callerInfo_; 197 } IsHistoryRequestCode(int32_t requestCode)198 bool IsHistoryRequestCode(int32_t requestCode) 199 { 200 return requestCodeSet_.count(requestCode) > 0; 201 } RemoveHistoryRequestCode(int32_t requestCode)202 void RemoveHistoryRequestCode(int32_t requestCode) 203 { 204 requestCodeSet_.erase(requestCode); 205 } AddHistoryRequestCode(int32_t requestCode)206 void AddHistoryRequestCode(int32_t requestCode) 207 { 208 requestCodeSet_.insert(requestCode); 209 } SetRequestCodeSet(const std::set<int32_t> & requestCodeSet)210 void SetRequestCodeSet(const std::set<int32_t> &requestCodeSet) 211 { 212 requestCodeSet_ = requestCodeSet; 213 } GetRequestCodeSet()214 std::set<int32_t> GetRequestCodeSet() 215 { 216 return requestCodeSet_; 217 } 218 219 private: 220 int requestCode_ = -1; // requestCode of for-result start mode 221 std::weak_ptr<AbilityRecord> caller_; 222 std::shared_ptr<SystemAbilityCallerRecord> saCaller_ = nullptr; 223 std::shared_ptr<CallerAbilityInfo> callerInfo_ = nullptr; 224 std::set<int32_t> requestCodeSet_; 225 }; 226 227 /** 228 * @class AbilityRequest 229 * Wrap parameters of starting ability. 230 */ 231 enum AbilityCallType { 232 INVALID_TYPE = 0, 233 CALL_REQUEST_TYPE, 234 START_OPTIONS_TYPE, 235 START_SETTINGS_TYPE, 236 START_EXTENSION_TYPE, 237 }; 238 239 enum CollaboratorType { 240 DEFAULT_TYPE = 0, 241 RESERVE_TYPE, 242 OTHERS_TYPE 243 }; 244 245 struct AbilityRequest { 246 Want want; 247 AppExecFwk::AbilityInfo abilityInfo; 248 AppExecFwk::ApplicationInfo appInfo; 249 int32_t uid = 0; 250 int requestCode = -1; 251 bool restart = false; 252 int32_t restartCount = -1; 253 int64_t restartTime = 0; 254 bool startRecent = false; 255 int32_t collaboratorType = CollaboratorType::DEFAULT_TYPE; 256 257 // call ability 258 int callerUid = -1; 259 AbilityCallType callType = AbilityCallType::INVALID_TYPE; 260 sptr<IRemoteObject> callerToken = nullptr; 261 sptr<IRemoteObject> asCallerSourceToken = nullptr; 262 uint32_t callerAccessTokenId = -1; 263 sptr<IAbilityConnection> connect = nullptr; 264 265 std::vector<AppExecFwk::SupportWindowMode> supportWindowModes; 266 std::shared_ptr<AbilityStartSetting> startSetting = nullptr; 267 std::shared_ptr<ProcessOptions> processOptions = nullptr; 268 std::shared_ptr<StartWindowOption> startWindowOption = nullptr; 269 std::string specifiedFlag; 270 int32_t userId = -1; 271 bool callSpecifiedFlagTimeout = false; 272 sptr<IRemoteObject> abilityInfoCallback = nullptr; 273 274 AppExecFwk::ExtensionAbilityType extensionType = AppExecFwk::ExtensionAbilityType::UNSPECIFIED; 275 AppExecFwk::ExtensionProcessMode extensionProcessMode = AppExecFwk::ExtensionProcessMode::UNDEFINED; 276 277 sptr<SessionInfo> sessionInfo; 278 uint32_t specifyTokenId = 0; 279 bool uriReservedFlag = false; 280 std::string reservedBundleName; 281 bool isFromIcon = false; 282 bool isShellCall = false; IsContinuationAbilityRequest283 std::pair<bool, LaunchReason> IsContinuation() const 284 { 285 auto flags = want.GetFlags(); 286 if ((flags & Want::FLAG_ABILITY_CONTINUATION) == Want::FLAG_ABILITY_CONTINUATION) { 287 return {true, LaunchReason::LAUNCHREASON_CONTINUATION}; 288 } 289 if ((flags & Want::FLAG_ABILITY_PREPARE_CONTINUATION) == Want::FLAG_ABILITY_PREPARE_CONTINUATION) { 290 return {true, LaunchReason::LAUNCHREASON_PREPARE_CONTINUATION}; 291 } 292 return {false, LaunchReason::LAUNCHREASON_UNKNOWN}; 293 } 294 IsAcquireShareDataAbilityRequest295 bool IsAcquireShareData() const 296 { 297 return want.GetBoolParam(Want::PARAM_ABILITY_ACQUIRE_SHARE_DATA, false); 298 } 299 IsAppRecoveryAbilityRequest300 bool IsAppRecovery() const 301 { 302 return want.GetBoolParam(Want::PARAM_ABILITY_RECOVERY_RESTART, false); 303 } 304 IsCallTypeAbilityRequest305 bool IsCallType(const AbilityCallType & type) const 306 { 307 return (callType == type); 308 } 309 DumpAbilityRequest310 void Dump(std::vector<std::string> &state) 311 { 312 std::string dumpInfo = " want [" + want.ToUri() + "]"; 313 state.push_back(dumpInfo); 314 dumpInfo = " app name [" + abilityInfo.applicationName + "]"; 315 state.push_back(dumpInfo); 316 dumpInfo = " main name [" + abilityInfo.name + "]"; 317 state.push_back(dumpInfo); 318 dumpInfo = " request code [" + std::to_string(requestCode) + "]"; 319 state.push_back(dumpInfo); 320 } 321 322 void Voluation(const Want &srcWant, int srcRequestCode, 323 const sptr<IRemoteObject> &srcCallerToken, const std::shared_ptr<AbilityStartSetting> srcStartSetting = nullptr, 324 int srcCallerUid = -1) 325 { 326 want = srcWant; 327 requestCode = srcRequestCode; 328 callerToken = srcCallerToken; 329 startSetting = srcStartSetting; 330 callerUid = srcCallerUid == -1 ? IPCSkeleton::GetCallingUid() : srcCallerUid; 331 } 332 }; 333 334 // new version 335 enum ResolveResultType { 336 OK_NO_REMOTE_OBJ = 0, 337 OK_HAS_REMOTE_OBJ, 338 NG_INNER_ERROR, 339 }; 340 341 enum class AbilityWindowState { 342 FOREGROUND = 0, 343 BACKGROUND, 344 TERMINATE, 345 FOREGROUNDING, 346 BACKGROUNDING, 347 TERMINATING 348 }; 349 350 enum class AbilityVisibilityState { 351 INITIAL = 0, 352 FOREGROUND_HIDE, 353 FOREGROUND_SHOW, 354 UNSPECIFIED, 355 }; 356 357 struct LaunchDebugInfo { 358 public: 359 void Update(const Want &want); 360 361 bool isDebugAppSet = false; 362 bool isNativeDebugSet = false; 363 bool isPerfCmdSet = false; 364 bool debugApp = false; 365 bool nativeDebug = false; 366 std::string perfCmd; 367 }; 368 369 /** 370 * @class AbilityRecord 371 * AbilityRecord records ability info and states and used to schedule ability life. 372 */ 373 class AbilityRecord : public std::enable_shared_from_this<AbilityRecord> { 374 public: 375 AbilityRecord(const Want &want, const AppExecFwk::AbilityInfo &abilityInfo, 376 const AppExecFwk::ApplicationInfo &applicationInfo, int requestCode = -1); 377 378 virtual ~AbilityRecord(); 379 380 /** 381 * CreateAbilityRecord. 382 * 383 * @param abilityRequest,create ability record. 384 * @return Returns ability record ptr. 385 */ 386 static std::shared_ptr<AbilityRecord> CreateAbilityRecord(const AbilityRequest &abilityRequest); 387 388 /** 389 * Init ability record. 390 * 391 * @return Returns true on success, others on failure. 392 */ 393 bool Init(); 394 395 /** 396 * load UI ability. 397 * 398 */ 399 void LoadUIAbility(); 400 401 /** 402 * load ability. 403 * 404 * @return Returns ERR_OK on success, others on failure. 405 */ 406 int LoadAbility(bool isShellCall = false); 407 408 /** 409 * foreground the ability. 410 * 411 */ 412 void ForegroundAbility(uint32_t sceneFlag = 0); 413 void ForegroundUIExtensionAbility(uint32_t sceneFlag = 0); 414 415 /** 416 * process request of foregrounding the ability. 417 * 418 */ 419 void ProcessForegroundAbility(uint32_t tokenId, uint32_t sceneFlag = 0, bool isShellCall = false); 420 421 /** 422 * post foreground timeout task for ui ability. 423 * 424 */ 425 void PostForegroundTimeoutTask(); 426 427 void PostUIExtensionAbilityTimeoutTask(uint32_t messageId); 428 429 /** 430 * move the ability to back ground. 431 * 432 * @param task timeout task. 433 */ 434 void BackgroundAbility(const Closure &task); 435 436 /** 437 * prepare terminate ability. 438 * 439 * @return Returns true on stop terminating; returns false on terminate. 440 */ 441 bool PrepareTerminateAbility(); 442 443 /** 444 * terminate ability. 445 * 446 * @return Returns ERR_OK on success, others on failure. 447 */ 448 int TerminateAbility(); 449 450 /** 451 * get ability's info. 452 * 453 * @return ability info. 454 */ 455 const AppExecFwk::AbilityInfo &GetAbilityInfo() const; 456 457 /** 458 * get application's info. 459 * 460 * @return application info. 461 */ 462 const AppExecFwk::ApplicationInfo &GetApplicationInfo() const; 463 464 /** 465 * set ability's state. 466 * 467 * @param state, ability's state. 468 */ 469 void SetAbilityState(AbilityState state); 470 471 bool GetAbilityForegroundingFlag() const; 472 473 void SetAbilityForegroundingFlag(); 474 475 /** 476 * get ability's state. 477 * 478 * @return ability state. 479 */ 480 AbilityState GetAbilityState() const; 481 482 /** 483 * get ability's windowconfig. 484 * 485 * @return ability windowconfig. 486 */ 487 WindowConfig GetAbilityWindowConfig() const; 488 489 bool IsForeground() const; 490 491 AbilityVisibilityState GetAbilityVisibilityState() const; 492 void SetAbilityVisibilityState(AbilityVisibilityState state); 493 494 void UpdateAbilityVisibilityState(); 495 496 /** 497 * set ability scheduler for accessing ability thread. 498 * 499 * @param scheduler , ability scheduler. 500 */ 501 void SetScheduler(const sptr<IAbilityScheduler> &scheduler); 502 GetScheduler()503 inline sptr<IAbilityScheduler> GetScheduler() const 504 { 505 return scheduler_; 506 } 507 508 sptr<SessionInfo> GetSessionInfo() const; 509 510 /** 511 * get ability's token. 512 * 513 * @return ability's token. 514 */ 515 sptr<Token> GetToken() const; 516 517 /** 518 * set ability's previous ability record. 519 * 520 * @param abilityRecord , previous ability record 521 */ 522 void SetPreAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord); 523 524 /** 525 * get ability's previous ability record. 526 * 527 * @return previous ability record 528 */ 529 std::shared_ptr<AbilityRecord> GetPreAbilityRecord() const; 530 531 /** 532 * set ability's next ability record. 533 * 534 * @param abilityRecord , next ability record 535 */ 536 void SetNextAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord); 537 538 /** 539 * get ability's previous ability record. 540 * 541 * @return previous ability record 542 */ 543 std::shared_ptr<AbilityRecord> GetNextAbilityRecord() const; 544 545 /** 546 * check whether the ability is ready. 547 * 548 * @return true : ready ,false: not ready 549 */ 550 bool IsReady() const; 551 552 void UpdateRecoveryInfo(bool hasRecoverInfo); 553 554 bool GetRecoveryInfo(); 555 556 #ifdef SUPPORT_GRAPHICS 557 /** 558 * check whether the ability 's window is attached. 559 * 560 * @return true : attached ,false: not attached 561 */ 562 bool IsWindowAttached() const; 563 IsStartingWindow()564 inline bool IsStartingWindow() const 565 { 566 return isStartingWindow_; 567 } 568 SetStartingWindow(bool isStartingWindow)569 inline void SetStartingWindow(bool isStartingWindow) 570 { 571 isStartingWindow_ = isStartingWindow; 572 } 573 574 void PostCancelStartingWindowHotTask(); 575 576 /** 577 * process request of foregrounding the ability. 578 * 579 */ 580 void ProcessForegroundAbility(bool isRecent, const AbilityRequest &abilityRequest, 581 std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility, 582 uint32_t sceneFlag = 0); 583 584 void ProcessForegroundAbility(const std::shared_ptr<AbilityRecord> &callerAbility, bool needExit = true, 585 uint32_t sceneFlag = 0); 586 void NotifyAnimationFromTerminatingAbility() const; 587 void NotifyAnimationFromMinimizeAbility(bool& animaEnabled); 588 589 bool ReportAtomicServiceDrawnCompleteEvent(); 590 void SetCompleteFirstFrameDrawing(const bool flag); 591 bool IsCompleteFirstFrameDrawing() const; 592 bool GetColdStartFlag(); 593 void SetColdStartFlag(bool isColdStart); 594 #endif 595 596 bool GrantUriPermissionForServiceExtension(); 597 598 bool GrantUriPermissionForUIExtension(); 599 600 /** 601 * check whether the ability is launcher. 602 * 603 * @return true : lanucher ,false: not lanucher 604 */ 605 bool IsLauncherAbility() const; 606 607 /** 608 * check whether the ability is terminating. 609 * 610 * @return true : yes ,false: not 611 */ 612 bool IsTerminating() const; 613 614 /** 615 * set the ability is terminating. 616 * 617 */ 618 void SetTerminatingState(); 619 620 /** 621 * set the ability is new want flag. 622 * 623 * @return isNewWant 624 */ 625 void SetIsNewWant(bool isNewWant); 626 627 /** 628 * check whether the ability is new want flag. 629 * 630 * @return true : yes ,false: not 631 */ 632 bool IsNewWant() const; 633 634 /** 635 * check whether the ability is created by connect ability mode. 636 * 637 * @return true : yes ,false: not 638 */ 639 bool IsCreateByConnect() const; 640 641 /** 642 * set the ability is created by connect ability mode. 643 * 644 */ 645 void SetCreateByConnectMode(bool isCreatedByConnect = true); 646 647 /** 648 * active the ability. 649 * 650 */ 651 virtual void Activate(); 652 653 /** 654 * inactive the ability. 655 * 656 */ 657 virtual void Inactivate(); 658 659 /** 660 * terminate the ability. 661 * 662 */ 663 void Terminate(const Closure &task); 664 665 /** 666 * connect the ability. 667 * 668 */ 669 void ConnectAbility(); 670 671 /** 672 * connect the ability with want. 673 * 674 */ 675 void ConnectAbilityWithWant(const Want &want); 676 677 /** 678 * disconnect the ability. 679 * 680 */ 681 void DisconnectAbility(); 682 683 /** 684 * disconnect the ability with want 685 * 686 */ 687 void DisconnectAbilityWithWant(const Want &want); 688 689 /** 690 * Command the ability. 691 * 692 */ 693 void CommandAbility(); 694 695 void CommandAbilityWindow(const sptr<SessionInfo> &sessionInfo, WindowCommand winCmd); 696 697 /** 698 * save ability state. 699 * 700 */ 701 void SaveAbilityState(); 702 void SaveAbilityState(const PacMap &inState); 703 void SaveAbilityWindowConfig(const WindowConfig &windowConfig); 704 705 /** 706 * restore ability state. 707 * 708 */ 709 void RestoreAbilityState(); 710 711 /** 712 * notify top active ability updated. 713 * 714 */ 715 void TopActiveAbilityChanged(bool flag); 716 717 /** 718 * set the want for start ability. 719 * 720 */ 721 void SetWant(const Want &want); 722 723 /** 724 * get the want for start ability. 725 * 726 */ 727 Want GetWant() const; 728 729 /** 730 * remove signature info of want. 731 * 732 */ 733 void RemoveSignatureInfo(); 734 735 /** 736 * remove specified wantParam for start ability. 737 * 738 */ 739 void RemoveSpecifiedWantParam(const std::string &key); 740 741 /** 742 * get request code of the ability to start. 743 * 744 */ 745 int GetRequestCode() const; 746 747 /** 748 * set the result object of the ability which one need to be terminated. 749 * 750 */ 751 void SetResult(const std::shared_ptr<AbilityResult> &result); 752 753 /** 754 * get the result object of the ability which one need to be terminated. 755 * 756 */ 757 std::shared_ptr<AbilityResult> GetResult() const; 758 759 /** 760 * send result object to caller ability thread. 761 * 762 */ 763 void SendResult(bool isSandboxApp, uint32_t tokeId); 764 765 /** 766 * send result object to caller ability thread. 767 * 768 */ 769 void SendResultByBackToCaller(const std::shared_ptr<AbilityResult> &result); 770 771 /** 772 * send result object to caller ability thread for sandbox app file saving. 773 */ 774 void SendSandboxSavefileResult(const Want &want, int resultCode, int requestCode); 775 776 /** 777 * send result object to caller ability. 778 * 779 */ 780 void SendResultToCallers(bool schedulerdied = false); 781 782 /** 783 * save result object to caller ability. 784 * 785 */ 786 void SaveResultToCallers(const int resultCode, const Want *resultWant); 787 788 std::shared_ptr<AbilityRecord> GetCallerByRequestCode(int32_t requestCode, int32_t pid); 789 790 /** 791 * save result to caller ability. 792 * 793 */ 794 void SaveResult(int resultCode, const Want *resultWant, std::shared_ptr<CallerRecord> caller); 795 796 bool NeedConnectAfterCommand(); 797 798 /** 799 * add connect record to the list. 800 * 801 */ 802 void AddConnectRecordToList(const std::shared_ptr<ConnectionRecord> &connRecord); 803 804 /** 805 * get the list of connect record. 806 * 807 */ 808 std::list<std::shared_ptr<ConnectionRecord>> GetConnectRecordList() const; 809 810 /** 811 * get the list of connect record. 812 * 813 */ 814 std::list<std::shared_ptr<ConnectionRecord>> GetConnectingRecordList(); 815 816 /** 817 * get the count of In Progress record. 818 * 819 */ 820 uint32_t GetInProgressRecordCount(); 821 /** 822 * remove the connect record from list. 823 * 824 */ 825 void RemoveConnectRecordFromList(const std::shared_ptr<ConnectionRecord> &connRecord); 826 827 /** 828 * check whether connect list is empty. 829 * 830 */ 831 bool IsConnectListEmpty(); 832 833 size_t GetConnectedListSize(); 834 835 size_t GetConnectingListSize(); 836 837 void RemoveCallerRequestCode(std::shared_ptr<AbilityRecord> callerAbilityRecord, int32_t requestCode); 838 839 /** 840 * add caller record 841 * 842 */ 843 void AddCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode, const Want &want, 844 std::string srcAbilityId = "", uint32_t callingTokenId = 0); 845 846 /** 847 * get caller record to list. 848 * 849 */ 850 std::list<std::shared_ptr<CallerRecord>> GetCallerRecordList() const; 851 std::shared_ptr<AbilityRecord> GetCallerRecord() const; 852 853 std::shared_ptr<CallerAbilityInfo> GetCallerInfo() const; 854 855 /** 856 * get connecting record from list. 857 * 858 */ 859 std::shared_ptr<ConnectionRecord> GetConnectingRecord() const; 860 861 /** 862 * get disconnecting record from list. 863 * 864 */ 865 std::shared_ptr<ConnectionRecord> GetDisconnectingRecord() const; 866 867 /** 868 * convert ability state (enum type to string type). 869 * 870 */ 871 static std::string ConvertAbilityState(const AbilityState &state); 872 873 static std::string ConvertAppState(const AppState &state); 874 875 /** 876 * convert life cycle state to ability state . 877 * 878 */ 879 static int ConvertLifeCycleToAbilityState(const AbilityLifeCycleState &state); 880 881 /** 882 * get the ability record id. 883 * 884 */ GetRecordId()885 inline int GetRecordId() const 886 { 887 return recordId_; 888 } 889 890 /** 891 * dump ability info. 892 * 893 */ 894 void Dump(std::vector<std::string> &info); 895 896 void DumpClientInfo(std::vector<std::string> &info, const std::vector<std::string> ¶ms, 897 bool isClient = false, bool dumpConfig = true) const; 898 899 /** 900 * Called when client complete dump. 901 * 902 * @param infos The dump info. 903 */ 904 void DumpAbilityInfoDone(std::vector<std::string> &infos); 905 906 /** 907 * dump ability state info. 908 * 909 */ 910 void DumpAbilityState(std::vector<std::string> &info, bool isClient, const std::vector<std::string> ¶ms); 911 912 void SetStartTime(); 913 914 int64_t GetStartTime() const; 915 916 /** 917 * dump service info. 918 * 919 */ 920 void DumpService(std::vector<std::string> &info, bool isClient = false) const; 921 922 /** 923 * dump service info. 924 * 925 */ 926 void DumpService(std::vector<std::string> &info, std::vector<std::string> ¶ms, bool isClient = false) const; 927 928 /** 929 * set aconnect remote object. 930 * 931 */ 932 void SetConnRemoteObject(const sptr<IRemoteObject> &remoteObject); 933 934 /** 935 * get connect remote object. 936 * 937 */ 938 sptr<IRemoteObject> GetConnRemoteObject() const; 939 940 /** 941 * check whether the ability is never started. 942 */ 943 bool IsNeverStarted() const; 944 945 void AddStartId(); 946 int GetStartId() const; 947 948 void SetIsUninstallAbility(); 949 /** 950 * Determine whether ability is uninstalled 951 * 952 * @return true: uninstalled false: installed 953 */ 954 bool IsUninstallAbility() const; 955 void ShareData(const int32_t &uniqueId); 956 void SetLauncherRoot(); 957 bool IsLauncherRoot() const; 958 bool IsAbilityState(const AbilityState &state) const; 959 bool IsActiveState() const; 960 961 void SetStartSetting(const std::shared_ptr<AbilityStartSetting> &setting); 962 std::shared_ptr<AbilityStartSetting> GetStartSetting() const; 963 964 void SetRestarting(const bool isRestart); 965 void SetRestarting(const bool isRestart, int32_t canReStartCount); 966 int32_t GetRestartCount() const; 967 void SetRestartCount(int32_t restartCount); 968 bool GetKeepAlive() const; SetKeepAliveBundle(bool value)969 void SetKeepAliveBundle(bool value) 970 { 971 keepAliveBundle_ = value; 972 } IsKeepAliveBundle()973 bool IsKeepAliveBundle() const 974 { 975 return keepAliveBundle_; 976 } 977 void SetLoading(bool status); 978 bool IsLoading() const; 979 int64_t GetRestartTime(); 980 void SetRestartTime(const int64_t restartTime); 981 void SetAppIndex(const int32_t appIndex); 982 int32_t GetAppIndex() const; 983 bool IsRestarting() const; 984 void SetAppState(const AppState &state); 985 AppState GetAppState() const; 986 987 void SetLaunchReason(const LaunchReason &reason); 988 void SetLastExitReason(const ExitReason &exitReason); 989 void ContinueAbility(const std::string &deviceId, uint32_t versionCode); 990 void NotifyContinuationResult(int32_t result); 991 992 void SetMissionId(int32_t missionId); 993 int32_t GetMissionId() const; 994 995 void SetUid(int32_t uid); 996 int32_t GetUid(); 997 int32_t GetPid(); 998 void SetSwitchingPause(bool state); 999 bool IsSwitchingPause(); 1000 void SetOwnerMissionUserId(int32_t userId); 1001 int32_t GetOwnerMissionUserId(); 1002 1003 // new version 1004 ResolveResultType Resolve(const AbilityRequest &abilityRequest); 1005 bool ReleaseCall(const sptr<IAbilityConnection> &connect); 1006 bool IsNeedToCallRequest() const; 1007 bool IsStartedByCall() const; 1008 void SetStartedByCall(const bool isFlag); 1009 void CallRequest(); 1010 bool CallRequestDone(const sptr<IRemoteObject> &callStub) const; 1011 bool IsStartToBackground() const; 1012 void SetStartToBackground(const bool flag); 1013 bool IsStartToForeground() const; 1014 void SetStartToForeground(const bool flag); 1015 void SetSessionInfo(sptr<SessionInfo> sessionInfo); 1016 void UpdateSessionInfo(sptr<IRemoteObject> sessionToken); 1017 void SetMinimizeReason(bool fromUser); 1018 void SetSceneFlag(uint32_t sceneFlag); 1019 bool IsMinimizeFromUser() const; 1020 void SetClearMissionFlag(bool clearMissionFlag); 1021 bool IsClearMissionFlag(); 1022 1023 void SetSpecifiedFlag(const std::string &flag); 1024 std::string GetSpecifiedFlag() const; 1025 void SetWindowMode(int32_t windowMode); 1026 void RemoveWindowMode(); 1027 LifeCycleStateInfo lifeCycleStateInfo_; // target life state info 1028 1029 bool CanRestartRootLauncher(); 1030 1031 bool CanRestartResident(); 1032 1033 std::string GetLabel(); GetAbilityRecordId()1034 inline int64_t GetAbilityRecordId() const 1035 { 1036 return recordId_; 1037 } 1038 1039 void SetPendingState(AbilityState state); 1040 AbilityState GetPendingState() const; 1041 1042 bool IsNeedBackToOtherMissionStack(); 1043 void SetNeedBackToOtherMissionStack(bool isNeedBackToOtherMissionStack); 1044 std::shared_ptr<AbilityRecord> GetOtherMissionStackAbilityRecord() const; 1045 void SetOtherMissionStackAbilityRecord(const std::shared_ptr<AbilityRecord> &abilityRecord); 1046 void RevokeUriPermission(); 1047 void RemoveAbilityDeathRecipient() const; 1048 bool IsExistConnection(const sptr<IAbilityConnection> &connect); 1049 1050 int32_t GetCollaboratorType() const; 1051 1052 std::string GetMissionAffinity() const; 1053 1054 void SetLockedState(bool lockedState); 1055 bool GetLockedState(); 1056 1057 void SetAttachDebug(const bool isAttachDebug); 1058 void SetAssertDebug(bool isAssertDebug); 1059 int32_t CreateModalUIExtension(const Want &want); 1060 1061 AppExecFwk::ElementName GetElementName() const; 1062 bool IsDebugApp() const; 1063 bool IsDebug() const; 1064 1065 void AddAbilityWindowStateMap(uint64_t uiExtensionComponentId, 1066 AbilityWindowState abilityWindowState); 1067 1068 void RemoveAbilityWindowStateMap(uint64_t uiExtensionComponentId); 1069 1070 bool IsAbilityWindowReady(); 1071 1072 void SetAbilityWindowState(const sptr<SessionInfo> &sessionInfo, 1073 WindowCommand winCmd, bool isFinished); 1074 1075 void SetUIExtensionAbilityId(const int32_t uiExtensionAbilityId); 1076 int32_t GetUIExtensionAbilityId() const; 1077 1078 void OnProcessDied(); 1079 1080 void SetProcessName(const std::string &process); 1081 1082 std::string GetProcessName() const; 1083 1084 void SetURI(const std::string &uri); 1085 std::string GetURI() const; 1086 1087 void DoBackgroundAbilityWindowDelayed(bool needBackground); 1088 bool BackgroundAbilityWindowDelayed(); 1089 1090 bool IsSceneBoard() const; 1091 1092 void SetRestartAppFlag(bool isRestartApp); 1093 bool GetRestartAppFlag() const; 1094 1095 void SetSpecifyTokenId(const uint32_t specifyTokenId); 1096 void UpdateUIExtensionInfo(const WantParams &wantParams); 1097 1098 void SaveConnectWant(const Want &want); 1099 1100 void UpdateConnectWant(); 1101 1102 void RemoveConnectWant(); 1103 1104 void UpdateDmsCallerInfo(Want &want); 1105 SetSecurityFlag(bool securityFlag)1106 void SetSecurityFlag(bool securityFlag) 1107 { 1108 securityFlag_ = securityFlag; 1109 } 1110 GetSecurityFlag()1111 bool GetSecurityFlag() const 1112 { 1113 return securityFlag_; 1114 } 1115 1116 protected: 1117 void SendEvent(uint32_t msg, uint32_t timeOut, int32_t param = -1, bool isExtension = false); 1118 1119 sptr<Token> token_ = {}; // used to interact with kit and wms 1120 std::unique_ptr<LifecycleDeal> lifecycleDeal_ = {}; // life manager used to schedule life 1121 AbilityState currentState_ = AbilityState::INITIAL; // current life state 1122 Want want_ = {}; // want to start this ability 1123 1124 private: 1125 /** 1126 * get the type of ability. 1127 * 1128 */ 1129 void GetAbilityTypeString(std::string &typeStr); 1130 void OnSchedulerDied(const wptr<IRemoteObject> &remote); 1131 void GrantUriPermission(Want &want, std::string targetBundleName, bool isSandboxApp, uint32_t tokenId); 1132 void GrantDmsUriPermission(Want &want, std::string targetBundleName); 1133 bool IsDmsCall(Want &want); 1134 int32_t GetCurrentAccountId() const; 1135 1136 /** 1137 * add system ability caller record 1138 * 1139 */ 1140 void AddSystemAbilityCallerRecord(const sptr<IRemoteObject> &callerToken, int requestCode, 1141 std::string srcAbilityId); 1142 1143 bool IsSystemAbilityCall(const sptr<IRemoteObject> &callerToken, uint32_t callingTokenId = 0); 1144 1145 void RecordSaCallerInfo(const Want &want); 1146 1147 #ifdef WITH_DLP 1148 void HandleDlpAttached(); 1149 void HandleDlpClosed(); 1150 #endif // WITH_DLP 1151 void NotifyRemoveShellProcess(int32_t type); 1152 void NotifyAnimationAbilityDied(); SetCallerAccessTokenId(uint32_t callerAccessTokenId)1153 inline void SetCallerAccessTokenId(uint32_t callerAccessTokenId) 1154 { 1155 callerAccessTokenId_ = callerAccessTokenId; 1156 } 1157 1158 bool GrantPermissionToShell(const std::vector<std::string> &uriVec, uint32_t flag, std::string targetPkg); 1159 1160 void GrantUriPermissionInner(Want &want, std::vector<std::string> &uriVec, const std::string &targetBundleName, 1161 uint32_t tokenId); 1162 void GrantUriPermissionFor2In1Inner( 1163 Want &want, std::vector<std::string> &uriVec, const std::string &targetBundleName, uint32_t tokenId); 1164 1165 LastExitReason CovertAppExitReasonToLastReason(const Reason exitReason); 1166 1167 void NotifyMissionBindPid(); 1168 1169 void DumpUIExtensionRootHostInfo(std::vector<std::string> &info) const; 1170 1171 void DumpUIExtensionPid(std::vector<std::string> &info, bool isUIExtension) const; 1172 1173 void PublishFileOpenEvent(const Want &want); 1174 1175 void SetDebugAppByWaitingDebugFlag(); 1176 void AfterLoaded(); 1177 1178 #ifdef SUPPORT_GRAPHICS 1179 std::shared_ptr<Want> GetWantFromMission() const; 1180 void SetShowWhenLocked(const AppExecFwk::AbilityInfo &abilityInfo, sptr<AbilityTransitionInfo> &info) const; 1181 void SetAbilityTransitionInfo(const AppExecFwk::AbilityInfo &abilityInfo, 1182 sptr<AbilityTransitionInfo> &info) const; 1183 void SetAbilityTransitionInfo(sptr<AbilityTransitionInfo>& info) const; 1184 sptr<IWindowManagerServiceHandler> GetWMSHandler() const; 1185 void SetWindowModeAndDisplayId(sptr<AbilityTransitionInfo> &info, const std::shared_ptr<Want> &want) const; 1186 sptr<AbilityTransitionInfo> CreateAbilityTransitionInfo(); 1187 sptr<AbilityTransitionInfo> CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> &startOptions, 1188 const std::shared_ptr<Want> &want) const; 1189 sptr<AbilityTransitionInfo> CreateAbilityTransitionInfo(const AbilityRequest &abilityRequest) const; 1190 sptr<AbilityTransitionInfo> CreateAbilityTransitionInfo(const std::shared_ptr<StartOptions> &startOptions, 1191 const std::shared_ptr<Want> &want, const AbilityRequest &abilityRequest); 1192 std::shared_ptr<Global::Resource::ResourceManager> CreateResourceManager() const; 1193 std::shared_ptr<Media::PixelMap> GetPixelMap(const uint32_t windowIconId, 1194 std::shared_ptr<Global::Resource::ResourceManager> resourceMgr) const; 1195 1196 void AnimationTask(bool isRecent, const AbilityRequest &abilityRequest, 1197 const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<AbilityRecord> &callerAbility); 1198 void NotifyAnimationFromStartingAbility(const std::shared_ptr<AbilityRecord> &callerAbility, 1199 const AbilityRequest &abilityRequest) const; 1200 void NotifyAnimationFromRecentTask(const std::shared_ptr<StartOptions> &startOptions, 1201 const std::shared_ptr<Want> &want) const; 1202 void NotifyAnimationFromTerminatingAbility(const std::shared_ptr<AbilityRecord> &callerAbility, bool needExit, 1203 bool flag); 1204 1205 void StartingWindowTask(bool isRecent, bool isCold, const AbilityRequest &abilityRequest, 1206 std::shared_ptr<StartOptions> &startOptions); 1207 void StartingWindowColdTask(bool isRecnet, const AbilityRequest &abilityRequest, 1208 std::shared_ptr<StartOptions> &startOptions); 1209 void PostCancelStartingWindowColdTask(); 1210 void StartingWindowHot(const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want, 1211 const AbilityRequest &abilityRequest); 1212 void StartingWindowHot(); 1213 void StartingWindowCold(const std::shared_ptr<StartOptions> &startOptions, const std::shared_ptr<Want> &want, 1214 const AbilityRequest &abilityRequest); 1215 void InitColdStartingWindowResource(const std::shared_ptr<Global::Resource::ResourceManager> &resourceMgr); 1216 void GetColdStartingWindowResource(std::shared_ptr<Media::PixelMap> &bg, uint32_t &bgColor); 1217 void SetAbilityStateInner(AbilityState state); 1218 #endif 1219 1220 static int64_t abilityRecordId; 1221 int recordId_ = 0; // record id 1222 int32_t uiExtensionAbilityId_ = 0; // uiextension ability id 1223 AppExecFwk::AbilityInfo abilityInfo_ = {}; // the ability info get from BMS 1224 AppExecFwk::ApplicationInfo applicationInfo_ = {}; // the ability info get from BMS 1225 std::weak_ptr<AbilityRecord> preAbilityRecord_ = {}; // who starts this ability record 1226 std::weak_ptr<AbilityRecord> nextAbilityRecord_ = {}; // ability that started by this ability 1227 int64_t startTime_ = 0; // records first time of ability start 1228 int64_t restartTime_ = 0; // the time of last trying restart 1229 bool isReady_ = false; // is ability thread attached? 1230 bool isWindowStarted_ = false; // is window hotstart or coldstart? 1231 bool isWindowAttached_ = false; // Is window of this ability attached? 1232 bool isLauncherAbility_ = false; // is launcher? 1233 1234 sptr<IAbilityScheduler> scheduler_ = {}; // kit scheduler 1235 bool isLoading_ = false; // is loading? 1236 bool isTerminating_ = false; // is terminating ? 1237 bool isCreateByConnect_ = false; // is created by connect ability mode? 1238 1239 int requestCode_ = -1; // requestCode_: >= 0 for-result start mode; <0 for normal start mode in default. 1240 sptr<IRemoteObject::DeathRecipient> schedulerDeathRecipient_ = {}; // scheduler binderDied Recipient 1241 1242 /** 1243 * result_: ability starts with for-result mode will send result before being terminated. 1244 * Its caller will receive results before active. 1245 * Now we assume only one result generate when terminate. 1246 */ 1247 std::shared_ptr<AbilityResult> result_ = {}; 1248 1249 /** 1250 * When this ability startAbilityForResult another ability, if another ability is terminated, 1251 * this ability will move to foreground, during this time, isAbilityForegrounding_ is true, 1252 * isAbilityForegrounding_ will be set to false when this ability is background 1253 */ 1254 bool isAbilityForegrounding_ = false; 1255 1256 // service(ability) can be connected by multi-pages(abilites), so need to store this service's connections 1257 mutable ffrt::mutex connRecordListMutex_; 1258 std::list<std::shared_ptr<ConnectionRecord>> connRecordList_ = {}; 1259 // service(ability) onConnect() return proxy of service ability 1260 sptr<IRemoteObject> connRemoteObject_ = {}; 1261 int startId_ = 0; // service(ability) start id 1262 1263 // page(ability) can be started by multi-pages(abilites), so need to store this ability's caller 1264 std::list<std::shared_ptr<CallerRecord>> callerList_ = {}; 1265 1266 bool isUninstall_ = false; 1267 1268 bool isLauncherRoot_ = false; 1269 1270 PacMap stateDatas_; // ability saved ability state data 1271 WindowConfig windowConfig_; 1272 bool isRestarting_ = false; // is restarting ? 1273 AppState appState_ = AppState::BEGIN; 1274 1275 int32_t uid_ = 0; 1276 int32_t pid_ = 0; 1277 int32_t missionId_ = -1; 1278 int32_t ownerMissionUserId_ = -1; 1279 bool isSwitchingPause_ = false; 1280 1281 // new version 1282 std::shared_ptr<CallContainer> callContainer_ = nullptr; 1283 bool isStartedByCall_ = false; 1284 bool isStartToBackground_ = false; 1285 bool isStartToForeground_ = false; 1286 int32_t appIndex_ = 0; 1287 bool minimizeReason_ = false; 1288 1289 bool clearMissionFlag_ = false; 1290 bool keepAliveBundle_ = false; 1291 int32_t restartCount_ = -1; 1292 int32_t restartMax_ = -1; 1293 std::string specifiedFlag_; 1294 std::string uri_; 1295 ffrt::mutex lock_; 1296 mutable ffrt::mutex dumpInfoLock_; 1297 mutable ffrt::mutex dumpLock_; 1298 mutable ffrt::mutex resultLock_; 1299 mutable ffrt::mutex wantLock_; 1300 mutable ffrt::condition_variable dumpCondition_; 1301 mutable bool isDumpTimeout_ = false; 1302 std::vector<std::string> dumpInfos_; 1303 std::atomic<AbilityState> pendingState_ = AbilityState::INITIAL; // pending life state 1304 std::atomic<AbilityVisibilityState> abilityVisibilityState_ = AbilityVisibilityState::INITIAL; 1305 1306 // scene session 1307 sptr<SessionInfo> sessionInfo_ = nullptr; 1308 mutable ffrt::mutex sessionLock_; 1309 std::map<uint64_t, AbilityWindowState> abilityWindowStateMap_; 1310 1311 #ifdef SUPPORT_GRAPHICS 1312 bool isStartingWindow_ = false; 1313 uint32_t bgColor_ = 0; 1314 std::shared_ptr<Media::PixelMap> startingWindowBg_ = nullptr; 1315 1316 bool isCompleteFirstFrameDrawing_ = false; 1317 bool coldStart_ = false; 1318 #endif 1319 1320 bool isGrantedUriPermission_ = false; 1321 uint32_t callerAccessTokenId_ = -1; 1322 bool isNeedBackToOtherMissionStack_ = false; 1323 std::weak_ptr<AbilityRecord> otherMissionStackAbilityRecord_; // who starts this ability record by SA 1324 int32_t collaboratorType_ = 0; 1325 std::string missionAffinity_ = ""; 1326 bool lockedState_ = false; 1327 bool isAttachDebug_ = false; 1328 bool isAssertDebug_ = false; 1329 bool isAppAutoStartup_ = false; 1330 bool isConnected = false; 1331 std::atomic_bool backgroundAbilityWindowDelayed_ = false; 1332 1333 bool isRestartApp_ = false; // Only app calling RestartApp can be set to true 1334 uint32_t specifyTokenId_ = 0; 1335 1336 std::shared_ptr<Want> connectWant_ = nullptr; 1337 std::shared_ptr<CallerAbilityInfo> saCallerInfo_ = nullptr; 1338 ffrt::mutex connectWantLock_; 1339 bool isLaunching_ = true; 1340 LaunchDebugInfo launchDebugInfo_; 1341 bool securityFlag_ = false; 1342 }; 1343 } // namespace AAFwk 1344 } // namespace OHOS 1345 #endif // OHOS_ABILITY_RUNTIME_ABILITY_RECORD_H 1346