@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 +5 -5
- package/packages/async-image/src/AsyncImage.tsx +15 -10
- package/packages/driver-androidtv/src/DeviceAndroidTV.ts +32 -5
- package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +7 -5
- package/packages/driver-androidtv/src/keymap.ts +5 -0
- package/packages/driver-androidtv/src/types.ts +19 -15
- package/packages/driver-base/src/KeyMap/KeyMap.ts +4 -4
- package/packages/driver-base/src/types/KeycodeKeyMap.ts +1 -2
- package/packages/driver-entone/src/keymap.ts +1 -0
- package/packages/driver-tizen/src/TizenKeys.ts +2 -0
- package/packages/driver-vidaa/src/keymap.ts +2 -0
- package/packages/driver-webos/src/keymap.ts +1 -0
- package/packages/types-bigscreen-jsx/index.d.ts +2 -0
- package/packages/utils/src/textUtils.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@24i/bigscreen-sdk",
|
|
3
|
-
"version": "1.0.10
|
|
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.
|
|
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.
|
|
61
|
+
"@types/react": "^18.0.26",
|
|
62
62
|
"babel-jest": "^29.0.3",
|
|
63
|
-
"chalk": "^5.0
|
|
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.
|
|
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
|
|
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.
|
|
51
|
+
this.clearBackground();
|
|
51
52
|
if (typeof onImageError === 'function') {
|
|
52
53
|
onImageError(this.src);
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
};
|
|
56
57
|
|
|
57
|
-
private
|
|
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
|
|
66
|
-
if (
|
|
71
|
+
if (typeof src !== 'string') return;
|
|
72
|
+
if (src === '') {
|
|
67
73
|
this.src = '';
|
|
68
|
-
this.
|
|
69
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
};
|
|
@@ -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.
|
|
35
|
+
const charToAdd = originalTextContent.charAt(currentPosition);
|
|
36
36
|
stringBuffer = `${charToAdd}${stringBuffer}`;
|
|
37
37
|
row.textContent = `${ellipsis}${stringBuffer}`;
|
|
38
38
|
currentPosition -= 1;
|