Google Glass: Actualización del firmware XE16

Hasta el año 2015, momento del nacimiento de Sngular, el nombre de "s|Software" era "Medianet Software"


Recientemente ha llegado a los usuarios de Google Glass la última actualización del firmware, XE16, vía OTA. Siguiendo con las novedades de Google Glass para el usuario comentadas en el artículo anterior, revisamos las implicaciones técnicas para los desarrolladores.

Antes de recibir esta actualización, Google Glass contaba con Android 4.0.3 (Ice Cream Sandwich) como versión del sistema operativo, trás la nueva actualización, Google Glass se ejecutará sobre Android 4.4.2 (KitKat), lo que supone una serie de ventajas que se comentarán más adelante.

En s|Software hemos visto que esta nueva actualización trae consigo bastantes cambios significativos, tanto a nivel de usuario como a nivel de API. Antes de comenzar a explicar los cambios que se han introducido con la nueva actualización, en cuanto a desarrollo se refiere, vamos a explicar un concepto básico, el GDK.

GDK (Glass Development Kit) es un add-on para el SDK de Android, que permite desarrollar aplicaciones que se ejecutan en Google Glass. Está compuesto por el API de Android estándar compilado y un API extra específico para Glass.

Cambios a nivel del API

En cuanto a la API específica de Glass se refiere, en s|Software nos hemos encontrado con algunos cambios, que describimos a continuación. Todos estos cambios pueden ser consultados en las Release Notes que ha publicado Google.

Cambios en la clase Card

En primer lugar vamos a ver los cambios que hemos encontrado en la clase Card:

  • El método toView(), usado para obtener la vista de una tarjeta, desaparece, en su lugar utilizaremos el método getView(). En el siguiente método crearemos una tarjeta, le añadiremos ciertos elementos y obtendremos su vista:

[code lang="java"] //Método que devuelve la vista asociada a la tarjeta creada.
private View getCard() {
Card card = new Card(this);
card.setText("sngular Software");
card.setFootnote("www.sngular.team");
card.setImageLayout(Card.ImageLayout.LEFT);
card.addImage(R.drawable.sngular_logo);
card.addImage(R.drawable.map);
return card.getView(); }
[/code]

  • El método addImage(android.net.Uri) ha sido eliminado.
  • Se han añadido dos nuevos métodos para el reciclado de vistas: getItemViewType() y getViewTypeCount()

Cambios en la clase CardScrollView

Continuaremos con los cambios encontrados en la clase CardScrollView:

  • Los siguientes métodos han sido eliminados: onPreActivate(), onPreDeactivate(), getItemForChildAt(int), isSettled()
  • El método updateViews(boolean) ha sido eliminado, usaremos en su lugar el método notifyDataSetChanged() de la clase BaseAdapter.

Cambios en la clase LiveCard, Static Cards y TimeLineManager

La clase TimeLineManager ha sido eliminada. Las Static Cards también han sido eliminadas, seguramente debido a que el usuario no podía interactuar con ellas, lo cual restringe bastante su uso. Ahora la creación de LiveCards para publicar tarjetas en el TimeLine se hace desde el constructor de la propia clase LiveCard. A continuación, vamos a crear y publicar una tarjeta en el TimeLine, usando la clase TimeLineManager, tal y como se hacía antes de que llegara esta nueva actualización del firmware.

[code lang="java"] //Código de creación y publicación de una tarjeta en el TimeLine con TimeLineManager
private LiveCard mLiveCard;
private void publishLiveCard(Context context) {
if(mLiveCard == null){
TimelineManager tm = TimelineManager.from(context);
mLiveCard = tm.createLiveCard(LIVE_CARD_TAG);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.live_card);
remoteViews.setTextViewText(R.id.livecard_text_view, "sngular Software");
mLiveCard.setViews(remoteViews);
Intent intent = new Intent(context, LiveCardMenuActivity.class);
mLiveCard.setAction(PendingIntent.getActivity(context, 0, intent, 0));
mLiveCard.publish(LiveCard.PublishMode.SILENT);
}
}
[/code]

Ahora vamos a crear y publicar una tarjeta en el TimeLine, usando el constructor de la clase LiveCard, tal y como ha de hacerse después de la nueva actualización.

[code lang="java"] //Código de creación y publicación de una tarjeta en el TimeLine con LiveCard
private LiveCard mLiveCard;
private void publishLiveCard(Context context) {
if(mLiveCard == null){
LiveCard liveCard = new LiveCard(this, LIVE_CARD_TAG);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.live_card);
remoteViews.setTextViewText(R.id.livecard_text_view, "sngular Software");
liveCard.setViews(remoteViews);
Intent intent = new Intent(context, LiveCardMenuActivity.class);
liveCard.setAction(PendingIntent.getActivity(context, 0, intent, 0));
liveCard.publish(LiveCard.PublishMode.SILENT);
}
}
[/code]

Se ha añadido el método navigate(), el cual nos permite navegar hasta la tarjeta publicada en el TimeLine.

Cambios en la clase CardScrollAdapter

En la clase CardScrollAdapter se han reemplazado los métodos findPosition() y findItemPosition() por un único método: getPosition(java.lang.Object item), el cual devuelve la posición del elemento en cuestión, tal y como puede verse a continuación:

[code lang="java"] CardScrollAdapter mCardScrollAdapter = new CardScrollAdapter() {
@Override
public int getCount() {
return mCardsList.size();
}
@Override
public Object getItem(int position) {
return mCardsList.get(position);
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
return mCardsList.get(position);
}
@Override
public int getPosition(Object item) {
return mCardsList.indexOf(item);
}
};
[/code]

Los métodos recycleView() y setItemOnCard() han sido eliminados.

VoiceTriggers

Una funcionalidad interesante, y que aplicamos en los desarrollos que hacemos en s|Software, son los comandos de voz. Para añadir nuestros propios comandos de voz, deberemos añadir el permiso de desarrollo en nuestro fichero Manifest, de la siguiente manera:

[code lang="xml"] [/code]

Añadiendo este permiso no pasará la revisión para poder subir la aplicación a MyGlass. Los comandos de voz permitidos están incluidos ahora como constantes en la clase VoiceTriggers.Command

Otros cambios

Finalmente, destacar que se han actualizado los valores de los enumerados de la clase Sounds, y que la clase GestureDetector cuenta con dos métodos estáticos de ayuda: isForward(Gesture gesture) y isForward(float deltaX), para detectar si un desplazamiento realizado en el touchpad se corresponde o no con el gesto de desplazamiento adelante.

En definitiva, en s|Software observamos que todos estos cambios obligan a actualizar las aplicaciones de Google Glass, para estar a la última versión de Android KitKat.

Últimos posts