tv future is apps - tvos vs androidtv

64
TV Future is Apps tvOS vs AndroidTV by @pablito_az @hugojperal @jr_salazares MADRID · NOV 18-19 · 2016

Upload: pablo-azana-sanchez

Post on 09-Apr-2017

221 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Tv Future is Apps - tvOS vs AndroidTV

TV Future is AppstvOS vs AndroidTVby @pablito_az @hugojperal @jr_salazares

MADRID · NOV 18-19 · 2016

Page 2: Tv Future is Apps - tvOS vs AndroidTV

Agenda ¿Quiénes somos? Introducción a la plataforma Dinámica del workshop. Primeros pasos ¿Cómo buscar contenido dentro de la app? Vayamos al detalle. Cosas que nos dejamos en el tintero

Page 3: Tv Future is Apps - tvOS vs AndroidTV

¿Quiénes somos?

http://www.edreamsodigeocareers.com

Page 4: Tv Future is Apps - tvOS vs AndroidTV

Introducción. Experiencia

Page 5: Tv Future is Apps - tvOS vs AndroidTV

Introducción. Interacción

Page 6: Tv Future is Apps - tvOS vs AndroidTV

Introducción. UX

Page 7: Tv Future is Apps - tvOS vs AndroidTV

Introducción. Foco

Page 8: Tv Future is Apps - tvOS vs AndroidTV
Page 9: Tv Future is Apps - tvOS vs AndroidTV

Dinámica del workshop

Repo AndroidTV: https://github.com/odigeoteam/AndroidTV-workshop

Repo tvOS y TVML: https://github.com/odigeoteam/tvOS-workshop

Page 10: Tv Future is Apps - tvOS vs AndroidTV

Primeros pasos

Step 1 - 2

Page 11: Tv Future is Apps - tvOS vs AndroidTV

Para que sea compatible en AndroidTV ...… tenemos que hacer algunas cosas:

● Nuestras activity principal CATEGORY_LEANBACK_LAUNCHER

● <uses-feature android:name = “android.software.leanback”android:required = “false”>

● <uses-feature android:name = “android.hardware.touchscreen”android:required = “false”>

Page 12: Tv Future is Apps - tvOS vs AndroidTV

… y nuestro dispositivo tiene limitaciones:

● Touchscreen● Telephony● Camera

● GPS● Microphone● Sensors

Page 13: Tv Future is Apps - tvOS vs AndroidTV

Adaptando el comportamiento ... … en tiempo de ejecución:

if (getPackageManager().hasSystemFeature("android.hardware.camera")) {

// Hago algo con la cámara

} else {

// Adapto mi comportamiento

}

Page 14: Tv Future is Apps - tvOS vs AndroidTV

Algunas características de los layoutsDebemos tener en cuenta:

● Layouts en Landscape.● UI en secciones fácilmente navegables.● Suficiente margen entre elementos.● Cuidado con el Overscan● Textos suficientemente visibles.

Page 15: Tv Future is Apps - tvOS vs AndroidTV

v17 Leanback to the rescue

compile 'com.android.support:leanback-v17:24.2.1'

Page 16: Tv Future is Apps - tvOS vs AndroidTV

Nuestra primera vista: BrowseFragment

Page 17: Tv Future is Apps - tvOS vs AndroidTV

Configurando el BrowseFragmentPodemos configurar elementos en la interfaz muy fácil:

setBadgeDrawable(...);setOnSearchClickedListener(...);setSearchAffordanceColor(...);

Page 18: Tv Future is Apps - tvOS vs AndroidTV

Pintando contenido

Page 19: Tv Future is Apps - tvOS vs AndroidTV

Pintando contenidoclass ContentAdapter extends ArrayObjectAdapter {

for (CategoryList) {ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardItemPresenter());for (awesomePlaces) {

listRowAdapter.add(places);}HeaderItem header = new HeaderItem(Category);add(new ListRow(header, listRowAdapter));

}}

Page 20: Tv Future is Apps - tvOS vs AndroidTV

Nuestro CardItemPresenterpublic class CardItemPresenter extends Presenter{

@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent) {

// Creo mi ImageCardView aquí}

@Overridepublic void onBindViewHolder(ViewHolder viewHolder,

Object item) {// Pinto la información en la ImageCardView

}}

Page 21: Tv Future is Apps - tvOS vs AndroidTV

Configurando ImageCardViewTiene 3 elementos principales, además de la imágen de fondo:

Se pueden configurar, mediante un Style combinando estos elementos:

<item name="lbImageCardViewType">Title|Content|IconOnLeft</item>

● Título● Contenido● Badge

Page 22: Tv Future is Apps - tvOS vs AndroidTV

Step 1 - 2

Page 23: Tv Future is Apps - tvOS vs AndroidTV

Limitaciones 200MB No LocalStorage No WebViews No Custom Video Player No Contacts, HandOff...

Page 24: Tv Future is Apps - tvOS vs AndroidTV

Universal PurchaseMisma entrada en iTunes ConnectMismo bundle IDSubidas a iTunes Connect separadasDistintas versionesDistintos procesos de revisiónEsta unión es para… siempre

Page 25: Tv Future is Apps - tvOS vs AndroidTV

Construyamos un layout

Page 26: Tv Future is Apps - tvOS vs AndroidTV

Grids, grids everywhere¿puedo tener el foco? -> canBecomeFocusedUIButton, UIControl, UISegmentedControl, UITabBar, UITextField, UISearchBar(UITextField)collectionView(_:canFocusItemAtIndexPath:)tableView(_:canFocusRowAtIndexPath:)

y yo, ¿tengo el foco? -> focuseddidUpdateFocusInContext(_:withAnimationCoordinator:)

Page 27: Tv Future is Apps - tvOS vs AndroidTV

Step 1-2

Page 28: Tv Future is Apps - tvOS vs AndroidTV

TVMLTVML (TV Markup Language)TVJS (TV Javascript)TVMLKit

TVML

Page 29: Tv Future is Apps - tvOS vs AndroidTV

Templates, templates everywhere18 templates a elegirElementos simplesElementos compuestos

carousel, collectionList, shelf, lockup

TVML

Page 30: Tv Future is Apps - tvOS vs AndroidTV

JS Principalesapplication.js:

JS Inicial. Carga otros JS y la primera pantallaDocumentLoader:

Encargado de cargar documentosDocumentController:

Es el controller y tiene asociado un loader y un template. Nos abstrae de la navegación

TVML

Page 31: Tv Future is Apps - tvOS vs AndroidTV

Aspecto template● Para navegar entre pantallas

usaremos el atributo “documentURL” en cualquier elemento focusable

TVML

Page 32: Tv Future is Apps - tvOS vs AndroidTV

Step 1 - 2TVML

Page 33: Tv Future is Apps - tvOS vs AndroidTV

¿Cómo buscamos dentro de la app?

Step 3

Page 34: Tv Future is Apps - tvOS vs AndroidTV

In-app search: SearchFragment

Page 35: Tv Future is Apps - tvOS vs AndroidTV

SearchFragmentclass SearchViewImp extends SearchFragment implements SearchResultProvider {

@Overridepublic ObjectAdapter getResultsAdapter() {}

@Overridepublic boolean onQueryTextChange(String newQuery) {}

@Overridepublic boolean onQueryTextSubmit(String query) {}

}

Page 36: Tv Future is Apps - tvOS vs AndroidTV

Cards interaction: BackgroundManager

private BackgroundManager mBackgroundManager;

// Inicializamos el BackgroundManagermBackgroundManager = BackgroundManager.getInstance(getActivity());mBackgroundManager.attach(getActivity().getWindow());

// Cambiamos el fondo cada vez que seleccione una cardmBackgroundManager.setDrawable(backgroundDrawable);

Page 37: Tv Future is Apps - tvOS vs AndroidTV

Step 3

Page 38: Tv Future is Apps - tvOS vs AndroidTV

¿Cómo buscar dentro de la app?//Swiftlet searchResultsController = SearchResultsViewController()

let searchController = UISearchController(searchResultsController: searchResultsController)

searchController.searchResultsUpdater = searchResultsController let searchContainer = UISearchContainerViewController(searchController: searchController)

Page 39: Tv Future is Apps - tvOS vs AndroidTV

Gestos

Page 40: Tv Future is Apps - tvOS vs AndroidTV

Veamos los styles//Con el Appearance ProxyUIButton.appearance().setTitleColor(.red, for: [])let light = UITraitCollection(userInterfaceStyle: .light)let dark = UITraitCollection(userInterfaceStyle: .dark)UIButton.appearance(for: light).setTitleColor(.red, for:[])UIButton.appearance(for: dark).setTitleColor(.blue, for:[])

// UIScreen, UIWindow, UIViewController, UIPresentationController, UIViewfunc traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)

Page 41: Tv Future is Apps - tvOS vs AndroidTV

Step 3

Page 42: Tv Future is Apps - tvOS vs AndroidTV

TVJSEventos:Document → load, unload, appear, disappear…Focusable Elements → select, highlight, holdselect, play

event.target vs event.currentTarget

TVML

Page 43: Tv Future is Apps - tvOS vs AndroidTV

SearchTemplateTVML

Page 44: Tv Future is Apps - tvOS vs AndroidTV

Step 3TVML

Page 45: Tv Future is Apps - tvOS vs AndroidTV

Vayamos al detalle

Step 4

Page 46: Tv Future is Apps - tvOS vs AndroidTV

Construyendo cualquier layoutLo más importante, la navegación

Page 47: Tv Future is Apps - tvOS vs AndroidTV

Controlando la navegación

if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN) {// Vamos abajo

} else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {// Vamos arriba

} else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {

// Vamos a la derecha} else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) {

// Vamos a la izquiera}

Page 48: Tv Future is Apps - tvOS vs AndroidTV

Controlando la navegación

<TextView android:id="@+id/Category1"

android:nextFocusDown="@+id/Category2"\>

Page 49: Tv Future is Apps - tvOS vs AndroidTV

Manejando recursos pesados

● Carga imágenes solo cuando se muestren en la pantalla.

● Recicla los Bitmaps cuando ya no sean necesarios.

● Si traes imágenes de red, hazlo siempre en un hilo aparte.

● Escala las imágenes al tamaño que realmente necesitas.

Page 50: Tv Future is Apps - tvOS vs AndroidTV

Step 4

Page 51: Tv Future is Apps - tvOS vs AndroidTV

Cargar un videoLo más fácil es usar la clase AVPlayerViewController y el resto sería así://Creamos el player con la URL del videoplayer = AVPlayer(url: url)//configuramos el payer con las opciones deseadasplayer?.play()

Page 52: Tv Future is Apps - tvOS vs AndroidTV

Step 4

Page 53: Tv Future is Apps - tvOS vs AndroidTV

TVML. Elementos Custom I TVML

Page 54: Tv Future is Apps - tvOS vs AndroidTV

TVML. Elementos Custom II 1.Implementar protocolo TVInterfaceCreating2.Asignar el extendedInterfaceCreator del objeto

singleton TVInterfaceFactory3.Registrar elemento4.Usar en nuestros TVMLs

TVML

Page 55: Tv Future is Apps - tvOS vs AndroidTV

Custom template

Page 56: Tv Future is Apps - tvOS vs AndroidTV

Step 4TVML

Page 57: Tv Future is Apps - tvOS vs AndroidTV

Cosas que nos dejamos en el tintero

Page 58: Tv Future is Apps - tvOS vs AndroidTV

Finding content outside the app

● Recommendation Row:○ Continuation content○ New content○ Related content

● Hacer que el contenido de tu aplicación sea encontrable desde fuera de ella.

Page 59: Tv Future is Apps - tvOS vs AndroidTV

Más vistas reutilizables

Page 60: Tv Future is Apps - tvOS vs AndroidTV

Modo picture-in-picture

Page 61: Tv Future is Apps - tvOS vs AndroidTV

Cosas que nos dejamos en el tintero

Testing. Unit Test y UI Test Top Shelf Dinámico Parallax Artwork Más Focus Engine:

∘ UIFocusGuide∘ var preferredFocusEnvironments: [UIFocusEnvironment]

Page 62: Tv Future is Apps - tvOS vs AndroidTV

Cosas que nos dejamos en el tintero

Video features Now playing Animar DOM updates

Page 64: Tv Future is Apps - tvOS vs AndroidTV

¡Gracias!