@flexem/fc-gui 3.0.0-alpha.89 → 3.0.0-alpha.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,6 +16,9 @@ export declare class VideoElement extends ConditionalDisplayElement {
16
16
  private videoId;
17
17
  private isShow;
18
18
  private videoPlayer;
19
+ private refreshTimer;
20
+ private isFullscreen;
21
+ private videoUrl;
19
22
  constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, videoService: VideoService, guiSize: Size, svgRootClass: string, signalRAppId: string);
20
23
  dispose(): void;
21
24
  hide(): void;
@@ -24,4 +27,5 @@ export declare class VideoElement extends ConditionalDisplayElement {
24
27
  private initVideo;
25
28
  private addVideoAddressToolTip;
26
29
  private setAndroidVideo;
30
+ private setIosVideo;
27
31
  }
@@ -11,6 +11,7 @@ export class VideoElement extends ConditionalDisplayElement {
11
11
  this.guiSize = guiSize;
12
12
  this.svgRootClass = svgRootClass;
13
13
  this.videoId = '';
14
+ this.isFullscreen = false;
14
15
  this.isMobileMode = DisplayMode.Mobile === injector.get(GlobalSettings).displayMode;
15
16
  this.localization = injector.get(LOCALIZATION);
16
17
  this.init();
@@ -50,12 +51,13 @@ export class VideoElement extends ConditionalDisplayElement {
50
51
  .attr('width', this.model.size.width)
51
52
  .attr('height', this.model.size.height);
52
53
  this.videoService.getVideoUrl(this.model.videoTag).then(result => {
53
- this.initVideo(result.url, result.isMobileType, this.videoId);
54
+ this.videoUrl = result.url;
55
+ this.initVideo(result.url, this.videoId);
54
56
  }).catch(() => {
55
57
  throw new Error('Failure of the videoService');
56
58
  });
57
59
  }
58
- initVideo(videoUrl, isMobileType, videoId) {
60
+ initVideo(videoUrl, videoId) {
59
61
  const patt = /https:.+.m3u8/;
60
62
  if (videoUrl.indexOf('http:') !== -1) {
61
63
  videoUrl = videoUrl.replace('http:', 'https:');
@@ -68,6 +70,8 @@ export class VideoElement extends ConditionalDisplayElement {
68
70
  this.addVideoAddressToolTip(videoToolTip);
69
71
  return;
70
72
  }
73
+ const isAndroid = !!navigator.userAgent.match(/(Android)/i);
74
+ const isIos = !!navigator.userAgent.match(/(Mac)/i);
71
75
  const currentRect = this.$element.find('rect#rect' + videoId).first();
72
76
  if (!currentRect.length) {
73
77
  return;
@@ -77,16 +81,18 @@ export class VideoElement extends ConditionalDisplayElement {
77
81
  const chartHeight = clientRect.height;
78
82
  const left = this.model.location.x / this.guiSize.width * $('.' + this.svgRootClass).find('.svg-content').width();
79
83
  const top = this.model.location.y / this.guiSize.height * $('.' + this.svgRootClass).find('.svg-content').height();
80
- let videoHtml = `<video scareX="${this.model.location.x / this.guiSize.width}"
81
- scareY="${this.model.location.y / this.guiSize.height}" id="${videoId}" src="${videoUrl}" style="
82
- position: absolute;top:${top}px;left:${left}px;width:${chartWidth}px;height:${chartHeight}px;object-fit:fill;z-index:0"
83
- playsInline webkit-playsinline `;
84
- const isAndroid = !!navigator.userAgent.match(/(Android)/i);
84
+ const scareX = this.model.location.x / this.guiSize.width;
85
+ const scareY = this.model.location.y / this.guiSize.height;
86
+ if (isIos) {
87
+ videoUrl = videoUrl + '#t=1';
88
+ }
89
+ const preload = isIos ? ' preload=\'metadata\'' : '';
90
+ let videoHtml = `<video scareX="${scareX}"
91
+ scareY="${scareY}" id="${videoId}" ${preload} src="${videoUrl}" width="${chartWidth}" height="${chartHeight}"
92
+ style="position: absolute;top:${top}px;left:${left}px;object-fit:fill;z-index:0;"
93
+ playsInline webkit-playsinline `;
85
94
  if (this.isMobileMode) {
86
95
  if (isAndroid) {
87
- if (isMobileType) {
88
- videoHtml += ' controls ';
89
- }
90
96
  videoHtml += ' autoplay muted></video>';
91
97
  }
92
98
  else {
@@ -100,10 +106,20 @@ export class VideoElement extends ConditionalDisplayElement {
100
106
  if (this.isShow === false) {
101
107
  $('#' + this.videoId).hide();
102
108
  }
103
- this.videoPlayer = new EZUIPlayer(videoId);
104
- if (isAndroid && !isMobileType) {
105
- this.setAndroidVideo(videoId);
106
- }
109
+ setTimeout(() => {
110
+ if (isAndroid) {
111
+ this.setAndroidVideo(videoId);
112
+ }
113
+ else if (isIos) {
114
+ this.setIosVideo(this.videoUrl, videoId);
115
+ }
116
+ this.videoPlayer = new EZUIPlayer(videoId);
117
+ }, 1000);
118
+ const style = document.createElement('style');
119
+ style.innerHTML = `#${videoId}::-webkit-media-controls-enclosure {
120
+ display: none;
121
+ }`;
122
+ document.head.append();
107
123
  }
108
124
  addVideoAddressToolTip(videoToolTip) {
109
125
  const size = this.model.size;
@@ -126,35 +142,68 @@ export class VideoElement extends ConditionalDisplayElement {
126
142
  this.$element.append(textElement.Element);
127
143
  }
128
144
  setAndroidVideo(videoId) {
129
- let isFullscreen = false;
130
145
  const videoElement = $('#' + videoId);
131
146
  let preHeight = videoElement.height();
132
147
  let preWidth = videoElement.width();
133
148
  let preTop = videoElement.css('top');
134
149
  let preLeft = videoElement.css('left');
150
+ const { StatusBar } = window;
135
151
  videoElement.on('click', () => {
136
- if (!isFullscreen) {
152
+ if (!this.isFullscreen) {
153
+ if (StatusBar) {
154
+ StatusBar.hide();
155
+ }
137
156
  preHeight = videoElement.height();
138
157
  preWidth = videoElement.width();
139
158
  preTop = videoElement.css('top');
140
159
  preLeft = videoElement.css('left');
141
- const width = document.body.clientWidth;
142
- const height = width * 9 / 16;
160
+ const width = document.documentElement.clientWidth;
161
+ const height = document.documentElement.clientHeight;
162
+ videoElement.css('object-fit', 'contain');
163
+ videoElement.css('background', '#000000');
143
164
  videoElement.css('width', width + 'px');
144
165
  videoElement.css('height', height + 'px');
145
166
  videoElement.css('left', '0px');
146
167
  videoElement.css('top', '0px');
147
168
  videoElement.css('z-index', '99');
148
- isFullscreen = true;
169
+ videoElement.css('position', 'fixed');
170
+ this.isFullscreen = true;
171
+ try {
172
+ screen.orientation.lock(screen.orientation.type);
173
+ }
174
+ catch (error) {
175
+ console.error(error);
176
+ }
149
177
  }
150
178
  else {
179
+ videoElement.css('object-fit', 'fill');
151
180
  videoElement.css('width', preWidth + 'px');
152
181
  videoElement.css('height', preHeight + 'px');
153
182
  videoElement.css('left', preLeft);
154
183
  videoElement.css('top', preTop);
155
184
  videoElement.css('z-index', '0');
156
- isFullscreen = false;
185
+ videoElement.css('position', 'absolute');
186
+ this.isFullscreen = false;
187
+ try {
188
+ if (screen.orientation.type.includes('portrait')) {
189
+ StatusBar.show();
190
+ }
191
+ }
192
+ catch (error) {
193
+ console.error(error);
194
+ }
157
195
  }
158
196
  });
159
197
  }
198
+ setIosVideo(videoUrl, videoId) {
199
+ const video = $('#' + this.videoId);
200
+ video.on('webkitendfullscreen', () => {
201
+ video.remove();
202
+ clearTimeout(this.refreshTimer);
203
+ this.refreshTimer = null;
204
+ this.refreshTimer = setTimeout(() => {
205
+ this.initVideo(videoUrl, videoId);
206
+ }, 500);
207
+ });
208
+ }
160
209
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"VideoElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":15,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":23,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":24,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":25,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":26,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":27,"character":23},{"__symbolic":"reference","module":"../../service","name":"VideoService","line":28,"character":39},{"__symbolic":"reference","module":"../../model","name":"Size","line":29,"character":34},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"hide":[{"__symbolic":"method"}],"show":[{"__symbolic":"method"}],"init":[{"__symbolic":"method"}],"initVideo":[{"__symbolic":"method"}],"addVideoAddressToolTip":[{"__symbolic":"method"}],"setAndroidVideo":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"VideoElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":15,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":27,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":28,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":29,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":30,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":31,"character":23},{"__symbolic":"reference","module":"../../service","name":"VideoService","line":32,"character":39},{"__symbolic":"reference","module":"../../model","name":"Size","line":33,"character":34},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"hide":[{"__symbolic":"method"}],"show":[{"__symbolic":"method"}],"init":[{"__symbolic":"method"}],"initVideo":[{"__symbolic":"method"}],"addVideoAddressToolTip":[{"__symbolic":"method"}],"setAndroidVideo":[{"__symbolic":"method"}],"setIosVideo":[{"__symbolic":"method"}]}}}}]
@@ -180,7 +180,7 @@ export class ViewOperationElement extends ConditionalEnableElement {
180
180
  }
181
181
  closeView() {
182
182
  this.popupViewService.closeView();
183
- if ($(`#${this.hostContainerId} svg`).length === 1) {
183
+ if ($(`#${this.hostContainerId} > svg > svg`).length === 0) {
184
184
  $(`#${this.hostContainerId} .video-hidden`)
185
185
  .removeClass('video-hidden')
186
186
  .css('visibility', 'visible');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "main": "bundles/fc-gui.umd.js",
3
- "version": "3.0.0-alpha.89",
3
+ "version": "3.0.0-alpha.90",
4
4
  "module": "public_api.js",
5
5
  "typings": "public_api.d.ts",
6
6
  "license": "UNLICENSED",