15fede72eSopenharmony_ci/*
25fede72eSopenharmony_ci * Copyright (c) 2020 Huawei Device Co., Ltd.
35fede72eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
45fede72eSopenharmony_ci * you may not use this file except in compliance with the License.
55fede72eSopenharmony_ci * You may obtain a copy of the License at
65fede72eSopenharmony_ci *
75fede72eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
85fede72eSopenharmony_ci *
95fede72eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
105fede72eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
115fede72eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125fede72eSopenharmony_ci * See the License for the specific language governing permissions and
135fede72eSopenharmony_ci * limitations under the License.
145fede72eSopenharmony_ci */
155fede72eSopenharmony_ci
165fede72eSopenharmony_ci#include "player_ability_slice.h"
175fede72eSopenharmony_ci#include <algorithm>
185fede72eSopenharmony_ci#include <vector>
195fede72eSopenharmony_ci
205fede72eSopenharmony_ci#include "ability_env.h"
215fede72eSopenharmony_ci#include "ability_manager.h"
225fede72eSopenharmony_ci#include "components/ui_image_view.h"
235fede72eSopenharmony_ci#include "gfx_utils/file.h"
245fede72eSopenharmony_ci
255fede72eSopenharmony_ciusing OHOS::Media::Player;
265fede72eSopenharmony_ciusing OHOS::Media::Source;
275fede72eSopenharmony_ciusing namespace OHOS::Media;
285fede72eSopenharmony_ci
295fede72eSopenharmony_cinamespace OHOS {
305fede72eSopenharmony_ciREGISTER_AS(PlayerAbilitySlice)
315fede72eSopenharmony_ci
325fede72eSopenharmony_ci
335fede72eSopenharmony_ciPlayerAbilitySlice::~PlayerAbilitySlice()
345fede72eSopenharmony_ci{
355fede72eSopenharmony_ci    printf("################ ~PlayerAbilitySlice enter\n");
365fede72eSopenharmony_ci
375fede72eSopenharmony_ci    /** released in DestoryPlayer(). */
385fede72eSopenharmony_ci
395fede72eSopenharmony_ci    printf("################ ~PlayerAbilitySlice exit\n");
405fede72eSopenharmony_ci}
415fede72eSopenharmony_ci
425fede72eSopenharmony_cistd::shared_ptr<Player> PlayerAbilitySlice::CreatePlayer()
435fede72eSopenharmony_ci{
445fede72eSopenharmony_ci    static std::shared_ptr<Player> instance_ = nullptr;
455fede72eSopenharmony_ci    if (instance_ == nullptr) {
465fede72eSopenharmony_ci        instance_ = std::make_shared<Player>();
475fede72eSopenharmony_ci    }
485fede72eSopenharmony_ci    return instance_;
495fede72eSopenharmony_ci}
505fede72eSopenharmony_ci
515fede72eSopenharmony_civoid PlayerAbilitySlice::Clear()
525fede72eSopenharmony_ci{
535fede72eSopenharmony_ci    printf("PlayerAbilitySlice::Clear | enter\n");
545fede72eSopenharmony_ci    if (backIconListener_ != nullptr) {
555fede72eSopenharmony_ci        delete backIconListener_;
565fede72eSopenharmony_ci        backIconListener_ = nullptr;
575fede72eSopenharmony_ci    }
585fede72eSopenharmony_ci    if (onClickListener_ != nullptr) {
595fede72eSopenharmony_ci        delete onClickListener_;
605fede72eSopenharmony_ci        onClickListener_ = nullptr;
615fede72eSopenharmony_ci    }
625fede72eSopenharmony_ci    if (surfaceView_ != nullptr) {
635fede72eSopenharmony_ci        delete surfaceView_;
645fede72eSopenharmony_ci        surfaceView_ = nullptr;
655fede72eSopenharmony_ci    }
665fede72eSopenharmony_ci    if (animatorGroup_ != nullptr) {
675fede72eSopenharmony_ci        delete animatorGroup_;
685fede72eSopenharmony_ci        animatorGroup_ = nullptr;
695fede72eSopenharmony_ci    }
705fede72eSopenharmony_ci    if (backIcon_ != nullptr) {
715fede72eSopenharmony_ci        delete backIcon_;
725fede72eSopenharmony_ci        backIcon_ = nullptr;
735fede72eSopenharmony_ci    }
745fede72eSopenharmony_ci    if (backArea_ != nullptr) {
755fede72eSopenharmony_ci        delete backArea_;
765fede72eSopenharmony_ci        backArea_ = nullptr;
775fede72eSopenharmony_ci    }
785fede72eSopenharmony_ci    if (errorTips_ != nullptr) {
795fede72eSopenharmony_ci        delete errorTips_;
805fede72eSopenharmony_ci        errorTips_ = nullptr;
815fede72eSopenharmony_ci    }
825fede72eSopenharmony_ci    if (totalTimeLabel_ != nullptr) {
835fede72eSopenharmony_ci        delete totalTimeLabel_;
845fede72eSopenharmony_ci        totalTimeLabel_ = nullptr;
855fede72eSopenharmony_ci    }
865fede72eSopenharmony_ci    if (currentTimeLabel_ != nullptr) {
875fede72eSopenharmony_ci        delete currentTimeLabel_;
885fede72eSopenharmony_ci        currentTimeLabel_ = nullptr;
895fede72eSopenharmony_ci    }
905fede72eSopenharmony_ci    if (slider_ != nullptr) {
915fede72eSopenharmony_ci        delete slider_;
925fede72eSopenharmony_ci        slider_ = nullptr;
935fede72eSopenharmony_ci    }
945fede72eSopenharmony_ci    if (toggleButton_ != nullptr) {
955fede72eSopenharmony_ci        delete toggleButton_;
965fede72eSopenharmony_ci        toggleButton_ = nullptr;
975fede72eSopenharmony_ci    }
985fede72eSopenharmony_ci    if (toggleButtonArea_ != nullptr) {
995fede72eSopenharmony_ci        delete toggleButtonArea_;
1005fede72eSopenharmony_ci        toggleButtonArea_ = nullptr;
1015fede72eSopenharmony_ci    }
1025fede72eSopenharmony_ci    if (rootView_ != nullptr) {
1035fede72eSopenharmony_ci        RootView::DestroyWindowRootView(rootView_);
1045fede72eSopenharmony_ci        rootView_ = nullptr;
1055fede72eSopenharmony_ci    }
1065fede72eSopenharmony_ci    printf("PlayerAbilitySlice::Clear() | end\n");
1075fede72eSopenharmony_ci}
1085fede72eSopenharmony_ci
1095fede72eSopenharmony_civoid PlayerAbilitySlice::ShowErrorTips()
1105fede72eSopenharmony_ci{
1115fede72eSopenharmony_ci    errorTips_ = new UILabel();
1125fede72eSopenharmony_ci    errorTips_->SetPosition(ROOT_VIEW_POSITION_X, ROOT_VIEW_POSITION_Y, ROOT_VIEW_WIDTH, ROOT_VIEW_HEIGHT);
1135fede72eSopenharmony_ci    errorTips_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER,
1145fede72eSopenharmony_ci        UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
1155fede72eSopenharmony_ci    errorTips_->SetFont(FONT_NAME, GALLERY_FONT_SIZE);
1165fede72eSopenharmony_ci    errorTips_->SetText("视频播放错误");
1175fede72eSopenharmony_ci
1185fede72eSopenharmony_ci    rootView_->Add(backArea_);
1195fede72eSopenharmony_ci    rootView_->Add(errorTips_);
1205fede72eSopenharmony_ci    rootView_->Add(backIcon_);
1215fede72eSopenharmony_ci    SetUIContent(rootView_);
1225fede72eSopenharmony_ci}
1235fede72eSopenharmony_ci
1245fede72eSopenharmony_civoid PlayerAbilitySlice::SetUpRootView()
1255fede72eSopenharmony_ci{
1265fede72eSopenharmony_ci    if (rootView_ != nullptr) {
1275fede72eSopenharmony_ci        return;
1285fede72eSopenharmony_ci    }
1295fede72eSopenharmony_ci    rootView_ = RootView::GetWindowRootView();
1305fede72eSopenharmony_ci    rootView_->SetPosition(ROOT_VIEW_POSITION_X, ROOT_VIEW_POSITION_Y);
1315fede72eSopenharmony_ci    rootView_->Resize(ROOT_VIEW_WIDTH, ROOT_VIEW_HEIGHT);
1325fede72eSopenharmony_ci    rootView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
1335fede72eSopenharmony_ci}
1345fede72eSopenharmony_ci
1355fede72eSopenharmony_civoid PlayerAbilitySlice::SetUpBackArea(const char* pathHeader)
1365fede72eSopenharmony_ci{
1375fede72eSopenharmony_ci    auto onClick = [this] (UIView &view, const Event &event) -> bool {
1385fede72eSopenharmony_ci        printf("############  PlayerAbilitySlice terminate AS enter   #############\n");
1395fede72eSopenharmony_ci        Terminate();
1405fede72eSopenharmony_ci        printf("############  PlayerAbilitySlice terminate AS exit   #############\n");
1415fede72eSopenharmony_ci        return true;
1425fede72eSopenharmony_ci    };
1435fede72eSopenharmony_ci    backIcon_ = new UIImageView();
1445fede72eSopenharmony_ci    backIcon_->SetPosition(BACK_ICON_POSITION_X, BACK_ICON_POSITION_Y);
1455fede72eSopenharmony_ci
1465fede72eSopenharmony_ci    if (sprintf_s(backIconAbsolutePath, MAX_PATH_LENGTH, "%s%s", pathHeader, BACK_ICON_PATH) < 0) {
1475fede72eSopenharmony_ci        printf("PlayerAbilitySlice::OnStart | backIconAbsolutePath | %s\n", pathHeader);
1485fede72eSopenharmony_ci        return;
1495fede72eSopenharmony_ci    }
1505fede72eSopenharmony_ci    backIcon_->SetSrc(backIconAbsolutePath);
1515fede72eSopenharmony_ci    backIcon_->SetTouchable(true);
1525fede72eSopenharmony_ci    backIconListener_ = new EventListener(onClick, nullptr);
1535fede72eSopenharmony_ci    backIcon_->SetOnClickListener(backIconListener_);
1545fede72eSopenharmony_ci
1555fede72eSopenharmony_ci    backArea_ = new UIViewGroup();
1565fede72eSopenharmony_ci    backArea_->SetPosition(0, 0, LABEL_POSITION_X, LABEL_HEIGHT);
1575fede72eSopenharmony_ci    backArea_->SetStyle(STYLE_BACKGROUND_OPA, 0);
1585fede72eSopenharmony_ci    backArea_->SetTouchable(true);
1595fede72eSopenharmony_ci    backArea_->SetOnClickListener(backIconListener_);
1605fede72eSopenharmony_ci
1615fede72eSopenharmony_ci    rootView_->Add(backArea_);
1625fede72eSopenharmony_ci    rootView_->Add(backIcon_);
1635fede72eSopenharmony_ci}
1645fede72eSopenharmony_ci
1655fede72eSopenharmony_civoid PlayerAbilitySlice::SetUpVideoPlayer(const Want &want)
1665fede72eSopenharmony_ci{
1675fede72eSopenharmony_ci    if (videoPlayer_ == nullptr) {
1685fede72eSopenharmony_ci        videoPlayer_ = new PlayerAdapter();
1695fede72eSopenharmony_ci    }
1705fede72eSopenharmony_ci    videoPlayer_->sourceType = 1;
1715fede72eSopenharmony_ci
1725fede72eSopenharmony_ci    uint16_t videoPathLen = strlen(VIDEO_SOURCE_DIRECTORY) + strlen(reinterpret_cast<char*>(want.data)) + 1;
1735fede72eSopenharmony_ci    int8_t ret = sprintf_s(videoPlayer_->filePath, videoPathLen + 1, "%s/%s", VIDEO_SOURCE_DIRECTORY,
1745fede72eSopenharmony_ci        reinterpret_cast<char*>(want.data));
1755fede72eSopenharmony_ci    if (ret < 0) {
1765fede72eSopenharmony_ci        printf("PlayerAbilitySlice::OnStart | videoPlayer_->filePath | %s\n", reinterpret_cast<char*>(want.data));
1775fede72eSopenharmony_ci        return;
1785fede72eSopenharmony_ci    }
1795fede72eSopenharmony_ci    ret = sprintf_s(&videoPlayer_->filePath[videoPathLen - strlen(AVAILABEL_SOURCE_TYPE)],
1805fede72eSopenharmony_ci                    strlen(AVAILABEL_SOURCE_TYPE) + 1, "%s", AVAILABEL_SOURCE_TYPE);
1815fede72eSopenharmony_ci    if (ret < 0) {
1825fede72eSopenharmony_ci        printf("PlayerAbilitySlice::OnStart | videoPlayer_->filePath \n");
1835fede72eSopenharmony_ci        return;
1845fede72eSopenharmony_ci    }
1855fede72eSopenharmony_ci    printf("------########### mp4 file path | %s\n", videoPlayer_->filePath);
1865fede72eSopenharmony_ci
1875fede72eSopenharmony_ci    videoPlayer_->adapter = PlayerAbilitySlice::CreatePlayer();
1885fede72eSopenharmony_ci    std::string uri(videoPlayer_->filePath);
1895fede72eSopenharmony_ci    std::map<std::string, std::string> header;
1905fede72eSopenharmony_ci    Source source(uri, header);
1915fede72eSopenharmony_ci    videoPlayer_->adapter->SetSource(source);
1925fede72eSopenharmony_ci}
1935fede72eSopenharmony_ci
1945fede72eSopenharmony_cibool PlayerAbilitySlice::SetUpSurfaceView()
1955fede72eSopenharmony_ci{
1965fede72eSopenharmony_ci    if (surfaceView_ != nullptr) {
1975fede72eSopenharmony_ci        return true;
1985fede72eSopenharmony_ci    }
1995fede72eSopenharmony_ci    int32_t width = 0;
2005fede72eSopenharmony_ci    int32_t height = 0;
2015fede72eSopenharmony_ci    videoPlayer_->adapter->GetVideoWidth(width);
2025fede72eSopenharmony_ci    printf("[%s,%d] width:%d\n", __func__, __LINE__, width);
2035fede72eSopenharmony_ci    videoPlayer_->adapter->GetVideoHeight(height);
2045fede72eSopenharmony_ci    printf("[%s,%d] height:%d\n", __func__, __LINE__, height);
2055fede72eSopenharmony_ci
2065fede72eSopenharmony_ci    if (width <= 0 || height <= 0) {
2075fede72eSopenharmony_ci        videoPlayer_->adapter->Release();
2085fede72eSopenharmony_ci        delete videoPlayer_;
2095fede72eSopenharmony_ci        videoPlayer_ = nullptr;
2105fede72eSopenharmony_ci        printf("******** width <= 0 || height <= 0 | return \n");
2115fede72eSopenharmony_ci        ShowErrorTips();
2125fede72eSopenharmony_ci        return false;
2135fede72eSopenharmony_ci    }
2145fede72eSopenharmony_ci    float ratio_x = static_cast<float>(width) / ROOT_VIEW_WIDTH;
2155fede72eSopenharmony_ci    float ratio_y = static_cast<float>(height) / ROOT_VIEW_HEIGHT;
2165fede72eSopenharmony_ci    uint16_t surfaceViewWidth;
2175fede72eSopenharmony_ci    uint16_t surfaceViewHeight;
2185fede72eSopenharmony_ci    uint16_t surfaceViewPositionX = 0;
2195fede72eSopenharmony_ci    uint16_t surfaceViewPositionY = 0;
2205fede72eSopenharmony_ci    if (ratio_x > ratio_y) {
2215fede72eSopenharmony_ci        surfaceViewWidth = ROOT_VIEW_WIDTH;
2225fede72eSopenharmony_ci        surfaceViewHeight = height / ratio_x;
2235fede72eSopenharmony_ci        surfaceViewPositionY = (ROOT_VIEW_HEIGHT - surfaceViewHeight) / 2; // 2: half
2245fede72eSopenharmony_ci    } else {
2255fede72eSopenharmony_ci        surfaceViewWidth = width / ratio_y;
2265fede72eSopenharmony_ci        surfaceViewHeight = ROOT_VIEW_HEIGHT;
2275fede72eSopenharmony_ci        surfaceViewPositionX = (ROOT_VIEW_WIDTH - surfaceViewWidth) / 2; // 2: half
2285fede72eSopenharmony_ci    }
2295fede72eSopenharmony_ci
2305fede72eSopenharmony_ci    surfaceView_ = new UISurfaceView();
2315fede72eSopenharmony_ci    surfaceView_->SetPosition(surfaceViewPositionX, surfaceViewPositionY);
2325fede72eSopenharmony_ci    surfaceView_->SetWidth(surfaceViewWidth - 1);
2335fede72eSopenharmony_ci    surfaceView_->SetHeight(surfaceViewHeight);
2345fede72eSopenharmony_ci    videoPlayer_->adapter->SetVideoSurface(surfaceView_->GetSurface());
2355fede72eSopenharmony_ci
2365fede72eSopenharmony_ci    rootView_->Add(surfaceView_);
2375fede72eSopenharmony_ci
2385fede72eSopenharmony_ci    return true;
2395fede72eSopenharmony_ci}
2405fede72eSopenharmony_ci
2415fede72eSopenharmony_civoid PlayerAbilitySlice::SetUpProgress(int64_t duration)
2425fede72eSopenharmony_ci{
2435fede72eSopenharmony_ci    slider_ = new UISlider();
2445fede72eSopenharmony_ci    slider_->SetPosition(SLIDER_X, SLIDER_Y, SLIDER_WIDTH, STATUS_BAR_GROUP_HEIGHT);
2455fede72eSopenharmony_ci    slider_->SetValidHeight(SLIDER_HEIGHT);
2465fede72eSopenharmony_ci    slider_->SetValidWidth(SLIDER_WIDTH - KNOB_WIDTH);
2475fede72eSopenharmony_ci    slider_->SetRange(SLIDER_WIDTH, 0);
2485fede72eSopenharmony_ci    slider_->SetValue(0);
2495fede72eSopenharmony_ci    slider_->SetKnobWidth(KNOB_WIDTH);
2505fede72eSopenharmony_ci    slider_->SetSliderRadius(SLIDER_HEIGHT, SLIDER_HEIGHT);
2515fede72eSopenharmony_ci    slider_->SetKnobRadius(KNOB_WIDTH / 2); // 2: half
2525fede72eSopenharmony_ci    slider_->SetKnobStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
2535fede72eSopenharmony_ci    slider_->SetBackgroundStyle(STYLE_BACKGROUND_COLOR, 0x1A888888);
2545fede72eSopenharmony_ci    slider_->SetBackgroundStyle(STYLE_BACKGROUND_OPA, 90); // 90: opacity is 90
2555fede72eSopenharmony_ci    slider_->SetDirection(UISlider::Direction::DIR_LEFT_TO_RIGHT);
2565fede72eSopenharmony_ci    slider_->SetTouchable(false);
2575fede72eSopenharmony_ci    animatorGroup_->Add(slider_);
2585fede72eSopenharmony_ci
2595fede72eSopenharmony_ci    animator_ = new SliderAnimator(videoPlayer_, slider_, currentTimeLabel_, duration, surfaceView_);
2605fede72eSopenharmony_ci}
2615fede72eSopenharmony_ci
2625fede72eSopenharmony_civoid PlayerAbilitySlice::SetUpAnimatorGroup(const char* pathHeader)
2635fede72eSopenharmony_ci{
2645fede72eSopenharmony_ci    int64_t duration = 0;
2655fede72eSopenharmony_ci    videoPlayer_->adapter->GetDuration(duration);
2665fede72eSopenharmony_ci    printf("[%s,%d] GetDuration:%lld\n", __func__, __LINE__, duration);
2675fede72eSopenharmony_ci
2685fede72eSopenharmony_ci    animatorGroup_ = new UIViewGroup();
2695fede72eSopenharmony_ci    animatorGroup_->SetPosition(0, ROOT_VIEW_HEIGHT - STATUS_BAR_GROUP_HEIGHT,
2705fede72eSopenharmony_ci                                ROOT_VIEW_WIDTH, STATUS_BAR_GROUP_HEIGHT);
2715fede72eSopenharmony_ci    animatorGroup_->SetStyle(STYLE_BACKGROUND_OPA, 0);
2725fede72eSopenharmony_ci
2735fede72eSopenharmony_ci    totalTimeLabel_ = new UILabel();
2745fede72eSopenharmony_ci    totalTimeLabel_->SetPosition(TOTAL_TIME_LABEL_X, TOTAL_TIME_LABEL_Y,
2755fede72eSopenharmony_ci        TOTAL_TIME_LABEL_WIDTH, TOTAL_TIME_LABEL_HEIGHT);
2765fede72eSopenharmony_ci    totalTimeLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_LEFT,
2775fede72eSopenharmony_ci        UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
2785fede72eSopenharmony_ci    totalTimeLabel_->SetFont(FONT_NAME, PLAYER_FONT_SIZE);
2795fede72eSopenharmony_ci    int64_t second = duration / 1000; // 1000: 1s = 1000ms
2805fede72eSopenharmony_ci    char timer[6]; // 6: length of time label
2815fede72eSopenharmony_ci    if (sprintf_s(timer, sizeof(timer), "%02lld:%02lld", second / 60, second % 60) < 0) { // 60: 1minute = 60s
2825fede72eSopenharmony_ci        return;
2835fede72eSopenharmony_ci    }
2845fede72eSopenharmony_ci
2855fede72eSopenharmony_ci    totalTimeLabel_->SetText(timer);
2865fede72eSopenharmony_ci    totalTimeLabel_->SetTextColor(Color::White());
2875fede72eSopenharmony_ci    animatorGroup_->Add(totalTimeLabel_);
2885fede72eSopenharmony_ci
2895fede72eSopenharmony_ci    currentTimeLabel_ = new UILabel();
2905fede72eSopenharmony_ci    currentTimeLabel_->SetPosition(CURRENT_TIME_LABEL_X, CURRENT_TIME_LABEL_Y,
2915fede72eSopenharmony_ci        CURRENT_TIME_LABEL_WIDTH, CURRENT_TIME_LABEL_HEIGHT);
2925fede72eSopenharmony_ci    currentTimeLabel_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);
2935fede72eSopenharmony_ci    currentTimeLabel_->SetFont(FONT_NAME, PLAYER_FONT_SIZE);
2945fede72eSopenharmony_ci    currentTimeLabel_->SetText("00:00");
2955fede72eSopenharmony_ci    currentTimeLabel_->SetTextColor(Color::White());
2965fede72eSopenharmony_ci    currentTimeLabel_->SetAlign(UITextLanguageAlignment::TEXT_ALIGNMENT_LEFT,
2975fede72eSopenharmony_ci        UITextLanguageAlignment::TEXT_ALIGNMENT_CENTER);
2985fede72eSopenharmony_ci    animatorGroup_->Add(currentTimeLabel_);
2995fede72eSopenharmony_ci
3005fede72eSopenharmony_ci    SetUpProgress(duration);
3015fede72eSopenharmony_ci
3025fede72eSopenharmony_ci    SetUpToggleButton(pathHeader);
3035fede72eSopenharmony_ci
3045fede72eSopenharmony_ci    rootView_->Add(animatorGroup_);
3055fede72eSopenharmony_ci}
3065fede72eSopenharmony_ci
3075fede72eSopenharmony_civoid PlayerAbilitySlice::SetUpToggleButton(const char* pathHeader)
3085fede72eSopenharmony_ci{
3095fede72eSopenharmony_ci    toggleButton_ = new UIToggleButton();
3105fede72eSopenharmony_ci    toggleButton_->SetTouchable(false);
3115fede72eSopenharmony_ci    toggleButton_->SetPosition(TOGGLE_BUTTON_OFFSET_X, TOGGLE_BUTTON_OFFSET_Y,
3125fede72eSopenharmony_ci        TOGGLE_BUTTON_WIDTH, TOGGLE_BUTTON_HEIGHT);
3135fede72eSopenharmony_ci    toggleButton_->SetState(true);
3145fede72eSopenharmony_ci
3155fede72eSopenharmony_ci    if (sprintf_s(videoPlayAbsolutePath, MAX_PATH_LENGTH, "%s%s", pathHeader, VIDEO_PALY_PATH) < 0) {
3165fede72eSopenharmony_ci        printf("PlayerAbilitySlice::OnStart | videoPlayAbsolutePath\n");
3175fede72eSopenharmony_ci        return;
3185fede72eSopenharmony_ci    }
3195fede72eSopenharmony_ci
3205fede72eSopenharmony_ci    if (sprintf_s(videoPauseAbsolutePath, MAX_PATH_LENGTH, "%s%s", pathHeader, VIDEO_PAUSE_PATH) < 0) {
3215fede72eSopenharmony_ci        printf("PlayerAbilitySlice::OnStart | videoPauseAbsolutePath\n");
3225fede72eSopenharmony_ci        return;
3235fede72eSopenharmony_ci    }
3245fede72eSopenharmony_ci    toggleButton_->SetImages(videoPauseAbsolutePath, videoPlayAbsolutePath);
3255fede72eSopenharmony_ci    onClickListener_ = new ToggleBtnListener(toggleButton_, videoPlayer_, animator_, surfaceView_);
3265fede72eSopenharmony_ci
3275fede72eSopenharmony_ci    toggleButtonArea_ = new UIViewGroup();
3285fede72eSopenharmony_ci    toggleButtonArea_->SetPosition(0, 0, TOGGLE_BUTTON_OFFSET_X + TOGGLE_BUTTON_WIDTH, STATUS_BAR_GROUP_HEIGHT);
3295fede72eSopenharmony_ci    toggleButtonArea_->SetTouchable(true);
3305fede72eSopenharmony_ci    toggleButtonArea_->SetOnClickListener(onClickListener_);
3315fede72eSopenharmony_ci    toggleButtonArea_->Add(toggleButton_);
3325fede72eSopenharmony_ci
3335fede72eSopenharmony_ci    animatorGroup_->Add(toggleButtonArea_);
3345fede72eSopenharmony_ci}
3355fede72eSopenharmony_ci
3365fede72eSopenharmony_civoid PlayerAbilitySlice::OnStart(const Want &want)
3375fede72eSopenharmony_ci{
3385fede72eSopenharmony_ci    printf("@@@@@ PlayerAbilitySlice::OnStart\n");
3395fede72eSopenharmony_ci    AbilitySlice::OnStart(want);
3405fede72eSopenharmony_ci
3415fede72eSopenharmony_ci    SetUpRootView();
3425fede72eSopenharmony_ci    const char* pathHeader = GetSrcPath();
3435fede72eSopenharmony_ci    SetUpVideoPlayer(want);
3445fede72eSopenharmony_ci
3455fede72eSopenharmony_ci    videoPlayer_->adapter->Prepare();
3465fede72eSopenharmony_ci
3475fede72eSopenharmony_ci    if (!SetUpSurfaceView()) {
3485fede72eSopenharmony_ci        return;
3495fede72eSopenharmony_ci    }
3505fede72eSopenharmony_ci    SetUpBackArea(pathHeader);
3515fede72eSopenharmony_ci    SetUpAnimatorGroup(pathHeader);
3525fede72eSopenharmony_ci
3535fede72eSopenharmony_ci    SetUIContent(rootView_);
3545fede72eSopenharmony_ci
3555fede72eSopenharmony_ci    videoPlayer_->adapter->Play();
3565fede72eSopenharmony_ci    animator_->SetToggleButton(toggleButton_);
3575fede72eSopenharmony_ci    animator_->SetToggleBtnListener(onClickListener_);
3585fede72eSopenharmony_ci    animator_->Start();
3595fede72eSopenharmony_ci
3605fede72eSopenharmony_ci    printf("## @@@@@ PlayerAbilitySlice::OnStart | end \n");
3615fede72eSopenharmony_ci}
3625fede72eSopenharmony_ci
3635fede72eSopenharmony_civoid PlayerAbilitySlice::OnInactive()
3645fede72eSopenharmony_ci{
3655fede72eSopenharmony_ci    printf("PlayerAbilitySlice::OnInactive\n");
3665fede72eSopenharmony_ci    AbilitySlice::OnInactive();
3675fede72eSopenharmony_ci}
3685fede72eSopenharmony_ci
3695fede72eSopenharmony_civoid PlayerAbilitySlice::OnActive(const Want &want)
3705fede72eSopenharmony_ci{
3715fede72eSopenharmony_ci    printf("PlayerAbilitySlice::OnActive\n");
3725fede72eSopenharmony_ci    AbilitySlice::OnActive(want);
3735fede72eSopenharmony_ci}
3745fede72eSopenharmony_ci
3755fede72eSopenharmony_civoid PlayerAbilitySlice::OnBackground()
3765fede72eSopenharmony_ci{
3775fede72eSopenharmony_ci    printf("PlayerAbilitySlice::OnBackground\n");
3785fede72eSopenharmony_ci    AbilitySlice::OnBackground();
3795fede72eSopenharmony_ci}
3805fede72eSopenharmony_ci
3815fede72eSopenharmony_civoid PlayerAbilitySlice::OnStop()
3825fede72eSopenharmony_ci{
3835fede72eSopenharmony_ci    if (animator_ != nullptr) {
3845fede72eSopenharmony_ci        animator_->Stop();
3855fede72eSopenharmony_ci        delete animator_;
3865fede72eSopenharmony_ci        animator_ = nullptr;
3875fede72eSopenharmony_ci    }
3885fede72eSopenharmony_ci
3895fede72eSopenharmony_ci    if (videoPlayer_ != nullptr && videoPlayer_->adapter.get() != nullptr) {
3905fede72eSopenharmony_ci        videoPlayer_->adapter->Stop();
3915fede72eSopenharmony_ci        videoPlayer_->adapter->Reset();
3925fede72eSopenharmony_ci        delete videoPlayer_;
3935fede72eSopenharmony_ci        videoPlayer_ = nullptr;
3945fede72eSopenharmony_ci    }
3955fede72eSopenharmony_ci    Clear();
3965fede72eSopenharmony_ci    printf("PlayerAbilitySlice::OnStop\n");
3975fede72eSopenharmony_ci    AbilitySlice::OnStop();
3985fede72eSopenharmony_ci}
3995fede72eSopenharmony_ci
4005fede72eSopenharmony_civoid SliderAnimator::Callback(UIView* view)
4015fede72eSopenharmony_ci{
4025fede72eSopenharmony_ci    if (needRefreshPlayer_) {
4035fede72eSopenharmony_ci        videoPlayer_->adapter->Stop();
4045fede72eSopenharmony_ci        videoPlayer_->adapter->Reset();
4055fede72eSopenharmony_ci
4065fede72eSopenharmony_ci        videoPlayer_->adapter = PlayerAbilitySlice::CreatePlayer();
4075fede72eSopenharmony_ci        std::string uri(videoPlayer_->filePath);
4085fede72eSopenharmony_ci        std::map<std::string, std::string> header;
4095fede72eSopenharmony_ci        Source source(uri, header);
4105fede72eSopenharmony_ci        videoPlayer_->adapter->SetSource(source);
4115fede72eSopenharmony_ci        videoPlayer_->adapter->Prepare();
4125fede72eSopenharmony_ci        videoPlayer_->adapter->SetVideoSurface(surfaceView_->GetSurface());
4135fede72eSopenharmony_ci        videoPlayer_->adapter->Play();
4145fede72eSopenharmony_ci        needRefreshPlayer_ = false;
4155fede72eSopenharmony_ci    }
4165fede72eSopenharmony_ci
4175fede72eSopenharmony_ci    int64_t currentTime = 0;
4185fede72eSopenharmony_ci    videoPlayer_->adapter->GetCurrentTime(currentTime);
4195fede72eSopenharmony_ci    int64_t currentSecond = currentTime / 1000; // 1000: 1s = 1000ms
4205fede72eSopenharmony_ci
4215fede72eSopenharmony_ci    char time[6]; // 6: length of time label
4225fede72eSopenharmony_ci    sprintf_s(time, sizeof(time), "%02lld:%02lld", currentSecond / 60, currentSecond % 60); // 60: 1minute = 60s
4235fede72eSopenharmony_ci    timeLabel_->SetText(time);
4245fede72eSopenharmony_ci    timeLabel_->Invalidate();
4255fede72eSopenharmony_ci
4265fede72eSopenharmony_ci    int64_t curPosition = currentTime * slider_->GetRangeMax() / duration_;
4275fede72eSopenharmony_ci    slider_->SetValue(curPosition);
4285fede72eSopenharmony_ci    slider_->Invalidate();
4295fede72eSopenharmony_ci
4305fede72eSopenharmony_ci    if (currentTime >= duration_) {
4315fede72eSopenharmony_ci        listener_->SetCompleteFlag(true);
4325fede72eSopenharmony_ci        toggleButton_->SetState(false);
4335fede72eSopenharmony_ci        needRefreshPlayer_ = true;
4345fede72eSopenharmony_ci        Stop();
4355fede72eSopenharmony_ci    }
4365fede72eSopenharmony_ci}
4375fede72eSopenharmony_ci
4385fede72eSopenharmony_cibool ToggleBtnListener::OnClick(UIView &view, const ClickEvent& event)
4395fede72eSopenharmony_ci{
4405fede72eSopenharmony_ci    button_->OnClickEvent(event);
4415fede72eSopenharmony_ci    if (completeFlag_) {
4425fede72eSopenharmony_ci        animator_->Start();
4435fede72eSopenharmony_ci        button_->Invalidate();
4445fede72eSopenharmony_ci        completeFlag_ = false;
4455fede72eSopenharmony_ci        return true;
4465fede72eSopenharmony_ci    }
4475fede72eSopenharmony_ci
4485fede72eSopenharmony_ci    if (button_->GetState()) {
4495fede72eSopenharmony_ci        videoPlayer_->adapter->Play();
4505fede72eSopenharmony_ci        animator_->Resume();
4515fede72eSopenharmony_ci        printf("ToggleBtnListener::OnClick | play\n");
4525fede72eSopenharmony_ci    } else {
4535fede72eSopenharmony_ci        videoPlayer_->adapter->Pause();
4545fede72eSopenharmony_ci        animator_->Pause();
4555fede72eSopenharmony_ci        printf("ToggleBtnListener::OnClick | pause\n");
4565fede72eSopenharmony_ci    }
4575fede72eSopenharmony_ci    button_->Invalidate();
4585fede72eSopenharmony_ci    return true;
4595fede72eSopenharmony_ci}
4605fede72eSopenharmony_ci}
461