Archives pour la catégorie Clouder

Windows Metro – Clouder! (15) – Fin du fil rouge Clouder! Aller plus loin avec Windows 8…

C’est la fin du fil rouge sur le développement Windows 8 Metro! Grâce à 15 articles, vous avez pu découvrir comme mon application « Clouder! » pour Windows 8 a été conçue. Si vous l’aviez raté, je vous conseille de lire mon article sur l’application Clouder pour voir de quoi il en retourne:

Windows Metro – Retour d’expérience sur la création de l’application Clouder! pour Windows 8 (stack HTML5)

A travers ces 15 étapes détaillées, vous avez pu vous familiariser avec les APIs Windows et WinJS ainsi qu’aux interfaces Windows 8. Bien sûr, à la fin de ces 15 étapes, vous n’avez pas réalisé l’application complète.

Pour l’exercice, vous pouvez donc vous amuser à faire évoluer cette application pour la rendre plus ludique. Il manque par exemple, la page utilisateur qui liste les tracks de l’utilisateur, ses favoris, ses followins/ers, etc. Cela permet à l’utilisateur de votre application de découvrir facilement de nouveaux titres.

Vous pouvez aussi faire la lecture des playlists SoundCloud, voire même permettre à l’utilisateur de se logger avec son propre compte SoundCloud pour pouvoir envoyer ses propres morceaux!

Il y a encore de nombreux points sur le développement d’application Windows 8 que je n’ai pas abordé. Cela fera sûrement l’objet d’autres tutoriaux sur html5-tutorial.fr mais en attendant, vous pouvez consulter la très bonne documentation de Microsoft pour Metro:

Roadmap for Metro style apps using JavaScript

Vous pouvez récupérer les sources du projet ClouderTutorial et les importer directement dans Visual Studio pour avoir le code complet de l’étape 14.

Si vous voulez innover, vous pouvez aussi faire une application sur un autre thème. Un petit indice :) :

http://www.mixcloud.com/developers/documentation/

J’espère que cela vous a plu !

Sources du projet

Télécharger les sources du projet

Windows Metro – Clouder! (14) – Modifier la « Tile » du menu démarrer avec Notifications et TileUpdateManager

Dans les derniers tutoriaux, on a utilisé les fonctionnalités unifiée de Windows 8 Metro comme la recherche ou le partage:

Windows Metro – Clouder! (11) – Utiliser la recherche intégrée à Windows 8 dans son application

Windows Metro – Clouder! (12) – Afficher ses suggestions de recherche dans la recherche unifiée Windows 8

Windows Metro – Clouder! (13) – Partager une URL avec le Share Charm de Windows 8

Dans ce 14ème tutorial, on va voir une autre notion propre aux application Windows 8 Métro, ce sont les « Tiles » (tuiles) du menu démarrer qui représentent chacune une application:

Pour l’instant, notre application a un pauvre carré comme icône. C’est encore une chose différente, qui se passe dans le manifest (descriptif) de l’application que l’on verra plus tard. Ce que vous ne voyez pas sur cette capture d’écran, c’est que ces tuile sont animées. Ainsi, on peut voir le texte puis la photo correspondante. C’est parfait pour notre application, on va pouvoir afficher les pochettes des albums et les artistes / titres dans nos tuiles.

Mise en place de Tiles avec Notifications

Encore une fois, la documentation fournie par Microsoft est très bien fournie:

Creating tiles (Metro style apps using JavaScript and HTML)

Avec notamment une application exemple qui contient de très nombreux exemples:

App tiles and badges sample

Pour définir nos tuiles, on va en fait utiliser des mini-documents HTML contenant les informations à utiliser dans nos tuiles. Pour nous faciliter la tâche, Microsoft met à la disposition des développeurs pas moins de 45 templates différents, déjà présentés et prêt à être utilisés dans votre application.

Voici la liste des templates:

TileTemplateType enumeration

Une autre subtilité des Tiles Windows 8, c’est qu’elle peuvent avoir deux tailles (square et wide). Par exemple, sur le screenshot ci-dessus, la Tile Allociné prend 2 emplacement alors que la Tile ClouderTutorial n’en prend qu’un. C’est l’utilisateur qui peut décider s’il veut que la Tile soit en taille grande ou réduite. Il faut donc prévoir les 2 cas mais Windows a prévu un sample / tutorial pour cela:

How to specify a square and wide tile in the same notification (Metro style apps using JavaScript and HTML)

On va en fait créer nos deux définitions XML puis faire une sorte de « merge » dans un seul document XML. Pour l’instant, on va se concentrer sur notre première tuile.

On va créer nos définitions XML de tuiles à partir des « hottest tracks » que l’on récupère au démarrage. Dans onHottestTracks, ajoutez donc ce code:

onHottestTracks : function(data){
    var list = new WinJS.Binding.List(data);
    var listView = document.querySelector(".tracklist");
    WinJS.UI.setOptions(listView.winControl, {
        layout: new WinJS.UI.GridLayout(),
        itemDataSource: list.dataSource
    });
    // notification tiles
    Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication().enableNotificationQueue(true);
    for (var i = 0, l = data.length; i < l; i++) {
        var item = data[i];
        // notifications
        if (i > 4) {
            continue;
        }
        var tileImageSrc = item.artwork_url;
        var Notifications = Windows.UI.Notifications;
        var squareTileXml = Notifications.TileUpdateManager.getTemplateContent(Notifications.TileTemplateType.tileSquareImage);
        var squareTileImageAttributes = squareTileXml.getElementsByTagName("image");
        squareTileImageAttributes[0].setAttribute("src", tileImageSrc);

        var tileNotification = new Notifications.TileNotification(squareTileXml);
        Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication().update(tileNotification);
    }
},

Petite explication de code. On commence par appeler:

Windows.UI.Notifications.TileUpdateManager.createTileUpdaterForApplication().enableNotificationQueue(true);

Pour indiquer à Windows qu’il va devoir faire défiler les tuiles automatiquement (5 max, limite Windows).

Lire la suite

Windows Metro – Clouder! (13) – Partager une URL avec le Share Charm de Windows 8

Dans les deux derniers tutoriaux développement Windows 8, on a vu comment intégrer son application à la recherche unifiée de Windows 8:

Windows Metro – Clouder! (11) – Utiliser la recherche intégrée à Windows 8 dans son application

Windows Metro – Clouder! (12) – Afficher ses suggestions de recherche dans la recherche unifiée Windows 8

Cette fois, on va voir comment utiliser la fonction de partage intégrée à Windows 8 (le « Share Charm ») pour partager directement du contenu depuis son application:

Comme d’habitude, vous pouvez aussi suivre la documentation officielle:

Adding share (Metro style apps using JavaScript and HTML)

Ajouter un Search Contract

Dans notre exemple, on va permettre à l’utilisateur de partager l’URL de la page SoundCloud du morceau sur lequel il se trouve. Dans notre cas, cela va se passer dans track.js.

Dans la fonction ready, on va ajouter un listener sur l’évènement « datarequested » sur l’objet DataTransferManager fourni par Windows:

var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
dataTransferManager.addEventListener("datarequested", onDataTransferRequest);

Puis on va de suite se désinscrire de l’évènement dans la fonction unload de la page. En effet, si vous essayer d’ajouter un handler 2 fois, votre application va crasher:

        unload: function () {
            var dataTransferManager = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();
            dataTransferManager.removeEventListener("datarequested", onDataTransferRequest);
        }

Alors là, j’ai eu un comportement que je n’arrive pas à expliquer. Si j’utilisais une fonction définie dans la page (this.onDataTransferRequest), le removeListener ne fonctionnait pas. Je crois que j’avais mis un .bind(this) aussi pour récupérer la track courante. Bref, pas de removeEventListener faisait que dès que je revenais sur la page track une seconde fois, Windows lançait une erreur car j’avais enregistré 2 callbacks sur le même évènement windows.

En sortant la fonction et les variables nécessaires, cela fonctionne bien. Juste avant la fin du self-execute de track.js, ajoutez donc la méthode onDataRequestTransfer:

    var trackToShare = null;

    function onDataTransferRequest(e) {
        if (!trackToShare) {
            return;
        }
        var request = e.request;
    };
})();

sans oublier dans ready:

        ready: function (element, options) {
            trackToShare = this.track = options.selectedTrack;

Partage d’un lien URL par le Search Charm

Windows a plusieurs méthodes de partage, selon ce que vous voulez partager (lien, image, texte, fichier, …). Le détail de chaque opération est ici:

http://msdn.microsoft.com/en-us/library/windows/apps/hh758315.aspx

Dans notre cas, c’est très simple, on va prendre l’objet request transmis par Windows et lui assigner quelques variables de métadonnées (titre, description) et puis appeler la méthode setUri pour indiquer à Windows l’URL à partager:

    function onDataTransferRequest(e) {
        if (!trackToShare) {
            return;
        }
        var request = e.request;
        request.data.properties.title = trackToShare.title + " by " + trackToShare.user.username + " on SoundCloud";
        request.data.properties.description = "You might like this song !";
        request.data.setUri(new Windows.Foundation.Uri(trackToShare.permalink_url));
    };

Testez donc vous-même. Dans notre cas, notre application est une « source » de partage. D’autres application appelées « target » vont pouvoir faire passer le message comme par exemple « Contacts » ou « Courrier ». Ces applications savent comment partager les différentes types de contenu. L’application Courrier par exemple va chercher le contenu de la page web et propose même de joindre une image du site en question directement dans le mail:

puis:

Conclusion

Encore un petit plus que j’ai apprécié pendant le développement d’application Windows 8. Grâce à ce système de « contrat », votre application n’a pas besoin de contenir de logique pour envoyer des mails ou des tweets. On se sert simplement de ponts vers d’autres applications. C’est comme sur Android avec la fonction « Partager » qui peut être répartie sur plusieurs applications.

En quelques lignes, on a réalisé notre fonction de partage, c’est plutôt cool :)

Sources du projet

Télécharger les sources du projet

Windows Metro – Clouder! (12) – Afficher ses suggestions de recherche dans la recherche unifiée Windows 8

Dans le dernier tutorial, on a vu comment intégrer la recherche dans son application Windows 8-style Metro:

Windows Metro – Clouder! (11) – Utiliser la recherche intégrée à Windows 8 dans son application

Maintenant on va voir comment faire pour non pas afficher les résultats mais afficher à l’utilisateur, des suggestions de recherche adaptées à ce qu’il vient de taper.

Un petit merci pour la route

Je n’invente pas ce que j’écris dans ces tutoriaux, ils sont souvent basé sur des recherches ou sur les documentations Microsoft. Là, c’est un très bon article de Thomas Lebrun qui m’a donné toutes les pistes:

[Windows 8] How to get a search suggestions list ?

Merci donc à lui pour avoir participé indirectement à l’écriture de cet article :)

Utilisation des API Windows

Si vous regardez à la fin du fichier results.js généré par Visual Studio, vous avez cette instruction:

appModel.Search.SearchPane.getForCurrentView().onquerysubmitted = function (args) { nav.navigate(searchPageURI, args); };

Cet écouteur d’évènement « onquerysubmitted » est appelé quand l’utilisateur valide une recherche. Soit en cliquant sur une suggestion, soit en appuyant sur Entrée.

On va ajouter un autre écouteur d’évènement qui se nomme « onsuggestionsrequested »:

appModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested = function (eventObject) {

};

L’objet « eventObject » contient de nombreuses informations, notamment la propriété « queryText » qui contient le texte entré par l’utilisateur et une « deferral » qui va permettre de « faire attendre Windows » jusqu’à ce qu’on lui dise que l’on a récupéré les résultats, comme ils sont récupérés de manières asynchrones par XHR.

La technique pour suggérer des résultats est très simple, on va faire une recherche sur SoundCloud limitée à 5 résultats puis récupérer soit le titre, soit le nom d’utilisateur (SoundCloud cherche dans les deux). Ensuite, on va détecter les éléments qui semblent dupliqués. En effet, on aura beaucoup de résultats avec des casses différentes (minuscules / majuscules), il n’est pas utile d’afficher cela à l’utilisateur.

A noter que Windows 8 ne peut afficher plus de 5 suggestions et c’est lui qui s’occupe du highlight du terme recherché dans la suggestion.

Voici le code complet de la méthode qui récupère les suggestions:

appModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested = function (eventObject) {
        var queryText = eventObject.queryText;
        var suggestions = eventObject.request.searchSuggestionCollection;
        var deferral = eventObject.request.getDeferral();

        // Call services to get search suggestions and add them to the search pane
        window.soundCloudService.getTracks({ q: queryText, limit: 5 }, function (suggestResults) {
            if (suggestResults) {
                // éviter les doublons
                var suggestionMemory = [];
                suggestResults.forEach(function (item) {
                    if (item && item.title && queryText && queryText != "") {
                        var suggestion = null;
                        if (item.title.toLowerCase().indexOf(queryText.toLowerCase()) != -1) {
                            suggestion = item.title;
                        } else if (item.user.username.toLowerCase().indexOf(queryText.toLowerCase()) != -1) {
                            suggestion = item.user.username;
                        }
                        if (suggestion && suggestion != "" && suggestionMemory.indexOf(suggestion.toLowerCase()) == -1) {
                            suggestions.appendQuerySuggestion(suggestion);
                            suggestionMemory.push(suggestion.toLowerCase());
                        }
                    }
                });
            }
            deferral.complete();
        });

    };

Et voilà le résultat, des suggestions directement dans Windows 8 Metro!:

Conclusion

Tutorial assez court car Windows vous mâche pas mal le travail.

Ainsi, vous n’avez pas à vous occuper de l’interface de recherche, tout se fait dans la recherche unifiée Windows 8. Comme on a déjà géré l’évènement « onquerysubmitted », au click sur la suggestion, notre application va afficher les résultats correspondants.