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