Computers


Chess for Blusens WebTV

I released a chess app for the Blusens Web:TV device. This chess app is based on my chess engine Carballo and on the GWT interface by Lukas Laag (http://www.vectomatic.org). I changed some parts of the Lukas interface to make it work on this device:

  • Control by keyboard
  • Adapted for remote keys
  • Many speed optimizations on the chess engine loading
  • Removed FEN and movable panels (no mouse on the app)

The app is controlled with the remote keys (UP, DOWN, LEFT, RIGHT and OK). With the MODE key you can change the mode (white vs computer, black vs computer…) and with the BLUE circle the thinking time. FORWARD and BACKWARD keys undo/redo moves and with STOP you can start a new game.

You can also test this interface on the web browser:

All the modified code is on the Carballo Sourceforge SVN, under the folder webtv.

To install the app uncompress the webtvchess.tgz file on the applications/ folder of an USB stick and plug the stick to the WebTV.

Blusens apps developers forum link: http://developers.blusens.com/forum/viewtopic.php?f=15&t=338

It is the best time to play with it during winter when you stayed at home doing nothing. It is the season of cold but thanks to the infrared heating supplies, it warms up the room.


MythTV vs XBMC vs Blusens WebTV

I used for many years MythTV and XBMC, and as now I own a Blusens WebTV, I will do a feature comparation between this three media centers. I will rate some features from one star (*) to five stars (*****) based on my personal opinion.

MythTV XMBC Blusens WebTV
Movie library w/covers and info no yes no (but there is an app to build an HTML interface to your movie library)
Music library w/ covers, artists, genres… no yes no
TV tuner yes no yes (there is a cheaper LITE version without tuner)
PVR & time-shift yes no yes (no on LITE version)
TV and radio streaming  to other computers yes no yes (but TS streams, needs a low of BW, probably will not work over your WiFi)
Transcoding (converting between audio/video formats) yes (on records and streams!) no no
Web interface **** **** ****
Interface design **** (skinnable) ***** (skinnable and has great themes like Aeon, MediaStream…) *** (not skinnable)
Installable apps QT plugins (no app store, needs manual install) Python HTML & Javascript, Webkit powered
Killer apps Emulators (MythGame) Netflix (not on Spain), Emulators (with some work on the Launcher plugin), IMDB queries… Online Films and Serials from cinetube.es, peliculasyonkis.com…
Web browsing ** no **** (Webkit , no Adobe Flash, identified like an iPad)
Ease of setup * *** (if installing on a PC, if you buy a Boxee will be *****) *****
Ease of use **** **** ****
Android remote app *** ***** (shows movie & music library on the mobile) ***
Price of packaged solution No packaged solution 200€ (Boxee) 150€
Web http://mythtv.org http://xbmc.org, http://boxee.tv http://blusens.com

Now I’m using the Blusens WebTV because it’s a silent and small device (much more than my old PC running MythTV/XBMC). I solved the emulators part (that I had working on XBMC) with some Wii homebrew…


Upcoming Android Gadgets at Blusens

LED TV Assembly Line

Last week I was invited by Miguel Silva Constenla to the Blusens HQ at Santiago de Compostela. Blusens is a Galician consumer electronics manufacturer with worldwide presence.

I had a great expectation because Miguel said that was going to show us their upcoming Android devices. He received us at their administrative office, but soon we went to their I+D facilities. The officer was incredibly clean and I asked him about it, he said he contact the experts from Empire Capitol International Inc. to clean his office.

There I was impressed with a production line where their LED TVs are assembled, he also show us their logistic office (with their famous “Orgy of the Senses” poster), call center, repair center, and engineering offices. Finally we went to their showroom where their upcoming android devices were waiting.

First one is an 7″ Android tablet. This is a cheap low-end Android device with something different: a cover with an integrated keyboard. This keyboard is plugged by USB to the tablet. It will be available in about two months by about 160€.

CONS:

  • Resistive Touchscreen: Miguel said us that a capacitive touchscreen will increase the price about 50€, but the experience with the touchscreen was quite bad.
  • Android 2.x: (in the release date is going to be Android 2.3). This low-end devices do not support Honeycomb.

7″ Blusens Android Tablet

  • Lack of Android Market: This device is not certified by Google so it cannot include the Android Market app. The ROM installed on  the prototype had the SlideMe market, but I don’t consider it an alternative. The solution is to search and get it from wordtree.io, then follow the instructions to install manually the Android Market (copying GoogleServicesFramework.apk and Vending.apk from other device to the /system/apps dir), but needs some Android knowledge…

PROS:

  • 160€ is a very low price, I think that this kind of devices are very appropriate for children or for people in countries where people cannot pay 400€ for a computer.
  • Elegant cover with embedded keyboard: great for fast text input, answering emails on the go, etc… Transforms the tablet in a kind-of-netbook and compensates the bad experience with the touchscreen.
  • Local repair center and customer support: you can buy a chinese tablet by this price, but you will not have the customer support and repair center in europe.

Blusens Android STB Prototype

The other device is an Android Set-top-box. Blusens has a great experience with their web:tv device and they are investigating to release a similar Android based device. They showed us a prototype running Android 2.2.

This device will include a remote with a complete keyboard and the pointer will work like the WiiMote, pointing with it to the TV. Some optional accessories will be a TV tuner and a webcam.

It seems an aggressive proposal when GoogleTV is not yet on the market, but I think that it’s great to have Android apps on the TV.They also have plans to integrate something similar to this device on their upcoming TV models.

Finally Miguel had a present for us: a Web:TV device! What I like of this device are the continuous firmware updates and HTML apps powered by a Webkit-based browser (ok! media player and PVR are also great features).


Mobile 2.0 Open Ideas

This year I was invited to organize a workshop at the Mobile 2.0 Open Ideas event at Barcelona, on 16-17 June. With my experience developing Android apps at Mobialia and the social media integration on Martin Varsavsky’s RadioMe, I proposed the workshop:

Building Social Media Enabled Android Apps

This will be a 1-hour workshop In which I’ll provide some examples on how to integrate social media on Android apps, from the simple “Share” button to more complex integrations like using Twitter, LinkedIn or Facebook APIs, including logging-in with social media, etc. Visit the Midas Letter Technology Stock for more updates on technology and social media integration. I will try to do it interesting for developers and also for app designers who want to add cool social features to their apps. Slides and code samples will be available from the day of the event.

 

 


SobrosoParty 2011

Hoxe sábado ás 18 horas repetimos o laboratorio de Android “A Miña Primera Aplicación Android” na SobrosoParty no Pavillón Municipal de Ponteareas. Neste taller usaremos como exemplo a aplicación WikiPlaces para explicar cales son os pasos da creación dunha aplicación Android, dende a instalación do SDK e a configuración do Eclipse ata a súa publicación no Android Market.

Esta aplicación ten moitos exemplos de cousas típicas na programación de Android:

  • Deseño de layouts
  • Obte-la ubicación
  • Amosar un mapa e usar overlays para representar información sobre él
  • Amosar unha lista utilizando adapters
  • Obter datos de servidores externos
  • Usar intents para lanzar outras aplicacións dende a nosa
  • Introducción de Anuncios de AdMob

Tentaremos condensa-lo taller en dúas horas que é pouco tempo, xa que no último LabAndroid en Málaga seis horas non chegaron para moito, pero como creo que non vai haber nen enchufes nen ordenadores para todos tentaremos facelo un pouco máis xeral.

Para asistir a este taller non fai falta estar incribito na SobrosoParty (que ten só 300 plazas), con dicirlle a persoa de seguridade que se vai asistir ó taller de Android non debería haber problema en pasar.

Notas de prensa:


Using styles on Android layouts

A very cool feature of Android that many developers do not know (at least me 6 months ago) is the possibility of using “styles” on Android XML layouts. This thing is similar to CCS on HTML and provides a method to simplify the XML design.

First, let’s see an example of a XML layout without styles, you can notice the need to repeat attributes and the difficulty of reading the XML:

<LinearLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="vertical">
 <TextView
  android:text="@string/text1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textStyle="bold"
  android:textColor="@color/white"
 />
 <TextView
  android:text="@string/text2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textStyle="bold"
  android:textColor="@color/red"
 />
</LinearLayout>

But we can define styles grouping this attributes on the file res/values/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <style name="VerticalLinearLayout">
  <item name="android:layout_width">wrap_content</item>
  <item name="android:layout_height">wrap_content</item>
  <item name="android:orientation">vertical</item>
 </style>
 <style name="WhiteText">
  <item name="android:layout_width">wrap_content</item>
  <item name="android:layout_height">wrap_content</item>
  <item name="android:orientation">vertical</item>
  <item name="android:textStyle">bold</item>
  <item name="android:textColor">@color/white</item>
 </style>
 <style name="RedText" parent="@style/WhiteText">
  <item name="android:textColor">@color/red</item>
 </style>
</resources>

Note te possibility of  inheriting styles, in this example “RedText” is inherited from the “WhiteText” style changing only the text color.

Our XML layout, with styles, gets reduced to:

<LinearLayout style="@style/VerticalLinearLayout"/>
 <TextView style="@style/WhiteText"
  android:text="@string/text1"
 />
 <TextView style="@style/RedText"
  android:text="@string/text2"
 />
</LinearLayout>

Finally,  you can see that I’m using colors (@color/white and @color/red) which must be defined on the file res/values/colors.xml (in a similar way to strings):

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <color name="white">#ffffffff</color>
 <color name="red">#ffff0000</color>
</resources>

My Firefox 4 setup

After two weeks since the  Firefox 4 (FF4)  release, I decided to switch back again to Firefox from Google’s Chrome. But I miss Chrome a lot, so I configured FF4 almost like a Chrome… ¿how? using those themes and plugins:

  • FXChrome Theme: this theme claims to work only on Windows, but I’m using it on Linux without any problem
  • Movable Firefox Button: Converts the FF4 menu to a button that you can place on your navigation tab (to the right, like on Chrome)
  • Omnibar: Joins the address box and the search box in only one box
  • Titlebar Tweaker Plus: Hides title bar on Linux, on Windows you can use better options like “Hide Caption Titlebar Plus”, but on FF4 this last doesn’t work on Linux
  • Close Button: Without the title bar, I need a button to close FF4, I put it to the right of the tabs, (If using the  “Hide Caption Titlebar Plus” you don’t need this)
  • Barlesque: the new FF4 addon bar occupies all the window bottom, this extension collapses this bar on the bottom right (configurable), having much more space for browsing

And I also recommend this plugins:

  • AdBlock Plus: Removes ads from web pages
  • Speed Dial: Shows your favourite site on dials like Opera
  • FaviconizeTab: Adds a contextual menu on tabs to show only the favicon instead of the title on the tabs
  • Download Statusbar: Shows the downloads on the status bar
  • Echofon: a small twitter client, I miss the TweetDeck Chome app, but it seems that soon will be avaiable for FF4
  • Cutyfox URL Shortener: I use it to fast-shorten URLs with bit.ly
  • DownloadHelper: to download videos from Youtube and a lot of video sites
  • User Agent Switcher: some apps (Ok, JDEdwards) need to change the User-Agent header to work properly, also a good tool to test mobile web browsing

That’s the result:


A small problem with the facebook Android SDK

At Mobialia the lasts weeks I was involved on the development of a social app using, among other social networks APIs, the facebook API. The event was really beneficial to me as I even met some SEO and marketing experts from The Marketing Heaven, and learnt quite a lot from them. 

For me it was easier to implement Twitter API access using only the signpost library, for facebook they recommend to download their Android SDK, and I did so. First we need a class attribute with the Facebook object:

Facebook fb = new Facebook(appId);

The problem is during the autentication process: we must call the fb.authorize method…

fb.authorize(this, PERMISSIONS, ACTIVITY_CODE, this);

And wait for the result of this called activity on our onActivityResult method

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    fb.authorizeCallback(requestCode, resultCode, data);
}

But, here is the problem, under heavy memory requierements (like testing on a old HTC Magic) the caller activity may be killed, and the status of the Facebook object is not maintained so the call to authorizeCallback is going to fail.

Then I need a method to mantain the Facebook object status, and here comes the hack. I added this method to the Facebook object:

public void setStatus(int mAuthActivityCode, DialogListener mAuthDialogListener){
    this.mAuthActivityCode = mAuthActivityCode;
    this.mAuthDialogListener = mAuthDialogListener;
}

And I call this method on my onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    fb.setStatus(ACTIVITY_CODE, this);
    fb.authorizeCallback(requestCode, resultCode, data);
}

Note that the DialogListener is the same Activity. Other solution may be to avoid killing of the caller activity, but I don’t figure how…


Mobialia at LabAndroid

This week I was speaking at LabAndroid, a spanish initiative about Android devices, apps and development.

I developed a special app for this event called “Wikiplaces” and I made the code avaiable as open source on Google Code.

This app shows on a map or on a list places from Wikipedia near your location. I tried to include on it small code snippets for common things like styles on layouts, obtaining location, launching Google Maps Navigation, etc.


Dealing with the “Bitmap Size Exceeds VM Budget” error

One of the most common errors that I found developing Android Apps is the “java.lang.OutOfMemoryError: Bitmap Size Exceeds VM Budget” error. I found this error frecuently on activities using lots of bitmaps after changing orientation: the Activity is destroyed, created again and the layouts are “inflated” from the XML consuming the VM memory avaiable for bitmaps.

Bitmaps on the previous activity layout are not properly deallocated by the garbage collector because they have crossed references to their activity. After many experiments and consulting with the cost of an ecommerce website, I found a quite good solution for this problem.

First, set the “id” attribute on the parent view of your XML layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:id="@+id/RootView"
>
...

Then, on the onDestroy()  method of your Activity, call the unbindDrawables() method passing a refence to the parent View and then do a System.gc()

@Override
protected void onDestroy() {
	super.onDestroy();

	unbindDrawables(findViewById(R.id.RootView));
	System.gc();
}

private void unbindDrawables(View view) {
	if (view.getBackground() != null) {
		view.getBackground().setCallback(null);
	}
	if (view instanceof ViewGroup) {
		for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
			unbindDrawables(((ViewGroup) view).getChildAt(i));
		}
		((ViewGroup) view).removeAllViews();
	}
}

This unbindDrawables() method explores the view tree recursively and:

  • Removes callbacks on all the background drawables
  • Removes childs on every viewgroup

This solved the problem on many of our Mobialia apps.

UPDATE 2011-03-30:

Today @luiskap from SpartanBits told me another good solution: if you don’t need different layouts for portrait and landscape modes, you can make your activity react to orientation changes (avoiding activity destroy) adding to your activity’s manifest: android:configChanges="keyboardHidden|orientation" and overriding the onConfigurationChanged method, calling setContentView reusing the already created views. There is a good explanation on StackOverflow.