1 /*
2  * Copyright (c) 2022-2023 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 "core/components_ng/image_provider/image_state_manager.h"
17 
18 #include "core/components_ng/image_provider/image_loading_context.h"
19 
20 namespace OHOS::Ace::NG {
21 
GetCurrentState()22 ImageLoadingState ImageStateManager::GetCurrentState()
23 {
24     return state_;
25 }
26 
HandleCommand(ImageLoadingCommand command)27 void ImageStateManager::HandleCommand(ImageLoadingCommand command)
28 {
29     switch (state_) {
30         case ImageLoadingState::UNLOADED:
31             HandleCommandByUnloadedState(command);
32             break;
33         case ImageLoadingState::DATA_LOADING:
34             HandleCommandByDataLoadingState(command);
35             break;
36         case ImageLoadingState::DATA_READY:
37             HandleCommandByDataReadyState(command);
38             break;
39         case ImageLoadingState::MAKE_CANVAS_IMAGE:
40             HandleCommandByMakeCanvasImageState(command);
41             break;
42         case ImageLoadingState::LOAD_SUCCESS:
43             HandleCommandByLoadSuccessState(command);
44             break;
45         case ImageLoadingState::LOAD_FAIL:
46             HandleCommandByLoadFailState(command);
47             break;
48         default:
49             TAG_LOGW(AceLogTag::ACE_IMAGE, "unknown command: %{public}d", command);
50             break;
51     }
52 }
53 
54 #define CASE_OF_STATE_TRANSITION(command, nextState, nextStateName) \
55     case ImageLoadingCommand::command: {                            \
56         auto ctx = ctx_.Upgrade();                                  \
57         CHECK_NULL_VOID(ctx);                                       \
58         state_ = ImageLoadingState::nextState;                      \
59         ctx->On##nextStateName();                                   \
60         break;                                                      \
61     }
62 
63 #define DEFAULT_CASE_OF_STATE_TRANSITION()    \
64     case ImageLoadingCommand::RESET_STATE: {  \
65         auto ctx = ctx_.Upgrade();            \
66         CHECK_NULL_VOID(ctx);                 \
67         state_ = ImageLoadingState::UNLOADED; \
68         ctx->OnUnloaded();                    \
69         break;                                \
70     }                                         \
71     default:                                  \
72         break;
73 
HandleCommandByUnloadedState(ImageLoadingCommand command)74 void ImageStateManager::HandleCommandByUnloadedState(ImageLoadingCommand command)
75 {
76     switch (command) {
77         CASE_OF_STATE_TRANSITION(LOAD_DATA, DATA_LOADING, DataLoading);
78         DEFAULT_CASE_OF_STATE_TRANSITION();
79     }
80 }
81 
HandleCommandByDataLoadingState(ImageLoadingCommand command)82 void ImageStateManager::HandleCommandByDataLoadingState(ImageLoadingCommand command)
83 {
84     switch (command) {
85         CASE_OF_STATE_TRANSITION(LOAD_DATA_SUCCESS, DATA_READY, DataReady);
86         CASE_OF_STATE_TRANSITION(LOAD_FAIL, LOAD_FAIL, LoadFail);
87         DEFAULT_CASE_OF_STATE_TRANSITION();
88     }
89 }
90 
HandleCommandByDataReadyState(ImageLoadingCommand command)91 void ImageStateManager::HandleCommandByDataReadyState(ImageLoadingCommand command)
92 {
93     switch (command) {
94         CASE_OF_STATE_TRANSITION(MAKE_CANVAS_IMAGE, MAKE_CANVAS_IMAGE, MakeCanvasImage);
95         DEFAULT_CASE_OF_STATE_TRANSITION();
96     }
97 }
98 
HandleCommandByMakeCanvasImageState(ImageLoadingCommand command)99 void ImageStateManager::HandleCommandByMakeCanvasImageState(ImageLoadingCommand command)
100 {
101     switch (command) {
102         CASE_OF_STATE_TRANSITION(MAKE_CANVAS_IMAGE_SUCCESS, LOAD_SUCCESS, LoadSuccess);
103         CASE_OF_STATE_TRANSITION(LOAD_FAIL, LOAD_FAIL, LoadFail);
104         DEFAULT_CASE_OF_STATE_TRANSITION();
105     }
106 }
107 
HandleCommandByLoadSuccessState(ImageLoadingCommand command)108 void ImageStateManager::HandleCommandByLoadSuccessState(ImageLoadingCommand command)
109 {
110     switch (command) {
111         CASE_OF_STATE_TRANSITION(MAKE_CANVAS_IMAGE, MAKE_CANVAS_IMAGE, MakeCanvasImage);
112         DEFAULT_CASE_OF_STATE_TRANSITION();
113     }
114 }
115 
HandleCommandByLoadFailState(ImageLoadingCommand command)116 void ImageStateManager::HandleCommandByLoadFailState(ImageLoadingCommand command)
117 {
118     switch (command) {
119         DEFAULT_CASE_OF_STATE_TRANSITION();
120     }
121 }
122 
SetState(ImageLoadingState state)123 void ImageStateManager::SetState(ImageLoadingState state)
124 {
125     state_ = state;
126 }
127 } // namespace OHOS::Ace::NG
128