Passa ai contenuti principali

Microsoft Band SDK Preview–Tile

In questo post dedicato alla Preview dell’SDK DI Microsoft Band ci occuperemo delle funzionalità relative alla gestione delle tile sullo smartwatch.

L’interfaccia IBandClient, tra le proprietà che espone e che ci consentono di accedere alle funzionalità del Band, espone anche la TileManager il cui nome è, evidentemente, tutto un programma.

image

La proprietà TileManager è un’ istanza dell’interfaccia IBandTileManager che, a sua volta espone, 4 operazioni:
  • AddTileAsync : permette di aggiungere (ove ce ne fosse spazio) una tile all’interno della stripe delle tile del Band;
  • GetRemainingTileCapacityAsync: restituisce il numero di posizioni disponibili all’interno della stripe delle tile del Band. Se non c’è più posto otterremo il valore 0;
  • GetTilesAsync: restituisce l’elenco delle tile aggiunte alla stripe del Band da parte della nostra applicazione;
  • RemoveTileAsync: rimuove una tile dalla stripe delle tile del Band.
Prima di entrare nel merito delle operazioni offerte dall’interfaccia IBandTileManager, diamo un’occhiata all’oggetto Tile del Band.

image

Come possiamo vedere dalla precedente figura una tile è composta da:
  • TileId: un guid che identifica univocamente la tile e che ci consentirà di gestire le notifiche alla tile stessa;
  • Name: una stringa che definisce il nome della tile;
  • IsBadgingEnabled: indica se la tile può visualizzare il numero di notifiche ricevute o meno;
  • SmallIcon e TileIcon: rappresentano rispettivamente l’immagine della tile quando appare il numero delle notifiche e l’immagine della tile in visualizzazione normale. La TileIcon è obbligatoria, la SmallIcon no;
  • Theme: permette di impostare un tema particolare per la tile.
Le immagini che possiamo utilizzare nelle tile debbono essere monocolore (bianche) con trasparenza e debbono avere dimensioni 46x46 pixel per la TileIcon e 24x24 pixels per la SmallIcon.

image

Inoltre le due immagini debbono essere istanze della classe BandIcon. Questa classe non ha costruttore ma fortunatamente l’SDK del Band ci mette a disposizione un paio di metodi di estensione per poter convertire una WriteableBitmap in una BandIcon e viceversa:

Dim bitmap As WriteableBitmap=New WriteableBitmap(46,46)
' WriteableBitmap --> BandIcon
Dim bandIcon as BandIcon = bitmap.ToBandIcon()
' BandIcon --> WriteableBitmap
Dim newBitmap=bandIcon.ToWriteableBitmap()

Nel pezzo di codice seguente viene mostrato come creare una Tile con delle immagini memorizzate nell’asset dell’applicazione:

Public Shared Async Function CreateStandardTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = New BandTile(Guid.NewGuid())
    
    tile.Name = tileName
    tile.IsBadgingEnabled = isBadgingEnabled
    Dim icon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconLarge.png"))
    Dim smallIcon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconSmall.png"))
    tile.TileIcon =  icon.ToBandIcon()
    tile.SmallIcon = smallIcon.ToBandIcon()

    Return tile
End Function

In questo caso si e’ utilizzato il package WriteableBitmapEx, disponibile su NuGet, per poter avere a disposizione la classe BitmapFactory.

GetRemainingTileCapacityAsync

L’operazione GetRemainingTileCapacityAsync, dell’interfaccia IBandTileManager, ci permette di sapere quanti “posti” sono disponibili per le nostre tile.

Try
    Dim tileCapacity = Await App.CurrentBandClient.TileManager.GetRemainingTileCapacityAsync()
    RemainingTileCapacityText.Text = tileCapacity.ToString()
Catch ex As BandException

End Try

Nell’esempio precedente App.CurrentBandClient è un’istanza valida di IBandClient che possiamo ottenere, come visto nei precedenti post della serie, connettendoci ad un Band.
Se non ci sono slot disponibili per le tile, il risultato della chiamata al metodo è il valore 0.
La nostra app dovrebbe sempre controllare, prima di aggiungere una tile, che ci sia posto in modo da evitare di generare eccezione nel momento in cui si tenta di aggiungere una nuova tile.

GetTilesAsync

Il metodo GetTilesAsync permette di recuperare l’elenco delle BandTile che la nostra app ha aggiunto al Band.

Try
    Dim tiles = Await App.CurrentBandClient.TileManager.GetTilesAsync()
    TileList.ItemsSource = tiles
Catch ex As BandException

End Try

La collezione non conterrà alcun elemento se non abbiamo mai aggiunto tile.

AddTileAsync

Il metodo AddTileAsync permette di aggiungere una tile alla stripe delle tile del Band (se ci sono posti liberi).

Try
    If Await App.CurrentBandClient.TileManager.AddTileAsync(tile) Then
        Dim msgDlg = New MessageDialog("Tile added!!")
        Await msgDlg.ShowAsync()
        NavigationHelper.GoBack()
    End If
Catch ex As Exception

End Try

Se non ci sono posti liberi e tentiamo di aggiungere una tile, otteniamo un’eccezione di tipo InvalidOperationException.
Se, invece, abbiamo spazio per inserire la tile, il sistema mostrerà all’utente la finestra di conferma (attualmente non bypassabile) mostrata nella seguente figura:

SNAGHTML53355a7


RemoveTileAsync

Il metodo RemoveTileAsync permette la rimozione di una tile dalla stripe delle tile del Band. Il metodo accetta sia una tile (magari recuperata utilizzando il metodo GetTilesAsync esposto in precedenza), sia il guid di una tile.

Try
     If Await App.CurrentBandClient.TileManager.RemoveTileAsync(tile) Then
         Dim msgDlg = New MessageDialog("Tile removed!!")
         Await msgDlg.ShowAsync()
     End If
 Catch ex As Exception

 End Try

Se la tile (o il guid della tile) non esiste, il metodo restituisce false. Se la rimozione avviene con successo, il metodo restituisce true.

Cambiare il tema della tile

E’ possibile impostare un tema differente rispetto a quello del Band nel momento in cui si aggiunge una tile, semplicemente valorizzando la proprieta’ Theme dell’istanza di BandTile.

Public Shared Async Function CreateStandardTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = New BandTile(Guid.NewGuid())
    
    tile.Name = tileName
    tile.IsBadgingEnabled = isBadgingEnabled
    Dim icon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconLarge.png"))
    Dim smallIcon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconSmall.png"))
    tile.TileIcon =  icon.ToBandIcon()
    tile.SmallIcon = smallIcon.ToBandIcon()

    Return tile
End Function

Public Shared Async Function CreateRedTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = Await CreateStandardTileAsync(tileName, isBadgingEnabled)
    tile.Theme=New Personalization.BandTheme()
    With tile.Theme
        .Base=Colors.Red.ToBandColor()
        .HighContrast=Colors.blueviolet.ToBandColor()
        .Highlight=Colors.blueviolet.ToBandColor()
        .SecondaryText=Colors.LightGray.ToBandColor()
        .Muted=Colors.DarkRed.ToBandColor()
        .Lowlight=Colors.DarkRed.ToBandColor()
    End With

    Return tile
End Function

Nell’esempio precedente viene impostato il tema della tile valorizzando opportunamente i colori. Il significato dei colori è riportato nella seguente figura.

image

La classe BandTheme (che vedremo dettagliatamente in un successivo post) una proprieta’ per ogni colore del tema. Queste proprietà sono di tipo BandColor, una struttura proprietaria dell’SDK del Band. Anche in questo caso abbiamo un metodo di estensione (il metodo ToBandColor) che ci consente di convertire un colore espresso con la classe Windows.UI.Color nella struttura BandColor corrispondente.

Nell’attuale versione dell’SDK sembrerebbe che il colore Base (cioè quello dello sfondo dell’icona non venga preso in considerazione).

Vedremo in un post apposito i dettagli sulla personalizzazione del Band e su come usare l’SDK per impostare il tema del device.

Il codice sorgente dell’esempio usato in questo post è disponibile al seguente link.

Rimanete connessi!!!


Commenti

Post popolari in questo blog

VB.NET : Aggregare stringhe con LINQ

Tip facile facile, ma a qualcuno potrebbe servire. Supponiamo di avere una lista di stringhe (magari come risultato di una query LINQ) e di voler ottenere una stringa con la concatenazione delle stesse: Dim list = CreateList() Dim concatStr = (From s In list _ Select s).Aggregate( Function (currentString, nextString) currentString + nextString) MessageBox.Show(concatStr) Il metodo CreateList non ci interessa, in questo momento, ma crea una lista di oggetti String. Protected Function CreateList() As IEnumerable( Of String ) Dim list As String () = {" stringa1 ", " stringa2 ", " stringa3 ", " stringa4 ", " stringa5 "} Return list.AsEnumerable() End Function Questo metodo potrebbe restituire una qualsiasi lista di oggetti di cui, nella select successiva recuperiamo solo stringhe. La stessa tecnica è utilizzabile per concatenare stringhe inserendovi un carattere separatore Dim list = CreateList() Dim

VB.NET: SplashScreen con effetto fade-in

In questo post vorrei proporvi un modo per realizzare una splash screen per le nostre applicazioni Windows Form che appare progressivamente con un effetto fade. Supponiamo di avere il nostro progetto VB.NET in una soluzione Visual Studio 2008 in cui abbiamo il sorgente della nostra applicazione Windows Form. Inseriamo una splash screen utilizzando il menù Progetto->Aggiungi Nuovo Elemento e selezionando il tipo di elemento “Schermata Iniziale” A questo punto Visual Studio creerà, automaticamente, la schermata iniziale che possiamo personalizzare graficamente come vogliamo. Per poter fare in modo che questa finestra appaia nel momento in cui avviamo l’applicazione, è necessario aprire le proprietà del progetto e impostare la maschera di avvio: In questo modo, all’avvio dell’applicazione, la schermata appare immediatamente e scompare un attimo prima della visualizzazione della finestra dell’applicazione. Possiamo far apparire la schermata iniziale con un ef

VB.NET: Convertire un file DOC in RTF e PDF con office interop

In questo post vorrei proporvi del codice per poter convertire un file .doc in un file .rtf oppure .pdf utilizzando le API di interoperabilità di Office. Creeremo una classe, DocConverter, che esporrà le due funzionalità sopra citate. Cominciamo con il prevedere un attributo privato della classe che rappresenterà l’applicazione Word che utilizzeremo per la conversione. Creeremo l’istanza dell’attributo privato all’interno del costruttore della classe: Public Sub New () If Not CreateWordApp() Then Throw New ApplicationException(" Assembly di interoperabilità con Office non trovato! ") End If End Sub Private _wordApp As Word.ApplicationClass Protected Function CreateWordApp() As Boolean Dim retval = True Try _wordApp = New Word.ApplicationClass() _wordApp.Visible = False Catch ex As System.Exception _wordApp = Nothing retval = False End Try Return retval End Function La conve