πŸ”– Release 7.241

πŸ”– Release 7.241

March 31, 20244 minutes

Build platform deployment, TVOS launch, stabilization of native input, introduction of VAST... Everything you need to know about 7.241 version

Release 7.241

We are thrilled to announce the first 2024 major release of Dana. This release brings major stabilization on existing components like EPG and NativeInput and introduce some new features in Beta like VAST or Tracking privacy. But the most important news for this first quarter is the launch of Dana build platform and official support of TVOS devices.

🍎 Official support of TVOS devices

Major objective of this release was to be apple to develop and produce application for TVOS. Stabilization has been done on Dana to offer you the best development experience for TVOS and Dana build platform now integrate support of TVOS too. You can now configure your CI / CD to create application for Apple TVs with signature for release. Deployment to test flight should be done manually for the moment.

βš’οΈ Deployment of Dana build platform

To be able to build official release of different engines, you need to use the new Dana build platform. For now, prefer using workflows.

▢️ Upgrade shaka to 4.6.15

Version of Shaka player has been upgraded from 3.3.18 to 4.6.15 to include latest fixes.

✏️ Vendor Hisense renamed to Vidaa

Vendor for Hisense TV vendor-hisensehas been renamed to vendor-vidaa. Even if Hisense is creator of Vidaa operating system, it is used by multiple manufacturer, so it makes sense to use this name.

⌨️ Virtual keyboard stabilization

NativeInputTextElement has been stabilized around every device.

In particular:

  • Virtual keyboard was not displayed on LG devices (Webos)
  • “Clear all” button in keyboard wasn’t reseting cursor

▢️ Implementation of getSeekableTimeRange

Android and TVOS now have implementation of getSeekableTimeRange method of PlayerService.

▢️ Align getDuration from PlayerService

Returned value for live or not loaded media wasn’t consistent between engines. Rule for the returned value of getDuration is now the following :

  • return the duration of the current media in ms.
  • returns Infinity for live and NaN if no media is loaded

βš™οΈ Navigation type of components are no longer Trait

Navigation type used by RecyclingList and other components are no longer a Trait. Files have been renamed to reflect that.

βš™οΈ Improved number of item views for Left Right Navigation

The RecyclingList views using the LRNavigation will need less item views to be configured in nbViewsBefore and nbViewsAfter.

βš™οΈ Update time dimension of EPG component

The start and end time configured in the EPG component can now be modified anytime when needed. Also the start and end time of each time frame of the EPG can now be configured more precisely.

Beta features

🎬 VAST

Support of client-side VAST specification is on going in Dana. You can start testing by using vendor-shaka and read Ad insertion article.

Limitations

Implementation of VAST will be based on capability of Player. There is no JavaScript code to support VAST, we rely on player. So limitations on devices will depend on player limitations and not of Dana.

πŸ”’ Tracking Privacy

On TVOS, you could need to ask users for their permission to track them. An abstraction as been created to allow to use it across multiple platform. You can read more about it here.

🎬 Player Sessions

Android now supports multiple player sessions.

In app_android/app/src/main/res/layout/main_activity.xml, remove the <include...> tag with id `@+id/player.

In app_android/app/src/main/java/app_id/MainActivity.java :

  • playerAdapter.addPlayerView(findViewById(R.id.playerView)); becomes playerAdapter.setRootView((WTV8RelativeLayout)findViewById(R.id.rendererView));
  • playerAdapter.playerSessionSetActive(false); becomes playerAdapter.setSessionsActive(false);
  • playerAdapter.stop(); becomes playerAdapter.stopSessions();
  • playerAdapter.playerSessionSetActive(true); becomes playerAdapter.setSessionsActive(true);
  • add import com.dana.androidtv.v8_runtime.WTV8RelativeLayout; with other import

Migration guide

An internal note will be shared for migration.

Components

RecyclingList views

You will need to rename import and declaration of the navigation type references :

  • MFixedNavigation type becomes FixedNavigationType
  • MFixedRightNavigation type becomes FixedRightNavigationType
  • MLMRNavigation type becomes LMRNavigationType
  • MLRNavigation type becomes LRNavigationType
  • MPaginateNavigation type becomes PaginateNavigationType

Adapt nbViewsBefore and nbViewsAfter of the RecyclingListView that are using LRNavigation. See number of item views configuration in RecyclingListView documentation.

Danger

The perimeter of the following internal methods have been updated : _setDataInRecycleMode, _recycleFirstItem, _recycleLastItem. In case you override one of these, please check your code. The internal method _getPosition have been removed. Overrides of this method must be replaced by giving a specific navigationType instance in your list. Navigation types are simple class and can be inherited.

_getPosition Some internal methods have changed, if you had overriden one of these method, you should check consequences : _setDataInRecycleMode, _getPosition, _recycleFirstItem, _recycleLastItem

EPG view

Configuration of the EPG has changed, and it now needs the channel and the time to show parameters.

Before you should have :

  // Done only once during the first screen opening ...
  this.epgView.configure(channels, startTime, endTime);
  // ... then
  this.epgView.select(channelId, timeToSelect);

Now you should use :

  this.epgView.configure(channels, {startTime: startTime, endTime: endTime}, channelId, timeToSelect)

Note

select is still the right method to call when EPG has been configured once. Also note that configure method can now be called as many times it needs, and that if offers new time options for a more precise configuration.

updateChannels method no longer exist, but configure can now be called more than once. Replace :

  this.epgView.updateChannels(newChannelList, channelId, timeToSelect);

with :

  this.epgView.configure(newChannelList, null /* null value indicates no change in time configuration */ , channelId, timeToSelect);

Further reading