It’s about Cloud!

Now you can share your plans with other users.

screenshot_share_0screenshot_share_1

Improvements:
– Layout improvements.
– Share plans with other users.
– Add Plublic Plans.
– Address autocomplete from Google Maps.
– Add Geocoding information.
– Add Notes Field on Hotels.
– Add Notes Field on Transports.
– Add Terminal Field on Flights.
– Add Notes Field on Flights.
– Bugs fixed.


Get it on Google Play

ViewPage Title Project – Swipey Tabs

Junto com a nova versão do Android, 4.1 Jelly Bean, o google disponibilizou a versão 9 do Android Support Library, a tentativa do google em manter a compatibilidade entre as versões do Android (E ainda dizem que existe fragmentação no Android 😛 ).

Entre as novidades e correções (vejo o changelog completo aqui), se destaca o PagerTabStrip, esta classe permite que você tenha uma funcionalidade  “swipey tabs“,  o mesmo utilizado na Google Play, por exemplo.

Para demostrar o uso, criei um pequeno exemplo da utilização.

Antes de tudo, temos que adcionar o .jar do support library no projeto.

Fazendo o Download – Support Libary

O .jar é fornecido como um pacote para download a partir do Android SDK Manager. Para instalar:

  1. Abra o Android SDK Manager.No Eclipse, você pode selecionar Window > Android SDK Manager. Ou, execute SDK Manager.exe dentro do diretório <sdk>/  (no Windows somente) ou android do diretório <sdk>/tools/ .
  2. No Extras, marque Android Support package e selecione Install.

Quando o download terminar, todos os arquivos (incluindo o código fontes, exemplos e o arquivo.jar) serão salvos no diretório <sdk>/extras/android/support/.

Configurando o Projeto – Support Libary

Para adcionar a biblioteca no seu projeto Android:

  1. No seu projeto, crie um diretório chamado libs  (no mesmo nível do src/res/, etc.)
  2. Localize o arquivo JAR da biblioteca que você quer usar e copie para o diretório libs/.Por exemplo, a biblioteca que da suporte ao nível 4 da API está localizado no diretório <sdk>/extras/android/support/v4/android-support-v4.jar.
  3. Adcione o JAR no path build do seu projeto: No Eclipse, com o botão direito no Package Explorer, selecione  Build Path > Add to Build Path.

Sua aplicação agora esta pronta para usar a biblioteca. Todas as APIs estão disponíveis no pacote android.support (por exemplo, android.support.v4).

Dica: Junto com a biblioteca, também é disponibilizado exemplos de uso e funcionalidades da API, os exemples estão no diretório <sdk>/extras/android/support/<version>/samples/.

ViewPage Title Project

Para demostrar o uso do PagerTabStrip e adcionar a funcionalidade do Swipey Tabs, criei o projeto ViewPage Title, para ver o código completo click aqui.

No layout adcione o elemento PagerTitleStrip, observe que o PagerTitleStrip é filho do ViewPager, para controlar o possicionamento é usado o parametro android:layout_gravity, sete para TOP ou BOTTOM, para possicionar os titulos acima ou embaixo do PageView, repectivamente.

activity_main.xml

<android.support.v4.view.ViewPager
   android:id=”@+id/viewpager”
   android:layout_width=”fill_parent”
   android:layout_height=”0dp”
   android:layout_weight=”1″>

           <android.support.v4.view.PagerTabStrip
              android:id=”@+id/pagerTabStrip”
              android:layout_gravity=”top”
             android:layout_width=”wrap_content”
            android:layout_height=”wrap_content”
           android:background=”##a22c2e”/>

</android.support.v4.view.ViewPager>

MainActivity.java

Abaixo o código do Activity, duas observações aqui: Primeiro, o pacote que se deve importar é o android.support.v4, observar o pacote que esta sendo importado, caso contrario a aplicação vai da erro quando rodar em dispositivos anteriores. Segundo, sua Activity deve extender de FragmentActivity e não de Activity para manter a compatibilidade da biblioteca.

package com.jansouza.viewpagetitle;

import android.os.Bundle;
import android.view.Menu;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

public class MainActivity extends FragmentActivity {

@Override
  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

         mViewPager = (ViewPager) findViewById(R.id.viewpager);

         TitleAdapter titleAdapter = new TitleAdapter(getSupportFragmentManager());
         mViewPager.setAdapter(titleAdapter);
         mViewPager.setCurrentItem(0);
   }

TitleAdapter.java

Aqui é aonde mágica acontece …

O title de cada view é fornecido pelo método getPageTitle(int) do adapter que é passado para o ViewPage, no exemplo do projeto é denifido no array titles[].

private String titles[] = new String[]{“View1″,”View2″,”View3”};

@Override
 public CharSequence getPageTitle (int position){
     return titles[position];
 }

Abaixo o screenhot no Ice Cream Sandwich 4.0 e no 2.1 Eclair, para demonstrar a compatibilidade em versões antigas do Android.

Google Play

Instale pelo Google Play!
Android app on Google Play

http://play.google.com/store/apps/details?id=com.jansouza.viewpagetitle
Enjoy!

Skype for Linux 4.0

Depois de mais de 3 anos em desenvolvimento o Skype para Linux finalmente foi lançado, saindo da versão Beta 2.2 direto para uma versão estável 4.0, com o codenome Four Rooms for Improvement.

As principais mudanças:

  • Nova interface para chamadas e chats (veja os screenshots abaixo)
  • Melhorias na qualidade do audio e video
  • Suporte adcional para Web Cam
  • Melhorias na sincornização dos chats
  • Novos ícones para o status e emoticons
  • Chats em Abas

 

Download Skype for Linux 4.0

O download pode ser feito diretamente do site do Skype (http://www.skype.com/intl/en/get-skype/on-your-computer/linux/).
A versão 4.0 ainda não foi disponibilizada no Ubuntu Software Center

Fonte: http://blogs.skype.com/linux/2012/06/skype_40_for_linux.html

Como (não) assistir Netflix no Linux

Se você  ficou super empolgado com a chegada do NetFlix no Brasil e assim como eu é usuário Linux, então esqueça!

O Netflix não é compatível com o Linux. 😦

Isso é porque eles usam a tecnologia Silverlight (com DRM) da Microsoft. Embora haja uma alternativa ao Silverlight no Linux chamada Mono/Moonlight, ele não tem qualquer DRM embutido e é muito improvável que a Microsoft vá fazer uma opção de DRM para ele.

Netflix afirmou que não vai usar nada sem DRM. Então, se Netflix continua a usar o Silverlight, não haverá suporte ao Linux.

O que nós pobres usuários do Linux podemos fazer é rodar uma VM com o Windows para poder desfrutas dos benefícios do Netflix.

Também podemos reclamar com a Netflix, o número do suporte deles no Brasil é 0800-086-4042.

Existem também uma petição online http://www.petitiononline.com/Linflix

Para quem tem o PS3 ou o Wii, podem acessar o NetFlix nessas consoles.

No Wii, basta que seu console estava conectado à Internet,fazer o download Netflix a partir do Wii Shop Channel e seguir as instruções.

No PS3 simplesmente entre com seu login/senha no aplicativo NetFlix na sessão Video/TV.

Enjoy!!!

JavaScript Country State List

My two cents on project http://sourceforge.net/projects/countries/

I just added default select

Diff:
function print_country(country_id,selected){
var indexSelected=0;
// given the id of the tag as function argument, it inserts tags
var option_str = document.getElementById(country_id);
var x, i=0;
for(x in country_arr){
option_str.options[i++] = new Option(country_arr[x],country_arr[x]);
if(selected && country_arr[x] == selected){
//alert(selected);
indexSelected = i-1;
}

}
if(selected){
option_str.selectedIndex = indexSelected;
print_state('state',indexSelected);
}

}

Use:
print_country("country","Brazil");

Project information
http://bdhacker.wordpress.com/2009/11/21/adding-dropdown-country-state-list-dynamically-into-your-html-form-by-javascript/

Enjoy!

Google Json Java

Gson is a Google Open Source library to convert Java Objects into its JSON representation. Very clean and simple. 🙂

It’s my two cent for this project. I add locale option for Date format.

public GsonBuilder setDateFormat(int style,Locale locale);
public GsonBuilder setDateFormat(int dateStyle, int timeStyle, Locale locale);

Code exemple:
Gson gson = new GsonBuilder().setDateFormat(DateFormat.MEDIUM, DateFormat.SHORT,Locale.US).create();
String json = gson.toJson(Object);

Patch file:

Index: DefaultTypeAdapters.java
===================================================================
— DefaultTypeAdapters.java (revision 557)
+++ DefaultTypeAdapters.java (working copy)
@@ -254,10 +254,18 @@
DefaultDateTypeAdapter(final int style) {
this.format = DateFormat.getDateInstance(style);
}
+
+ DefaultDateTypeAdapter(final int style, final Locale aLocale) {
+ this.format = DateFormat.getDateInstance(style,aLocale);
+ }

public DefaultDateTypeAdapter(final int dateStyle, final int timeStyle) {
this.format = DateFormat.getDateTimeInstance(dateStyle, timeStyle);
}
+
+ public DefaultDateTypeAdapter(final int dateStyle, final int timeStyle, final Locale aLocale) {
+ this.format = DateFormat.getDateTimeInstance(dateStyle, timeStyle, aLocale);
+ }

// These methods need to be synchronized since JDK DateFormat classes are not thread-safe
// See issue 162
Index: GsonBuilder.java
===================================================================
— GsonBuilder.java (revision 557)
+++ GsonBuilder.java (working copy)
@@ -23,6 +23,7 @@
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;

import com.google.gson.DefaultTypeAdapters.DefaultDateTypeAdapter;

@@ -77,6 +78,7 @@
private String datePattern;
private int dateStyle;
private int timeStyle;
+ private Locale locale;
private boolean serializeSpecialFloatingPointValues;
private boolean escapeHtmlChars;
private boolean prettyPrinting;
@@ -108,6 +110,7 @@
serializeNulls = false;
dateStyle = DateFormat.DEFAULT;
timeStyle = DateFormat.DEFAULT;
+ locale = null;
serializeSpecialFloatingPointValues = false;
generateNonExecutableJson = false;
}
@@ -319,6 +322,28 @@
this.datePattern = null;
return this;
}
+
+ /**
+ * Configures Gson to to serialize {@code Date} objects according to the style value provided.
+ * You can call this method or {@link #setDateFormat(String)} multiple times, but only the last
+ * invocation will be used to decide the serialization format.
+ *
+ *

Note that this style value should be one of the predefined constants in the
+ * {@code DateFormat} class. See the documentation in {@link java.text.DateFormat} for more
+ * information on the valid style constants.

+ *
+ * @param style the predefined date style that date objects will be serialized/deserialized
+ * to/from
+ * @param locale the given locale
+ * @return a reference to this {@code GsonBuilder} object to fulfill the “Builder” pattern
+ * @since 1.2
+ */
+ public GsonBuilder setDateFormat(int style,Locale aLocale) {
+ this.dateStyle = style;
+ this.datePattern = null;
+ this.locale = aLocale;
+ return this;
+ }

/**
* Configures Gson to to serialize {@code Date} objects according to the style value provided.
@@ -341,8 +366,31 @@
this.datePattern = null;
return this;
}

+
/**
+ * Configures Gson to to serialize {@code Date} objects according to the style value provided.
+ * You can call this method or {@link #setDateFormat(String)} multiple times, but only the last
+ * invocation will be used to decide the serialization format.
+ *
+ *

Note that this style value should be one of the predefined constants in the
+ * {@code DateFormat} class. See the documentation in {@link java.text.DateFormat} for more
+ * information on the valid style constants.

+ *
+ * @param dateStyle the predefined date style that date objects will be serialized/deserialized
+ * to/from
+ * @param timeStyle the predefined style for the time portion of the date objects
+ * @param locale the given locale
+ * @return a reference to this {@code GsonBuilder} object to fulfill the “Builder” pattern
+ * @since
+ */
+ public GsonBuilder setDateFormat(int dateStyle, int timeStyle, Locale aLocale) {
+ this.dateStyle = dateStyle;
+ this.timeStyle = timeStyle;
+ this.datePattern = null;
+ this.locale = aLocale;
+ return this;
+ }
+ /**
* Configures Gson for custom serialization or deserialization. This method combines the
* registration of an {@link InstanceCreator}, {@link JsonSerializer}, and a
* {@link JsonDeserializer}. It is best used when a single object {@code typeAdapter} implements
@@ -527,7 +575,7 @@

ParameterizedTypeHandlerMap<JsonSerializer> customSerializers = serializers.copyOf();
ParameterizedTypeHandlerMap<JsonDeserializer> customDeserializers = deserializers.copyOf();
– addTypeAdaptersForDate(datePattern, dateStyle, timeStyle, customSerializers,
+ addTypeAdaptersForDate(datePattern, dateStyle, timeStyle, locale, customSerializers,
customDeserializers);

customSerializers.registerIfAbsent(DefaultTypeAdapters.getDefaultSerializers(
@@ -553,7 +601,7 @@
return gson;
}

– private static void addTypeAdaptersForDate(String datePattern, int dateStyle, int timeStyle,
+ private static void addTypeAdaptersForDate(String datePattern, int dateStyle, int timeStyle,Locale locale,
ParameterizedTypeHandlerMap<JsonSerializer> serializers,
ParameterizedTypeHandlerMap<JsonDeserializer> deserializers) {
if (!serializers.hasSpecificHandlerFor(Date.class)
@@ -562,10 +610,12 @@
DefaultDateTypeAdapter dateTypeAdapter = null;
if (datePattern != null && !””.equals(datePattern.trim())) {
dateTypeAdapter = new DefaultDateTypeAdapter(datePattern);
+ } else if (locale != null) {
+ dateTypeAdapter = new DefaultDateTypeAdapter(dateStyle, timeStyle,locale);
} else if (dateStyle != DateFormat.DEFAULT && timeStyle != DateFormat.DEFAULT) {
dateTypeAdapter = new DefaultDateTypeAdapter(dateStyle, timeStyle);
}

+
if (dateTypeAdapter != null) {
serializers.register(Date.class, dateTypeAdapter);
deserializers.register(Date.class, dateTypeAdapter);