@24i/bigscreen-sdk 1.0.10-alpha.2209 → 1.0.10

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@24i/bigscreen-sdk",
3
- "version": "1.0.10-alpha.2209",
3
+ "version": "1.0.10",
4
4
  "description": "SmartApps BIGscreen SDK monorepo",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -52,15 +52,15 @@
52
52
  "@24i/eslint-config-smartapps-bigscreen-linters": "file:./libs/linters",
53
53
  "@24i/smartapps-bigscreen-changelog-generator": "0.17.0",
54
54
  "@babel/core": "^7.19.0",
55
- "@babel/preset-env": "^7.19.0",
55
+ "@babel/preset-env": "^7.20.2",
56
56
  "@types/fs-extra": "^9.0.13",
57
57
  "@types/inquirer": "^9.0.3",
58
58
  "@types/jest": "^29.2.3",
59
59
  "@types/minimist": "^1.2.2",
60
60
  "@types/node": "^18.7.18",
61
- "@types/react": "^18.0.25",
61
+ "@types/react": "^18.0.26",
62
62
  "babel-jest": "^29.0.3",
63
- "chalk": "^5.0.1",
63
+ "chalk": "^5.2.0",
64
64
  "coveralls": "^3.1.1",
65
65
  "cross-env": "^7.0.3",
66
66
  "fs-extra": "^10.1.0",
@@ -71,7 +71,7 @@
71
71
  "jest-canvas-mock": "^2.4.0",
72
72
  "jest-environment-jsdom": "^29.0.3",
73
73
  "minimist": "^1.2.6",
74
- "patch-package": "^6.4.7",
74
+ "patch-package": "^6.5.0",
75
75
  "sass": "^1.54.9",
76
76
  "sass-true": "^6.1.0",
77
77
  "ts-jest": "^29.0.3",
@@ -1,7 +1,7 @@
1
1
  import { createRef, Component, DeclareProps } from '@24i/bigscreen-sdk/jsx';
2
2
 
3
3
  export type Props = {
4
- src: string;
4
+ src?: string;
5
5
  clearBeforeLoading?: boolean;
6
6
  onImageLoad?: (src: string) => void;
7
7
  onImageError?: (src: string) => void;
@@ -17,6 +17,7 @@ export class AsyncImage extends Component<Props> {
17
17
  isCleared = true;
18
18
 
19
19
  static defaultProps = {
20
+ src: undefined,
20
21
  clearBeforeLoading: true,
21
22
  };
22
23
 
@@ -30,7 +31,7 @@ export class AsyncImage extends Component<Props> {
30
31
 
31
32
  componentDidMount() {
32
33
  const { src } = this.props;
33
- this.updateImage(src);
34
+ this.updateImage(src!);
34
35
  }
35
36
 
36
37
  private readonly onLoad = () => {
@@ -47,27 +48,31 @@ export class AsyncImage extends Component<Props> {
47
48
  private readonly onError = () => {
48
49
  if (this.isMounted) {
49
50
  const { onImageError } = this.props;
50
- this.clearImage();
51
+ this.clearBackground();
51
52
  if (typeof onImageError === 'function') {
52
53
  onImageError(this.src);
53
54
  }
54
55
  }
55
56
  };
56
57
 
57
- private clearImage() {
58
+ private clearBackground() {
58
59
  if (!this.isCleared) {
59
60
  this.domRef.current!.style.backgroundImage = '';
60
61
  this.isCleared = true;
61
62
  }
62
63
  }
63
64
 
65
+ clearImage() {
66
+ this.src = '';
67
+ this.clearBackground();
68
+ }
69
+
64
70
  updateImage(src: string) {
65
- if (src === this.src) return;
66
- if (!src) {
71
+ if (typeof src !== 'string') return;
72
+ if (src === '') {
67
73
  this.src = '';
68
- this.image.src = '';
69
- this.clearImage();
70
- } else {
74
+ this.onError();
75
+ } else if (src !== this.src) {
71
76
  this.src = src;
72
77
  this.loadImage(src);
73
78
  }
@@ -77,7 +82,7 @@ export class AsyncImage extends Component<Props> {
77
82
  const { props: { clearBeforeLoading }, image } = this;
78
83
  image.src = src;
79
84
  if (clearBeforeLoading === true && !image.complete) {
80
- this.clearImage();
85
+ this.clearBackground();
81
86
  }
82
87
  }
83
88
 
@@ -4,7 +4,7 @@ import {
4
4
  ScreenSaverStatus,
5
5
  VolumeRange,
6
6
  } from '@24i/bigscreen-sdk/driver-base';
7
- import { IJavaScriptBridge } from './types';
7
+ import { IJavaScriptBridge, DeviceInfo } from './types';
8
8
  import { getFirmware } from './formatUserAgent';
9
9
  import { getKeyMap } from './keymap';
10
10
 
@@ -25,7 +25,9 @@ declare global {
25
25
  export class DeviceAndroidTV extends DeviceBase {
26
26
  keyMap = getKeyMap();
27
27
 
28
- platformInfo = window.JavaScriptBridge.bridgeJavaScriptToAndroid_GetDeviceInfo();
28
+ deviceInfo = window.JavaScriptBridge.bridgeJavaScriptToAndroid_GetDeviceInfo();
29
+
30
+ platformInfo: DeviceInfo = this.deviceInfo ? JSON.parse(this.deviceInfo) : '';
29
31
 
30
32
  firmware = getFirmware(navigator.userAgent);
31
33
 
@@ -44,7 +46,8 @@ export class DeviceAndroidTV extends DeviceBase {
44
46
  }
45
47
 
46
48
  /**
47
- * Handles keydown/up events for the BACK key which are dispatched on the document
49
+ * Handles keydown/up events for the BACK, FF, REW, STOP, PLAY
50
+ * key which are dispatched on the document
48
51
  * from the Android TV Bridge. We must catch them and re-emit them properly
49
52
  * on the active (focused) element in the DOM tree.
50
53
  * @param event keyboard event
@@ -53,8 +56,32 @@ export class DeviceAndroidTV extends DeviceBase {
53
56
  if (event.bigscreenSdkRelaunched) { // prevent to relaunch event in loop
54
57
  return;
55
58
  }
56
- const { keyCode } = event;
57
- if (keyCode === this.keyMap.BACK) {
59
+
60
+ const { key } = event;
61
+ let { keyCode } = event;
62
+
63
+ /**
64
+ * Remap KeyCode by its key value.
65
+ * On Android all colors keys and some others coming with "0" keyCode.
66
+ */
67
+ if (key === 'ColorF0Red') keyCode = this.keyMap.RED;
68
+ if (key === 'ColorF1Green') keyCode = this.keyMap.GREEN;
69
+ if (key === 'ColorF2Yellow') keyCode = this.keyMap.YELLOW;
70
+ if (key === 'ColorF3Blue') keyCode = this.keyMap.BLUE;
71
+ if (key === 'ClosedCaptionToggle') keyCode = this.keyMap.SUBTITLES;
72
+
73
+ if (keyCode === this.keyMap.BACK
74
+ || keyCode === this.keyMap.STOP
75
+ || keyCode === this.keyMap.FF
76
+ || keyCode === this.keyMap.REW
77
+ || keyCode === this.keyMap.PLAYPAUSE
78
+ || keyCode === this.keyMap.PLAY
79
+ || keyCode === this.keyMap.RED
80
+ || keyCode === this.keyMap.GREEN
81
+ || keyCode === this.keyMap.YELLOW
82
+ || keyCode === this.keyMap.BLUE
83
+ || keyCode === this.keyMap.SUBTITLES
84
+ ) {
58
85
  event.preventDefault();
59
86
  event.stopImmediatePropagation();
60
87
  const newEvent = new KeyboardEvent(event.type, {
@@ -2,11 +2,13 @@ import { IJavaScriptBridge } from '../types';
2
2
 
3
3
  export const mockJavaScriptBridge: IJavaScriptBridge = {
4
4
  JavaScriptBridge: {
5
- bridgeJavaScriptToAndroid_GetDeviceInfo: () => ({
6
- deviceBrand: 'Sony',
7
- deviceModel: 'BRAVIA 4K 2015',
8
- osVersion: '8.0.0',
9
- }),
5
+ bridgeJavaScriptToAndroid_GetDeviceInfo: () => (
6
+ JSON.stringify({
7
+ deviceBrand: 'Sony',
8
+ deviceModel: 'BRAVIA 4K 2015',
9
+ osVersion: '8.0.0',
10
+ })
11
+ ),
10
12
  bridgeJavaScriptToAndroid_Back: () => {},
11
13
  },
12
14
  };
@@ -4,6 +4,11 @@ import { KeyMap } from '@24i/bigscreen-sdk/driver-base';
4
4
  export const getKeyMap = () => {
5
5
  KeyMap.overrideValues({
6
6
  BACK: { keyCode: 4 },
7
+ STOP: { keyCode: 178 },
8
+ FF: { keyCode: 90 },
9
+ REW: { keyCode: 89 },
10
+ PLAY: { keyCode: 126 },
11
+ SUBTITLES: { keyCode: 175 },
7
12
  });
8
13
  return KeyMap.generateKeyCodeKeyMap();
9
14
  };
@@ -1,27 +1,31 @@
1
1
  interface JavaScriptBridge {
2
2
  /**
3
- * It returns device info.
3
+ * It returns a JSON string with device info.
4
+ * @return JSON string with the information about the device brand, model and Android version.
5
+ * Ex. '{"deviceBrand": "Sony", "deviceModel": "BRAVIA 4K 2015", "osVersion": "7.0" }'
4
6
  */
5
- bridgeJavaScriptToAndroid_GetDeviceInfo: () => {
6
- /**
7
- * Device brand. Ex. "Sony"
8
- */
9
- deviceBrand: string,
10
- /**
11
- * Device model. Ex. "BRAVIA 4K 2015"
12
- */
13
- deviceModel: string,
14
- /**
15
- * Android version. Ex. "7.0"
16
- */
17
- osVersion: string,
18
- },
7
+ bridgeJavaScriptToAndroid_GetDeviceInfo: () => string,
19
8
  /**
20
9
  * It simulates a native Android back press.
21
10
  */
22
11
  bridgeJavaScriptToAndroid_Back: () => void,
23
12
  }
24
13
 
14
+ export type DeviceInfo = {
15
+ /**
16
+ * Device brand. Ex. "Sony"
17
+ */
18
+ deviceBrand: string,
19
+ /**
20
+ * Device model. Ex. "BRAVIA 4K 2015"
21
+ */
22
+ deviceModel: string,
23
+ /**
24
+ * Android version. Ex. "7.0"
25
+ */
26
+ osVersion: string,
27
+ };
28
+
25
29
  export interface IJavaScriptBridge {
26
30
  JavaScriptBridge: JavaScriptBridge,
27
31
  }
@@ -320,6 +320,10 @@ export const GUIDE = new Key({
320
320
  keyCode: 458,
321
321
  });
322
322
 
323
+ export const SUBTITLES = new Key({
324
+ id: 'SUBTITLES',
325
+ });
326
+
323
327
  // MARK: Xbox specials
324
328
  export const GAMEPAD_LEFT_THUMBSTICK_UP = new Key({
325
329
  id: 'GAMEPAD_LEFT_THUMBSTICK_UP',
@@ -384,7 +388,3 @@ export const GAMEPAD_A = new Key({
384
388
  export const GAMEPAD_B = new Key({
385
389
  id: 'GAMEPAD_B',
386
390
  });
387
-
388
- export const SUBTITLES = new Key({
389
- id: 'SUBTITLES',
390
- });
@@ -61,6 +61,7 @@ export type KeycodeKeyMap = {
61
61
  EXIT: number,
62
62
  INFO: number,
63
63
  GUIDE: number,
64
+ SUBTITLES: number,
64
65
 
65
66
  // Xbox specials
66
67
  GAMEPAD_LEFT_THUMBSTICK_UP: number,
@@ -82,6 +83,4 @@ export type KeycodeKeyMap = {
82
83
 
83
84
  GAMEPAD_A: number,
84
85
  GAMEPAD_B: number,
85
-
86
- SUBTITLES: number,
87
86
  };
@@ -51,6 +51,7 @@ export function getKeyMap() {
51
51
  EXIT: { keyCode: EntoneInput.KEY_EXIT },
52
52
  INFO: { keyCode: EntoneInput.KEY_INFO },
53
53
  GUIDE: { keyCode: EntoneInput.KEY_GUIDE },
54
+ SUBTITLES: { keyCode: EntoneInput.KEY_SUBTITLE },
54
55
  });
55
56
  return KeyMap.generateKeyCodeKeyMap();
56
57
  }
@@ -49,6 +49,7 @@ export class TizenKeys {
49
49
  tizen.tvinputdevice.registerKey('PreviousChannel');
50
50
  tizen.tvinputdevice.registerKey('Info');
51
51
  tizen.tvinputdevice.registerKey('Guide');
52
+ tizen.tvinputdevice.registerKey('Caption');
52
53
  }
53
54
 
54
55
  buildKeyMap(keyCodeMap: KeyCodeMap) {
@@ -84,6 +85,7 @@ export class TizenKeys {
84
85
  EXIT: { keyCode: keyCodeMap.Exit },
85
86
  INFO: { keyCode: keyCodeMap.Info },
86
87
  GUIDE: { keyCode: keyCodeMap.Guide },
88
+ SUBTITLES: { keyCode: keyCodeMap.Caption },
87
89
  });
88
90
  this.keyMap = KeyMap.generateKeyCodeKeyMap();
89
91
  }
@@ -49,6 +49,8 @@ export const getKeyMap = () => {
49
49
  CHANNEL_UP: { keyCode: window.VK_CHANNEL_UP || 427 },
50
50
  CHANNEL_DOWN: { keyCode: window.VK_CHANNEL_DOWN || 428 },
51
51
  INFO: { keyCode: window.VK_INFO },
52
+ // VK_SUBTITLE defined on 2019, not on 2021.
53
+ SUBTITLES: { keyCode: window.VK_SUBTITLE || 460 },
52
54
  });
53
55
  return KeyMap.generateKeyCodeKeyMap();
54
56
  };
@@ -4,6 +4,7 @@ export const getKeyMap = () => {
4
4
  overrideValues({
5
5
  BACK: { keyCode: 461 },
6
6
  TXT: { keyCode: 110 },
7
+ SUBTITLES: { keyCode: 460 },
7
8
  });
8
9
  return generateKeyCodeKeyMap();
9
10
  };
@@ -2824,6 +2824,7 @@ declare namespace React {
2824
2824
  button: DetailedHTMLFactory<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
2825
2825
  canvas: DetailedHTMLFactory<CanvasHTMLAttributes<HTMLCanvasElement>, HTMLCanvasElement>;
2826
2826
  caption: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2827
+ center: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2827
2828
  cite: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2828
2829
  code: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2829
2830
  col: DetailedHTMLFactory<ColHTMLAttributes<HTMLTableColElement>, HTMLTableColElement>;
@@ -3161,6 +3162,7 @@ declare global {
3161
3162
  button: React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
3162
3163
  canvas: React.DetailedHTMLProps<React.CanvasHTMLAttributes<HTMLCanvasElement>, HTMLCanvasElement>;
3163
3164
  caption: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3165
+ center: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3164
3166
  cite: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3165
3167
  code: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3166
3168
  col: React.DetailedHTMLProps<React.ColHTMLAttributes<HTMLTableColElement>, HTMLTableColElement>;
@@ -32,7 +32,7 @@ const trimWithEllipsis = (
32
32
  } else {
33
33
  let currentPosition = originalTextContent.length - 1;
34
34
  do {
35
- const charToAdd = originalTextContent.at(currentPosition);
35
+ const charToAdd = originalTextContent.charAt(currentPosition);
36
36
  stringBuffer = `${charToAdd}${stringBuffer}`;
37
37
  row.textContent = `${ellipsis}${stringBuffer}`;
38
38
  currentPosition -= 1;