Créer des applications HTML5 sur Tizen

Nicolas Le Bot

Ce tutoriel va vous apprendre à créer des applications HTML5 à l'aide du système Tizen. à la fin de ce tutoriel, vous aurez appris à utiliser certaines API Tizen et à créer vos premières applications pour ce nouveau système ! si vous voulez voir les autres API Tizen, vous pouvez directement les avoir via le site de Tizen. Bon courage !

Commentez

- Titre : Créer des applications HTML5 sur Tizen

- Auteur : Nicolas Le Bot

- Parution : 10 octobre 2013

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Nicolas Le Bot. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Présentation de Tizen

- I-A. Présentation du système

- I-A-1. La Tizen association

- I-A-2. Écosystème Tizen

- I-A-3. Tizen et l'HTML5

- I-A-4. Support

- I-B. Le SDK Tizen

- I-B-1. Un environnement de développement complet

- I-B-2. Web Simulateur

- I-B-3. Émulateur

- I-B-4. Event Injector

- I-B-5. UI Builder

- I-B-6. Documentations

- I-B-7. Exemples d'applications

- II. Les bases

- II-A. Le projet

- II-A-1. Constitution d'un nouveau projet

- II-A-2. Structure d'un projet vierge

- II-A-3. Le fichier config.xml

- II-A-4. Déployer son application Tizen

- II-A-5. Débogage des applications

- II-A-6. Remote Inspector

- III. Les API Tizen

- III-A. Contrôler les applications

- III-A-1. Cycle de vie

- III-A-2. Récupération des informations de l'application

- III-A-3. Gestion des applications

- III-A-4. Contrôle de l'application

- III-A-5. Opérations standards

- III-B. Gérer les informations système

- III-B-1. Voir le niveau de la batterie

- III-B-2. Recevoir une mise à jour de la batterie

- III-C. Gestion des notifications

- III-C-1. Créer une notification

- III-C-2. Gérer une notification

- III-D. Gestion des fichiers

- III-D-1. Copier un fichier

- III-D-2. Écrire ou lire dans un fichier

- III-D-3. Faire la liste des stockages du périphérique

- III-E. Comment gérer les téléchargements

- III-E-1. Gérer les téléchargements

- III-E-2. Vérifier les états et les informations du téléchargement

- III-F. Manipuler les contenus multimédias

- III-F-1. Afficher les répertoires

- III-F-2. Listes des médias (Image, Audio, Vidéo)

- III-G. Contrôle du NFC

- III-G-1. Allumer le périphérique NFC

- III-G-2. Détecter les tags

- III-G-3. Créer un NDEF message

- III-H. Géolocalisons-nous

- III-H-1. Conversions entre coordonnées et adresse

- IV. Conclusion

I - Présentation de Tizen

CRÉER DES APPLICATIONS HTML5 SUR TIZEN

Tizen est le nouveau système de la fondation Linux, créé et porté par un consortium industriel (composé de grands noms du secteur tels que Intel et Samsung) ayant pour but de créer le premier système entièrement open source, indépendant de tout constructeur.

En effet les différents partenaires interviennent dans la création et la promotion de ce système qui reste libre.

L'implication des partenaires dans le secteur mobile en fait certainement l'une des plus grosses opportunités se présentant aux développeurs en cette fin d'année 2013. Un système récent et plein d'avenir qui permettra une visibilité maximum aux premières applications développées.

À travers ce tutoriel vous apprendrez à développer vos applications HTML5 sur Tizen et à utiliser un bon nombre de ses API.

Nous démarrerons ce tutoriel par une présentation complète de l'environnement de développement dans lequel nous allons évoluer, du système lui-même aux outils de développement.

Dans une seconde partie, nous étudierons toutes les phases de développement d'une application de la création d'un projet vide au packaging de l'application finie.

Il est préférable de connaître le développement HTML5/JS pour suivre ce tutoriel.

Nous terminerons avec la présentation des principales API proposées ainsi que leur mise en application dans des exemples concrets.

I-A - Présentation du système

Avant de commencer, qu'est-ce que Tizen ?

Tizen est un système open source basé sur un noyau Linux. Tizen n'appartient ni à Samsung, ni à aucun des acteurs de l'écosystème Tizen. C'est un projet complètement libre et open source de la Linux fondation (le code source est donc ouvert, c'est-à-dire téléchargeable, consultable et modifiable).

Cependant, Tizen est piloté, dirigé et promu par un groupe nommé la Tizen Association.

Dans ce chapitre nous allons voir qui sont ces acteurs ainsi que l'écosystème Tizen et son mariage avec l'HTML5, le but de Tizen étant de proposer la meilleure plateforme Web (HTML5) du marché.

Dans ce tutoriel, vous serez amené à travailler avec du HTML et JavaScript, je me permets donc pour ceux qui le souhaitent les liens des tutoriels suivants :

JavaScript : https://JavaScript.developpez.com/tutoriels/introduction/

HTML : https://j-willette.developpez.com/tutoriels/html/les-bases-du-html/

I-A-1 - La Tizen association

Faisant suite à la LiMo (Linux Mobile) Foundation, la Tizen Association est un consortium industriel ayant pour but la création du premier système d'exploitation mobile réellement open source, basé sur noyau Linux et indépendant de tout constructeur pour smartphones.

Formée en 2007 par Motorola, NEC, NTT DoCoMo, Panasonic, Samsung et Vodafone, la LiMo Foundation fut renommée Tizen Association le 1er janvier 2012.

En effet, fin 2011, la Linux Foundation annonce que Meego sera totalement remplacé par Tizen, Tizen sera le nouveau système libre et open source basé sur un noyau Linux. Intel et Samsung, avec la collaboration de la LiMo Foundation et assistés par les développeurs MeeGo prennent la tête du développement de cette nouvelle plateforme. Le développement d'applications est orienté vers l'HTML5 et les autres standards du Web.

Aujourd'hui la Tizen Association est dirigée par

- Fujitsu ;

- Huawei ;

- Intel ;

- Kt ;

- LG U+ ;

- Ntt DoCoMo ;

- Orange ;

- Panasonic ;

- Samsung ;

- Sk telecom ;

- Sprint ;

- Vadafone.

I-A-2 - Écosystème Tizen

Tizen est un système multiplateforme très polyvalent : présent sur Smartphones, tablettes et TV connectées, nous pourrons également le retrouver sur ordinateurs, appareils photo, caméras ainsi que sur des systèmes embarqués de voiture (appelé système IVI pour In-Vehicle Infotainment).

Dernièrement, J.K. Shin, l'un des coprésidents de Samsung a même annoncé l'intention de Samsung d'aller encore plus loin et de positionner Tizen dans les différentes industries comme le bio ou les banques.

En plus de donner plusieurs plateformes de production, le développeur va trouver également plusieurs moyens de développement.

Tizen supporte les App Natives en C++, les App Hybrides et les App Web en HTML5/JS.

Qu'est-ce qu'une App Native ?

Les applications natives sont des applications conçues spécifiquement pour une plateforme mobile, en utilisant le SDK propre à celle-ci et un langage dédié au système (ici le C++, le Java pour Android ou l'objectif C pour IOS).

Les performances sont souvent meilleures et les accès aux périphériques complets, mais le code n'est pas portable et l'app peut avoir des problèmes de compatibilité matériel avec les devices (incompatibilité processeur…).

Qu'est-ce qu'une App Hybride ?

Une application hybride est un mélange de code natif et d'affichage de vues HTML5/JS.

Concrètement toutes les plateformes mobiles proposent un composant de type WebView, permettant d'afficher du contenu Web soit sur une partie de l'écran, soit en plein écran, et en utilisant le moteur HTML du navigateur intégré au système.

Pour la suite de ce tutoriel, nous allons nous focaliser sur le troisième type de développement : les App Web (ou Web Apps).

Les App Web sont des applications développées pour le Web et exécutées dans un environnement Web en ligne ou hors ligne comme sur les mobiles.

Le développement se compose en deux parties : la partie graphique avec l'HTML5 qui va permettre la réalisation de pages (appelée également interface graphique) et le CSS pour la charte graphique et la partie opérationnelle avec le JS (JavaScript) pour les automatismes à exécuter.

Simples et rapides à développer, les App Web sont réutilisables sur d'autres navigateurs, et pas seulement sur le système qui leur est prédéfini. Tizen a une très forte implémentation de l'HTML5 dans sa plateforme Web.

De plus, les frameworks Web et natif ont accès l'un comme l'autre à toutes les fonctionnalités du téléphone telles que :

- les applications ;

- l'interface ;

- les messages (SMS, MMS, mail) ;

- le système ;

- l'affichage ;

- la téléphonie (passer des appels, intercepter des appels…) ;

- la géolocalisation et le GPS ;

- les contacts ;

- le multimédia (système de fichier, musique, vidéo…) ;

- les connexions (Wi-Fi, 3G, 4G…) ;

- la sécurité ;

- …

Qu'est-ce qu'un framework ?

Un framework est un ensemble cohérent de composants logiciels structurels, qui sert à créer les fondations ainsi que les grandes lignes de tout ou d'une partie d'un logiciel (architecture). Un framework se distingue d'une simple bibliothèque logicielle principalement par :

- son caractère générique, faiblement spécialisé, contrairement à certaines bibliothèques ; un framework peut à ce titre être constitué de plusieurs bibliothèques chacune spécialisée dans un domaine. Un framework peut néanmoins être spécialisé, sur un langage particulier, une plateforme spécifique, un domaine particulier (reporting, mapping, etc.) ;

- le cadre de travail (traduction littérale de framework) qu'il impose de par sa construction même, guidant l'architecture logicielle voire conduisant le développeur à respecter certains patterns ; les bibliothèques le constituant sont alors organisées selon le même paradigme.

Les frameworks sont donc conçus et utilisés pour modeler l'architecture des logiciels applicatifs, des applications Web, des middlewares et des composants logiciels. Les frameworks sont acquis par les ingénieurs, puis incorporés dans des logiciels applicatifs mis sur le marché, ils sont par conséquent rarement achetés et installés séparément par un utilisateur final.

I-A-3 - Tizen et l'HTML5

Tizen a pour but de fournir la meilleure plateforme HTML5 du marché, ce qui est aujourd'hui un pari réussi.

Il est placé premier par tous les tests du type de HTML5test : avec un score de 492 (sur 500).

En effet, Tizen a l'implémentation la plus complète du HTML5, avec un total de 97 % des API HTML5 supportées. (Android est à 74 % et iOS à 72 % pour information).

Pour rappel une API (interface de programmation) est un ensemble normalisé de classes, de méthodes ou des fonctions.

La plateforme Web possède un accès à toutes les fonctionnalités du mobile à travers plusieurs API :

- API W3C Standards :

qui nous permet d'utiliser l'HTML5, le CSS3, WebRTC, la géolocalisation, Web Worker, l'interface tactile, WebAudio, la batterie, WebSocket, le système de fichiers, les Web notifications, App Cache Widget…

- API Tizen :

les API Tizen nous donnent accès aux applications, au NFC, au Bluetooth, au multimédia, au PIM, aux informations système, au système de fichiers…

- Autres technologies :

nous avons également accès à d'autres technologies Web telles que Web GL, Typed Array, Full Screen API, Metatag, JSON, URI scheme…

I-A-4 - Support

Tizen met à disposition de nombreux supports pour les développeurs.

- Page d'accueil : https://www.tizen.org.

- Le site développeurs : https://developer.tizen.org.

- Les sources Tizen : https://source.tizen.org.

- Un bug tracker : https://bugs.tizen.org.

À travers ces sites, vous allez retrouver toutes les infos et news sur Tizen, le site développeur va vous accompagner dans le développement, en vous fournissant accompagnement, documentation, spécifications et forum d'entre-aide.

Un bug tracker est également disponible pour suivre les problèmes qui sont survenus et faciliter l'entre-aide et le travail d'équipe.

Pour finir ce projet étant open source, vous pourrez récupérer toutes les sources disponibles sur le site dédié.

Romuald, le développeur évangéliste français reste également à notre disposition pour toutes questions sur Tizen par mail à romualdx.z.rozan@intel.com.

Ou via les réseaux sociaux :

- Google+ : +Romuald Tizen ;

- Twitter : @RomualdTizen.

Alors, n'hésitez pas à le contacter, à tout moment.

I-B - Le SDK Tizen

Maintenant qu'on a le « quoi ? », passons au « comment ? »

Et la réponse à « comment développer sur Tizen ? » réside en trois lettres : SDK.

Le SDK Tizen (kit de développement) est un outil complet et téléchargeable sur http://developer.tizen.org.

Qu'est-ce qu'un SDK ?

Un kit de développement ou trousse de développement logiciel est un ensemble d'outils permettant aux développeurs de créer des applications de type défini (par exemple pour Ios, Android, Symbian, Bada, Windows Phone 7, Windows Phone 8 ou Windows 8).

Les kits de développement logiciels sont souvent désignés par le sigle anglais SDK (Software Development Kit) ou DevKit.

Ils sont en général fournis avec :

- les langages de programmation ;

- les jeux vidéo (éditeurs de niveau, compilateurs, etc.).

Le SDK Tizen contient tous les outils nécessaires à un bon développement rapide et facile.

Nous vous montrerons les outils mis à votre disposition et comment les utiliser pour que vous soyez fin prêt à développer votre première App Tizen.

En conclusion de ce chapitre, vous aurez appris à :

- découvrir l'environnement complet ;

- gérer le Web Simulateur et l'émulateur ;

- apprendre à vous servir d'outils tels que l'Event Injector et l'UI Builder.

I-B-1 - Un environnement de développement complet

L'IDE Tizen (environnement de développement) est basé sur un IDE connu, facile à utiliser et très complet nommé éclipse.

Ce dernier est déjà préconfiguré pour Tizen et disposé de la façon suivante :

Qu'est-ce qu'un IDE ?

En programmation informatique, un environnement de développement est un ensemble d'outils pour augmenter la productivité des programmeurs qui développent des logiciels. Il comporte un éditeur de texte destiné à la programmation, des fonctions qui permettent, par pression sur un bouton, de démarrer le compilateur ou l'éditeur de liens ainsi qu'un débogueur en ligne, qui permet d'exécuter ligne par ligne le programme en cours de construction. Certains environnements sont dédiés à un langage de programmation en particulier.

- En haut à gauche, nous avons le Project Explorer, qui va nous permettre de changer de projet, ou de naviguer dans nos projets.

- Au centre, nous avons l'Editor Area, c'est ici que vous allez taper vos lignes de codes.

- En haut à droite, nous avons le Outline/Event Injector. Outline va vous montrer les différents appels aux différentes variables ou fonctions. (Event injector sera décrit plus bas.)

- En bas à droite, nous avons les property/HTML/CSS Preview, qui vont donc nous montrer les propriétés de nos éléments HTML5.

- En dessous de l'éditeur, nous avons la partie Problems/Console/pages, qui va nous permettre de voir les erreurs de notre programme et de le déboguer.

- Et enfin, en bas à gauche, le tout dernier cadre : Connection explorer, qui va permettre de voir quels terminaux sont connectés, y compris les émulateurs. Il permet également de parcourir le système de fichiers des terminaux.

I-B-2 - Web Simulateur

Comme son nom l'indique, le Web Simulateur va vous permettre de simuler vos applications Web ainsi que de tester certaines réactions de votre App en simulant différents aspects d'un mobile via le Panneau de configuration. Il est basé sur Chrome.

Cependant, il ne faut pas oublier que le Web Simulateur simule la plateforme Web de Tizen, mais ce n'est en rien un émulateur, il n'émule pas un périphérique réel et donc ne va pas supporter tous les aspects du développement.

Par conséquent si votre App plante sur le Web Simulateur, il vous restera à tester sur l'émulateur ou un vrai device, de la même manière si votre application tourne sur le Web Simulateur alors elle fonctionnera sur votre périphérique.

I-B-3 - Émulateur

L'émulateur est une machine virtuelle qui reproduit le fonctionnement d'un périphérique réel. Il est donc nécessaire de configurer ses différentes caractéristiques avant sa création, cette configuration vous permettra de créer un téléphone dans la gamme que vous désirez : bas de gamme, moyen de gamme, haut de gamme.

Cela vous permettra de mieux cibler vos futurs utilisateurs et d'orienter votre développement en fonction de cette cible.

Son utilisation permettra d'avoir une interaction et un rendu similaires à ceux d'un périphérique réel.

Le Connexion Explorer qui vous liste vos périphériques connectés vous permet également de les parcourir. Ainsi vous pourrez les gérer aisément.

Il est possible d'effectuer des transferts de fichiers depuis (ou vers) votre ordinateur.

La création peut prendre un peu de temps ! Donc, ne vous étonnez pas si votre device n'apparaît pas immédiatement.

I-B-4 - Event Injector

L'event Injector permet de générer des événements et de les envoyer aux terminaux (événement système, localisation, NFC, capteurs, téléphonie).

Par exemple vous pouvez simuler une batterie faible ou un appel.

Cela vous permettra de gérer les actions associées à ces événements (fermeture de l'App si batterie faible, enregistrement sur le téléphone si Card SD retirée…).

I-B-5 - UI Builder

L'UI builder qui s'utilise uniquement à partir d'un projet « Web UI builder », sert à générer le code de l'interface.

Il vous suffira de disposer vos éléments graphiques sur votre page à l'aide d'un glisser/déplacer et cela vous générera le code HTML5 associé.

I-B-6 - Documentations

Le SDK Tizen comprend une documentation complète :

- Découvrir Tizen :

un tour d'horizon et une découverte du système et ses outils ;

- Guides et Tutoriels :

des cours vous permettant un développement accompagné ;

- Spécifications des API :

liste de toutes les API, avec leur descriptif complet ;

- Développement de la plateforme :

le développement de la plateforme Tizen.

I-B-7 - Exemples d'applications

Le SDK contient environ une quinzaine d'applications exemples qui vous permettront de voir, avec des exemples concrets et réels, l'utilisation des différentes API.

Pour trouver ces App exemples, il vous suffit de faire New Project, puis de choisir l'option Sample juste à côté de Template. Grâce à ça, vous aurez des petits exemples d'applications pour vous aider !

N'oubliez pas de nommer le projet, cela vous aidera à mieux vous y retrouver quand vous travaillerez sur plusieurs projets.

II - Les bases

II-A - Le projet

Ici nous étudierons comment réaliser un projet Tizen, de sa création à son déploiement.

À la fin de ce chapitre, vous saurez comment bien vous servir d'un projet sur Tizen avec :

- la constitution d'un projet ;

- la configuration d'un projet et son déploiement ;

- le déblocage de vos applications.

II-A-1 - Constitution d'un nouveau projet

Ici nous allons voir où et comment créer un projet, rien de plus simple étant sur un Eclipse, il suffit juste de faire File -> New -> Project…

Puis sélectionner dans les projets Tizen un « Tizen Web Project ».

Une fenêtre de création de projets va s'ouvrir, vous pourrez choisir entre les différents templates de projet Web, les différents types proposés et les exemples fournis par le SDK.

Après sélection du template, il vous suffira de nommer votre projet.

N'oubliez pas le titre de votre projet, ça sera plus facile pour vous y retrouver !

II-A-2 - Structure d'un projet vierge

Une fois le projet créé, vous pourrez voir dans le Project Explorer que certains fichiers ont été créés, toute l'arborescence du projet, vous permettant de travailler plus rapidement et efficacement.

Il en est de même pour un projet Web UI Builder.

II-A-3 - Le fichier config.xml

En plus des fichiers classiques d'un projet HTML5 (tels que index.html, main.js et style.css), un fichier config.xml est présent dans tous les types de projet. Ce fichier permet la configuration de tout le projet.

Tout d'abord vous pouvez configurer les informations générales :

- Identifier : adresse de votre application ;

- Version : version de votre application ;

- Name : nom de votre application ;

- Icon : l'icône pour votre application (qui lance l'application).

En plus des informations générales, différents onglets (Widget, Features, Privileges, Access, Localization, Preferences, Tizen et Source) sont présents, vous permettant de configurer toutes les caractéristiques de votre application.

L'onglet Privileges va vous permettre de gérer les autorisations liées à votre application. Il vous faudra demander des autorisations pour l'utilisation de chaque API.

Le « Name » est très important, en effet si vous ne le mettez pas vous aurez une erreur au lancement de votre application ! N'oubliez donc pas ce point important !

II-A-4 - Déployer son application Tizen

Une fois le code de l'application généré, vous pourrez immédiatement le tester en exécutant votre application.

La méthode sera la même lorsque vous voudrez tester votre application par la suite.

Il vous suffit de sélectionner votre projet dans le Project Explorer et votre device (réel ou émulateur) dans le connexion explorer et de faire Run > Run As > Tizen Web Application.

Accessible également via un clic droit sur le projet.

Votre application s'exécutera sur le device sélectionné, réel ou émulateur.

En cliquant sur Tizen Web Simulator Application au lieu de Tizen Web Application vous exécuterez votre projet sur le Web Simulateur.

Il est également à noter qu'une fois l'application déployée sur son téléphone ou émulateur, l'application est déjà packagée et se trouve dans l'arborescence du projet. Ce package porte le nom de votre projet avec l'extension « .wgt ».

Lors d'un échec de compilation, le packaging ne se fait pas.

Un échec de compilation est souvent dû à une erreur de code, il faut donc penser au débogage et plusieurs outils sont mis à disposition pour vous permettre de corriger vos erreurs facilement et rapidement.

II-A-5 - Débogage des applications

Qu'est-ce que le débogage ?

Le débogage sert essentiellement au moment où vous tentez de lancer votre programme, à ce moment-là, il est possible que votre programme ne fonctionne pas. Le but du débogage est de trouver d'où vient l'erreur pour pouvoir la corriger, cela se fait en général au moment du test de l'application.

Comme dans tous les IDE classiques, vous bénéficiez de deux outils de développement vraiment utiles :

- l'auto complétion qui vous permettra d'éviter les erreurs et de coder plus vite en vous suggérant des fonctions ou mots-clés. Accessible également via un Ctrl+Espace.

- Le Jlint qui vous affichera toutes les erreurs de syntaxe.

Comme il s'agit de développement Web, la console vous affichera les messages comme sur un navigateur Web standard.

II-A-6 - Remote Inspector

Lorsque vous compilez en mode debug, le remote inspector vous permettra de déboguer votre App très facilement avec la possibilité de suivre les différentes étapes du déroulement de l'application grâce au mode pas à pas, la possibilité de mettre des points d'arrêt…

Pour exécuter en mode Debug, il va vous falloir faire Run > Debug As > Tizen Web Application.

Accessible également par un clic droit sur le projet puis Debug As > Tizen Web Application.

Ainsi qu'en cliquant sur la petite icône en forme d'insecte.

Qu'est-ce que le mode DEBUG ?

Le mode debug : lors de l'exécution et notamment lors d'une erreur, les fonctions renvoient plus d'informations concernant ce qui s'est produit. En contrepartie les bibliothèques sont plus lourdes.

Ce mode va vous permettre de repérer des erreurs de programmation (et non de code) comme une boucle infinie (qui n'est pas repérable à la syntaxe).

Le mode Debug ne fonctionne pas avec le Web Simulateur.

Et maintenant, nous allons continuer ce tutoriel avec la partie sur les API !

III - Les API Tizen

Nous allons entamer la partie 3 avec l'utilisation des API Tizen et commencer par un rappel :

Qu'est-ce qu'une API ?

En informatique une interface de programmation (abr. API pour Application Programming Interface) est un ensemble normalisé de classes, des méthodes ou des fonctions qui sert de façade par laquelle un logiciel offre des services à d'autres logiciels. Elle est offerte par une bibliothèque logicielle ou un service Web, le plus souvent accompagnée d'une description qui spécifie comment des programmes consommateurs peuvent se servir des fonctionnalités du programme fournisseur.

Dans l'industrie du logiciel contemporaine, les applications informatiques se servent de nombreuses interfaces de programmation, la programmation se fait en réutilisant des briques de fonctionnalités fournies par des logiciels tiers. Cette construction par assemblage nécessite pour le programmeur de connaître la manière d'interagir avec les autres logiciels, qui dépend de leur interface de programmation. Le programmeur n'a pas besoin de connaître les détails de la logique interne du logiciel tiers, et celle-ci n'est généralement pas documentée par le fournisseur.

Nous allons donc voir durant cette partie comment fonctionnent les API Tizen et leurs utilisations pour vos futurs programmes.

En conclusion de ce chapitre, vous saurez :

- utiliser les principales API Tizen ;

- gérer les informations vitales de votre téléphone via des applications ;

- manipuler les données de votre téléphone.

III-A - Contrôler les applications

L'application API va nous permettre de contrôler le cycle de vie des applications, du lancement à l'arrêt en passant par toutes les étapes intermédiaires pouvant être répétées indéfiniment (la mise en pause, la récupération et le redémarrage).

Cette API va nous permettre de contrôler à la fois l'application courante que nous réalisons, mais également les autres applications de l'appareil.

Concrétisons tout cela par un peu de pratique.

III-A-1 - Cycle de vie

Avant de manipuler les applications, il faut connaître leur cycle de vie composé en cinq étapes :

- Create : le lancement de l'application ;

- Terminate : pour quitter et fermer l'application ;

- Reset : pour redémarrer l'application ;

- Pause : pour mettre en pause l'application ;

- Resume : pour reprendre l'application précédemment mise en pause.

Comme mis dans le titre de l'image, cela va permettre de contrôler les états de notre application.

III-A-2 - Récupération des informations de l'application

Nous allons vous montrer comment utiliser l'API pour récupérer un certain nombre d'informations sur les applications et les afficher dans la console.

Tout d'abord nous allons voir comment récupérer une liste des applications installées.

L'intérêt de cette partie va être de voir les applications installées sur le téléphone et donc par exemple de développer une application permettant de désinstaller des applications du téléphone.

function onListInstalledApplications(applications) {
console.log("Le nombre d'applications installées est de : " + applications.length);
}

Voyons comment récupérer une liste des applications en cours d'exécution.

Nous pourrons grâce à ça voir les applications qui tournent sur le téléphone et pouvoir par exemple développer une application permettant de quitter un processus qui ne fonctionne plus.

function onRunningApplicationContexts(contexts) {
console.log("Le nombre d'installations en cours d'exécution est : " + contexts.length);
}

Comment récupérer des informations de base de l'application :

function onListInstalledApplications(applications) {
var appInfo = applications[0];
console.log("Le path de l'application est :" + appInfo.iconPath);
console.log("Le nom de l'application est :" + appInfo.name);
}
tizen.application.getAppsInfo(onListInstalledApplications);

Ici nous allons récupérer des informations du contexte d'application :

var appContext = tizen.application.getAppContext();
console.log("Le contexte de l'application est " + appContext.id);

III-A-3 - Gestion des applications

Ici nous allons voir comment lancer une application, et pour tester nous allons lancer la calculette.

L'intérêt de cette partie va être de pouvoir lancer des applications au sein d'autres applications.

Par exemple, vous êtes sur une application comme Shazam ou SOundhound, grâce à cette fonction vous pouvez lancer une application comme Spotify ou deezer.

function onSuccess() {
console.log("L'application a bien été lancée");
}
tizen.application.launch("org.tizen.calculator", onSuccess);

Pour savoir quelle application est en cours, nous allons utiliser la méthode getCurrentApplication,

Nous allons pouvoir par exemple développer une application qui permet de quitter des applications qui sont en cours de fonctionnement.

var currApp = tizen.application.getCurrentApplication();

Avec la méthode Hide, nous pouvons cacher l'application courante, si vous voulez faire une application qui tourne en fond et qui n'est pas visible.

currApp.hide();

Avec la méthode Exit, nous pouvons quitter l'application courante, ce qui va être utile pour la plupart de vos applications

currApp.exit();

III-A-4 - Contrôle de l'application

La prochaine fonction va nous permettre de récupérer des fichiers images à partir d'une liste d'images.

Par exemple avec cette fonction, vous pourrez faire une galerie d'images, ou si vous voulez sur une de vos applications permettre à quelqu'un de mettre un avatar en photo.

var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/pick", null, "image/*");
//Définir le format de la réponse que vous voulez recevoir du contrôle de l'application
var appControlReplyCB = {
// La réponse est envoyée si l'opération demandée est un succès
onsuccess: function(reply)  {
for (var num = 0; num < reply.data.length; num++)
{
console.log("reply.data["+num+"].key = "+ reply.data[num].key);
console.log("reply.data["+num+"].value = "+ reply.data[num].value);
}
}
}

Et enfin, la toute dernière fonction de cette partie va servir à trouver une suite d'applications pour sélectionner les images via la méthode launchAppControl()

Si vous ne voulez pas créer une galerie vous-même, vous pouvez directement les sélectionner via cette méthode :

tizen.application.launchAppControl(appControl, null,
function(){console.log("launch appControl succeeded");},
function(e){console.log("launch appControl failed. Reason: " + e.name);},
appControlReplyCB);

III-A-5 - Opérations standards

Les liens des opérations standards ci-dessous sont des liens à utiliser directement dans votre code lors de l'utilisation de ces opérations, comme montré dans les exemples précédents. Cela ne sert donc à rien d'essayer d'y accéder via votre navigateur, vous aurez une erreur 404 - Page not found puisque cela n'est utilisable que dans le code.

Voilà la liste des opérations standards que vous pouvez utiliser avec l'ApplicationControl :

- Défaut (http://tizen.org/appcontrol/operation/default);

- Modifier (http://tizen.org/appcontrol/operation/edit);

- Vue (http://tizen.org/appcontrol/operation/view);

- Prendre (http://tizen.org/appcontrol/operation/pick);

- Création de contenu (http://tizen.org/appcontrol/operation/create_content);

- Composer (http://tizen.org/appcontrol/operation/dial);

- Envoyer (http://tizen.org/appcontrol/operation/send).

III-B - Gérer les informations système

Cette API (SystemInfo API) est notre interface avec notre périphérique, elle va nous permettre de récupérer toutes les informations relatives au matériel, comme les niveaux de batterie, l'utilisation du CPU (processeur), ou encore la connectivité (Wi-Fi, 3G…).

Propriétés disponibles :

- Batterie ;

- CPU ;

- Stockage ;

- Affichage ;

- Réseau ;

- Réseau Wi-Fi ;

- Réseau mobile ;

- SIM ;

- Orientation du périphérique.

Dans la prochaine partie, nous verrons comment se servir de cette API avec l'utilisation de la batterie.

III-B-1 - Voir le niveau de la batterie

Dans ce bout de code, nous allons voir plusieurs fonctions qui vont nous permettre d'utiliser l'API, et nous allons commencer par récupérer la propriété de la batterie

tizen.systeminfo.getPropertyValue("BATTERY", onPowerSuccessCallback)

La prochaine fonction va nous montrer le niveau de la batterie sur la console et nous indiquer si le périphérique est actuellement en charge.

Cela peut être utile pour afficher une alerte en fonction du niveau de la batterie, si on le combine avec la partie notification.

Exemple : avec l'utilisation du GPS ou du flash.

function onPowerSuccessCallback(battery)
{
console.log("Le niveau de la batterie est : " + battery.level);
//Une variable nous indique si la batterie est en charge.
var charging = battery.isCharging;
if (charging)
{
console.log("Le périphérique est en charge");
}
}

III-B-2 - Recevoir une mise à jour de la batterie

Tout d'abord, inscrivons-nous au gestionnaire d'événements pour les changements de la batterie.

Les trois prochaines fonctions vont vous permettre de gérer les mises à jour de la batterie, cela peut être utile si vous voulez savoir combien de batterie il vous reste exactement lors de l'utilisation d'une application particulière (tel que le GPS, le flash ou encore la caméra).

var id = tizen.systeminfo.addPropertyValueChangeListener("BATTERY", onSuccessCallback,
{lowThreshold = 0.2});

N'oublions pas d'implémenter la fonction de callback qui sera appelée lorsque l'événement aura lieu.

function onSuccessCallback(battery) {
console.log("Niveau de la batterie : " + battery.level);
}

Il est également intéressant de savoir se désinscrire du gestionnaire d'événements pour les changements de la batterie.

if (id != null)    {
tizen.systeminfo.removerPropertyValueChangeListener(id);
}
}

III-C - Gestion des notifications

L'API Notification va nous servir à créer des notifications ou à les gérer, il est possible via l'API de définir toutes les propriétés d'une notification (comme son type, si elle possède une image à afficher, une sonnerie, une vibration ou encore l'action à effectuer après avoir cliqué dessus).

III-C-1 - Créer une notification

Tout d'abord, créons un contrôle d'application comme vu précédemment.

var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/create_content",
null, "image/jpg", null, null);

Définissons les propriétés de la notification avec le choix de l'image de la notification, le contenu ainsi qu'un son et si vous voulez que le portable vibre ou non.

var notificationDict = {
content: "Ceci est une notification.",  // Contenu de la notification
iconPath: "images/image1.jpg", // Chemin de l'image de la notification
// Le chemin où est le son à jouer quand une notification est affichée
soundPath: "music/Over the horizon.mp3",
vibration: true, // Le périphérique vibre quand une notification est affichée
appControl: appControl // Contrôle de l'application est lancé quand l'utilisateur sélectionne la notification
}

Pour afficher la notification, créer un objet avec le type de notification d'état, titre et autre propriété de notifications.

var notification = new tizen.StatusNotification("SIMPLE", "Simple notification", notificationDict);

Il ne reste plus qu'à poster la notification.

tizen.notification.post(notification);

III-C-2 - Gérer une notification

Nous avons la possibilité de récupérer une notification précédemment créée, cela vous permettra de ne créer qu'une seule fois la notification et de pouvoir l'utiliser plusieurs fois sans devoir la recréer à chaque utilisation.

var myId = notification.id;
var myNotification = tizen.notification.get(myId);

Ou de récupérer toutes les notifications précédemment créées, ici comme au-dessus, mais dans le cas où vous voulez utiliser toutes les notifications que vous aviez créées.

var notifications = tizen.notification.getAll();

Pour chaque notification, écrivons un ID et un title dans la console de log, ce qui vous permettra de gérer vos notifications que vous avez créées.

for (index = 0; index < notifications.length; index++) {
console.log(notifications[index].id);
console.log(notifications[index].title);
}

Comment mettre à jour une notification précédemment affichée, utilisez la méthode update () en précisant l'objet de la notification mise à jour (par exemple pour mettre à jour la batterie).

myNotification.content = "Ma notification";

Vous pouvez supprimer une notification postée précédemment, si vous ne voulez plus vous en servir par exemple.

tizen.notification.remove(myNotification.id);

Mais également supprimer toutes les notifications précédemment postées par l'application courante, dans le cas où vous supprimez l'application ou si vous voulez arrêter de faire des notifications.

tizen.notification.removeAll();

III-D - Gestion des fichiers

Cette API (FileSystem API) permet de gérer les fichiers et les répertoires du périphérique, l'API permet en somme d'avoir accès aux parties accessibles du système.

Vous pourrez donc, avec cette API :

- copier, déplacer un fichier ;

- créer, supprimer un fichier ;

- créer, supprimer un dossier ;

- obtenir des informations sur un stockage ;

- lire depuis un fichier ou écrire dans ce fichier ;

- recevoir des fichiers ou des informations sur un fichier.

III-D-1 - Copier un fichier

Cette fonction va nous permettre de copier un fichier,

Par exemple si vous développez une application de type Dropbox ou Google Drive. Cela peut vous permettre de copier vos fichiers comme vous voulez sans devoir passer par un ordinateur.

var documentsDir;
function onsuccess(files) {
for(var i = 0; i < files.length; i++) {
if (files[i].isDirectory == false)
documentsDir.copyTo(files[i].fullPath, "images/backup/"+files[i].name, false,
function(){console.log("file copied");});
}
}
function onerror(error) {
console.log("L'erreur " + error.message + " est survenu lors de la création de la liste dans le dossier sélectionné");
}
tizen.filesystem.resolve( 'documents',
function(dir){
documentsDir = dir;
dir.listFiles(onsuccess, onerror);
}, function(e) {
console.log("Error" + e.message);
}, "rw"
);

III-D-2 - Écrire ou lire dans un fichier

Maintenant que nous savons copier un fichier,

Nous allons voir comment l'écrire ou le lire.

Quel est l'intérêt de lire ou écrire un fichier ? Le lire déjà va vous permettre de faire par exemple une visionneuse de document, afin de lire votre fichier directement sur votre téléphone. L'écriture va vous permettre d'éditer des fichiers depuis votre mobile sans passer par un ordinateur.

var documentsDir;
function onsuccess(files) {
for(var i = 0; i < files.length; i++) {
console.log("Le nom du dossier est " + files[i].name); // displays file name
}
var testFile = documentsDir.createFile("test.txt");
if (testFile != null) {
testFile.openStream( "w",
function(fs){
fs.write("HelloWorld");
fs.close();
}, function(e){ console.log("Erreur " + e.message); }, "UTF-8" );
}
}
tizen.filesystem.resolve('documents',
function(dir){
documentsDir = dir; dir.listFiles(onsuccess,onerror);
}, function(e) {
console.log("Error" + e.message);}, "rw" )

III-D-3 - Faire la liste des stockages du périphérique

Après avoir copié un fichier, ou lu ce dernier, nous allons voir comment lister les stockages disponibles sur le périphérique.

Par exemple dans le cas où vous voulez permettre à une de vos applications d'enregistrer un fichier, vous pourrez grâce à cette fonction, laisser le choix de l'emplacement à l'utilisateur ! (ou dans le cas où la mémoire interne du téléphone est pleine, de pouvoir quand même enregistrer le document, mais sur une card SD externe).

function StorageDrives(storages) {
for (var i = 0; i < storages.length; i++) {
if (storages[i].type != "EXTERNAL")
continue;
if (storages[i].state == "UNMOUNTABLE")
console.log("External drive " + storages[i].label + " gone bad.");
}
}

III-E - Comment gérer les téléchargements

L'API vous permet de télécharger des fichiers depuis Internet ainsi que de suivre la progression du téléchargement et ses différents états.

L'API Download va nous permettre de :

- gérer les téléchargements ;

- démarrer le téléchargement ;

- mettre en pause le téléchargement ;

- reprendre le téléchargement ;

- vérifier l'état du téléchargement.

Voici les différents états du téléchargement :

- QUEUED - indique que l'opération de téléchargement est répertoriée dans une file d'attente ;

- DOWNLOADING - indique que l'opération de téléchargement est en cours ;

- PAUSED - indique que l'opération de téléchargement est dans un état de pause à la demande de l'utilisateur ;

- CANCELED - indique que l'opération de téléchargement est annulée à la demande de l'utilisateur ;

- COMPLETED - indique que l'opération de téléchargement est terminée ;

- FAILED - indique que l'opération de téléchargement a échoué.

III-E-1 - Gérer les téléchargements

Pour la gestion des téléchargements, nous allons tout d'abord créer une instance de DownloadRequest, interface qui définit l'URL de téléchargement du fichier.

(Pensez à changer l'URL sinon ça ne va pas être très utile pour votre application.)

var downloadRequest = new tizen.DownloadRequest("http://www.tizen.org", "downloads");

Ensuite, définir les événements pour les téléchargements.

Les différents événements vont vous permettre de faire une application de type BitTorrent ou uTorrent par exemple pour pouvoir télécharger depuis votre portable directement (et en plus avec la partie d'avant, vous pourrez choisir où enregistrer le fichier …).

var listener = {
// Progression du téléchargement
onprogress: function(id, receivedSize, totalSize)    {
console.log('Reçu avec ID : ' + id + ', ' + receivedSize + '/' + totalSize);
},
// Quand l'utilisateur met en pause le téléchargement.
onpaused: function(id)    {
console.log('Pause avec ID : ' + id);
},
// Quand l'utilisateur annule le téléchargement.
oncanceled: function(id)    {
console.log('Annuler avec ID : ' + id);
},
// Quand le téléchargement est fini.
oncompleted: function(id, fullPath)   {
console.log('Complété avec ID : ' + id + ', full path: ' + fullPath);
},
// Quand le téléchargement a échoué.
onfailed: function(id, error)   {
console.log('Échoué avec l'ID : ' + id + ', error name: ' + error.name);
}
};

Il ne reste plus qu'à démarrer le téléchargement

downloadId = tizen.download.start(downloadRequest, listener);

Mettre en pause le téléchargement (si par exemple l'utilisateur n'a plus de batterie).

tizen.download.pause(downloadId);

Reprendre le téléchargement (si par exemple l'utilisateur a retrouvé de la batterie et veut reprendre son téléchargement).

tizen.download.resume(downloadId);

Annuler le téléchargement (si vous vous êtes trompé de fichier par exemple).

tizen.download.cancel(downloadId);

III-E-2 - Vérifier les états et les informations du téléchargement

Nous pouvons surveiller l'état du téléchargement grâce au retour de la méthode Start().

Utile si vous voulez savoir où en est le téléchargement ou son statut (pause ou en cours).

downloadId = tizen.download.start(downloadRequest, listener);

Grâce au downloadId, on peut obtenir toute sorte d'informations sur le téléchargement et opérer dessus.

Obtenir l'état du téléchargement :

var state = tizen.download.getState(downloadId) ;

Obtenir les détails du téléchargement que l'utilisateur a préalablement définis :

var downloadRequest = tizen.download.getDownloadRequest(downloadId);

Obtenir le MIMEType du téléchargement en cours :

var MIMEType = tizen.download.getMIMEType(downloadId);

III-F - Manipuler les contenus multimédias

La content API permet de voir les contenus multimédias disponibles sur l'appareil (images, vidéos, musiques). Il est possible de rechercher des contenus spécifiques en utilisant des filtres.

L'API prend également la modification des éléments multimédia.

III-F-1 - Afficher les répertoires

Tout d'abord créer un ContentManager

var manager = tizen.content;

Recevoir un array of ContentDirectories objects, cela vous permettra d'avoir accès à tous les dossiers du téléphone (utile si vous voulez, par exemple, sauvegarder des données ou si vous voulez sauvegarder des fichiers téléchargés).

function onDirectoryArraySuccess(directories)
{
console.log("Répertoires trouvés " + ", directories.length: " + directories.length);
for (var i = 0; i < directories.length; i++)
{
// Recevoir des infos spécifiques d'un dossier
}
}

Appeler une méthode du ContentManager pour obtenir le répertoire du périphérique local :

manager.getDirectories(onDirectoryArraySuccess, onError);manager.getDirectories(onDirectoryArraySuccess, onError);manager.getDirectories(onDirectoryArraySuccess, onError);

III-F-2 - Listes des médias (Image, Audio, Vidéo)

Écrivons tout d'abord une fonction qui va afficher la liste des médias dans la console

(vous pourrez permettre à un utilisateur par exemple de les copier après ou de les modifier en écrivant) :

function onContentItemArraySuccess(contents)
{
for (var i=0; i < contents.length; i++)
{
console.log(i + ":" + contents[i].type + ":" + contents[i].title + ":" + contents[i].mimeType);
}
}

Définissons le type de média.

Après avoir fait cette fonction en dessous, vous pourrez définir des options pour un utilisateur et lui permettre dans le cas d'un fichier audio, de le copier !

var contentType = "AUDIO";  // contentType can be:"IMAGE","VIDEO","AUDIO

Puis un filtre définissant la recherche, si vous recherchez un fichier particulier.

var filter = new tizen.AttributeFilter("type", "EXACTLY", contentType);

Lancer la recherche en fonction du filtre pour obtenir les objets vidéo et appeler la fonction d'affichage en cas de succès.

manager.find(onContentItemArraySuccess, onError, null, filter);

III-G - Contrôle du NFC

Near Field Communication (NFC) est une norme internationale (ISO / IEC 18092), qui définit une interface et un protocole d'interconnexion sans fil simple d'appareils étroitement couplés fonctionnant à 13,56 MHz.

Il y a trois groupes de scénarios d'application pour NFC :

- tenir un appareil à proximité d'une étiquette sans fil pour échanger des informations ou des données numériques ;

- maintenir deux dispositifs à proximité l'un de l'autre afin d'échanger des informations ou des données entre eux ;

- faire des paiements en maintenant les téléphones mobiles à proximité des terminaux de point de vente au lieu de glisser les cartes à puce.

Voici les différentes caractéristiques de l'API NFC, elle permet :

- la gestion de périphériques NFC ;

- la mise en marche et l'arrêt du dispositif NFC ON/OFF ;

- la gestion des Tag NFC et la détection par les pairs ;

- le réglage du Listener Tag ;

- le réglage du Listener par les pairs ;

- la manipulation de messages NDEF (création, modification, suppression) ;

- la création d'un enregistrement de NDEF et l'ajout à un message ;

- l'échange de données NDEF.

III-G-1 - Allumer le périphérique NFC

Nous allons allumer le périphérique NFC en prenant en compte le succès et l'échec de cette mise en route.

Vous pourrez faire des applications utilisant la technologie NFC de cette manière par la suite.

var nfcAdapter;
function startapp() {
function onPowerOn() {
Log.I('NFC Powered allumé !');
}
function onPowerOnFails(e) {
Log.I('Power allumé erreur: ' + e.message);
}
try {
Log.initialize('logArea');
nfcAdapter = tizen.nfc.getDefaultAdapter();
nfcAdapter.setPowered(true, onPowerOn, onPowerOnFails);
} catch (e) {
Log.E(e.message);
}
}

III-G-2 - Détecter les tags

Récupérons le NFC adapté par défaut :

var nfcAdapter = tizen.nfc.getDefaultAdapter();

Gestionnaire d'événements pour la détection de tags NFC.

Savoir si un tag NFC est disponible et détecté ou s'il n'est plus disponible !

setTagDetect() {
// Quand un TAG NFC est détecté:
void onattach(nfcTag)  {
console.log("NFC Tag détecté. Son type est : " + nfcTag.type);
}
// Quand un TAG NFC n'est plus disponible:
void ondetach()  {
console.log("NFC Tag plus disponible");
}
}

Nous allons définir les types de balises à détecter, qui permettront à votre application de savoir quel tag reconnaître :

// Enregistrer les événements
nfcAdapter.setTagListener(setTagDetect, tagFilter);

III-G-3 - Créer un NDEF message

L'intérêt du NFC est le transfert d'informations, pour cela il faut créer des messages que nous allons envoyer par la suite.

Commençons par créer une instance de NDEFRecordURI en spécifiant l'URL en paramètre :

var newRecord = new tizen.NDEFRecordURI("http://www.Tizen.org/");

Maintenant que nous avons l'information à envoyer, il va falloir créer le message qui va contenir cette information, pour cela créons une instance de NDEFMessage.

var newMessage = new tizen.NDEFMessage();

Maintenant, ajoutons l'enregistrement NDEF au message NDEF précédemment créé.

newMessage.records[0] = newRecord;

Comme nous pouvons le voir dans cet extrait de code, le message NDEF contient un tableau d'enregistrements, vous pourrez donc mettre plusieurs informations, et de types différents, dans un message.

III-H - Géolocalisons-nous

L'API Geocoder sert à gérer la localisation en adresse et en coordonnées (latitude et longitude) et la conversion de l'un à l'autre.

Avec l'API nous pouvons :

- convertir des coordonnées en adresse ;

- convertir une adresse en coordonnées ;

- convertir une adresse à une position correspondante.

III-H-1 - Conversions entre coordonnées et adresse

Comment convertir des coordonnées en adresse, utile si vous voulez recoder Google ou Bing map … Non je rigole, cela peut être utile dans le cas où vous voulez donner la position GPS à une personne via l'application, cela lui permettra ensuite d'utiliser Google ou Bing map justement.

function positionToAdresse() {
var lat = parseFloat(document.getElementById(‘inputLat').value);
var lon = parseFloat(document.getElementById(‘inputLon').value);

var coordinats = new tizen.SimpleCoordinates(lat, lon);

var options = { resultType : ‘STRUCTURED' };
Output.set(‘Adresse en cours de réception ...');

try {
provider.reserveGeocode(coordinates, onGetStructuredAddress, onError, options);
} catch (exc) {
Output.append(‘reverseGeocode() exception : ‘ + exc.message);
}
}

Comment convertir une adresse en coordonnées :

function structuredAdressToPosition() {
var adress = {
country : document.getElementById(‘inputCountry').value),
city : document.getElementById(‘inputCity').value),
street : document.getElementById(‘inputStreet').value)

};
Output.set(‘Position en cours de réception ...');

try {
provider.geocode(address, onGetPosition, onError);
} catch (exc) {
Output.append(‘structuredAddressToPosition(), geocode() exception: ‘‘ + exc.message);
}
}

IV - Conclusion

Merci d'avoir suivi ce tutoriel, en espérant qu'il vous a été utile.

Je tiens à remercier Romuald ROZAN sans qui ce tutoriel n'aurait pu voir le jour.

Ainsi que toute l'équipe d'Intel et BeMyApp.

Sans oublier FirePrawn et Bovino pour leurs relectures techniques et ClaudeLELOUP pour la relecture orthographique !

Pour toute information complémentaire, n'hésitez pas à me contacter ou à contacter Romuald (romualdx.z.rozan@intel.com) !