πŸ”– Release 7.243

πŸ”– Release 7.243

September 19, 20246 minutes

Native integration with home rails, support of "product-project"... Everything you need to know about 7.243 version

✨ What’s new ?

Core

Support home rail on TVOS and Android devices

To better integrate Dana application in the device environment, let’s introduce new big feature : home native rails. Android and TVOS offers the ability to applications to promote their contents when user is on the device main interface. Dana abstract this functionality, so you only care about retrieving contents and they will be provided to populate rails and interface of the main UI. To start implementation, visit dedicated documentation.

SystemInfoService expose getApplicationId

To standardize the way to retrieve unique id of an application, SystemInfoService offer a new API getApplicationId. Depending on the device, you will receive the relative unique identifier.

Ability to add custom key from remote

Until then, it was possible to modify key mapping to add new key or change mapping between key code and key name. But it wasn’t possible to create a new key with its own key name (for example Netflix or customer specific button). You can now create those specific key mapping !

"KeyMapping": {
  "TRIANGLE": 42
}

_init method of services resolve by default

Every service offer an extension point _init that could be implemented. By default, this method was trowing an error and requested an implementation. This method is no longer required to be implemented. By default, it is now returning a resolved Promise. You can still override it if you need to.

isInteractive flag for magic remote

To allow activation / deactivation of collision detection for pointer (like magic remote on LG), a new flag isInteractive is available on View. Default value is set to false that will prevent collision on all View. You need to specify on which View you want to activate collision to make pointer work.

For more information about magic remote, have a look at dedicated documentation

Support product folders on vendors and modules

To improve product development on top of Dana, two new folders are supported by tooling :

  • modules-product
  • vendors-product

Those folders are working as modules and vendorsbut are expected to be used by product to isolate what is product compared to what is project.

WtvDebug retrieve view by its hash

A new method getViewByHash is available to allow you quicker access to elements. For example, if your view has an id in HTML DOM lightningRectanglePrimitive[109], you can call wtvDebug.getViewByHash("LightningRectanglePrimitive[109]").

Warning

Hash is not the same as id, first letter is in uppercase.

CSS

Support pointer

To better support LG magic remote, pointer is now also available with CSS renderer. For more information about magic remote, have a look at dedicated documentation.

Android

JavaScript runtime have been refactored to remove a lot of code and to use latest version of V8 engine.

Resolution adaptation

On Android TV device, application will now always be in full screen. Application will automatically scale down or up depending on the resolution of the used device.

QT / QML

StorageService is now available

An implementation of StorageService is available on QT devices. See migration details to add support of storage in your application.

🐛 What’s fixed ?

Lightning

Measure text acknowledge \n

With Lightning renderer, using MeasureText.getWidth() wasn’t taking new line \n character into account. Even if text contains new line, final width was computed as if text was on a single line. On other renderers, the new line was well took into account and so final width was well reflecting the new line behaviour.

Renderers are now all taking new line character into account to measure text width.

Text in RTL was not visible on some device

It has been noticed that some devices where using old version of canvas which was not supporting property rtlon text. As a result, text was not displayed. This use case as been protected and rtl flag is only added if device supports it. As a result, some device won’t support right to left properly due to technical limitation.

⬆️ Migration guide

Update QML template

StorageService

To support local storage, you need to add import of QtQuick.LocalStorage in main.qml.tpl :

import QtQuick.LocalStorage 2.15

Protect keyEventAdapter

global.keyEventAdapter could be null. You need to surround call to it by protection if (global.keyEventAdapter != null).

    Keys.onPressed: {
        ...
        if (global.keyEventAdapter != null) {
            global.keyEventAdapter.manageInputEvent(event);
        }
    }
    Keys.onReleased: {
        event.type="keyUp";
        if (global.keyEventAdapter != null) {
            global.keyEventAdapter.manageInputEvent(event);
        }
    }
    Keys.onBackPressed: {
        if (global.keyEventAdapter != null) {
            global.keyEventAdapter.manageInputEvent(event);
        }
    }

Update TVOS template

New AppDelegate

To limit updates required in AppDelegate.swift file during Dana version upgrade, file has been re-written. Replace your AppDelegate.swift by following file :

import JavaScriptCore
import JscModule
import PlayerModule
import UIKit

@UIApplicationMain
class AppDelegate: DanaAppDelegate {
    override func getLoaders() -> [ModuleLoader] {
        return [
            PlayerLoader.shared,
            JscLoader.shared,
        ]
    }

    override func defineTemplateCells() {
        // define template cells for collection
    }
}

Caution

If you previously have configured custom cells for collection, put them back in defineTemplateCells method.

Dev build configuration

To limit configuration manipulation, in particular for signing, a new build configuration named “Dev” is required. This configuration will be used during grunt serve.

You need to set it up using XCode.

Select your project, and under Info tab, you should found Configurations settings. Click on + and select Duplicate "Debug" configuration.

Xcode build configuration

Rename the newly created configuration to Dev.

Xcode build configuration result

Then, select tvOS-App target, and under Signing & Capabilities tab, you can select Dev tab. Here, check Automatically manage signing. This will allow you to have a certificate for Debug and Release build but not for Dev. As a result, you will be able to use grunt serve without the certificate for deployment.

Xcode signing dev

Update AndroidTV template

variables.gradle

Path for entry point has been merged in a unique variable. You should remove variables for assets (assetsProtocol, assetsHotname, assetsPort, assetsPath) and add an new entryPoint variable instead.

entrypoint = project.hasProperty("ENTRYPOINT") ? '"' + project.findProperty("ENTRYPOINT") + '"' : '"https://localhost:9001/index.js"'

Remove

androidxStartupRuntimeVersion = "1.1.1"

Upgrade native shell to latest version :

wtvAndroidtvVersion = "7.243.5"

gradle.properties

Update -Xmx4096m to -Xmx8Gand remove -XX:MaxPermSize=512m.

MainActivity.java

Replace

ProjectBuildConfig.setBaseFilePath(
BuildConfig.ASSETS_PROTOCOL + "://" + BuildConfig.ASSETS_HOSTNAME
    + (!BuildConfig.ASSETS_PORT.isEmpty() ? ":" + BuildConfig.ASSETS_PORT : "")
    + BuildConfig.ASSETS_PATH
);
ProjectBuildConfig.setAssetsProtocol(BuildConfig.ASSETS_PROTOCOL);
ProjectBuildConfig.setAssetsHostname(BuildConfig.ASSETS_HOSTNAME);
ProjectBuildConfig.setAssetsPort(BuildConfig.ASSETS_PORT);

by

ProjectBuildConfig.setEntrypoint(BuildConfig.ENTRYPOINT);

Remove player code. You have now events in JavaScript side for Application suspend / resume, if you still want to pause player on Application suspend, do it in your JavaScript application

app/build.gradle

Replace

buildConfigField 'String', 'ASSETS_PROTOCOL', project.ext.assetsProtocol
buildConfigField 'String', 'ASSETS_HOSTNAME', project.ext.assetsHostname
buildConfigField 'String', 'ASSETS_PORT', project.ext.assetsPort
buildConfigField 'String', 'ASSETS_PATH', project.ext.assetsPath

by

buildConfigField 'String', 'ENTRYPOINT', "$project.ext.entrypoint"

Add ‘buildConfig’ to ‘buildFeatures’:

android {
    buildFeatures {
        buildConfig true
        viewBinding true
    }
}

Remove

implementation "androidx.startup:startup-runtime:$project.ext.androidxStartupRuntimeVersion"

Update AndroidTV modules

If you have Android modules exposed to JavaScript, you need to update them to make them works.

You can delete {NAME}ModuleInitializer classes.

ExampleModule.java

Modules constructor have changed, it now takes a Context as only argument.

public ExampleModule(Context context) {
    super(context);
}

AndroidManifest.xml

Replace

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false">
    <meta-data
        android:name="com.dana.androidtv.example_module.ExampleModuleInitializer"
        android:value="androidx.startup" />
</provider>

by

<meta-data
    android:name="com.dana.androidtv.example_module.ExampleModule"
    android:value="com.dana.androidtv.v8_runtime.js.JSExported" />

📝 Further reading