[Xamarin] Desgranando las posibilidades de Xamarin Inspector

Introducción

En el desarrollo de aplicaciones móviles es habitual al desarrollar
la interfaz de usuario y otros detalles, realizar pequeños ajustes y
desplegar la App para ver el resultado. De igual forma, en ocasiones
tenemos problemas con la interfaz con elementos que no se ven o que
aparecen donde no esperábamos, etc.

¿Os ha pasado?

Probablemente la respuesta sea afirmativa. En todos estos casos, ¿podríamos contar con una opción más óptima?

Xamarin Inspector

Xamarin ha lanzado una nueva herramienta para aplicaciones iOS, Android, Mac y WPF llamada Xamarin Inspector que nos permite acelerar el desarrollo permitiendo:

  • Ver el árbol visual de elementos de la interfaz. En OSX además se
    puede ver una visualización 3D con capas con los diferentes elementos
    visuales que componen la interfaz.
  • Poder seleccionar elementos y modificar propiedades.
  • Poder ejecutar evaluaciones de expresiones C# con REPL (Read-Eval-Print Loop).
Xamarin Inspector

Xamarin Inspector

La herramienta consiste en un add-in para Xamarin Studio y una extensión para Visual Studio.

Instalación

Podemos instalar la herramienta tanto en Windows como en OSX de forma sencilla.

Instalando Xamarin Inspector

Instalando Xamarin Inspector

NOTA: Xamarin Inspector se encuentra en Preview.
Para poder lanzarlo y utilizarlo debemos tener actualizado Xamarin a
sus versiones más recientes del canal Alpha. Para ello, ya sea en
Xamarin Studio o Visual Studio debemos modificar la configuración de
verificación de actualizaciones al canal Alpha.

Lanzando Xamarin Inspector

Tomamos cualquier aplicación iOS, Android, Mac, o WPF en Xamarin
Studio o Visual Studio, ejecutamos en modo Debug y veremos un botón como
el siguiente:

Botón de Xamarin Inspector

Botón de Xamarin Inspector

Una vez pulsado se nos abrirá una nueva ventana cmo la siguiente:

Vista 3D

Vista 3D

¿Qué podemos hacer?

Gracias a Xamarin Inspector tenemos acceso a un REPL (Read-Eval-Print Loop) en C#. Podemos realizar desde operaciones sencillas y básicas como cálculos matemáticos, colores, etc:

Operaciones simples

Operaciones simples

A definición de variables, peticiones web, acceso a servicios, todo lo que sea necesario dentro de nuestra propia App:

Operaciones más complejas

Operaciones más complejas

Además de escribir y evaluar código al vuelo, Xamarin Inspector nos permite acceder a la interfaz de usuario de nuestra App:

Consultas de la App

Consultas de la App

Podemos ver el árbol visual de elementos, una composición en 3D de
los mismos (sólo disponible en OSX) y las propiedades de cada uno de los
elementos. Una vez seleccionado un elemento visual podremos acceder al mismo para ver los valores de sus propiedades así como realizar modificaciones. Todo ello al vuelo!.

NOTA: Utilizada la App CoffeeTipper de James Montemagno para mostrar Inspector.

Más información

[Xamarin.Forms] Probando Gorilla Player, viendo cambios de UI al vuelo!

Introducción

Xamarin.Forms es un toolkit que crea una abstracción sobre la interfaz de usuario de Android, iOS y Windows Phone permitiendo desarrollarla una única vez con código C# o Extensible Application Markup Language (XAML).

Con la llegada de Xamarin 4 se alcanza la versión
2.0 del toolkit añadiendo soporte a UWP, nuevos gestos y entre las
novedades más destacables cabe mencionar importantes mejoras en rendimiento
en layouts, listados y la posibilidad de compilar XAML. Estas mejoras
aumentan las posibilidades de una opción que permite una cantidad
elevada de código compartido incrementando la productividad y por
extensión reduciendo costes.

El problema

Se sigue echando en falta un diseñador gráfico que permita ver en
tiempo real de forma sencilla, rápida y efectiva cualquier cambio por
pequeño que sea sin necesidad de compilar y desplegar la aplicación.

Nace Gorilla Player

Los chicos de UXDivers se marcaron como objetivo lanzar un Toolkit (Grial UI Kit)
que permitiera la creación de interfaces ricas y atractivas con
facilidad para cualquier desarrollador Xamarin. Durante el desarrollo de
Grial los tiempos de implementación de la UI se dispararon. Gran parte
de ese incremento se debío a los tiempos de compilación. Al ser un
producto con foco en la parte visual cada cambió por mínimo que fuera
tomaba minutos antes de ser visualizado. Todo esto llevó a pensar en una
solución alternativa para evitar compilar, lo cual dió origen a Gorilla Player.

Cambios de UI al vuelo!

El objetivo principal de Gorilla Player es permitir ver
cualquier cambio visual en layouts, estilos o imágenes de forma
inmediata sin necesidad de compilar. Entre las opciones que ofrece:

  • Add-in para Xamarin Studio.
  • Aplicación Player para dispositivos o emuladores.
  • Posibilidad de ver cualquier cambio de layout, estilos o imágenes al vuelo.
  • Posibilidad de utilizar datos de prueba.
  • Posibilidad de sincronizar con múltiples dispositivos de manera
    simultánea. De esta forma podemos ver el mismo cambio en diferentes
    dispositivos o plataformas.
  • Notifica de errores en el marcado (XAML).

Instalando Gorilla Player

La instalación de Gorilla es sencilla tanto en Windows como Mac.

OSX

Tras la descarga del paquete bastará con arrastrar el icono de Gorilla Player a la carpeta de aplicaciones:

Instalar Gorilla Player

Instalar Gorilla Player en OSX

Windows

En Windows contaremos con el clásico asistente de instalación:

En Windows

En Windows

Terminada la instalación tendremos la siguiente pantalla de
configuración donde podremos elegir si instalar el add-in de Gorilla
Player y los proyectos de ejemplo además de poder cambiar rutas.

Instalado add-in y ejemplos

Instalado add-in y ejemplos

NOTA: Para evitar problemas es recomendable
asegurar que Xamarin Studio permanece cerrado durante la instalación. En
caso contrario, el add-in no se instalará.

Llegados a este punto necesitaremos una conexión a internet para
validar nuestras credenciales. Utilizaremos el correo electrónico con el
que nos registramos en Gorilla Player junto a la contraseña recibida
por correo electrónico.

 

Iniciando sesión

Iniciando sesión

Un vez realizada la autenticación tendremos Gorilla en funcionamiento y todo casi preparado para trabajar. En todo momento tendremos acceso rápido a la documentación online o al Walkthrough donde se detallan los pasos básicos para tenerlo todo listo.

Walkthough

Walkthough

Gorilla 07Gorilla Player en dispositivos

Deseamos ver los cambios en XAML al vuelo en un dispositivo o
emulador (o dispositivos / emuladores pueden ser múltiples de manera
simultánea) por lo que el siguiente paso será, añadir el Player.

Abrimos la solución del proyecto del Player y desplegamos en dispositivo o emulador.

Gorilla tratará de realizar la conexión de forma automática. En caso
de no poder establecerla debemos realizarla a mano introduciendo la
dirección IP del servidor.

NOTA: El puerto por defecto que utiliza Gorilla es el 8080.

Gorilla Player en emulador Android

Gorilla Player en emulador Android

Una vez establecida la conexión tenemos todo lo necesario para previsualizar los cambios en nuestro dispositivo o emulador.

NOTA: Podemos repetir el proceso por cada dispositivo o emulador extra en el que deseamos probar la aplicación.

Probando cambios

Nos lanzamos de pleno a probar la actualización al vuelo de cambios
en XAML. Podemos utilizar cualquier aplicación Xamarin.Forms, para este
ejemplo utilizaremos la misma proprocionada en la instalación de
Gorilla, MyCoolCompanyApp.

Abrimos un archivo XAML de nuestro proyecto y comenzamos a editar,
cualquier cambio que guardemos se verá reflejado de manera inmediata en
el Player sincronizado:

Cambios al vuelo!

Cambios al vuelo!

Probando con datos de prueba

Podemos utilizar datos de prueba para poder ver resultados cercanos
al resultado final en nuestra UI de forma muy sencilla. Podemos asociar
datos de prueba con XAML de las siguientes formas:

  • Utilizando un archivo JSON.
  • Utilizando la clase JsonData.
  • Utilizando objetos planos.

Comenzamos tratando la primera opción. Definimos un archivo JSON
en la raíz del proyecto donde tenemos definidas nuestras vistas XAML
donde el contenido serán cada unas de las propiedades que desearemos
bindear.

Archivo JSON con los datos de prueba:

{
    "MyPeople.xaml": [
    { "Name": "Casy Niman", "City": "HOBART", "Department":"Accounts", "Age":58, "Followers":267,  "Photo":"friend_thumbnail_93.jpg" },
    { "Name": "Gorge Tach", "City": "NEWCASTLE", "Department":"Design", "Age":29, "Followers":127, "Photo":"friend_thumbnail_55.jpg" },
    { "Name": "Cristina Maciel", "City": "HOBART", "Department":"Mobile Dev.", "Age":32, "Followers":80, "Photo":"friend_thumbnail_31.jpg" },
    { "Name": "Simon Deuva", "City": "MELBOURNE", "Department":"Media", "Age":58, "Followers":420, "Photo":"friend_thumbnail_34.jpg" }
    ]
}

Uso en la interfaz de usuario:

<ListView>
     <ListView.ItemTemplate>
          <DataTemplate>
               <ViewCell>
                    <Label Text="{Binding Name}" VerticalOptions="Center" Grid.Column="1" />
                    <Label Text="{Binding Age}" VerticalOptions="Center" Grid.Column="2"/>
                    <Image Source="{Binding Photo}" HorizontalOptions="Center" Grid.Column="3"/>
               </ViewCell>
          </DataTemplate>
     </ListView.ItemTemplate>
</ListView>

El BindingContext de la vista esta enlazado al fichero JSON. Podemos
utilizar para realizar el proceso el nombre de la vista o bien la ruta
al archivo.

La otra posibilidad que tenemos de utilizar datos de prueba es mediante la clase JsonData.

<ContentPage
       xmlns:common="clr-namespace:UXDivers.Artina.Player;assembly=UXDivers.Artina.Player.Common">
    <ContentPage.Resources>
        <ResourceDictionary>
            <common:JsonData x:Key="People">
                [
             { "Name": "Casy Niman", "City": "HOBART", "Department":"Accounts", "Age":58, "Followers":267,  "Photo":"friend_thumbnail_93.jpg" },
             { "Name": "Gorge Tach", "City": "NEWCASTLE", "Department":"Design", "Age":29, "Followers":127, "Photo":"friend_thumbnail_55.jpg" },
             { "Name": "Cristina Maciel", "City": "HOBART", "Department":"Mobile Dev.", "Age":32, "Followers":80, "Photo":"friend_thumbnail_31.jpg" },
             { "Name": "Simon Deuva", "City": "MELBOURNE", "Department":"Media", "Age":58, "Followers":420, "Photo":"friend_thumbnail_34.jpg" }
                ]
            </common:JsonData>
        </ResourceDictionary>
    </ContentPage.Resources>
    <ContentPage.Content>
            <ListView ItemsSource="{Binding Source={StaticResource People}, Path=Obj}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                                <Label Text="{Binding Name}" VerticalOptions="Center" Grid.Column="1" />
                                <Label Text="{Binding Age}" VerticalOptions="Center" Grid.Column="2"/>
                                <Image Source="{Binding Photo}" HorizontalOptions="Center" Grid.Column="3"/>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    </ContentPage.Content>
</ContentPage>

la clase JsonData nos permite definir una estructura de datos
utilizando un archivo JSON. Su uso es tan sencillo como definir la
estructura deseada como recurso asignádole un identificador y
referenciar más tarde al recurso vía identificador donde deseamos
acceder a cualquier dato de la estructura.

La tercera opción disponible es utilizar objetos. En XAML podemos
definir un objeto y luego referenciarlo desde un elemento de UI. Podemo
definir una estructura como la siguiente:

x:Array x:Key="Data"
        Type="{x:Type sys:String}">
     <sys:String>Hello</sys:String>
     <sys:String>World!</sys:String>
</x:Array>

Y enlazar con facilidad:

<ListView ItemsSource="{StaticResource Data}">
     <ListView.ItemTemplate>
          <DataTemplate>
               <ViewCell>
                    <Label Text="{Binding .}"/>
               </ViewCell>
          </DataTemplate>
     </ListView.ItemTemplate>
</ListView>

Un ejemplo de uso:

Datos de prueba

Datos de prueba

Gestión de estilos

Desde la llegada de Xamarin.Forms 1.3 tenemos la posibilidad de
utilizar estilos para gestionar con facilidad la apariencia de nuestra
interfaz de usuario. En este caso lo normal es trabajar con
ResourceDictionary que puede estar tanto a nivel de elemento visual,
como de página como de aplicación (en otro archivo App.xaml).

Gorilla Player permite trabajar con:

  • Estilos implícitos, explícitos y herencia.
  • Permite que esten definidos en el mismo archivo o diferentes.
  • Colores tanto con nombres directos como valores hexadecimales.
  • Previsualizar imágenes locales.
Cambios en estilos

Cambios en estilos

Detección de errores en marcado

Por último, y no por ello menos importante, cabe resaltar el feedback proporcionado en errores
de marcado. En caso de definir una propiedad de forma incorrecta,
cerrar mal algun elemento XAML, establecer una propiedad inválida, etc.
el Player nos indicará el tipo de error y otros detalles.

Errores en XAML

Errores en XAML

Más información

[Xamarin] Probando Continuous Coding

Introducción

Xamarin lanzó una nueva herramienta para aplicaciones iOS, Android, Mac y WPF llamada Xamarin Inspector que nos permite acelerar el desarrollo permitiendo:

  • Ver
    el árbol visual de elementos de la interfaz. En OSX además se puede ver
    una visualización 3D con capas con los diferentes elementos visuales
    que componen la interfaz.
  • Poder seleccionar elementos y modificar propiedades.
  • Poder ejecutar evaluaciones de expresiones C# con REPL (Read-Eval-Print Loop).

Entre
todas las opciones la última es increíblemente interesante ya que
permite realizar múltiples pruebas en tiempo real sin necesidad de
realizar recompilaciones del proyecto, proceso que conlleva un tiempo en
el que no podemos continuar nuestro desarrollo. Esto mismo debió pensar
Frank A. Krueger que ante la posibilidad de poder utilizar ensamblados dinámicos se ha lanzado a crear Continuous Coding anteriormente conocido como Live Coding.

Continuous Coding

La
propuesta de Continuous Coding es reducir al máximo el ciclo de
compilar y ejecutar permitiendo en tiempo real evaluar el código tanto
de la lógica como por puesto a nivel de UI. Poder contruir la interfaz al vuelo
viendo directamente los resultados de cada línea aplicada además de
poder enlazar la misma con la lógica y el backend segun vamos
escribiendo.

Suena a mágico, ¿verdad?

En eso consiste Continuous Coding actualmente disponible en C# para Xamarin en Android e iOS.

Preparando el entorno

El paso inicial de todos es instalar Xamarin Inspector.

Podemos instalar la herramienta tanto en Windows como en OSX de forma sencilla.

Instalando Xamarin Inspector
Instalando Xamarin Inspector

El siguiente paso será instalar el add-in de Continuous Coding para Xamarin Studio.

NOTA: Actualmente solo soportado en Xamarin Studio.

En
Xamarin Studio seleccionamos Archivo -> Gestor de complementos. Una
vez en la galería de complementos, seleccionamos la opción de
repositorios.

Repositorios
Repositorios

Añadimos un nuevo repositorio utilizando la siguiente URL:

https://raw.githubusercontent.com/praeclarum/Continuous/master/Continuous.Client.MonoDevelop/AddinRepo
Repostorio añadido
Repostorio añadido

Utilizando Continuous coding

Creamos una nueva aplicación, para este ejemplo crearemos una aplicación Xamarin.Forms.

Nuevo proyecto Xamarin.Forms
Nuevo proyecto Xamarin.Forms

Debemos añadir una referencia desde los proyectos iOS y Android al paquete NuGet de Continuous.

NuGet Continuous
NuGet Continuous

A continuación, añadiremos:

#if DEBUG
new Continuous.Server.HttpServer(this).Run();
#endif

En puntos de inicialización de la App. En el caso de iOS AppDelegate.FinishedLaunching y en el caso de Android Activity.OnCreate son lugares idóneos.

NOTA: this es el contexto en Android. En iOS puede ser cualquier cosa.

En el caso de utilizar el emulador de Android tendremos que hacer un forward del puerto utilizado por Continuous:

Llegados a este punto tenemos todo lo necesario para usar Continuous
Coding. Ejecutamos la App en depuración como lo haríamos normalmente.
Tenemos el panel de Continuous Coding disponible en Ver -> Paneles
-> Continuous Coding.

Panel Continuous Coding
Panel Continuous Coding

Podemos enviar Snippets de código utilizando el botón Set Type o la combinación de teclado Ctrl+Shift+Return. En caso de desar que todo lo que vamos editando vaya actualizándose en tiempo real debemos usar el botón Refresh del panel o la combinación de teclas Ctrl+Shift+C.

Podéis ver a continuación a Continuous Coding en acción.

Continuous en acción!
Continuous en acción!

El sencillo ejemplo mostrado anteriormente lo podéis encontrar en GitHub:

Ver GitHub

One more thing

James Montemagno,
evangelista de Xamarin, se lanzó este verano con un nuevo formato
llamado Motz Codes Live basado en Hangouts de 30-60 minutos tratando
diferentes aspectos relacionado con el desarrollo de aplicaciones con
Xamarin. En el último de ellos junto a Frank A. Krueger realizaron un recorrido bastante completo por Continuous:

Más información

[Material] Introducción a Xamarin en dotnetMálaga

El evento

DotNet Málaga, es el grupo de usuarios y
entusiastas de tecnologías Microsoft de Málaga. Con muchas ganas e
ilusión de impulsar fuertemente la comunidad, el networking y la
comnicación entre miembros. El pasado 23 de Septiembre tenía lugar un evento con múltiples sesiones sobre desarrollo Xamarin.

dotNetMálaga

dotNetMálaga

El material

En mi caso, tuve el placer de poder participar el evento con una charla sobre Desarrollo de Apps nativas multiplataforma con Xamarin utilizando MVVMCross. Paso a paso fuimos viendo:

  • Claves de MVVM
  • Introducción a MVVMCross
  • Conceptos de data binding, comandos, etc.
  • Cantidad de código a compartir y técnicas para compartir código.
  • Y más!

 

Evento Xamarin en dotNetMálaga

Evento Xamarin en dotNetMálaga

Tenéis disponible la presentación utilizada a continuación:

En cuanto a la demo técnica realizada, la tenéis disponible en GitHub:

Ver GitHub

Quisiera terminar agradeciendo a Josué Yeray por su participación, a dotNetMálaga por toda la organización, a Plain Concepts por dejarme ir al “sarao” y por supuesto a todos los asistentes. Espero que para todos fuese una tarde divertida y… ¿cuándo repetimos?

Más información

[Xamarin.Forms] Desarrollando para la Microsoft Band

Introducción

El año pasado Microsoft se aventuró en el terrero de wearables con el lanzamiento de Microsoft Band,
una pulsera cuantificadora compatible con Windows Phone, iOS y Android
con posibilidades de monitorización de pasos, ritmo cardiaco, sueño o
metros recorridos además de tener acceso a notificaciones del teléfono
como llamadas, mensajes, correos o notificaciones Twitter por ejemplo.

Xamarin Microsoft Band 01

Además, Microsoft lanzó Microsoft Health, una plataforma en la nube donde controlar todos los datos recogidos relacionados con la salud y la actividad física.

Microsoft Band

Es un wearable con 10 sensores (incluido GPS), pantalla táctil y
batería para hasta 2 días de uso continuo (de media) que se basa en tres
pilares fundamentales:

  1. Salud: Podemos tener información como el número de pasos, pulsaciones, calidad del sueño, ritmo cardiaco, etc.
  2. Productividad: Notificaciones de llamadas perdidas, mensajes, Twitter además de alertas de calendario e incluso Cortana.
  3. Conectividad: App en teléfono en la que obtener más información, históricos, etc.
App móvil

App móvil

Creando proyecto

Para probar todas las opciones de la Microsoft Band vamos a crear un nuevo proyecto desde cero:

Nueva App Xamarin.Forms

Nueva App Xamarin.Forms

Nuestro objetivo sera crear una App Xamarin.Forms destinada a iOS,
Android y Windows Phone que nos permita conectar con una Microsoft Band,
acceder a información de sus sensores, crear tiles, enviar notificaciones, vibraciones e incluso personalizarla.

Permisos

Debemos añadir los siguientes requisitos:

  • Android: Permiso para acceder a Bluetooth:

[assembly: UsesPermission(Android.Manifest.Permission.Bluetooth)]

  • Windows Phone: De igual forma, acceso a Bluetooth:
<DeviceCapability Name="bluetooth.rfcomm">
  <Device Id="any">
    <!-- Used by the Microsoft Band SDK -->
    <Function Type="serviceId:A502CA9A-2BA5-413C-A4E0-13804E47B38F" />
    <!-- Used by the Microsoft Band SDK -->
    <Function Type="serviceId:C742E1A2-6320-5ABC-9643-D206C677E580" />
  </Device>
</m2:DeviceCapability>

Xamarin Microsoft Band SDK

En Xamarin Components y en Nuget tenemos disponible Xamarin Microsoft Band SDK. Es un conjunto de librerías que nos permite extender nuestras Apps móviles integrándolas con la Band. Podremos:

  • Conectar a Band (o Bands)
  • Obtener información de la Band y de los sensores
  • Gestionar tiles y layouts
  • Notificaciones
  • Personalización

Antes de continuar y lanzarnos de lleno a programar, importante
resaltar que la Band ofrece un modelo de extensión, se requiere una App
móvil. Usaremos la Band para obtener información y como pantalla
auxiliar.

Conexión

Para poder interactuar con la Band, lo primero sera…conectar con la misma!. Utilizaremos el siguiente namespace:

using Microsoft.Band.Portable;

Utilizamos el método GetPairedBandsAsync para obtener el listado de Bands disponibles

private async Task LoadBands()        
{            
     Bands = new ObservableCollection<BandDeviceInfo>();            
      
     // Get paired Bands           
     IEnumerable<BandDeviceInfo> bands = await BandClientManager.Instance.GetPairedBandsAsync();
             
     foreach (var band in bands)            
     {               
          Bands.Add(band);    
     }        
}

Mostraremos al usuario el listado de Bands disponible, de modo que,
una vez seleccionada una de ella, utilizaremos la información disponible
en BandDeviceInfo para crear una instancia de BandClient que representará a la Band y nos permitirá trabajar con el resto de acciones (Tiles, notificaciones, etc).

Información de la Band

Una vez seleccionada una Band accedemos a una vista con información
de la misma. Pasamos la Band seleccionada como parámetro en la
navegación:

var bandInfo = navigationContext as BandDeviceInfo;

Podemos extraer información básica como el nombre de la Band de la clase BandDeviceInfo:

BandClient = await BandClientManager.Instance.ConnectAsync(BandInfo);

Podemos obtener más información relacionada con la Band gracias a la instancia de BandClient como la versión de Firmware o de Hardware:

IsConnected = BandClient.IsConnected;
FirmwareVersion = await BandClient.GetFirmwareVersionAsync();
HardwareVersion = await BandClient.GetHardwareVersionAsync();

BandClient representa la Band a la que hemos conectado.

Xamarin Microsoft Band 06Sensores

Entre las posibilidades que tenemos disponibles con la Band, una de
las más interesantes es sin duda obtener información de sensores.
Contamos con la siguiente lista de sensores en la Band:

Sensores

Sensores

Además de acelerómetro, pedómetro y algun sensor del que ya estamos
acostumbrados a encontrar en teléfonos u otros dispositivos, contamos
con sensores muy interesantes como la medición del ritmo cardiaco o UV.

Para trabajar con sensores utilizaremos el siguiente namespace:

using Microsoft.Band.Portable.Sensors;

Utilizando BandClient podemos acceder a SensorManager que nos permitirá acceder a todos los sensores:

var sensorManager = BandClient.SensorManager;

Para trabajar con sensores nos suscribiremos a eventos en los que recibiremos información tanto en valores decimales como Raw.

NOTA: En tiempos prolongados de conexión tiene un impacto negativo en la duración de la batería.

Veamos un ejemplo:

await _sensorManager.Distance.StartReadingsAsync(BandSensorSampleRate.Ms128);
sensorManager.Distance.ReadingChanged += (s, e) =>
{
     TotalDistance = e.SensorReading.TotalDistance;
     var speed = e.SensorReading.Speed;
     var pace = e.SensorReading.Pace;
     var currentmotion = e.SensorReading.CurrentMotion;
};

Nos suscribimos al evento StartReadingsAsync del sensor Distancia para acceder a información como ls velocidad o la distancia total recorrida.

NOTA: Para acceder a la información de alguno de
los sensores, se necesita el consentimiento por parte del usuario. Es
necesario para obtener información del ritmo cardiaco.

Tiles

Los Tiles (baldosas) son uno de los pilares fundamentales de la interfaz de usuario disponible en la plataforma Windows.

Para trabajar con los tiles utilizaremos el namespace:

using Microsoft.Band.Portable.Tiles;

Y la instancia de TileManager:

var tileManager = BandClient.TileManager;

Podemos tener hasta 13 Tiles diferentes e independientes en una
Microsoft Band, podemos obtener el número de “huecos” disponibles que
tenemos en la Band utilizando el método GetRemainingTileCapacityAsync:

// Load Remaining CApacity

RemainingCapacity = await tileManager.GetRemainingTileCapacityAsync();

También podemos obtener un listado de Tiles de nuestra Aplicación utilizados en la Band:

private async Task LoadTiles()
{
     var tiles = await tileManager.GetTilesAsync();
     Tiles = new ObservableCollection<BandTile>(tiles);
}

Utilizamos el método GetTilesAsync para obtener una colección de objetos BandTile.

Creando Tiles

Las Apps pueden crear uno o más tiles. Cada Tile cuenta con GUID e icono que lo identifica.

Tamaño del Icono

Tamaño del Icono

Para crear un nuevo Tile utilizaremos un objeto de tipo BandTile, definiremos un nuevo identificador (Guid) además de la información básica como título, icono, etc:

TileId = Guid.NewGuid();
TileName = "New Tile";
TileIcon = await ResourcesHelper.LoadBandImageFromResourceAsync("Resources/tile.png");
TileBadge = await ResourcesHelper.LoadBandImageFromResourceAsync("Resources/badge.png");

Utilizamos las propiedades anteriores para crear el tile:

var tile = new BandTile(TileId)
{
     Icon = TileIcon,
     Name = TileName,
     SmallIcon = TileBadge,
     IsScreenTimeoutDisabled = DisableScreenTimeout
};

Para añadirlo en la Band, utilizamos el método AddTileAsync disponible en TileManager pasando el objeto BandTile creado:

// Add Tile
await _tileManager.AddTileAsync(tile);

Cada Tile puede contar con hasta 8 páginas. El contenido de cada página es de 245 x 106 píxeles. Las páginas pueden mostrar un mensaje básico un utilizar un Custom Layout. Para crear custom layout utilizaremos un árbol de contenedores y elementos.

Contenedores y Elementos

Contenedores y Elementos

Podemos añadir Custom Layout al Tile añadiendo una colección de objetos PageLayout a la propiedad PageLayouts del tile.

// Tile Custom Layouts
var layouts = CreatePageLayouts();
tile.PageLayouts.AddRange(layouts);

Contamos con varios contenedores que nos permiten organizar los elementos de la página:

  • FlowPanel: Organiza los elementos apilando vertical u horizonalmente.
  • ScrollFlowPanel: Similar al anterior pero añadiendo Scroll.
  • FilledPanel: Rectángulo relleno con un color de fondo.

Además de elementos básicos que nos permiten incluir imágenes, texto, código de barras y botones.

  • TextBlock: Muestra texto.
  • WrappedTextBlock: Similar al anterior pero el texto puede hacer wrapping.
  • Icon: Imágenes.
  • Barcode: Código de barras en diferentes formatos.
  • TextButton: Botón con formato texto.
  • FilledButton: Botón.
new PageLayout {                 
   Root = new ScrollFlowPanel {                      
        Rect = new PageRect(0, 0, 245, 105),                  
        Orientation = FlowPanelOrientation.Vertical,    
        Elements = {
             new TextBlock
             {
                  ElementId = 11,                   
                  Rect = new PageRect(0, 0, 230, 30),                
                  Color = new BandColor(255, 0, 0),             
                  AutoWidth = false,                        
                  HorizontalAlignment = HorizontalAlignment.Center,               
                  VerticalAlignment = VerticalAlignment.Bottom             
             },        
             new Barcode {                   
                  ElementId = 12,          
                  Rect = new PageRect(0, 0, 230, 61),     
                  BarcodeType = BarcodeType.Code39,                     
             },
             new TextBlock
             {
                  ElementId = 13,          
                  Rect = new PageRect(0, 0, 230, 30),                           
                  Color = new BandColor(255, 0, 0),
                  AutoWidth = false,       
                  HorizontalAlignment = HorizontalAlignment.Center,              
                  VerticalAlignment = VerticalAlignment.Bottom                            
             },   
             new Barcode {                      
                  ElementId = 14,
                  Rect = new PageRect(0, 0, 230, 61),
                  BarcodeType = BarcodeType.Pdf417,      
             }          
        }              
   }           
}

Podemos por supuesto también indicar el contenido de textos, botones, códigos de barra etc utilizando el método SetTilePageDataAsync disponible en TileManager:

// Update with page data
var datas = CreatePageDatas();
await _tileManager.SetTilePageDataAsync(tile.Id, datas);

El contenido:

new PageData {       
     PageId = Guid.NewGuid(),      
     PageLayoutIndex = 0,           
     Data = {
          new TextBlockData {               
               ElementId = 11,              
               Text = "Code 39"                 
          },                       
          new BarcodeData {                           
               ElementId = 12,                          
               BarcodeType = BarcodeType.Code39,                
               BarcodeValue = "HELLO"            
          },
          new TextBlockData {                     
              ElementId = 13,                       
              Text = "Pdf 417"                   
          },                        
          new BarcodeData {              
              ElementId = 14,     
              BarcodeType = BarcodeType.Pdf417,           
              BarcodeValue = "0246810"                    
          }                   
     }              
}

La asociación de contenido y elemento la realizamos utilizando el identificador del elemento, ElementId.

Notificaciones

Seleccionado un Tile anclado en la Band, con su correspondiente
identificador, podremos trabajar con notificaciones. Para ello
utilizaremos el siguiente namespace:

using Microsoft.Band.Portable.Notifications;

El objeto NotificationManager será nuestro aliado en esta ocasión.

var notifiactionManager = BandClient.NotificationManager;

Recibimos como parámetro de navegación tanto el identificador del tile como BandClient:

public override void OnAppearing(object navigationContext)
{
     var notificationData = navigationContext as NotificationData;
     if (notificationData != null)
     {
          BandClient = notificationData.BandClient;
          _tile = notificationData.Tile;
     }
 
     _notifiactionManager = BandClient.NotificationManager;
 
     base.OnAppearing(navigationContext);
}

Utilizando NotificationManager podremos enviar notificaciones utilizando los métodos:

  • SendMessageAsync: Envía un mensaje a un Tile de la App con posibilidad de mostrar un diálogo.
  • ShowDialogAsync: Muestra un diálogo en la Band asociado a uno de los Tiles de la App.

Para enviar un mensaje a la Band utilizamos el método SendMessageAsync donde podemos pasar título y contenido:

await notifiactionManager.SendMessageAsync(_tile.Id, Title, Body, DateTime.Now);

Podemos indicar facilmente con otro parámetro que deseamos mostrar un diálogo:

await notifiactionManager.SendMessageAsync(_tile.Id, Title, Body, DateTime.Now, true);

Utilizando el método ShowDialogAsync podemos mostrar un diálogo directo en la Band:

await notifiactionManager.ShowDialogAsync(_tile.Id, Title, Body);

Sencillo, ¿verdad?

Vibración

Continuamos con otras opciones disponibles con las que podemos
interactuar con la Band. Una forma sencilla pero muy potente para
notificar al usuario es enviar notificaciones hápticas o vibraciones.
Tenemos una enumeración de tipo VibrationType con las siguientes opciones:

  • NotificationOneTone
  • NotificationTwoTone
  • NotificationAlarm
  • NotificationTimer
  • OneToneHigh
  • TwoToneHigh
  • ThreeToneHigh
  • RampUp
  • RampDown
public ObservableCollection<string> GetVibrationTypes()   
{          
     var names = Enum.GetNames(typeof(VibrationType));     
     var split = names.Select(n =>                
          string.Concat(n.ToCharArray().Select(c =>                 
          char.IsUpper(c) ? " " + c : c.ToString())));
            
     return new ObservableCollection<string>(split.ToList());
}

Utilizamos el método VibrateAync disponible en NotificationManager indicando el tipo de la vibración:

await notifiactionManager.VibrateAsync((VibrationType)_vibrationIndex);

Personalización

Para trabajar con notificaciones utilizaremos el siguiente namespace:

using Microsoft.Band.Portable.Personalization;

Y PersonalizationManager:

var personalizationManager = BandClient.PersonalizationManager;

Podremos:

  • Cambiar imagen “Me Tile”
  • Modificar colores del tema

La imagen “Me Tile”:

Me Tile

Me Tile

Es una imagen de 310 x 102 píxeles mostrada en la pantalla principal
de la Band. Podemos establecer la imagen utilizando el método SetMeTileImageAsync:

MeTileImage = await ResourcesHelper.LoadBandImageFromResourceAsync("Resources/metile.png");
await personalizationManager.SetMeTileImageAsync(MeTileImage);

También podemos editar el tema de la Band basado en un conjunto de colores:

Colores del tema

Colores del tema

Base = new BandColor(10, 110, 20);
HighContrast = new BandColor(20, 120, 30);
Highlight = new BandColor(30, 130, 40);
Lowlight = new BandColor(40, 140, 50);
Muted = new BandColor(50, 150, 60);
SecondaryText = new BandColor(60, 160, 70);

Estableciendo el tema utilizando el método SetThemeAsync pasándole un objeto de tipo BandTheme que contiene todo el conjunto de colores usados en diferentes estados:

await _personalizationManager.SetThemeAsync(new BandTheme
{
     Base = Base,
     HighContrast = HighContrast,
     Highlight = Highlight,
     Lowlight = Lowlight,
     Muted = Muted,
     SecondaryText = SecondaryText
});

Podéis descargar el ejemplo completo realizado a continuación:

También tenéis el código fuente disponible e GitHub:

Ver GitHub

Recordar que podéis dejar en los comentarios cualquier tipo de sugerencia o pregunta.

One more thing

WebTiles

Recientemente el equipo de Microsoft Band liberaron los Web Tiles.
Los Web Tiles son una forma fácil y sencilla de poder crear nuevos
Tiles que muestren información desde una URL que devuelva información en
JSON, RSS o ATOM feed sin necesidad de grandes conocimientos ni
programación.

Para ello, accederemos al siguiente enlace y completaremos el asistente paso a paso.

Microsoft Health APIs

Es una plataforma abierta de APIs Rest que nos permite a los
desarrolladores acceder a información de sensores, históricos y otras
opciones para poder crear Apps de salud y deporte de alta calidad.

Más información

[Material Evento SVQXDG] Programando para Apple Watch, Microsoft Band y Google Wear con Xamarin

El evento

El pasado Miércoles 16 de Septiembre tenía lugar el primer evento del grupo SVQXDG, grupo de desarrolladores Xamarin de Sevilla en el workINcompany.  Un evento con múltiples charlas todas enfocadas al desarrollo de los principales wearables utilizando Xamarin.

El material

En mi caso, tuve el placer de poder participar el evento con una charla sobre Desarrollo para la Microsoft Band con Xamarin. Paso a paso fuimos viendo como:

  • Encontrar Bands disponibles
  • Conectar con una Band
  • Obtener toda su información básica
  • Trabajar con sensores
  • Trabajar con tiles, obteniendo información
  • Crear tiles, custom layouts, distintos contendores, páginas, etc.
  • Envío de notificaciones y vibraciones
  • Personalización
  • Y más!

Tenéis disponible la presentación utilizada a continuación:

En cuanto a la demo técnica realizada, la tenéis disponible en GitHub:

Ver GitHub

Quisiera terminar agradeciendo a Josué Yeray y a Marcos Cobeña por su participación, a workINCompany por la sala, a Plain Concepts por el patrocinio y por supuesto a todos los asistentes. Espero que para todos fuese una tarde divertida y… ¿cuándo repetimos?

Más información