陈剑华

Merge remote-tracking branch 'origin/main'

@@ -90,7 +90,9 @@ export struct ZhSingleRow03 { @@ -90,7 +90,9 @@ export struct ZhSingleRow03 {
90 } 90 }
91 91
92 async aboutToAppear(): Promise<void> { 92 async aboutToAppear(): Promise<void> {
93 - this.getReserveState(); 93 + if (HttpUtils.getUserId()) {
  94 + this.getReserveState();
  95 + }
94 this.loadImg = await onlyWifiLoadImg(); 96 this.loadImg = await onlyWifiLoadImg();
95 } 97 }
96 98
@@ -256,6 +256,7 @@ export struct TopNavigationComponentNew { @@ -256,6 +256,7 @@ export struct TopNavigationComponentNew {
256 'right': { 'anchor': '__container__', 'align': HorizontalAlign.End } 256 'right': { 'anchor': '__container__', 'align': HorizontalAlign.End }
257 }) 257 })
258 .onClick(() => { 258 .onClick(() => {
  259 + Logger.info(TAG, `搜索按钮点击: 人民号`);
259 TrackingButton.searchClick(TrackConstants.PageName.Search, "PEOPLE") 260 TrackingButton.searchClick(TrackConstants.PageName.Search, "PEOPLE")
260 let params = { 'tabName': "PEOPLE" } as Record<string, string> 261 let params = { 'tabName': "PEOPLE" } as Record<string, string>
261 WDRouterRule.jumpWithPage(WDRouterPage.searchPage, params) 262 WDRouterRule.jumpWithPage(WDRouterPage.searchPage, params)
@@ -487,9 +488,10 @@ export struct TopNavigationComponentNew { @@ -487,9 +488,10 @@ export struct TopNavigationComponentNew {
487 } 488 }
488 489
489 updateCurrentTopNavSelectedIndex() { 490 updateCurrentTopNavSelectedIndex() {
  491 + Logger.info(TAG, `this.navItem 埋点参数topStyle: ${this.navItem.topStyle}`);
490 492
491 // 顶部tab埋点 493 // 顶部tab埋点
492 - if (CompUtils.isVideo(this.navItem)) { 494 + if (CompUtils.isNews(this.navItem)) {
493 const tab = this.myChannelList[this.currentTopNavSelectedIndex] 495 const tab = this.myChannelList[this.currentTopNavSelectedIndex]
494 Logger.info(TAG, `新闻tab埋点: ${JSON.stringify(tab)}`); 496 Logger.info(TAG, `新闻tab埋点: ${JSON.stringify(tab)}`);
495 497
@@ -498,7 +500,7 @@ export struct TopNavigationComponentNew { @@ -498,7 +500,7 @@ export struct TopNavigationComponentNew {
498 "tabName": tab.name, 500 "tabName": tab.name,
499 "pageId": tab.pageId, 501 "pageId": tab.pageId,
500 } 502 }
501 - Tracking.event("home_page_tab_click ", params) 503 + Tracking.event("home_page_tab_click", params)
502 } else if (CompUtils.isRMH(this.navItem)) { 504 } else if (CompUtils.isRMH(this.navItem)) {
503 const tab = this.topNavList[this.currentTopNavSelectedIndex] 505 const tab = this.topNavList[this.currentTopNavSelectedIndex]
504 Logger.info(TAG, `人民号tab埋点: ${JSON.stringify(tab)}`); 506 Logger.info(TAG, `人民号tab埋点: ${JSON.stringify(tab)}`);
@@ -8,6 +8,7 @@ import { SPHelper } from 'wdKit/Index' @@ -8,6 +8,7 @@ import { SPHelper } from 'wdKit/Index'
8 import { WDRouterPage, WDRouterRule } from 'wdRouter' 8 import { WDRouterPage, WDRouterRule } from 'wdRouter'
9 import { TrackingButton, TrackConstants } from 'wdTracking/Index' 9 import { TrackingButton, TrackConstants } from 'wdTracking/Index'
10 import SearcherAboutDataModel from '../../model/SearcherAboutDataModel' 10 import SearcherAboutDataModel from '../../model/SearcherAboutDataModel'
  11 +import { Logger } from 'wdKit';
11 12
12 const TAG = "FirstTabTopSearchComponent" 13 const TAG = "FirstTabTopSearchComponent"
13 14
@@ -73,6 +74,7 @@ export struct FirstTabTopSearchComponent { @@ -73,6 +74,7 @@ export struct FirstTabTopSearchComponent {
73 .backgroundImage($r('app.media.background_search')) 74 .backgroundImage($r('app.media.background_search'))
74 .backgroundImageSize(ImageSize.Cover) 75 .backgroundImageSize(ImageSize.Cover)
75 .onClick(() => { 76 .onClick(() => {
  77 + Logger.info(TAG, `搜索按钮点击: 新闻`);
76 TrackingButton.searchClick( TrackConstants.PageName.Search, "NEWS") 78 TrackingButton.searchClick( TrackConstants.PageName.Search, "NEWS")
77 let params = { 'tabName': "NEWS" } as Record<string, string> 79 let params = { 'tabName': "NEWS" } as Record<string, string>
78 WDRouterRule.jumpWithPage(WDRouterPage.searchPage,params) 80 WDRouterRule.jumpWithPage(WDRouterPage.searchPage,params)
@@ -43,6 +43,7 @@ export struct DetailPlayVLivePage { @@ -43,6 +43,7 @@ export struct DetailPlayVLivePage {
43 @State isPlayerError: boolean = false 43 @State isPlayerError: boolean = false
44 @State isCanplay: boolean = false 44 @State isCanplay: boolean = false
45 @State toastText: ResourceStr = "这是一个非Wi-Fi环境。请注意流量消耗" 45 @State toastText: ResourceStr = "这是一个非Wi-Fi环境。请注意流量消耗"
  46 +
46 dialogToast: CustomDialogController = new CustomDialogController({ 47 dialogToast: CustomDialogController = new CustomDialogController({
47 builder: CustomToast({ 48 builder: CustomToast({
48 bgColor: 0xB3000000, 49 bgColor: 0xB3000000,
@@ -135,7 +136,7 @@ export struct DetailPlayVLivePage { @@ -135,7 +136,7 @@ export struct DetailPlayVLivePage {
135 PlayerInfoComponent({ 136 PlayerInfoComponent({
136 playerController: this.playerController, 137 playerController: this.playerController,
137 swiperController: this.swiperController, 138 swiperController: this.swiperController,
138 - swiperIndex: $swiperIndex 139 + swiperIndex: $swiperIndex,
139 }) 140 })
140 141
141 // 直播资源加载失败 142 // 直播资源加载失败
@@ -24,7 +24,7 @@ export struct PlayerComponent { @@ -24,7 +24,7 @@ export struct PlayerComponent {
24 // 播放失败 24 // 播放失败
25 @Link isPlayerError: boolean 25 @Link isPlayerError: boolean
26 @Link isCanplay: boolean 26 @Link isCanplay: boolean
27 - 27 + @State isLarge:boolean = false
28 pageShowChange() { 28 pageShowChange() {
29 this.playerController?.play() 29 this.playerController?.play()
30 } 30 }
@@ -34,7 +34,6 @@ export struct PlayerComponent { @@ -34,7 +34,6 @@ export struct PlayerComponent {
34 } 34 }
35 35
36 aboutToAppear(){ 36 aboutToAppear(){
37 -  
38 if (this.playerController) { 37 if (this.playerController) {
39 this.playerController.onCanplay = () => { 38 this.playerController.onCanplay = () => {
40 this.isCanplay = true 39 this.isCanplay = true
@@ -52,6 +51,13 @@ export struct PlayerComponent { @@ -52,6 +51,13 @@ export struct PlayerComponent {
52 } 51 }
53 52
54 } 53 }
  54 + this.playerController.onVideoSizePlayerComponentBack = (width: number, height: number) => {
  55 + if(width>height){
  56 + this.isLarge = false
  57 + }else{
  58 + this.isLarge = true
  59 + }
  60 + }
55 } 61 }
56 62
57 63
@@ -113,7 +119,7 @@ export struct PlayerComponent { @@ -113,7 +119,7 @@ export struct PlayerComponent {
113 this.contentTrackingDict() 119 this.contentTrackingDict()
114 this.playerController?.firstPlay(this.playUrl, TrackConstants.PageName.Live_Detail, this.pageParam); 120 this.playerController?.firstPlay(this.playUrl, TrackConstants.PageName.Live_Detail, this.pageParam);
115 } 121 }
116 - }).margin({ top: 195 }).height(211) 122 + }).margin({ top: this.isLarge?0:195 }).height(this.isLarge?'100%': 211)
117 } 123 }
118 124
119 PictureLoading().visibility(this.isCanplay ? Visibility.None : Visibility.Visible) 125 PictureLoading().visibility(this.isCanplay ? Visibility.None : Visibility.Visible)
@@ -11,6 +11,7 @@ export struct PlayerInfoComponent { @@ -11,6 +11,7 @@ export struct PlayerInfoComponent {
11 @Consume isShowControl: boolean 11 @Consume isShowControl: boolean
12 @Link swiperIndex: number 12 @Link swiperIndex: number
13 13
  14 +
14 build() { 15 build() {
15 Column() { 16 Column() {
16 Swiper(this.swiperController) { 17 Swiper(this.swiperController) {
1 import lottie from '@ohos/lottie' 1 import lottie from '@ohos/lottie'
2 import { ContentDetailDTO, LiveDetailsBean, LiveRoomDataBean } from 'wdBean/Index' 2 import { ContentDetailDTO, LiveDetailsBean, LiveRoomDataBean } from 'wdBean/Index'
3 import { LiveFollowComponent, LottieView } from 'wdComponent/Index' 3 import { LiveFollowComponent, LottieView } from 'wdComponent/Index'
4 -import { NumberFormatterUtils } from 'wdKit/Index' 4 +import { NumberFormatterUtils, WindowModel } from 'wdKit/Index'
  5 +import { window } from '@kit.ArkUI'
  6 +import { WDAliPlayerController } from 'wdPlayer/Index'
  7 +import { DisplayDirection } from 'wdConstant/Index'
5 8
6 /** 9 /**
7 * 沉浸式直播--- 头部标题 10 * 沉浸式直播--- 头部标题
@@ -12,6 +15,22 @@ export struct PlayerTitleComponent { @@ -12,6 +15,22 @@ export struct PlayerTitleComponent {
12 @Consume liveRoomDataBean: LiveRoomDataBean 15 @Consume liveRoomDataBean: LiveRoomDataBean
13 @Consume liveState: string 16 @Consume liveState: string
14 @Consume contentDetailData: ContentDetailDTO 17 @Consume contentDetailData: ContentDetailDTO
  18 + @Consume displayDirection: DisplayDirection
  19 + @State isLarge:boolean = false
  20 + private playerController?: WDAliPlayerController
  21 +
  22 + aboutToAppear(): void {
  23 + if (!this.playerController) {
  24 + return
  25 + }
  26 + this.playerController.onVideoSizePlayerTitleComponentBack = (width: number, height: number) => {
  27 + if(width>height){
  28 + this.isLarge = false
  29 + }else{
  30 + this.isLarge = true
  31 + }
  32 + }
  33 + }
15 aboutToDisappear(): void { 34 aboutToDisappear(): void {
16 if (this.contentDetailData.liveInfo?.liveState == 'running') { 35 if (this.contentDetailData.liveInfo?.liveState == 'running') {
17 lottie.destroy('live_status_wait') 36 lottie.destroy('live_status_wait')
@@ -21,11 +40,42 @@ export struct PlayerTitleComponent { @@ -21,11 +40,42 @@ export struct PlayerTitleComponent {
21 build() { 40 build() {
22 Column() { 41 Column() {
23 Row() { 42 Row() {
  43 + //返回键
  44 + Image($r('app.media.icon_arrow_left_white'))
  45 + .width(24)
  46 + .aspectRatio(1)
  47 + .visibility(this.isLarge ? Visibility.Visible : Visibility.None)
  48 + .margin({
  49 + right: 10
  50 + })
  51 + .onClick(() => {
  52 + WindowModel.shared.setPreferredOrientation(this.isLarge ?
  53 + window.Orientation.PORTRAIT :
  54 + window.Orientation.LANDSCAPE_INVERTED)
  55 + WindowModel.shared.setSpecificSystemBarEnabled(true)
  56 + this.isLarge = false
  57 + this.displayDirection = DisplayDirection.VERTICAL
  58 + if(this.playerController){
  59 + if(this.playerController.onVideoSizePlayerComponentBack){
  60 + this.playerController.onVideoSizePlayerComponentBack(2,1);
  61 + }
  62 + if(this.playerController.onVideoSizePlayerUIComponentMethod){
  63 + this.playerController.onVideoSizePlayerUIComponentMethod(2,1);
  64 + }
  65 + }
  66 + })
24 Text(this.contentDetailData.newsTitle || '') 67 Text(this.contentDetailData.newsTitle || '')
25 .maxLines(2) 68 .maxLines(2)
26 .fontSize(16) 69 .fontSize(16)
27 .fontWeight(500) 70 .fontWeight(500)
28 .fontColor(Color.White) 71 .fontColor(Color.White)
  72 + Blank().layoutWeight(1)
  73 + //分享按钮
  74 + Image($r('app.media.icon_share'))
  75 + .width(24)
  76 + .aspectRatio(1)
  77 + .visibility(this.isLarge ? Visibility.Visible : Visibility.None)
  78 + .margin({right:16})
29 }.margin({ bottom: 10 }) 79 }.margin({ bottom: 10 })
30 80
31 Row() { 81 Row() {
@@ -9,12 +9,24 @@ import { PlayerVideoControlComponent } from './PlayerVideoControlComponent'; @@ -9,12 +9,24 @@ import { PlayerVideoControlComponent } from './PlayerVideoControlComponent';
9 @Component 9 @Component
10 export struct PlayerUIComponent { 10 export struct PlayerUIComponent {
11 private playerController?: WDAliPlayerController 11 private playerController?: WDAliPlayerController
  12 + @State isSmall:boolean = false
12 @Consume isShowControl: boolean 13 @Consume isShowControl: boolean
13 - 14 + aboutToAppear() {
  15 + if (!this.playerController) {
  16 + return
  17 + }
  18 + this.playerController.onVideoSizePlayerUIComponentMethod = (width: number, height: number) => {
  19 + if(width>height){
  20 + this.isSmall = true
  21 + }else{
  22 + this.isSmall = false
  23 + }
  24 + }
  25 + }
14 build() { 26 build() {
15 Stack() { 27 Stack() {
16 // 标题 28 // 标题
17 - PlayerTitleComponent() 29 + PlayerTitleComponent({ playerController: this.playerController })
18 30
19 PlayerCommentComponent() 31 PlayerCommentComponent()
20 .visibility(this.isShowControl ? Visibility.Hidden : Visibility.Visible) 32 .visibility(this.isShowControl ? Visibility.Hidden : Visibility.Visible)
@@ -23,11 +35,11 @@ export struct PlayerUIComponent { @@ -23,11 +35,11 @@ export struct PlayerUIComponent {
23 .markAnchor({ y: '100%' }) 35 .markAnchor({ y: '100%' })
24 36
25 PlayerVideoControlComponent({ playerController: this.playerController }) 37 PlayerVideoControlComponent({ playerController: this.playerController })
26 - .visibility(this.isShowControl ? Visibility.Visible : Visibility.Hidden) 38 + .visibility(this.isShowControl ? Visibility.Visible : this.isSmall? Visibility.Visible:Visibility.Hidden)
27 .animation({ duration: 500 }) 39 .animation({ duration: 500 })
28 - .position({ y: '100%' })  
29 - .markAnchor({ y: '100%' })  
30 - 40 + // .position({ y: '100%' })
  41 + // .markAnchor({ y: '100%' })
  42 + .margin({ top: this.isSmall?195 +211 - 105:0})
31 } 43 }
32 .height('100%') 44 .height('100%')
33 .width('100%') 45 .width('100%')
1 import { DateFormatUtil, WDAliPlayerController } from 'wdPlayer/Index' 1 import { DateFormatUtil, WDAliPlayerController } from 'wdPlayer/Index'
2 import { LiveRoomDataBean } from 'wdBean/Index' 2 import { LiveRoomDataBean } from 'wdBean/Index'
  3 +import { WindowModel } from 'wdKit/Index'
  4 +import { window } from '@kit.ArkUI'
  5 +import { DisplayDirection } from 'wdConstant/Index'
3 6
4 7
5 @Component 8 @Component
@@ -11,6 +14,8 @@ export struct PlayerVideoControlComponent { @@ -11,6 +14,8 @@ export struct PlayerVideoControlComponent {
11 @State progressVal: number = 0; 14 @State progressVal: number = 0;
12 //是否处于播放状态中 15 //是否处于播放状态中
13 @State isPlayStatus: boolean = true 16 @State isPlayStatus: boolean = true
  17 + @Consume displayDirection: DisplayDirection
  18 +
14 19
15 aboutToAppear(): void { 20 aboutToAppear(): void {
16 if (this.playerController) { 21 if (this.playerController) {
@@ -51,7 +56,34 @@ export struct PlayerVideoControlComponent { @@ -51,7 +56,34 @@ export struct PlayerVideoControlComponent {
51 .margin({ 56 .margin({
52 right: 16 57 right: 16
53 }) 58 })
  59 + //全屏按钮
  60 + Image($r('app.media.icon_live_player_full_screen'))
  61 + .height(32)
  62 + .width(32)
  63 + .padding(5)
  64 + .borderRadius($r('app.float.vp_16'))
  65 + .border({width:0.5})
  66 + .borderColor(0x4DFFFFFF)
  67 + .backgroundColor(0x4D222222)
  68 + .margin({right:10})
  69 + .onClick(() => {
  70 + WindowModel.shared.setSpecificSystemBarEnabled(false)
  71 + this.displayDirection = DisplayDirection.VIDEO_HORIZONTAL
  72 + WindowModel.shared.setPreferredOrientation(
  73 + window.Orientation.LANDSCAPE_INVERTED)
  74 + if(this.playerController){
  75 + if(this.playerController.onVideoSizePlayerUIComponentMethod){
  76 + this.playerController.onVideoSizePlayerUIComponentMethod(1,2)
  77 + }
  78 + if(this.playerController.onVideoSizePlayerComponentBack){
  79 + this.playerController.onVideoSizePlayerComponentBack(1,2)
  80 + }
54 81
  82 + if(this.playerController.onVideoSizePlayerTitleComponentBack){
  83 + this.playerController.onVideoSizePlayerTitleComponentBack(1,2)
  84 + }
  85 + }
  86 + })
55 } 87 }
56 .alignItems(VerticalAlign.Center) 88 .alignItems(VerticalAlign.Center)
57 // .linearGradient({ angle: 0, colors: [['#99000000', 0], ['#00000000', 1]] }) 89 // .linearGradient({ angle: 0, colors: [['#99000000', 0], ['#00000000', 1]] })
@@ -41,7 +41,17 @@ export class WDAliPlayerController { @@ -41,7 +41,17 @@ export class WDAliPlayerController {
41 private startTime: number = 0 41 private startTime: number = 0
42 public errorCode?: number 42 public errorCode?: number
43 public errorMesage?: string 43 public errorMesage?: string
  44 +
  45 + //onVideoSizeChange , onVideoSizeMethod同样的方法,不同地方使用
  46 + //AliPlayerRenderView回调
44 public onVideoSizeChange?: (width: number, height: number) => void; 47 public onVideoSizeChange?: (width: number, height: number) => void;
  48 + //PlayerUIComponent回调
  49 + public onVideoSizePlayerUIComponentMethod?: (width: number, height: number) => void;
  50 + //PlayerComponent
  51 + public onVideoSizePlayerComponentBack?: (width: number, height: number) => void;
  52 + //PlayerTitleComponent
  53 + public onVideoSizePlayerTitleComponentBack?: (width: number, height: number) => void;
  54 +
45 public onBufferUpdate?: (buffered: number, duration: number) => void; 55 public onBufferUpdate?: (buffered: number, duration: number) => void;
46 public onTimeUpdate?: (position: number, duration: number) => void; 56 public onTimeUpdate?: (position: number, duration: number) => void;
47 public onVolumeUpdate?: (volume: number) => void; 57 public onVolumeUpdate?: (volume: number) => void;
@@ -170,6 +180,13 @@ export class WDAliPlayerController { @@ -170,6 +180,13 @@ export class WDAliPlayerController {
170 if (this.onVideoSizeChange) { 180 if (this.onVideoSizeChange) {
171 this.onVideoSizeChange(this.avPlayer?.getVideoWidth(), this.avPlayer?.getVideoHeight()); 181 this.onVideoSizeChange(this.avPlayer?.getVideoWidth(), this.avPlayer?.getVideoHeight());
172 } 182 }
  183 + if(this.onVideoSizePlayerUIComponentMethod){
  184 + this.onVideoSizePlayerUIComponentMethod(this.avPlayer?.getVideoWidth(), this.avPlayer?.getVideoHeight());
  185 + }
  186 +
  187 + if(this.onVideoSizePlayerTitleComponentBack){
  188 + this.onVideoSizePlayerTitleComponentBack(this.avPlayer?.getVideoWidth(), this.avPlayer?.getVideoHeight());
  189 + }
173 if (this.onCanplay) { 190 if (this.onCanplay) {
174 this.onCanplay() 191 this.onCanplay()
175 } else { 192 } else {
@@ -22,7 +22,7 @@ export class TrackingButton { @@ -22,7 +22,7 @@ export class TrackingButton {
22 params["pageId"] = pageId 22 params["pageId"] = pageId
23 params["pageName"] = pageName 23 params["pageName"] = pageName
24 24
25 - Tracking.event("search_button_click ", params) 25 + Tracking.event("search_button_click", params)
26 } 26 }
27 27
28 } 28 }