@24i/bigscreen-sdk 1.0.51-alpha.2785 → 1.0.51-alpha.2791

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.
Files changed (26) hide show
  1. package/package.json +1 -1
  2. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +23 -2
  3. package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +8 -0
  4. package/packages/developer-tools/src/TechnicalInfo/translations.ts +4 -0
  5. package/packages/driver-androidtv/src/DeviceAndroidTV.ts +9 -0
  6. package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +1 -0
  7. package/packages/driver-androidtv/src/types.ts +5 -0
  8. package/packages/driver-base/src/DeviceBase.ts +2 -0
  9. package/packages/driver-base/src/__mocks__/DeviceBase.ts +4 -0
  10. package/packages/driver-browser/src/DeviceBrowser.ts +4 -0
  11. package/packages/driver-entone/src/DeviceEntone.ts +4 -0
  12. package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +1 -0
  13. package/packages/driver-hbbtv/src/DeviceHbbTV.ts +4 -0
  14. package/packages/driver-kreatv/src/DeviceKreaTV.ts +4 -0
  15. package/packages/driver-saphi/src/DeviceSaphi.ts +4 -0
  16. package/packages/driver-smartcast/src/DeviceSmartCast.ts +20 -1
  17. package/packages/driver-smartcast/src/__mocks__/api.ts +5 -1
  18. package/packages/driver-smartcast/src/types.ts +10 -0
  19. package/packages/driver-tizen/src/DeviceTizen.ts +10 -0
  20. package/packages/driver-tizen/src/__mocks__/tizen.ts +3 -0
  21. package/packages/driver-vidaa/src/DeviceVidaa.ts +4 -0
  22. package/packages/driver-webos/src/DeviceWebos.ts +26 -0
  23. package/packages/driver-webos/src/__mocks__/webos.ts +33 -0
  24. package/packages/driver-webos/src/constants.ts +1 -0
  25. package/packages/driver-webos/src/types.ts +30 -0
  26. package/packages/driver-xbox/src/DeviceXbox.ts +4 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@24i/bigscreen-sdk",
3
- "version": "1.0.51-alpha.2785",
3
+ "version": "1.0.51-alpha.2791",
4
4
  "description": "SmartApps BIGscreen SDK monorepo",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -111,6 +111,15 @@ class TechnicalInfoProvider implements ITechnicalInfoProvider {
111
111
  return value || unknown;
112
112
  }
113
113
 
114
+ async getDeviceOsLanguage() {
115
+ let value;
116
+ const { unknown } = this.translations;
117
+ try {
118
+ value = await this.props.device.getOsLanguage();
119
+ } catch (e) {}
120
+ return value || unknown;
121
+ }
122
+
114
123
  async getPlatformType() {
115
124
  let value;
116
125
  const { unknown } = this.translations;
@@ -137,6 +146,16 @@ class TechnicalInfoProvider implements ITechnicalInfoProvider {
137
146
  return value || unknown;
138
147
  }
139
148
 
149
+ async getAdInfo() {
150
+ let value;
151
+ const { unknown } = this.translations;
152
+ try {
153
+ const { adId, type, latEnabled } = await this.props.device.getAdInfo();
154
+ value = `LAT: ${latEnabled}, AD ID TYPE: ${type}, AD ID: ${adId}`;
155
+ } catch (e) {}
156
+ return value || unknown;
157
+ }
158
+
140
159
  async getLocalIpAddress() {
141
160
  let value;
142
161
  const { unknown } = this.translations;
@@ -283,8 +302,8 @@ class TechnicalInfoProvider implements ITechnicalInfoProvider {
283
302
  async getSourceDataLayout() {
284
303
  const {
285
304
  username, profile, appVersion, firmwareVersion, deviceModel,
286
- deviceManufacturer, platform, player, serialNumber, localIpAddress,
287
- publicIpAddress, connectionType, macAddress, memoryHeapSize,
305
+ deviceManufacturer, deviceLanguage, platform, player, serialNumber, adInfo,
306
+ localIpAddress, publicIpAddress, connectionType, macAddress, memoryHeapSize,
288
307
  usedLocalStorage, timeZone, dateAndTime, flavour, userAgent,
289
308
  emeSupport, emeDrmSystems, mseSupport, fourKSupport, resolution, baseUrl,
290
309
  appCoreVersions, androidWrapperVersion,
@@ -297,9 +316,11 @@ class TechnicalInfoProvider implements ITechnicalInfoProvider {
297
316
  { label: firmwareVersion, getter: this.getFirmwareVersion },
298
317
  { label: deviceModel, getter: this.getDeviceModelName },
299
318
  { label: deviceManufacturer, getter: this.getDeviceManufacturer },
319
+ { label: deviceLanguage, getter: this.getDeviceOsLanguage },
300
320
  { label: platform, getter: this.getPlatformType },
301
321
  { label: player, getter: this.getPlayerType },
302
322
  { label: serialNumber, getter: this.getDeviceSerialNumber },
323
+ { label: adInfo, getter: this.getAdInfo },
303
324
  { label: localIpAddress, getter: this.getLocalIpAddress },
304
325
  { label: publicIpAddress, getter: this.getPublicIpAddress },
305
326
  { label: connectionType, getter: this.getConnectionType },
@@ -43,6 +43,14 @@ class Device {
43
43
  return 'connection type';
44
44
  }
45
45
 
46
+ async getOsLanguage() {
47
+ return 'device language';
48
+ }
49
+
50
+ async getAdInfo() {
51
+ return { adId: 'ad-id', type: 'ad-id-type', latEnabled: false };
52
+ }
53
+
46
54
  async getMacAddress() {
47
55
  return 'mac address';
48
56
  }
@@ -15,9 +15,11 @@ export type TranslationKeys = {
15
15
  firmwareVersion: string,
16
16
  deviceModel: string,
17
17
  deviceManufacturer: string,
18
+ deviceLanguage: string;
18
19
  platform: string,
19
20
  player: string,
20
21
  serialNumber: string,
22
+ adInfo: string,
21
23
  localIpAddress: string,
22
24
  publicIpAddress: string,
23
25
  connectionType: string,
@@ -54,9 +56,11 @@ export const defaultTranslations = {
54
56
  firmwareVersion: 'Firmware version',
55
57
  deviceModel: 'Device model',
56
58
  deviceManufacturer: 'Device manufacturer',
59
+ deviceLanguage: 'Device Language',
57
60
  platform: 'Platform',
58
61
  player: 'Player',
59
62
  serialNumber: 'Serial number',
63
+ adInfo: 'Ad info',
60
64
  localIpAddress: 'Local IP address',
61
65
  publicIpAddress: 'Public IP address',
62
66
  connectionType: 'Connection type',
@@ -177,6 +177,15 @@ export class DeviceAndroidTV extends DeviceBase {
177
177
  return { adId, type, latEnabled };
178
178
  }
179
179
 
180
+ async getOsLanguage() {
181
+ try {
182
+ return window.JavaScriptBridge.bridgeJavaScriptToAndroid_GetOsLanguage() || '';
183
+ } catch (e) {
184
+ console.error('[DeviceAndroidTV] Failed to getOsLanguage', e);
185
+ return '';
186
+ }
187
+ }
188
+
180
189
  async getVolume(): Promise<number> {
181
190
  return VolumeRange.UNSUPPORTED;
182
191
  }
@@ -15,6 +15,7 @@ export const mockJavaScriptBridge: IJavaScriptBridge = {
15
15
  ),
16
16
  bridgeJavaScriptToAndroid_GetAdId: () => 'gaid-id',
17
17
  bridgeJavaScriptToAndroid_GetLimitAdTracking: () => false,
18
+ bridgeJavaScriptToAndroid_GetOsLanguage: () => '',
18
19
  bridgeJavaScriptToAndroid_GetMediaInfo: () => '{}',
19
20
  bridgeJavaScriptToAndroid_Back: () => {},
20
21
  bridgeJavaScriptToAndroid_StopVideo: () => {},
@@ -18,6 +18,11 @@ interface JavaScriptBridge {
18
18
  * @return true if limit ad tracking is enabled, false if not and null if not available.
19
19
  */
20
20
  bridgeJavaScriptToAndroid_GetLimitAdTracking: () => boolean | null,
21
+ /**
22
+ * It returns the language of the OS.
23
+ * @return Language of the OS. Ex. "en"
24
+ */
25
+ bridgeJavaScriptToAndroid_GetOsLanguage: () => string,
21
26
  /**
22
27
  * It returns media info including statistics
23
28
  */
@@ -155,6 +155,8 @@ export abstract class DeviceBase<
155
155
 
156
156
  abstract getAdInfo(): Promise<AdInfo>;
157
157
 
158
+ abstract getOsLanguage(): Promise<string>;
159
+
158
160
  abstract getVolume(): Promise<number>;
159
161
 
160
162
  abstract setVolume(volumePercentage: number): Promise<void>;
@@ -53,6 +53,10 @@ export class DeviceBase extends AbstractDeviceBase {
53
53
  return this.getBaseUuid();
54
54
  }
55
55
 
56
+ async getOsLanguage() {
57
+ return '';
58
+ }
59
+
56
60
  async getAdInfo() {
57
61
  const adId = 'uuid';
58
62
  const type = 'id type';
@@ -122,6 +122,10 @@ export class DeviceBrowser extends DeviceBase {
122
122
  return { adId, type, latEnabled };
123
123
  }
124
124
 
125
+ async getOsLanguage() {
126
+ return (window.navigator.language || '').slice(0, 2);
127
+ }
128
+
125
129
  async getVolume() {
126
130
  return this.volume;
127
131
  }
@@ -128,6 +128,10 @@ export class DeviceEntone extends DeviceBase {
128
128
  return { adId, type, latEnabled };
129
129
  }
130
130
 
131
+ async getOsLanguage() {
132
+ return (window.navigator.language || '').slice(0, 2);
133
+ }
134
+
131
135
  async getVolume() {
132
136
  try {
133
137
  const { leftVolPercentage, rightVolPercentage } = ENTONE.stb.getAudioVolume();
@@ -15,6 +15,7 @@ export const mockJavaScriptBridge: IJavaScriptBridge = {
15
15
  ),
16
16
  bridgeJavaScriptToAndroid_GetAdId: () => 'afai-id',
17
17
  bridgeJavaScriptToAndroid_GetLimitAdTracking: () => false,
18
+ bridgeJavaScriptToAndroid_GetOsLanguage: () => '',
18
19
  bridgeJavaScriptToAndroid_GetMediaInfo: () => '{}',
19
20
  bridgeJavaScriptToAndroid_Back: () => {},
20
21
  bridgeJavaScriptToAndroid_StopVideo: () => {},
@@ -253,6 +253,10 @@ export class DeviceHbbTV extends DeviceBase {
253
253
  return { adId, type, latEnabled };
254
254
  }
255
255
 
256
+ async getOsLanguage() {
257
+ return (window.navigator.language || '').slice(0, 2);
258
+ }
259
+
256
260
  async getVolume() {
257
261
  // TODO: not yet implemented
258
262
  return VolumeRange.UNSUPPORTED;
@@ -167,6 +167,10 @@ export class DeviceKreaTV extends DeviceBase {
167
167
  return { adId, type, latEnabled };
168
168
  }
169
169
 
170
+ async getOsLanguage() {
171
+ return (window.navigator.language || '').slice(0, 2);
172
+ }
173
+
170
174
  getSupportedAudioConnections() {
171
175
  const { audioOutputService } = this.toiInstance;
172
176
  const { ToiAudioOutputService } = this.toiInstance.consts;
@@ -89,6 +89,10 @@ export class DeviceSaphi extends DeviceBase {
89
89
  return { adId, type, latEnabled };
90
90
  }
91
91
 
92
+ async getOsLanguage() {
93
+ return (window.navigator.language || '').slice(0, 2);
94
+ }
95
+
92
96
  async getVolume(): Promise<number> {
93
97
  return VolumeRange.UNSUPPORTED;
94
98
  }
@@ -4,7 +4,13 @@ import {
4
4
  import { runAsync } from '@24i/bigscreen-sdk/utils/timers';
5
5
  import { ipify } from '@24i/bigscreen-sdk/ipify';
6
6
  import { getKeyMap } from './keymap';
7
- import { ISmartCastApi, IFA, DEFAULT_TTS_TIMEOUT, DevicePlaybackQuality } from './types';
7
+ import {
8
+ ISmartCastApi,
9
+ IFA,
10
+ DEFAULT_TTS_TIMEOUT,
11
+ DevicePlaybackQuality,
12
+ DeviceLanguage,
13
+ } from './types';
8
14
 
9
15
  declare const window: Window & { VIZIO: ISmartCastApi };
10
16
 
@@ -29,6 +35,8 @@ export class DeviceSmartCast extends DeviceBase {
29
35
 
30
36
  lastTextToSpeechItem?: { delay: number, text: string } | null;
31
37
 
38
+ deviceLanguage?: DeviceLanguage;
39
+
32
40
  API?: ISmartCastApi;
33
41
 
34
42
  IFA?: IFA;
@@ -84,6 +92,13 @@ export class DeviceSmartCast extends DeviceBase {
84
92
  });
85
93
  }));
86
94
 
95
+ promises.push(new Promise<void>((r) => {
96
+ API.setDeviceLanguageHandler((deviceLanguage: DeviceLanguage) => {
97
+ this.deviceLanguage = deviceLanguage;
98
+ r();
99
+ });
100
+ }));
101
+
87
102
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
88
103
  API.setContentChangeHandler(this.handleDeeplink);
89
104
 
@@ -272,6 +287,10 @@ export class DeviceSmartCast extends DeviceBase {
272
287
  return { adId, type, latEnabled };
273
288
  }
274
289
 
290
+ async getOsLanguage() {
291
+ return this.deviceLanguage?.code || '';
292
+ }
293
+
275
294
  async getVolume() {
276
295
  return VolumeRange.UNSUPPORTED;
277
296
  }
@@ -1,4 +1,4 @@
1
- import { IFA, ISmartCastApi, DevicePlaybackQuality } from '../types';
1
+ import { IFA, ISmartCastApi, DevicePlaybackQuality, DeviceLanguage } from '../types';
2
2
 
3
3
  export const deviceId = '2bd671ef-02cd-445f-9295-b3565dbaf1e8';
4
4
  export const deviceModel = 'D24f4-J01';
@@ -37,6 +37,10 @@ export const SmartCastMockApi: ISmartCastApi = {
37
37
  setContentChangeHandler:
38
38
  (callback: (contentUrl: string) => void): void => callback(deeplinkUrl),
39
39
 
40
+ setDeviceLanguageHandler: (
41
+ callback: (deviceLanguage: DeviceLanguage) => void,
42
+ ): void => callback({ code: 'en', name: 'English' }),
43
+
40
44
  Chromevox: {
41
45
  cancel: (): void => {
42
46
  throw new Error('Function not implemented.');
@@ -34,6 +34,11 @@ export type ISmartCastApi = {
34
34
  */
35
35
  setContentChangeHandler: (callback: (contentUrl: string) => void) => void;
36
36
 
37
+ /**
38
+ * Sets the callback to receive device language object.
39
+ */
40
+ setDeviceLanguageHandler: (callback: (deviceLanguage: DeviceLanguage) => void) => void;
41
+
37
42
  /**
38
43
  * Device model.
39
44
  */
@@ -63,3 +68,8 @@ export type IFA = {
63
68
  export type DevicePlaybackQuality = 'UHD' | 'HD' | 'SD';
64
69
 
65
70
  export const DEFAULT_TTS_TIMEOUT = 3000;
71
+
72
+ export type DeviceLanguage = {
73
+ code: string,
74
+ name: string,
75
+ };
@@ -211,6 +211,16 @@ export class DeviceTizen extends DeviceBase {
211
211
  return { adId, type, latEnabled };
212
212
  }
213
213
 
214
+ async getOsLanguage() {
215
+ return new Promise<string>((resolve) => {
216
+ tizen.systeminfo.getPropertyValue(
217
+ 'LOCALE',
218
+ ({ language }) => resolve(language),
219
+ () => resolve(''),
220
+ );
221
+ });
222
+ }
223
+
214
224
  async getVolume() {
215
225
  try {
216
226
  const volume = tizen.tvaudiocontrol.getVolume();
@@ -28,6 +28,9 @@ export const tizen = {
28
28
  unregisterKey: () => {},
29
29
  registerKey: () => {},
30
30
  },
31
+ systeminfo: {
32
+ getPropertyValue: async () => {},
33
+ },
31
34
  };
32
35
 
33
36
  declare global {
@@ -88,6 +88,10 @@ export class DeviceVidaa extends DeviceBase {
88
88
  return { adId, type, latEnabled };
89
89
  }
90
90
 
91
+ async getOsLanguage() {
92
+ return (window.navigator.language || '').slice(0, 2);
93
+ }
94
+
91
95
  async getVolume(): Promise<number> {
92
96
  return VolumeRange.UNSUPPORTED;
93
97
  }
@@ -252,6 +252,32 @@ export class DeviceWebos extends DeviceBase {
252
252
  return { adId, type, latEnabled };
253
253
  }
254
254
 
255
+ async getOsLanguage(): Promise<string> {
256
+ return new Promise<string>((resolve) => {
257
+ webOS.service.request(ApiUrls.SETTINGS_SERVICE, {
258
+ method: 'getSystemSettings',
259
+ parameters: {
260
+ keys: ['localeInfo'],
261
+ },
262
+ onSuccess: (response) => {
263
+ if (response.returnValue) {
264
+ const uiLanguage = response?.settings?.localeInfo?.locales?.UI;
265
+ resolve((uiLanguage || '').slice(0, 2));
266
+ }
267
+ resolve('');
268
+ },
269
+ onFailure: (error) => {
270
+ // ex. returns error for webOS 1.0, 2.0 as not supported
271
+ const { errorCode = '0', errorText } = error || {};
272
+ console.error(
273
+ `[DeviceWebos] getOsLanguage onFailure: [${errorCode}] ${errorText}`,
274
+ );
275
+ resolve('');
276
+ },
277
+ });
278
+ });
279
+ }
280
+
255
281
  async getVolume() {
256
282
  // TODO: not yet implemented
257
283
  return VolumeRange.UNSUPPORTED;
@@ -63,6 +63,39 @@ const mockServices = {
63
63
  callbackName: 'onSuccess',
64
64
  },
65
65
  },
66
+ 'luna://com.webos.settingsservice#getSystemSettings': {
67
+ responses: {
68
+ success: {
69
+ returnValue: true,
70
+ method: 'getSystemSettings',
71
+ settings: {
72
+ localeInfo: {
73
+ locales: {
74
+ UI: 'en-GB',
75
+ TV: 'en-GB',
76
+ FMT: 'en-GB',
77
+ NLP: 'en-GB',
78
+ STT: 'fr-FR',
79
+ AUD: 'fr-FR',
80
+ AUD2: 'en-GB',
81
+ },
82
+ clock: 'locale',
83
+ keyboards: ['en'],
84
+ timezone: '',
85
+ },
86
+ },
87
+ },
88
+ error: {
89
+ returnValue: false,
90
+ errorCode: 'ERR.001',
91
+ errorText: 'There is no matched result from DB',
92
+ },
93
+ },
94
+ selected: {
95
+ responseId: 'success',
96
+ callbackName: 'onSuccess',
97
+ },
98
+ },
66
99
  'luna://com.webos.service.connectionmanager#getStatus': {
67
100
  responses: {
68
101
  successWired: {
@@ -17,4 +17,5 @@ export const ApiUrls = {
17
17
  CONNECTION_MANAGER_WEBOS: 'luna://com.webos.service.connectionmanager',
18
18
  SYSTEM_PROPERTY: 'luna://com.webos.service.tv.systemproperty',
19
19
  SM: 'luna://com.webos.service.sm',
20
+ SETTINGS_SERVICE: 'luna://com.webos.settingsservice',
20
21
  } as const;
@@ -331,11 +331,41 @@ export type DuidOptions = {
331
331
  onComplete?: (response: NegativeResponse | DuidResponse) => any,
332
332
  };
333
333
 
334
+ type SettingsService = {
335
+ method: 'getSystemSettings',
336
+ settings: {
337
+ localeInfo: {
338
+ locales: {
339
+ UI: string,
340
+ TV: string,
341
+ FMT: string,
342
+ NLP: string,
343
+ STT: string,
344
+ AUD: string,
345
+ AUD2: string,
346
+ },
347
+ clock: string,
348
+ keyboards: string[],
349
+ timezone: string,
350
+ },
351
+ },
352
+ };
353
+ export type SettingsServiceResponse = PositiveResponse & SettingsService;
354
+ export type SettingsServiceOptions = {
355
+ method: 'getSystemSettings',
356
+ parameters: {
357
+ keys: ['localeInfo'],
358
+ },
359
+ onSuccess?: (response: NegativeResponse | SettingsServiceResponse) => any,
360
+ onFailure?: (response: NegativeResponse) => any,
361
+ };
362
+
334
363
  interface RequestTypeMap {
335
364
  [ApiUrls.CONNECTION_MANAGER_PALM]: ConnectionManagerOptions,
336
365
  [ApiUrls.CONNECTION_MANAGER_WEBOS]: ConnectionManagerOptions,
337
366
  [ApiUrls.SYSTEM_PROPERTY]: SystemPropertyOptions,
338
367
  [ApiUrls.SM]: DuidOptions,
368
+ [ApiUrls.SETTINGS_SERVICE]: SettingsServiceOptions,
339
369
  }
340
370
 
341
371
  // MARK: IPalmSystem
@@ -159,6 +159,10 @@ export class DeviceXbox extends DeviceBase {
159
159
  return { adId, type, latEnabled };
160
160
  }
161
161
 
162
+ async getOsLanguage() {
163
+ return (window.navigator.language || '').slice(0, 2);
164
+ }
165
+
162
166
  async getVolume() {
163
167
  return VolumeRange.UNSUPPORTED;
164
168
  }