Ce qui a changé pour les développeurs d'applications depuis la Consumer Preview

Blog des développeurs d'applications Windows 8

Indications sur la conception d'applications de style Metro pour Windows 8, par l'équipe d'ingénierie de Windows 8

Ce qui a changé pour les développeurs d'applications depuis la Consumer Preview

  • Comments 0

Nous y sommes : avec la nouvelle version Release Preview et les nouveaux outils de développement, Windows 8 s'approche un peu plus de sa version finale. Comme pour la version Consumer Preview, nos équipes de développeurs ont travaillé d'arrache-pied pour peaufiner la plateforme de développement et vous proposer la meilleure expérience de développement possible sur Windows 8. Dans ce billet, je mets en avant quelques-unes des nouveautés sur lesquelles nous avons travaillé et j'explique comment faciliter la migration de vos applications Consumer Preview existantes vers la version Release Preview.

Commençons par un petit aperçu du processus de développement de Windows

Avant d'évoquer quelques-unes des nouveautés de la Release Preview, je souhaite expliquer plus en détail de quelle manière notre équipe envisage les modifications apportées aux fonctionnalités, à l'occasion de cette version Release Preview. À ce stade du développement, la majorité des fonctionnalités de Windows sont intégrées à la plateforme. Avec la Release Preview, notre objectif est de peaufiner les fonctionnalités existantes.

Quelles sont les conséquences pour vous en tant que développeur ? La plupart des modifications que vous constaterez dans la Release Preview sont moins visibles que dans les versions précédentes de Windows 8. Les nouveautés visent à répondre à des besoins spécifiques. Bon nombre des modifications consistent simplement à optimiser les scénarios d'utilisation de la Consumer Preview. Nous avons corrigé des bogues, amélioré les performances de la plateforme (vous pouvez également créer plus facilement des applications plus rapides en apportant simplement de toutes petites modifications à votre code) et optimisé l'expérience de développement, jusqu'à être satisfaits du résultat.

C'est une bonne nouvelle pour vous, car toutes les compétences et connaissances acquises dans le cadre du développement d'applications pour la Consumer Preview peuvent être mises à profit avec la Release Preview. En outre, la quantité de modifications à apporter à vos applications existantes est réduite au strict minimum. Malgré tout, la plateforme de développement n'a jamais été aussi parfaite ! Examinons les modifications pour mieux comprendre le travail réalisé ces derniers mois.

Paramètres d'application itinérante à haute priorité

Les données d'application (Application Data) de Windows 8 vous offrent la possibilité de mettre en place facilement un comportement de type « configure once, use anywhere » dans vos paramètres d'application, par le biais des données d'application itinérantes : l'application est configurée une bonne fois pour toutes et est ensuite utilisable sur tous les appareils. Avec très peu d'investissement de votre part, vos utilisateurs profitent de la même configuration d'application sur l'ensemble de leurs PC Windows 8. Avec la Release Preview, nous étendons cette fonctionnalité afin d'inclure les paramètres d'application HighPriority en itinérance. L'itinérance à haute priorité vous permet de bâtir une expérience d'application continue sur l'ensemble de vos PC, en autorisant une petite partie des données d'état de votre application à profiter d'une itinérance à haute fréquence.

Par exemple, une application d'articles de journaux peut utiliser ce paramètre HighPriority pour diffuser en itinérance l'article que l'utilisateur était en train de lire. Chaque fois que l'utilisateur affiche un autre article, l'application modifie ce paramètre et le diffuse en itinérance. Si cet utilisateur bascule sur un autre PC Windows 8, l'application affiche le dernier article en cours de lecture, pour permettre à l'utilisateur de poursuivre la lecture sur l'autre appareil.

Cerise sur le gâteau, cette fonctionnalité est facile à implémenter. Il vous suffit ainsi de créer un paramètre ou un composite portant le nom « HighPriority » dans le conteneur racine des paramètres d'itinérance. Ce paramètre est transmis en itinérance moins d'une minute après avoir été modifié, ce qui vous permet de diffuser en itinérance les principales données d'état relatives à votre application. L'utilisateur retrouve ainsi l'application comme il l'avait laissée lorsqu'il bascule sur un autre ordinateur. L'itinérance à haute priorité fonctionne avec un seul paramètre. Par conséquent, si vous souhaitez diffuser en itinérance plusieurs données (article et numéro de page, par exemple), vous pouvez utiliser une valeur composite. Le composite « HighPriority » ne doit pas dépasser 8 Ko. Si sa taille est plus élevée, il est diffusé en itinérance comme n'importe quel paramètre standard.

Pour commencer, examinez l'exemple de données d'application, qui a été mis à jour de façon à inclure un exemple de paramètres d'application itinérante à haute priorité.

Des modèles Visual Studio améliorés

Les modèles de Visual Studio ont également fait l'objet de nombreuses améliorations. Nous avons apporté de nombreuses modifications à nos modèles et nous avons même ajouté un modèle supplémentaire, pour vous permettre de démarrer plus facilement un nouveau projet et de créer une formidable application en un rien de temps.

Mises à jour apportées aux modèles XAML

Les modèles XAML ont fait l'objet d'une attention toute particulière dans la version Release Preview. Voici quelques-unes des modifications les plus remarquables :

  • Nous avons supprimé les composants non indispensables du modèle vide : applications d'assistance pour la liaison de données, applications d'assistance de page pour la prise en charge de la navigation, gestion de la durée de vie des processus, etc. Vous profitez ainsi de plus de flexibilité pour créer votre application de A à Z. Si vous ajoutez un modèle d'élément nécessitant ces composants courants, vous avez la possibilité de les ajouter.
  • Les modèles XAML prennent désormais en charge la virtualisation par défaut. Les contrôles GridView et ListView prennent en charge une région d'en-tête, ce qui permet aux éléments liés d'être virtualisés. Désormais, la page de destination de GridApp prend seulement en charge un sous-ensemble d'éléments et non la collection complète, ce qui améliore les performances. Grâce à ces améliorations, les mouvements de défilement horizontal et vertical sont plus rapides que jamais dans votre application, sans effort supplémentaire de votre part.
  • Nous avons ajouté des animations d'entrée à toutes les pages (sauf à la page vide, qui reste entièrement vide). Ces animations rendent les transitions entre les pages des modèles plus fluides et donnent à l'utilisateur une sensation de rapidité et de fluidité.
  • Le modèle D2D Project prend désormais en charge XAML.

Mises à jour apportées à tous les modèles

Nous avons amélioré la navigation pour l'ensemble des modèles. Dans la version Consumer Preview, la navigation au sein des modèles était avant tout pensée pour le tactile. Désormais, les modèles prennent entièrement en charge la navigation au clavier et à la souris, à l'aide des boutons Précédent/Suivant et de raccourcis clavier. Grâce aux modèles, la structure de navigation de votre application est automatiquement configurée pour prendre en charge tous les modes de saisie.

Nouveau modèle pour la création d'un composant Windows Runtime

Outre la mise à jour de nos modèles existants, nous souhaitions également vous permettre de créer plus facilement vos propres composants Windows Runtime. Pour ce faire, nous avons ajouté un nouveau modèle C#/VB qui réalise pour vous la majeure partie du travail. Ce modèle vous permet de créer rapidement un nouveau composant Windows Runtime, que vous pouvez ensuite utiliser dans votre application principale. Ainsi, vous n'avez plus besoin de créer ces composants manuellement de A à Z, car le modèle se charge de l'ensemble de la configuration. Vous n'avez plus qu'à ajouter votre logique personnalisée et le travail est fait !

API de prérécupération des propriétés des fichiers et des miniatures

Depuis la publication de Windows 8 Consumer Preview, nous avons beaucoup travaillé sur les performances et cherché à comprendre comment vous aider à créer des applications rapides et fluides. Dans le cas des applications qui utilisent le système de fichiers pour afficher des vues de type galerie (albums photo, sélections musicales, plateformes de partage de documents, etc.), nous souhaitions en particulier améliorer les temps d'accès aux fichiers, qui ralentissaient jusque-là les performances.

Dans les versions Customer Preview, la récupération des propriétés des fichiers et des miniatures des images peut prendre du temps. En particulier, le modèle de récupération des propriétés fonctionne à la demande : les applications qui accèdent simultanément à de nombreux fichiers subissent des temps de traitement importants en arrière-plan, car les communications entre les processus sont répétées. En outre, toutes les propriétés ne sont pas optimisées pour un accès rapide. Par conséquent, si vous souhaitez utiliser des propriétés peu courantes, votre application est pénalisée.

Pour résoudre ces difficultés sans vous obliger à modifier en profondeur le code de votre application, nous avons ajouté deux nouvelles fonctionnalités aux API du modèle de données.

Windows.Storage.Search.QueryOptions.SetPropertyPrefetch

  • Cette méthode vous permet de fournir une liste de propriétés que Windows devra optimiser pour accélérer leur récupération.
  • Vous pouvez ensuite accéder à ces propriétés en utilisant les méthodes asynchrones que vous utilisez déjà. Elles seront cependant récupérées plus rapidement.

Windows.Storage.Search.QueryOptions.SetThumbnailPrefetch

  • Cette méthode indique à Windows que votre application doit disposer des miniatures des fichiers dans le jeu de résultats de la requête.
  • Vous pouvez ensuite récupérer les miniatures en utilisant la méthode asynchrone que vous utilisez déjà. Elles seront cependant récupérées plus rapidement.

Voici à quoi ressemble le code en JavaScript :

var search = Windows.Storage.Search;
var fileProperties = Windows.Storage.FileProperties;

// Create query options with common query sort order and file type filter.
var fileTypeFilter = [".jpg", ".png", ".bmp", ".gif"];
var queryOptions = new search.QueryOptions(search.CommonFileQuery.orderByName, fileTypeFilter);

// Set up property prefetch - use the PropertyPrefetchOptions for top-level properties
// and an array for additional properties.
var imageProperties = fileProperties.PropertyPrefetchOptions.imageProperties;
var copyrightProperty = "System.Copyright";
var colorSpaceProperty = "System.Image.ColorSpace";
var additionalProperties = [copyrightProperty, colorSpaceProperty];
queryOptions.setPropertyPrefetch(imageProperties, additionalProperties);

// Set up thumbnail prefetch.
var thumbnailMode = fileProperties.ThumbnailMode.picturesView;
var requestedSize = 190;
var thumbnailOptions = fileProperties.ThumbnailOptions.useCurrentScale;
queryOptions.setThumbnailPrefetch(thumbnailMode, requestedSize, thumbnailOptions);

// Query the Pictures library
var query = Windows.Storage.KnownFolders.picturesLibrary.createFileQueryWithOptions(queryOptions);
query.getFilesAsync().done(function (files) {
// Output the query results
files.forEach(function (file) {
// getImagePropertiesAsync returns synchronously when prefetching
// retrieved the properties in advance.
file.properties.getImagePropertiesAsync().done(function (properties) {
// Use image properties
});

// Similarly, extra properties are retrieved asynchronously but may
// return immediately when prefetching completed.
file.properties.retrievePropertiesAsync(additionalProperties).done(function (properties) {
// Use additional properties
});

// You can also retrieve and use thumbnails
file.getThumbnailAsync(thumbnailMode, requestedSize, thumbnailOptions).done(function (thumbnail) {
// Use the thumbnail
});
});
});

Le même code en C# :

const string CopyrightProperty = "System.Copyright";
const string ColorSpaceProperty = "System.Image.ColorSpace";

// Set up file type filter.
List<string> fileTypeFilter = new List<string>();
fileTypeFilter.Add(".jpg");
fileTypeFilter.Add(".png");
fileTypeFilter.Add(".bmp");
fileTypeFilter.Add(".gif");

// Create query options.
var queryOptions = new QueryOptions(CommonFileQuery.OrderByName, fileTypeFilter);

// Set up property prefetch - use the PropertyPrefetchOptions for top-level properties
// and a list for additional properties.
List<string> propertyNames = new List<string>();
propertyNames.Add(CopyrightProperty);
propertyNames.Add(ColorSpaceProperty);
queryOptions.SetPropertyPrefetch(PropertyPrefetchOptions.ImageProperties, propertyNames);

// Set up thumbnail prefetch.
const uint requestedSize = 190;
const ThumbnailMode thumbnailMode = ThumbnailMode.PicturesView;
const ThumbnailOptions thumbnailOptions = ThumbnailOptions.UseCurrentScale;
queryOptions.SetThumbnailPrefetch(thumbnailMode, requestedSize, thumbnailOptions);

// Set up the query and retrieve files.
var query = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> fileList = await query.GetFilesAsync();
foreach (StorageFile file in fileList)
{
// GetImagePropertiesAsync returns synchronously after prefetching
// retrieves the properties in advance.
var properties = await file.Properties.GetImagePropertiesAsync();
// Use image properties

// similarly, extra properties are retrieved asynchronously but may
// return immediately when prefetching completes.
IDictionary<string, object> extraProperties = await file.Properties.RetrievePropertiesAsync(propertyNames);
// Use additional properties

// You can also retrieve and use thumbnails.
var thumbnail = await fle.GetThumbnailAsync(thumbnailMode, requestedSize, thumbnailOptions);
// Use thumbnail
}

Nous avons testé les applications utilisant ces fonctionnalités. Les améliorations sont notables : le temps nécessaire à l'affichage de photos issues de la bibliothèque Images de l'utilisateur a été réduit de 70 %, grâce à StorageDataSourceAdapter, et pour une application chargée de remplir une base de données à partir des propriétés des fichiers extraites du système de fichiers, le gain est même de 400 % !

Ainsi, si vous développez une application qui doit pouvoir accéder à de nombreux fichiers, familiarisez-vous avec ces nouvelles fonctionnalités et utilisez-les pour accélérer votre application. Pour en savoir plus, consultez la documentation de l'API Windows.Storage.Search.QueryOptions dans le Centre de développement.

Blend et les concepteurs Visual Studio

Depuis la Consumer Preview, nous avons continué à améliorer nos outils de conception. Nous savons que l'interface utilisateur de votre application fait partie des principaux moyens dont vous disposez pour mettre en avant votre application. Aussi, nous souhaitions vous permettre d'intégrer facilement les nouveaux principes de conception du style Metro au sein même de l'application.

Outils améliorés pour la création d'états d'affichage pour les applications XAML

Les états d'affichage font partie des concepts clés en matière d'interface utilisateur pour les applications de style Metro. Dans la Release Preview, le concepteur VS XAML et Blend ont été mis à jour pour vous permettre de créer des pages et d'en afficher un aperçu à l'aide des états d'affichage. Ainsi, vous pouvez façonner les états d'affichage d'application de la plateforme (FullScreenLandscape, FullScreenPortrait, Filled et Snapped) à l'aide du volet Appareil (auparavant appelé « volet Plateforme »). Ce volet change automatiquement d'état d'affichage lorsque vous modifiez l'affichage. Si vous activez le mode d'enregistrement, les modifications que vous apportez à l'Aire de conception ou à l'Inspecteur de propriété modifient l'état d'affichage actuellement sélectionné et non pas l'état de base.

Image montrant le nouveau volet Appareil. L'image montre le volet en mode FullScreenLandscape, avec un menu déroulant permettant de sélectionner d'autres états d'affichage. L'option permettant d'enregistrer les états est également présente.Nouveau volet Appareil, qui prend entièrement en charge la conception des états d'affichage

Désormais, vous pouvez également concevoir des états visuels et en afficher un aperçu en utilisant des animations de thème issues de la bibliothèque d'animations, grâce à la fonctionnalité de conception des états visuels de Blend. La bibliothèque d'animations est une suite d'animations de style Metro spécialement conçues pour exploiter la fonctionnalité d'animation de la plateforme. Ces animations sont utilisées à travers toute l'interface utilisateur de Windows et peuvent également être utilisées dans votre application de style Metro.

Plus de productivité dans Blend pour la création HTML

Lors de la phase Consumer Preview, nous avons travaillé d'arrache-pied pour intégrer de nombreuses nouveautés à notre outil de création Blend pour HTML. Au cours de la phase Release Preview, nous avons cherché à rendre cette fonctionnalité plus facile à utiliser dans Blend et plus performante en termes de productivité. Nous avons apporté plusieurs améliorations aux outils de conception HTML/CSS généraux de Blend, pour faciliter la création d'applications dans la Release Preview :

  • Blend prend désormais en charge les opérations Couper, Copier et Coller pour les propriétés CSS, les règles de style, ainsi que pour les éléments de la planche graphique du DOM Live.
  • Vous pouvez modifier les propriétés CSS et les attributs HTML de plusieurs éléments simultanément.
  • Vous pouvez créer une règle de style à partir d'une classe ou d'un ID d'élément et ajouter/supprimer une classe, le tout directement par le biais du menu contextuel de n'importe quel élément.
  • Tous les panneaux pouvant faire l'objet d'une recherche indiquent de façon plus claire si un filtre de recherche est appliqué.

HTML_blend_designerConcepteur HTML Blend, avec ses nouvelles fonctionnalités Couper, Copier et Coller

Nous avons aussi apporté un certain nombre d'améliorations spécifiques pour accroître votre productivité lors du développement des applications. Par exemple, les contrôles WinJS sont désormais plus faciles à utiliser dans Blend.

  • Blend prend en charge les valeurs directes pour les propriétés de contrôle.
  • Blend affiche désormais des informations détaillées sur les erreurs dans le volet des résultats lorsqu'un contrôle WInJS génère une exception.
  • Nous avons amélioré l'interface utilisateur pour le basculement entre les différentes vues SemanticZoom et l'activation des contrôles Flyout et Menu.
  • Nous avons ajouté de nouveaux éditeurs de valeur pour la propriété de l'icône AppBarCommand, AppBarCommand et MenuCommand Flyout.

Ainsi, que vous développiez en HTML/CSS ou en XAML, vous bénéficiez dans tous les cas des nombreuses améliorations apportées à nos outils de conception des applications de style Metro. Bien évidemment, les nouveautés décrites ici ne constituent qu'une partie des nouvelles fonctionnalités. Essayez les outils pour juger par vous-même et découvrir toutes les améliorations.

Modèle d'événement de mouvement en JavaScript

Nous avons également apporté des améliorations significatives à la façon dont le modèle d'événement de mouvement fonctionne avec les applications JavaScript. Notre objectif était de vous offrir plus de flexibilité et de puissance dans le cadre du traitement des mouvements par votre application. Plus précisément, voici quelques-unes des améliorations :

  • Le nouveau modèle d'événement prend en charge plusieurs mouvements simultanés. Grâce à cette nouvelle fonctionnalité, vous pouvez désormais créer une expérience utilisateur à plusieurs mouvements (mouvement utilisant plusieurs déplacements latéraux, par exemple).
  • Vous pouvez désormais contrôler explicitement quels éléments sont ciblés par les mouvements et quels contacts tactiles actifs correspondent à chaque mouvement. Dans la version Consumer Preview, le modèle d'événement comportait des règles très simples et restrictives pour déterminer les contacts cible et les contacts pertinents. Avec le nouveau modèle, vous décidez au moment du contact avec quels autres contacts il doit être groupé et à quel élément renvoyer les événements correspondants. Vous pouvez intégrer le contact dans plusieurs reconnaissances de mouvements simultanément et vous pouvez même créer plusieurs reconnaissances de mouvements ciblant le même élément. Dans les deux cas, vos détecteurs d'événements peuvent choisir par programmation à quels mouvements ils doivent répondre.
  • Vous pouvez ainsi cibler et gérer les événements tactiles et les événements de mouvement indépendamment les uns des autres (jusqu'à présent,ils devaient cibler le même élément). Par conséquent, vous pouvez implémenter des scénarios de saisie bien plus complexes, par exemple autoriser l'utilisateur à effectuer des mouvements à plusieurs doigts pour agrandir un conteneur, tout en mettant en surbrillance les éléments individuels du conteneur que l'utilisateur touche.
  • L'événement renvoie des données de transformation sous une forme qui vous permet de les réutiliser facilement, afin de manipuler le contenu en fonction des mouvements. Par le passé, vous deviez passer par des matrices mathématiques complexes pour extraire les données pertinentes. Le nouveau modèle renvoie les deltas de transformation (incréments) dans l'espace de coordonnées de l'élément parent. Il s'agit justement des informations dont vous avez besoin pour concaténer les données à la transformation CSS actuelle qui place l'élément dans le conteneur, afin de mettre à jour la position, la taille et l'orientation de l'élément.

Grâce à ces modifications, vous pouvez désormais gérer bien plus facilement les mouvements dans votre application. Pour en savoir plus, consultez l'article consacré aux réponses aux interactions de l'utilisateur sur le Centre de développement, ainsi que l'exemple de mouvement instanciable.

Mises à jour du Centre de développement

En plus des efforts consacrés à la plateforme de développement, nous avons également travaillé sur l'amélioration de notre documentation dans le Centre de développement. Le Centre de développement regroupe toutes les informations à connaître sur le développement des applications de style Metro et nous nous sommes efforcés de le rendre le plus complet possible à l'occasion de la Release Preview.

Pour cela, nous avons commencé par ajouter de nouveaux contenus. Lors de la publication de la Consumer Preview, le Centre de développement contenait uniquement les informations de base nécessaires pour se lancer. Désormais, avec la Release Preview, vous trouverez plus facilement des conseils sur les aspects avancés qui permettent aux meilleures applications de style Metro de se démarquer. Voici quelques-unes des principales améliorations :

  • Nous avons ajouté de nombreux exemples, notamment des exemples consacrés au contrôle XAML WebView, à IndexedDB, au pool de thread, aux Web Workers JS, etc.
  • Vous disposez de plus de 200 sujets de tous types (concepts, démarrage rapide et procédures) pour vous aider à développer des applications de style Metro.
  • La documentation de référence sur les API est plus complète que jamais.

En plus des nouveaux contenus, nous avons également amélioré les outils permettant de trouver des informations et de se lancer dans le développement d'applications. Ainsi, nous avons amélioré les liens entre les exemples et la documentation associée. Vous pouvez désormais rechercher un exemple, étudier le code, puis accéder facilement à la documentation, qui décrit plus en détail le code en question. Si vous préférez commencer par lire la documentation, nous avons amélioré nos sujets de mise en route existants et ajouté des didacticiels plus élémentaires pour vous permettre de mettre en pratique vos efforts en matière de développement d'applications.

Après avoir installé la Release Preview, je vous conseille donc de consulter le Centre de développement et de découvrir par vous-même ces nouveaux contenus. Vous comprendrez alors comment ces améliorations facilitent le développement d'applications de style Metro.

Adapter vos applications à la Release Preview

Tout au long du développement de la Release Preview, nous avons cherché à limiter au maximum les modifications susceptibles d'empêcher vos applications de fonctionner. Nous savons que vous êtes nombreux à avoir travaillé d'arrache-pied sur vos applications et nous souhaitons limiter les efforts à fournir pour basculer sur la Release Preview. Bien évidemment, pour améliorer la qualité d'une plateforme de développement entièrement nouvelle, de nombreuses fonctionnalités doivent être adaptées.

Certaines modifications majeures ont été apportées aux projets Visual Studio eux-mêmes (j'en ai décrit une partie au début de ce billet). Par conséquent, pour vous assurer du bon fonctionnement de votre application, la meilleure solution consiste à créer un nouveau projet dans Visual Studio, à sélectionner le modèle de votre application, puis à porter votre ancien projet vers votre nouveau projet. La disposition des modèles n'a pas beaucoup évolué et la majeure partie de votre code restera parfaitement adapté. N'oubliez pas de porter également votre ancien manifeste.

Une fois votre projet porté, exécutez votre application et surveillez les éventuelles erreurs provoquées par les changements d'API. Pour vous aider, nous avons créé un Guide de migration  qui détaille les principales modifications apportées aux API entre la Consumer Preview et la Release Preview.

En créant un nouveau projet VS et en utilisant le Guide de migration pour comprendre les modifications apportées aux API, vous devriez pouvoir faire fonctionner votre application dans la Release Preview en un rien de temps.

Pour résumer

J'espère que vous êtes aussi impatients que nous à l'idée de commencer à développer des applications dans la Release Preview. Les modifications décrites dans ce billet ne constituent qu'une petite partie des nouveautés de cette version. Au final, toutes ces modifications vous permettent de développer dans Windows 8 des applications plus puissantes, plus facilement que jamais. Grâce au Guide de migration, vous pouvez commencer à profiter de ces modifications dans vos applications nouvelles ou existantes.

N'attendez plus et téléchargez la Release Preview ainsi que les outils de développement, et commencez à développer vos applications. Vous trouverez également des informations utiles sur le blog Windows Store destiné aux développeurs. En cas de question, pensez à consulter le Centre de développement, les forums et notre blog : ils contiennent peut-être la réponse ! Bon codage à tous !

--Jake Sabulsky 
   chef de projet, Windows

Remerciements tout particuliers à Dave Bennett, Marc Wautier, Paul Chapman, Heather Brown, Keith Boyd et Steve Wright pour m'avoir aidé à rédiger ce billet.


  • Loading...
Leave a Comment
  • Please add 5 and 6 and type the answer here:
  • Post